Probleme mit Verlgeichen/Sprüngen

Gast #2026174
Lesenswert?
• ▲
▼
Hallo,

ich habe ein Problem bei einem Mehrfachvergleich.

Hardware: ATMEGA 32
          PORTA0..7 Taster (gegen GND geschalten)
          PORTB0..7 LEDS
          (die includes von LCD und Menues im Code sind derzeit 
irrelevant)

Meine Idee war den gesamten Port A (also die Taster) abzufragen und dann 
das Register in dem die eingaben gespeichert werden mit BRNE Befehlen zu 
überprüfen und dann dementsprechen zu reagieren.

Konkret: Taster1 gedrückt Led1 an
         Taster2 gedrückt Led2 an
         Taster3 gedrückt Led3 an

         wenn nichts der Fall ist weiter den Tasterport abfragen...

In der Simulation macht das Prog auch das was es soll.

Im "echten Leben" leuchtet die Led 3 immer beim einschalten, und NUR 
wenn ich den jeweiligen Taster schon beim RESET des µC gedrückt halte 
leuchtet die richtige Led ansonsten bleibts bei Led3 ....

Kann mir vielleicht jemand sagen was ich beim Source falsch gemacht hab 
?


Viele Grüße

Stefan
Angehängte Dateien:
#2026176
Lesenswert?
• ▲
▼
Du Pusht nur 1-mal, Pops aber 2-mal.
Die Anzahl muss übereinstimmen!

Gut, du brauchst gar nicht zu pushen oder popen. Ein cpi zerstört das 
Register nicht. Wenn du dann noch die BRNE gegen BREQ austauscht und die 
Logik rumdrehst, vereinfacht sich der Code weiter
1
loop:   
2
      in temp1, PINA        ; Tasterwerte an Port A einlesen und in Temp1 speichern
3
      com temp1          ; Temp1 invertieren (da Taster gegen GND schalten und Pullups aktiv)
4
  
5
      cpi temp1, 1        ; Temp1 mit Wert 1 Vergleichen
6
      breq Main1          ; Wenn Taster1 gedrückt Sprung zu Main1
7

8
      cpi temp1, 2        ; Temp1 mit Wert 2 Vergleichen
9
      breq Main2          ; Wenn Taster2 gedrückt Sprung zu Main2
10

11
      cpi temp1, 4        ; Temp1 mit Wert 4 Vergleichen
12
      breq Main3          ; Wenn Taster3 gedrückt Sprung zu Main3
13

14
      rjmp loop           ; und wieder von vorne

die cpi sind momentan auch noch insofrn gefährlich, weil da natürlich 
all die anderen Bits vom PINA mit in den Vergleich einfliessen. Du 
solltest zumindest sicherstellen, dass die gezielt auf 0 gesetzt werden, 
egal welchen Zustand sie am physischen Port haben. Einfach mit einem 
ANDI wegmaskieren.
1
loop:   
2
      in temp1, PINA        ; Tasterwerte an Port A einlesen und in Temp1 speichern
3
      com temp1          ; Temp1 invertieren (da Taster gegen GND schalten und Pullups aktiv)
4

5
      andi temp1, 7       ; nur die 3 Bits für die Tasten sollen übrig bleiben
6
                          ; alle anderen auf 0 zwingen
7
  
8
      cpi temp1, 1        ; Temp1 mit Wert 1 Vergleichen
9
      breq Main1          ; Wenn Taster1 gedrückt Sprung zu Main1
10

11
      cpi temp1, 2        ; Temp1 mit Wert 2 Vergleichen
12
      breq Main2          ; Wenn Taster2 gedrückt Sprung zu Main2
13

14
      cpi temp1, 4        ; Temp1 mit Wert 4 Vergleichen
15
      breq Main3          ; Wenn Taster3 gedrückt Sprung zu Main3
16

17
      rjmp loop           ; und wieder von vorne

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.