mikrocontroller.net

Forum: Compiler & IDEs befehle werden nicht ausgeführt


Autor: Mitch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ++;  }


             }

Autor: Joh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler ist hier:

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

Autor: Mitch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ???

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>

uint8_t wahl;

int main(void)
{
  // Port B
  // PB5 o----TASTER----o GND
  //         active low
  DDRB &= ~(1<<PB5); // PB5 ist Eingang
  PORTB |= (1<<PB5); // mit internem Pull-up

  while (1) {
    // Taster abfragen
    if ( !(PINB & (1<<PB5)) ) {   // gedrückt?
      while (!(PINB & (1<<PB5))); // ja: Warten bis Taster losgelassen
      wahl++;  
    }

    // wahl anzeigen
    ...
  }
}

Autor: Helfer (Gast)
Datum:

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

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wahl ++;
Space zwischen wahl und ++   ???

Autor: Mitch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Floh (Gast)
Datum:

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

Beleg dafür? Wie festgestellt?

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit deinem PINB schleppst du auch die anderenBits (PB0...) mit!
    if ( (PINB & (1<<PB5))!=(1<<PB5)) {   // gedrückt?
      while ((PINB & (1<<PB5))!=(1<<PB5)); // ja: Warten bis Taster losgelassen
      wahl++;  
    }


Versuch den direkten Test z.B. wie o.a.

Taste entprellen geht besser, schau ins Tutorial ;)

avr

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
volatile uint8_t wahl;

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ;)

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg: Du hast recht, ich habe die Geschichte nicht zuende gedacht. Ich 
nehme alles zurück!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.