befehle werden nicht ausgeführt

Gast #2071359
Lesenswert?

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 ++;  }


             }
Gast #2071382
Lesenswert?

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 ???
Gast #2071385
Lesenswert?

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
}
Gast #2071967
Lesenswert?

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
Gast #2072207
Lesenswert?

>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;
Gast #2072368
Lesenswert?

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.
Moderator Persönliche Seite #2072796
Lesenswert?

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.
Gast #2072878
Lesenswert?

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? ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren