Forum: Mikrocontroller und Digitale Elektronik Abfragen, Pruefen, Unterprogramme in ASM


von Hahn (Gast)


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

von Kai G. (runtimeterror)


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

von Johannes M. (johnny-m)


Lesenswert?

> 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.

von Hahn (Gast)


Lesenswert?

kay, dann herzlichen danke


Gruß Hahn

von Uwe (Gast)


Lesenswert?

Hi!
Nach prog1 kommste, aber nach prog2/3 nicht, weil: siehe Posting von 
Johannes M.

Viel Erfolg, Uwe

von Gast (Gast)


Lesenswert?

vielleicht geht es auch mit

sbrc key_press,0
..
sbrc key_press,1
..
sbrc key_press,2
..

von Hahn (Gast)


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

von M. F. (sajuuk)


Lesenswert?

geht auch mit hex.

sbrc key_press,0x01
..
sbrc key_press,0x02
..
sbrc key_press,0x04
..

von Gast (Gast)


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!

von Johannes M. (johnny-m)


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...

von Falk B. (falk)


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

von Johannes M. (johnny-m)


Lesenswert?

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...

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.