Abfragen, Pruefen, Unterprogramme in ASM

Gast #707874
Lesenswert?

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
#707882
Lesenswert?

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
Gast #708153
Lesenswert?

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
Gast #708493
Lesenswert?

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!
#708502
Lesenswert?

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...
#708504
Lesenswert?

@ 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

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