Hi, habe ständig beim Compiler den Fehler, Invalid register (ir) und wrong number (wn). Ich kann nicht entdecken woran es liegt :(. Hab auch schon die Register höher als 15 probiert. dennoch treten immer noch die Fehler auf. Im Datenblatt steht bei den Instruction Sets meist immer Rd, oder Rr. Ich weiss das es Unterschiede zwischen den ersten 15 und den anderen Registern gibt. Auch das die letzen Register als 16 bit Adressregister benutzt werden können. Aber ich verstehe nicht die Bedeutung von Rd und Rr ?!:( Ein Codeschnipsel mit den Fehlern .def neuricht = r8 ; neuer Richtungstatus .def key_press = r6 ; gedrückte Taste main: ir->ld neuricht,key_press andi neuricht,0x04 ; Maskieren- nur für Richtung Rechts wn->sbis key_press, 3 ; Taste hoch gedrückt? rcall thoch wn->sbis key_press, 2 ; Taster runter? rcall trunter rjmp main Hoffe jemand kann mir helfen, Vielen Dank daniel
Alle 'immediate'-Befehle, also Befehle, die mit konstanten werten arbeiten, gehen nur mit den Register r16 - r31! Das gilt auch für andi in Deinem Programm.
Anstatt sbis must du sbrs verwenden. sbis /sbic ist nur für Ports und nicht für Register.
BTW: Du solltest bei der Assembler-Programmierung entweder das Instruction Set Manual griffbereit haben oder die Online-Hilfe von AVRStudio verwenden. Da stehen nämlich alle Infos, die Du brauchst drin! Damit Du nicht lange suchen musst, hier der Link zum Instruction Set Manual: http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
Schließe mich Johny an. Habe dann den Code getestet: [asm] .def neuricht = r18 ; neuer Richtungstatus .def key_press = r16 ; gedrückte Taste main: mov neuricht,key_press andi neuricht,0x04 ; Maskieren- nur für Richtung Rechts sbrs key_press, 3 ; Taste hoch gedrückt? nop sbrs key_press, 2 ; Taster runter? nop rjmp main [/asm]
Hi, Vielen Dank ich hab es auf die Register r20 und r 21 geänder für zwei befehle Also muss man bei der registerwahl unterscheiden mit was für werten man arbeitet. Ob Register oder Konstanten zugewiesen werden. Ein par Fehler sind schon weniger davon. Habe aber immer noch bei sbis den Fehler wrong number, hab auch mal probiert key_press auf Register20 zu legen und zu sehen ob der Fehler verschwindet, war aber nicht der Fall. :( Ebenso habe ich auch einen Fehler mit ld Register1,Register2 Ich weiss nicht woran das liegt :( Aber vielen Dank für die Info, das mit den Registerunterschieden von r16-r31 und den anderen, wird mir nun immer klarer. Daniel
> sbis /sbic ist nur für Ports und nicht für Register
Das mit den Ports ist Unsinn. sbis und sbic gehen mit allen
I/O-Registern, die im bitadressierbaren Bereich liegen, und das sind
bei weitem nicht nur Portregister. Ansonsten hat Fred recht. Du musst
hier die Befehle sbrs und sbrc verwenden!
Rr steht für das Ausgangs-Register (R_resource) und Rd für das Zielregister (R_destination) ld ist auch nur für das Laden aus dem Speicherbereich, nicht aus einem Register. Das erste Register muss immer eines der 3 Adressregister X,Y oder Z sein.
Du solltest Dir wirklich mal die Befehle ansehen, bevor Du programmierst (im Instruction Set Manual oder in der Hilfe)! Das Kopieren eines Wertes von einem Register in ein anderes geht mit mov und nicht mit ld! ld lädt einen Wert aus dem SRAM!
HI, Beim Kaninchen (Rabbit) war das immer so das man auch mit ld die Register kopieren oder bewegen konnte. Deswegen dachte ich mir das geht ;) Daniel
Na gut, Ports sind eine Untermenge der I/O Register bezüglich SBIC und SBIS. Unglücklich formuliert. ;-)
Dieser Befehl heißt hier mov PS: Du kannst auch beim avr mit ld in den Registern kopieren, wenn du die Adresse des Registers verwendest. Ist jedoch langsamer und nur in bestimmten Fällen zu empfehlen.
> Ports sind eine Untermenge der I/O Register bezüglich SBIC und > SBIS Wenn man jetzt Haare spalten will, dann darf man das auch nicht so stehenlassen. 1. Die 'Ports' an sich sind keine Register und 2. Es gibt bei den größeren AVRs ne Menge Portregister, die nicht bitadressierbar sind! Bitadressierbar sind nur die unteren 32 I/O-Register. Das soll jetzt nicht klugscheißerisch oder so sein. Ich halte es einfach für besser, einem Neuling gleich die korrekten Begriffe nahezubringen, so dass es nicht zu Missverständnissen kommt. Also nimms mir nicht übel, Fred...
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.