www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wortvariable in Assembler


Autor: Michael Endres (michael76)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

hab schon ein bischen in die mikrocontrollerprogrammierung
reingeschnuppert, jedoch in winavr, jetzt wollte ich mal etwas in
assembler programmieren.

hier meine frage:

wie kann ich in assembler eine zwei byte grosse Variable (wertebereich
bis 65535) anlegen und als zähler benutzen?

bisher hab ich das mit einem byte so gelöst:
.EQU   xxx=0x0060

lds    r18=xxx
dec    r18
sts    xxx=r18

gruß michael

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR sind 8bit-Prozessoren. Sie haben keine 16bit-Register. Du mußt zwei
8bit-Register kaskadieren. Es gibt allerdings ein paar wenige Befehle,
die zwei 8bit-Register zusammen als 16bit-Wert verwenden können.

> .EQU xxx=0x0060
>
> lds    r18=xxx
> dec    r18
> sts    xxx=r18

Also du willst eine Variable im RAM-Speicher an Adresse 0x0060
dekrementieren? Das ginge z.B. etwa so:

lds r24, xxx
lds r25, xxx+1
sbiw r25:r24, 1
sts xxx, r24
sts xxx+1, r25

Autor: Michael Endres (michael76)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super, danke das habe ich gesucht.

jetzt hab ich aber noch ne frage:
kann ich das ganze r25 und r24 in einem befehl auf null abfragen?
oder muss ich beide einzeln abfragen?

hab das bis jetzt so gemacht:

cpi   r18,0
breq  irgendwohin

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
or r24,r25
breq genaudorthin

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kann ich das ganze r25 und r24 in einem befehl auf null abfragen?

z. B.

tst r24  ; setzt das Zero-Flag wenn r24 = 0
breq xxx ; Sprung zu xxx, wenn r24 = 0


"tst" hat aber glaube ich nicht jeder AVR im Befehlssatz.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TST prüft nur ein Byte, OR verändert ggf das eine Byte.

Aber ADIW und SBIW beeinflussen doch auch das Zero-Flag, oder?

Ansonsten CP und CPC kaskadieren.

...

Autor: Michael Endres (michael76)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey, danke ich denke mit dem or-befehl müsste es gehen.

danke

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADIW und SBIW setzen alle Flags richtig, d.h. einfach nur breq oder brne
danach reicht.


Peter

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es verändert allerdings eines der Register. Wenn du das nicht willst, cp
und cpc. Es bietet sich an, ein Register als "null-Register" zu
reservieren, also den Wert 0 da reinschreiben und dann so lassen. Dann
ginge das z.B. so (mit r00 als null-Register):

cp r24, r00
cpc r25, r00
breq xxx

Oder falls du direkt nach dem Dekrementieren abfragen willst
(Schleifenzähler?), kannst du dir die Mühe evt. sparen. Die Subtraktion
setzt die Flags bereits passend, und damit reicht der breq alleine schon
aus.

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.