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

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