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
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
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
> 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.
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. ...
ADIW und SBIW setzen alle Flags richtig, d.h. einfach nur breq oder brne danach reicht. Peter
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.