Hallo, ich verzweifel langsam. Vieleicht kann mir jemand von euch weiter helfen. Ich möchte ein Programm schreiben das auf Knopfdruck eine Variable hochzählt. Aus irgendwelchen gründen wird aber genau der befehl "wahl++; " nicht ausgeführt. ich kann auch an dieser stelle keinen breakpoint setzen. ich wäre für eure hilfe sehr dankbar. hier der code ausschnitt: while (help2 == 1) { if (!(PINB & (1<<PB5))) { while (!(PINB & (1<<PB5))); wahl ++; } }
Danke für die schnelle antwort das while (!(PINB & (1<<PB5))); dient zur entprellung des tasters. mein gedanke war das ich damit solange warte bis der der taster wieder losgelassen wird und danach wahl hoch gezählt wird. warum kann ich das so nicht machen ???
1 | #include <avr/io.h> |
2 | |
3 | uint8_t wahl; |
4 | |
5 | int main(void) |
6 | {
|
7 | // Port B
|
8 | // PB5 o----TASTER----o GND
|
9 | // active low
|
10 | DDRB &= ~(1<<PB5); // PB5 ist Eingang |
11 | PORTB |= (1<<PB5); // mit internem Pull-up |
12 | |
13 | while (1) { |
14 | // Taster abfragen
|
15 | if ( !(PINB & (1<<PB5)) ) { // gedrückt? |
16 | while (!(PINB & (1<<PB5))); // ja: Warten bis Taster losgelassen |
17 | wahl++; |
18 | }
|
19 | |
20 | // wahl anzeigen
|
21 | ...
|
22 | }
|
23 | }
|
Versimplifiziert. Mehr kann ich aus deiner Frage nicht machen. Der Codeabschnitt ist zu kurz und ein Schaltplan fehlt.
das sollte wahl++; sein aber daran liegt es aber nicht. jeder befehl in dem einer variablen ein wertzugewiesen werden soll würd nicht ausgeführt.
Mitch schrieb: > jeder befehl in dem einer variablen ein wertzugewiesen werden soll würd > nicht ausgeführt. Beleg dafür? Wie festgestellt?
Mit deinem PINB schleppst du auch die anderenBits (PB0...) mit!
1 | if ( (PINB & (1<<PB5))!=(1<<PB5)) { // gedrückt? |
2 | while ((PINB & (1<<PB5))!=(1<<PB5)); // ja: Warten bis Taster losgelassen |
3 | wahl++; |
4 | }
|
Versuch den direkten Test z.B. wie o.a. Taste entprellen geht besser, schau ins Tutorial ;) avr
>Mit deinem PINB schleppst du auch die anderenBits (PB0...) mit! Nee, das ist schon ok so, wie Helfer es macht, das gefragte Bit wird ja mit der &-Verknüpfung maskiert. >jeder befehl in dem einer variablen ein wertzugewiesen werden soll würd >nicht ausgeführt. Liegt womöglich daran, dass Du im Programm mit diesen Varabeln nichts (sinvolles) machst, was das Programm beeinflussen würde und daher vom C-Optimizer wegoptimiert werden! Du könntest die Variable(n) mal versuchsweise als volatile deklarieren:
1 | volatile uint8_t wahl; |
Mitch schrieb: > das > while (!(PINB & (1<<PB5))); > dient zur entprellung des tasters. > mein gedanke war das ich damit solange warte bis der der taster wieder > losgelassen wird und danach wahl hoch gezählt wird. warum kann ich das > so nicht machen ??? Das kannst du schon so machen. Aber mit Entprellung hat das nichts zu tun.
Mitch schrieb: > jeder befehl in dem einer variablen ein wertzugewiesen werden soll würd > nicht ausgeführt. Wenn du die Variable hernach nicht mehr benutzt, merkt der Optimierer das. Er stellt dann fest, dass das Weglassen der Variablen einen funktional gleichen Code implementiert, wie wenn man sie wirklich hochzählen würde — also lässt er sie einfach weg.
Joh schrieb: > Fehler ist hier: > >>while (!(PINB & (1<<PB5))); Worüber wird hier eigentlich noch geredet? Die korrekte Antwort war doch schon in der ersten Antwort. Macht mal alle die Augen auf und lest die while-Zeile bis zum letzen Zeichen. Na, leuchtet die Lampe jetzt? ;)
Also ich kann das Problem dort auch nach mehrmaligem Lesen der Zeile nicht finden.
Rolf Magnus schrieb: > Also ich kann das Problem dort auch nach mehrmaligem Lesen der Zeile > nicht finden. Andreas bildet sich wohl ein, als einziger das Semikolon am Ende der Zeile entdeckt zu haben und glaubt, dass das ganze Problem nur daran liegen würde ...
@Jörg: Du hast recht, ich habe die Geschichte nicht zuende gedacht. Ich nehme alles zurück!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.