Forum: Mikrocontroller und Digitale Elektronik AVR ASM Fehler


von Steffen (Gast)


Lesenswert?

Hallo alle miteinander

Ich hab erst vor kurzem angefangen mich mit Mikrocontrollern zu 
beschäftigen und schreibe gerade ein kleines Programm für den Attiny 
2313.
Der Anfang des Programms sieht so aus:
1
 
2
.include "tn2313def.inc"
3
4
      ldi r9,  0b10000000
5
      ldi r10, 0b00000000
6
      ldi r11, 0b00000000
7
      ldi r12, 0b00000000
8
      ldi r13, 0b00000000
9
      ldi r14, 0b00000000
10
      ldi r15, 0b00000000
11
      ldi r16, 0b00000000
12
13
      ldi r17, 0b10000000
14
      ldi r18, 0b00000000
15
      ldi r19, 0b00000000
16
      ldi r20, 0b00000000
17
      ldi r21, 0b00000000
18
      ldi r22, 0b00000000
19
      ldi r23, 0b00000000
20
      ldi r24, 0b00000000

Das lässt sich, aus mir nicht verständlichen Gründen nicht kompilieren 
(im AVR Studio 4)
Die Operationen mit den Registern r9 bis r15 sind wohl so nicht möglich 
(error: invalid register)
Aber wieso? Und wie krieg ich die Daten sonst da rein? Ich dachte mit 
den 32 general purpose working registers kann ich anstellen was ich 
will? Also dass es keine Unterschiede zwischen denen gibt.

von spess53 (Gast)


Lesenswert?

Hi

r0...r15 lassen sich nicht mit 'ldi' laden. Das geht nur mit 'mov':
1
  ldi r16,0b00000000
2
  mov r9,r16

MfG Spess

von Steffen (Gast)


Lesenswert?

Alles klar, vielen Dank spess.
Kannst du mir vielleicht auch erklären wieso das so ist? Oder ist es 
eine " Die Architektur ist halt so, nimm es hin" Sache?

von *kopfkratz* (Gast)


Lesenswert?

Steffen schrieb:
> Kannst du mir vielleicht auch erklären wieso das so ist?

Lese dazu im datasheet zum 2313, dann wirst Du schlauer.
Alle Infos zum Proggrammieren findest Du dort.
Du musst Dich eh wenn Du mit µC weitermachen willst ins datasheet 
schauen.

Gruß

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag: Mit 'clr rX' oder 'ser rX' lassen sich die unteren 16 Register 
löschen oder auf $FF setzen.

>Ich dachte mit
>den 32 general purpose working registers kann ich anstellen was ich
>will? Also dass es keine Unterschiede zwischen denen gibt.

Das heisst doch nicht, das es keine Unterschiede gibt. Einige Befehle 
funktionieren sogar nur für r24...r31.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

@Autor: kopfkratz (Gast)

Das steht ausnahmsweise nicht im Datenblatt sondern im Instruction 
Set:

http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

MfG Spess

von *kopfkratz* (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
> @Autor: kopfkratz (Gast)
>
> Das steht ausnahmsweise nicht im Datenblatt sondern im Instruction
> Set:
>
> http://www.atmel.com/dyn/resources/prod_documents/...
>
> MfG Spess

Sorry, mia culpa, die meine ich aber...
da steht alles drin, die Bedeutung, die Unterschiede, usw...
Damit sollte man sich auseinandersetzen...

danke

Gruß

von Klaus 2. (klaus2m5)


Lesenswert?

spess53 schrieb:
> Nachtrag: Mit 'clr rX' oder 'ser rX' lassen sich die unteren 16 Register
> löschen oder auf $FF setzen.

Ha! Erwischt - ser rX ist nichts anderes als ein ldi rX,0xff und geht 
damit auch nur für r16-r31. Warum überhaupt ser im instruction manual 
steht, weiß nur Herr Atmel persönlich.

Ersatzweise geht clr rX und dec rX.

von Herr M. (herrmueller)


Lesenswert?

Steffen schrieb:
> Kannst du mir vielleicht auch erklären wieso das so ist? Oder ist es
> eine " Die Architektur ist halt so, nimm es hin" Sache?


Da bei Immediate 'direkt Ladebefehlen' der Operand (8Bit) komplett mit 
im (16Bit)Op Code enthalten ist, bleiben nur noch 4 Bit für das Register 
übrig. Also nur 16 Register.

zB: LDI R17,$56

ldi  5     R17  6
1110 KKKK dddd KKKK

1110 0101 0001 0110
E    5    1    6



herrmueller

von Peter R. (pnu)


Lesenswert?

Der Befehl ldi verwendet im Maschinencode 4 bit im ersten Byte, 4 bit im 
zweiten Byte. Für das Argument des Befehls ldi,rn , die Registernummer, 
stehen daher nur 4 bit zur Verfügung, also 16 Möglichkeiten. Die sind 
eben den Registern 16 bis 31 zugeordnet.
Ganz Genaues siehe: AVR instruction set, Aufbau des opcode für ldi.

Es gibt dann noch andere( Meist ...i - Befehle) die nur vier bit als 
Argument zulassen, also erst ab Nr.16 .

Deshalb ist es etwas geschummelt, wenn 32 "Allzweck-Register" genannt 
werden, 16 davon sind in bezug auf den Befehlssatz etwas verkrüppelt.

von spess53 (Gast)


Lesenswert?

Hi

>Deshalb ist es etwas geschummelt, wenn 32 "Allzweck-Register" genannt
>werden, 16 davon sind in bezug auf den Befehlssatz etwas verkrüppelt.

Eigentlich sind es mehr (verkrüppelte). ADIW und SBIW gehen nur mit den 
Registerpaaren r25:r24 ... r31:r30.
Aber wenn man, wie ich, vom Z80 kommt ist die Registerausstattung der 
AVRs schon recht üppig. Mit den paar kleinen kann man leben.

MfG Spess

von Hannes L. (hannes)


Lesenswert?

All diese Infos gibt es auch in der Online-Hilfe (F1) des AVR-Studios.

spess53 schrieb:
> Aber wenn man, wie ich, vom Z80 kommt

Mit dem Z80 warst Du aber schon ganz schön verwöhnt. Beim 6502 (7501, 
Commodore Plus/4) gab's nur Akku, X und Y, aber die Zeropage hat das 
wieder wett gemacht...

> ist die Registerausstattung der
> AVRs schon recht üppig. Mit den paar kleinen kann man leben.

Das meine ich auch.

...

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.