Forum: Compiler & IDEs befehle werden nicht ausgeführt


von Mitch (Gast)


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


             }

von Joh (Gast)


Lesenswert?

Fehler ist hier:

>while (!(PINB & (1<<PB5)));

von Mitch (Gast)


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

von Helfer (Gast)


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
}

von Helfer (Gast)


Lesenswert?

Versimplifiziert. Mehr kann ich aus deiner Frage nicht machen. Der 
Codeabschnitt ist zu kurz und ein Schaltplan fehlt.

von peter (Gast)


Lesenswert?

>wahl ++;
Space zwischen wahl und ++   ???

von Mitch (Gast)


Lesenswert?

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.

von Floh (Gast)


Lesenswert?

Mitch schrieb:
> jeder befehl in dem einer variablen ein wertzugewiesen werden soll würd
> nicht ausgeführt.

Beleg dafür? Wie festgestellt?

von avr (Gast)


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

von peter (Gast)


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;

von Rolf Magnus (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Andreas (Gast)


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

von Rolf Magnus (Gast)


Lesenswert?

Also ich kann das Problem dort auch nach mehrmaligem Lesen der Zeile 
nicht finden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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 ...

von Andreas (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.