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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.