Forum: Mikrocontroller und Digitale Elektronik Probleme mit Verlgeichen/Sprüngen


von Stefan Friedrich (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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

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.