mikrocontroller.net

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


Autor: Hahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
 58 main:   
sbrc    key_press, 0x00000001
rcall   prog1
sbrc    key_press, 0x00000010
rcall   prog2
sbrc    key_press, 0x00000100
rcall   prog3
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

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kay, dann herzlichen danke


Gruß Hahn

Autor: Uwe (Gast)
Datum:

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

Viel Erfolg, Uwe

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht geht es auch mit

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

Autor: Hahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: M. Faid (sajuuk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht auch mit hex.

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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:
 58 main:   
sbrc    key_press, 0x00
rcall   prog1
sbrc    key_press, 0x01
rcall   prog2
sbrc    key_press, 0x02
rcall   prog3
rjmp    main
oder eben (für manch einen übersichtlicher) dezimal...
 58 main:   
sbrc    key_press, 0
rcall   prog1
sbrc    key_press, 1
rcall   prog2
sbrc    key_press, 2
rcall   prog3
rjmp    main
während ich gerade in dem Fall die Binärschreibweise für absolut 
ungeeignet halte...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.