Forum: Mikrocontroller und Digitale Elektronik Einlesen von Tastern mit Entprellheader


von Daniel U. (Firma: zuhause) (uhli)


Angehängte Dateien:

Lesenswert?

Hallo!

Habe die Entprellfunktion mittels Flankenerkennung von µC.net genutzt.
Leider reagiert der µC (ATm8) nicht darauf.
Woran kann das liegen?
Wäre nett wenn mal jemand einen Blick auf das angehängte
Programm wirft.
Es soll folgende Funktion haben:
1. Tastendruck: LED aus
2. Tastendruck: LED blinkt
3. Tastendruck: LED an

Viele Grüße

von Karl H. (kbuchegg)


Lesenswert?

1
#define TASTERPORT PORTC
2
#define TASTERBIT PINC5

von einem Port liest man über das PINx Register ein und nicht über das 
PORTx Register.

Code nicht einfach gedankenlos übernehmen. Die Zeile hier
1
   if(zustand = 0 & !(TASTERPORT & (1<TASTERBIT))
muss dir bereits den entscheidenden Hinweis bringen, ob bei TASTERPORT 
das Port Register oder das Pin Register anzugeben ist.

PS: diese Form der Flankenerkennung ist auf eine funktionierende 
Entprellung angewiesen. Die funktioniert aber nur dann, wenn beim 
AUfrufer
1
  while( 1 ) {
2
3
    taster();
4
5
    ....
6
7
    _delay_ms( 10 );
8
  }
es auf jeden Fall eine Form eines Delays gibt. Ohne Delay wird da nichts 
enptrellt. Dazu ist der µC viel zu schnell wieder in der Funktion, so 
dass Preller gnadenlos durschchlagen. Das hättest du dann auch einfacher 
haben können. So wie du überhaupt die ganze Funktionalität bei 
vorhandenem Delay einfacher haben kannst.

von holger (Gast)


Lesenswert?

>Code nicht einfach gedankenlos übernehmen. Die Zeile hier
>
>   if(zustand = 0 & !(TASTERPORT & (1<TASTERBIT))
>
>muss dir bereits den entscheidenden Hinweis bringen,

das da ein Tippfehler ist.

(1<TASTERBIT)

So wird ein Schuh draus:

(1<<TASTERBIT)


Und wie zum Teufel kommt man auf die Idee eine einfache
Textdatei als PDF zu posten?

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
>>Code nicht einfach gedankenlos übernehmen. Die Zeile hier
>>
>>   if(zustand = 0 & !(TASTERPORT & (1<TASTERBIT))
>>
>>muss dir bereits den entscheidenden Hinweis bringen,
>
> das da ein Tippfehler ist.
>
> (1<TASTERBIT)
>
> So wird ein Schuh draus:
>
> (1<<TASTERBIT)

Danke.
Noch ein Fehler. Nach dem Erkennen des PORTC - PINC Fehlers hab ich 
nicht mehr weiter gelesen. Mir hat schon der Teil "alles gelbe ist 
auskommentiert" gereicht.

von Daniel U. (Firma: zuhause) (uhli)


Lesenswert?

Ja danke für die Tipps!

Warum keine einfache Textdatei als pdf posten?, habe nur open office
und kein word

von Karl H. (kbuchegg)


Lesenswert?

Daniel Duesentrieb schrieb:
> Ja danke für die Tipps!
>
> Warum keine einfache Textdatei als pdf posten?, habe nur open office
> und kein word

du sollst weder das eine noch das andere benutzen!

Häng dein C File einfach an, so wie es ist. Nicht mehr und nicht 
weniger.
Wozu verpacken? Ein C File ist erst mal ein Text File wie jedes andere 
auch. Nur mit dem Unterschied, dass das Forum schon weiß, wie es mit 
derartigen Files umgehen soll und entsprechendes Syntax Highlighting 
benutzt. Nur mit dem Unterschied, dass man dann mit einfachem Copy&Paste 
Teile aus deinem Code ausschneiden und in der Antwort wieder verwenden 
kann, ohne erst mal einen externen Viewer benutzen zu müssen.

Ganz im Gegenteil. Da ein C File einfach nur ein einfaches 
ASCII-Textfile ist, kann es auch keine Viren oder sonstige Schadlast 
beinhalten. Ein gepostetes C-File mach ich unbedenklich auf. Bei einem 
Word-File überleg ich mir das 3 mal.

von holger (Gast)


Lesenswert?

>Warum keine einfache Textdatei als pdf posten?, habe nur open office
>und kein word

Ich kenne keinen Compiler der OpenOffice, PDF oder Worddokumente
verarbeitet. Welchen Compiler benutzt du?

von Peter D. (peda)


Lesenswert?

holger schrieb:
> Und wie zum Teufel kommt man auf die Idee eine einfache
> Textdatei als PDF zu posten?

Damit keiner sie einfach mal durch den Compiler jagen kann, ob Warnungen 
oder Errors gemeldet werden. Oder sie vielleicht sogar simuliert.

Wenn man direkt die *.c Datei postet, könnte ja leicht jemand auf solche 
verrückten Ideen kommen und sofort die Fehler finden.

von Conny G. (conny_g)


Lesenswert?

holger schrieb:
> Und wie zum Teufel kommt man auf die Idee eine einfache
> Textdatei als PDF zu posten?

Schutz des Urheberrechts. Sonst zieht noch einer mit der wertvollen 
Software davon!

von saydexcfgtvhujk (Gast)


Lesenswert?

Wenn die Software wirklich so wertvoll wäre, dann würde das PDF keine 
ernstzunehmende Hürde...

von saydexcfgtvhujk (Gast)


Lesenswert?

Nachtrag: darstellen...

von Stefan F. (Gast)


Lesenswert?

Abgesehen von der außerordentlich hässlichen Formatierung des 
Quelltextes und der sträflichen Verwendung von #include mit absoluten 
Pfaden sehe ich folgende vermutlich fehlerhafte Zeilen:
1
if(rw==1) // Tastendruckzaehler=0
2
{
3
  PORTC|=(1<<PC5); 
4
  Tastendruckzaehler++;
5
} // neg. Logik -> + schaltet, LED aus
6
7
if((rw==1)&&(Tastendruckzaehler==1)) // blink blink blink
8
{
9
  Ledblinken(); 
10
  Tastendruckzaehler++;
11
}
12
13
if((rw==1)&&(Tastendruckzaehler==2)) // leucht leucht leucht
14
{
15
  PORTC&=~(1<<PC5); 
16
  Tastendruckzaehler=0;
17
} // neg. Logik -> - schaltet, LED ein

Wenn der Tastendruckzaehler=0 ist, werden alle drei bedingte Codeblöcke 
nacheinander ausgeführt. Das hast Du sicher nicht gewollt, oder doch? 
Wenn ja, wozu dienen dann die vielen if Ausdrücke?

PS: Hier siehst Du, wie einfach es ist, Text auf dem PDF heraus zu 
kopieren. Das geht einfach so, genau wie bei einer Textdatei.

von Peter D. (peda)


Lesenswert?

Stefan us schrieb:
> PS: Hier siehst Du, wie einfach es ist, Text auf dem PDF heraus zu
> kopieren. Das geht einfach so, genau wie bei einer Textdatei.

Aber je mehr unnötige Hürden man aufstellt, umso weniger beschäftigen 
sich mit dem Problem.

Atmel hatte mal ne Zeitlang Copy&Paste in seinen PDF-Datenblättern 
gesperrt.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

holger schrieb:
> Ich kenne keinen Compiler der OpenOffice, PDF oder Worddokumente
> verarbeitet. Welchen Compiler benutzt du?

Solch einen Compiler kenne ich auch nicht, aber früher(tm) hatte ich 
zwei Kollegen, die ihre C-Quelltexte mit Word und Wordpad schrieben und 
sich dann über die komischen Fehlermeldungen des Compilers wunderten. 
Als ich sie auf die Ursache des Problems hinwies, wollten sie mir 
zunächst nicht glauben. Erst nach etlichen Tagen (des 
Nichtkompilierens...) mussten sie mir dann rechtgeben. Angeblich hatten 
sie auch während des Studiums ihre Quelltexte immer mit Word geschrieben 
und es hätte da niemals Probleme gegeben.

Naja, gegen das Schreiben mit Word ist ja nichts einzuwenden, solange 
man nicht kompilieren will...

Oder besitzen die Microsoft-Compiler etwa heimlich einen 
Word-Importfilter? Denkbar wäre das schon.

von Uhli (Gast)


Lesenswert?

Ja
Asche auf mein Haupt, ihr habt natürlich recht, es ist quautsch als pdf 
zu posten.
Habe nur einem anderen Anfänger die Problemstellung per mail geschickt 
und
das ganze in ein pdf gehauen, da er auch andere Programmieroberfläche 
nutzt etc.
Deshalb habe ich ihm auch den auskommentierten Teil markiert.

...


Dann hab ich nur eben noch zwei Fragen zu dem was Stefan_us schrieb:
"...sträflichen Verwendung von #include mit absoluten
Pfaden..."

-Was ist günstiger als die Verwendung absoluter Pfade?
 Oder was sin d die genauen Nachteile?
 Im Moment Fällt mir da nur ein das man die Pfadangabe immer Ändern
 muss wenn man die include in eine ander Datei haut.

-Sorry das versteh ich gerade nicht: "Wenn der Tastendruckzaehler=0 ist, 
werden alle drei bedingte Codeblöcke nacheinander ausgeführt."
Warum werden dann die 3 Codeblöcke nacheinander aufgeführt?

MfG Uhli

von Karl H. (kbuchegg)


Lesenswert?

Uhli schrieb:
> Ja
> Asche auf mein Haupt, ihr habt natürlich recht, es ist quautsch als pdf
> zu posten.
> Habe nur einem anderen Anfänger die Problemstellung per mail geschickt
> und
> das ganze in ein pdf gehauen, da er auch andere Programmieroberfläche
> nutzt etc.
> Deshalb habe ich ihm auch den auskommentierten Teil markiert.

Damit hat der dann dieselben Probleme.

QUelltext, mit dem ein anderer etwas anfangen können soll, den 
verschickst du ganz einfach als genau die Textdatei, die du schreibst. 
Niemand muss dazu irgendwas auspacken oder einpacken oder umformatieren 
oder sonst irgendwas damit tun.
Ein Programmtext ist einfach nur eine Textdatei. Die gibt es seit 60 
Jahren und in einer reinen Textdatei gibt es auch keine Möglichkeit, 
irgendwelche Viren oder Trojaner oder sonstigen QUatsch unterzubringen. 
Das ist einfach nur Text, eine Abfolge von Buchstabebn, definiert durch 
(meistens) ASCII Code.
Das Leben könnte so viel einfacher sein, wenn Micorsoft nicht in ihrer 
unnachahmlichen Weitsicht beschlossen hätte, dass EMails auch HTML 
können müssen. Vorher waren EMails genauso einfach nur Text, der von 
einem Postfach zum anderen geschickt wurde. Sicher, Bilder konnte man 
nicht im Text einbetten, aber das brauchte auch niemand wirklich. Dafür 
waren die Mails klein und der einzige Virus den man damit ohne Ahnhabng 
verschicken konnte war die EMail
"Um mal etwas tolles zu sehen, gehen sie auf die Commandline und tippen 
sie "FORMAT C:" ein.

> Dann hab ich nur eben noch zwei Fragen zu dem was Stefan_us schrieb:
> "...sträflichen Verwendung von #include mit absoluten
> Pfaden..."
>
> -Was ist günstiger als die Verwendung absoluter Pfade?

keine absolute Pfade.
Wenn du dein Projekt von einem Ordner auf einen anderen Ordner 
verschiebst, dann ändert sich ja deiser absolute Pfad.

Besser ist es zb. Utility Verzeichnisse in der IDE einzutragen. Dann 
übergibt die IDE dem Compiler beim AUfruf diese Pfade, auf das der 
COmpiler sie alle durchsucht, wenn er ein Header File suchen muss.

>  Oder was sin d die genauen Nachteile?
>  Im Moment Fällt mir da nur ein das man die Pfadangabe immer Ändern
>  muss wenn man die include in eine ander Datei haut.

Genau das. Und zwar in allen C Dateien, die zum Projekt gehören. Das 
werden bei dir noch nicht so viele sein, es soll aber schon Projekte 
gegeben haben, die aus ein paar Hundert C-Files bestanden haben.

> -Sorry das versteh ich gerade nicht: "Wenn der Tastendruckzaehler=0 ist,
> werden alle drei bedingte Codeblöcke nacheinander ausgeführt."
> Warum werden dann die 3 Codeblöcke nacheinander aufgeführt?

WEil du in jedem if den Tastendruckzaehler erhöhst. Dadurch ist dann 
immer gleich die Bedingung für den nächsten if gegegben.
1
  i = 0;
2
3
  if( i == 0 )
4
    i++;      // i ist danach 1
5
6
  if( i == 1 )   // super: i ist ja bereits 1. Im vorhergehenden then
7
                 // Zweig wurde es ja von 0 auf 1 erhöht.
8
    i++;         // und jetzt wird i von 1 auf 2 erhöht
9
10
  if( i == 2 )   // daher trifft dann auch jetzt diese Bedingung zu.
11
    i++;

Wenn du deinen ganze Code mal ein bischen einfacher schreiben würdest, 
würde man das leichter sehen. Denn die Teilbedingung, dass rw gleich 1 
sein muss, ist ja in allen if's gefordert
1
  Tastendruckzaehler = 0;
2
3
...
4
5
  if( rw == 1 )
6
  {
7
    PORTC |= (1<<PC5); 
8
    Tastendruckzaehler++;
9
10
    if( Tastendruckzaehler == 1 ) // blink blink blink
11
    {
12
      Ledblinken(); 
13
      Tastendruckzaehler++;
14
    }
15
16
    if( Tastendruckzaehler == 2 ) // leucht leucht leucht
17
    {
18
      PORTC &= ~(1<<PC5); 
19
      Tastendruckzaehler = 0;
20
    }
21
  }

jetzt sieht man ganz deutlich, dass am Anfang der Tastendruckzähler am 
Anfang bei 0 losstartet. Beim tastendruck wird er duch das ++ erhöht, 
wodurch die Bedingung für das erste if zutgrifft. In Abarbeitung dessen 
then-Teil wird der Zähler wieder erhöht, wodurch die Bedingung für das 
nächste if zutrifft. etc. etc.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.