Forum: Mikrocontroller und Digitale Elektronik Rd,Rr als Register?


von daniel (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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.

von Fred (Gast)


Lesenswert?

Anstatt sbis must du sbrs verwenden.

sbis /sbic ist nur für Ports und nicht für Register.

von johnny.m (Gast)


Lesenswert?

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

von Fred (Gast)


Lesenswert?

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]

von daniel (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von Jan M. (mueschel)


Lesenswert?

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.

von Klaus2m5 (Gast)


Lesenswert?

.def key_press = PINX ; X ist durch I/O pin zu ersetzen

von johnny.m (Gast)


Lesenswert?

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!

von daniel (Gast)


Lesenswert?

HI :)
vielen Dank, da warens nur noch 0 ;)
 :)

daniel

von daniel (Gast)


Lesenswert?

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

von Fred (Gast)


Lesenswert?

Na gut, Ports sind eine Untermenge der I/O Register bezüglich SBIC und
SBIS. Unglücklich formuliert. ;-)

von Jan M. (mueschel)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.