www.mikrocontroller.net

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


Autor: daniel (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anstatt sbis must du sbrs verwenden.

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Fred (Gast)
Datum:

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

Autor: daniel (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.def key_press = PINX ; X ist durch I/O pin zu ersetzen

Autor: johnny.m (Gast)
Datum:

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

Autor: daniel (Gast)
Datum:

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

daniel

Autor: daniel (Gast)
Datum:

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

Autor: Fred (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

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.