Hi, ich hab mir gerade eine kleine Verwirrung geschenkt.
Also ich hab drei Taster, die ich ueber eine Entprellroutine entprelle
und den gedrueckten Taster dann in key_press=r10 ablege. Jetzt will ich
diesen Wert benutzen um zu schauen in welches Unterprogramm ich muss.
Sieht jetzt wie folgt aus, bin mir nur nicht sicher ob das so
funktioniert, oder ob ich das lieber ueber eine Sprungtabelle regeln
soll.
1
58 main:
2
sbrc key_press, 0x00000001
3
rcall prog1
4
sbrc key_press, 0x00000010
5
rcall prog2
6
sbrc key_press, 0x00000100
7
rcall prog3
8
rjmp main
Zja jetzt die Frage, hat das den gewuenschten Effeckt, das wenn Taster 1
gedrueckt wird, ich auch ins prog1 komme?
Die Taster haengen halt an den PINS 0-2 von PortD.
AVR ist ein Atmega16, falls das noch von Interesse ist.
Gruß Hahn
Hoi...
Sollte so passen... mal davon abgesehen, dass key_press in dem
Code-Fragment nicht aktualisiert wird.
Wenn's generischer werden soll kannst du key_press auch in einer
Schleife nach rechts ins Carry shiften und wenn's Carry gesetzt ist
einfach den Schleifenzähler als Pointer auf eine Lookup-Tabelle mit den
call-Zielen verwenden. (Hoffe, du kriegst den Satz disassembliert ;) )
Bei 3 Tastern ist das den Aufwand aber nicht wert.
Je nach Anwendung einen anderen Controller werden, der mehr Interrupts
unterstützt und die Taster entsprechend anschließen.
Gruß
Kai
> sbrc key_press, 0x00000100
0x00000100 passt im ATMega16 nicht in ein Register! Das Präfix "0x"
steht für eine Hexadezimalzahl. Was Du vermutlich haben wolltest, ist
0b00000100, wobei "0b" das Präfix für Binärzahlen ist.
ja ich hab aus den hex schon binaer Werte gemacht mit den muesste es ja
gehen, oder seh ich das jetzt falsch?
und key_press wird ueber einen Timer-Interrupt beschrieben, also sonst
sollte das schon funktionieren.
Gruß Hahn
Also ich bevorzuge bei sbrc und sbrs die Formulierung mit
dezimalen 0..7 als Argument.
Die oben benutzten Formate 0bXXXXXXXX und 0xXX suggerieren,
dass es sich bei dem Argument um eine Bitmaske handeln
könnte. Nach meinen Erfahrungen führt das gerne mal zu
einer längeren Fehlersuche.
Ring frei für die Besserwisser!
Hast recht! Die Schreibweise oben macht nämlich gar nicht das, was der
OP will (bin ich auch erst drauf reingefallen! Hat ja auch niemand
protestiert...). Die Skip-Befehle arbeiten allesamt mit Bitnummern. Also
muss es auch in der Hexadezimal-Schreibweise heißen:
1
58 main:
2
sbrc key_press, 0x00
3
rcall prog1
4
sbrc key_press, 0x01
5
rcall prog2
6
sbrc key_press, 0x02
7
rcall prog3
8
rjmp main
oder eben (für manch einen übersichtlicher) dezimal...
1
58 main:
2
sbrc key_press, 0
3
rcall prog1
4
sbrc key_press, 1
5
rcall prog2
6
sbrc key_press, 2
7
rcall prog3
8
rjmp main
während ich gerade in dem Fall die Binärschreibweise für absolut
ungeeignet halte...
@ Johannes M. (johnny-m)
>sbrc und sbrs arbeiten ja auch mit einer Bitmaske! Deshalb macht eine
Irrtum!
sbrc, Skip if bit in register is clear
sbrs, Skip if bit in register is set
>Schreibweise mit 0..7 keinen Sinn (und würde auch nicht das Gewünschte>machen). Du verwechselst das mit sbic/sbis. Da wäre das mit der>Bitnummer auch korrekt...
Nöö, DU verwechselst das mit CBR und SBR
CBR, Clear bits in Register
SBR, Set bit in Register
Was aber nur Pseudobefehle sind, dahinter steckt eine ANDI und ORI.
MFG
Falk
Falk Brunner wrote:
> @ Johannes M. (johnny-m)>>>sbrc und sbrs arbeiten ja auch mit einer Bitmaske! Deshalb macht eine>> Irrtum!
Siehe oben!
> Was aber nur Pseudobefehle sind, dahinter steckt eine ANDI und ORI.
Das ist mir ebenfalls bekannt...