Forum: Compiler & IDEs OUT SPH , r16 -> Constant value required


von Andreas W. (Gast)


Lesenswert?

Ich hab nach diesem Posting:
Beitrag "m8def.inc << hab ich nicht oder nicht korrekt. assembler"
und langem suchen erstmal die Brocken hingeschmissen und mich wieder 
stärker mit der µc freien Elektronik befasst. aber irgendwie lässt mich 
so ein kleiner "alleskönner" nicht in ruhe. Jetzt hab ich alles wieder 
ausgegraben und auch tatsächlich passende Definitionsdateien gefunden 
*jippie!*

als ich jedoch ein ganz einfaches kleines asm Programm assemblieren 
lassen möchte:

hier zeile 4 und 5:
1
4    LDI r16 , RAMEND 
2
5    OUT SPH , r16
gibt mir die fehlermeldung aus:
1
programm1.s:5:Error:constant value required

Ich steh irgendwie aufm schlauch... wieso??  RAMEND schluckt er aber SPH 
nicht oder seh ich da was falsch? Wo #zensierte flüche# liegt mein 
fehler?



ok ein bissel schiss hab ich jetzt schon ich hab nämlich das gefühl den 
wald vor lauter bäumen nicht zu sehen... nun ja Hilfe!!!

von Artur L. (arser05)


Lesenswert?

Hi,

RAMEND ist zwei Byte lang. Also wird in SPH das HIGH-Byte geladen und in 
SPL das LB.
Also für SPH:
LDI r16 , High(RAMEND)
für SPL:
LDI r16 , LOW(RAMEND)

von Andreas W. (Gast)


Lesenswert?

tja das ist ja das dumme: soweit war ich bereits nur erhalte ich für:
1
4      ldi r16 , high(RAMEND)
die fehlermeldung:
1
program1.s:4:Error:garbage at end of line

ist übrigens nur ein testprogramm ohne eigentliche funktion... in einer 
zeile weiter unten frisst gcc-asm scheinbar auch den DDRA-Port nicht...
mal morgen nochmal drüberguggen... gute nacht!

von Stefan E. (sternst)


Lesenswert?

ldi r16 , high(RAMEND)
->
ldi r16 , hi8(RAMEND)

OUT SPH , r16
->
OUT _SFR_IO_ADDR(SPH) , r16

von Michael U. (amiga)


Lesenswert?

Hallo,

von welchem Assembler ist denn eigentlich die Rede?

Gruß aus Berlin
Michael

von Andreas W. (Gast)


Lesenswert?

gcc-asm

von Andreas W. (Gast)


Lesenswert?

@ sternst

_SFR_IO_ADDR(SPH) <-- müsste das nicht durch die iom32.h datei eingefügt 
werden?

von Stefan E. (sternst)


Lesenswert?

Andreas W. wrote:

> _SFR_IO_ADDR(SPH) <-- müsste das nicht durch die iom32.h datei eingefügt
> werden?

Ich weiß nicht, was mir dieser Satz jetzt sagen soll.

Die Register-Definitionen in den IO-Headern sind so gestaltet, dass man 
sie direkt in C verwendet kann. In Assembler braucht man halt das Makro 
_SFR_IO_ADDR.
Die Details stehen recht ausführlich in der Dokumentation der AVR-Libc.

von Andreas W. (andiw)


Lesenswert?

ok das sph bzw spl beispiel verwirrt nur unnötig.
Ich hab jetzt nochmals einen anderen versuch gestartet:
1
1 .include "/usr/avr/include/avr/iom32.h"
2
2   ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
3
3   out DDRB, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
4
4   ldi r16, 0b11111100 ; 0b11111100 in r16 laden
5
5   out PORTB, r16      ; r16 ins IO-Register PORTB ausgeben
6
6  ende:
7
7   rjmp ende           ; Sprung zur Marke "ende" -> Endlosschleife
8
8
Es ist das beispiel aus dem Tutorial. und ich erhalte:
1
avr-gcc -mmcu=atmega32 -o0 -c programm1.s -o programm1.o
2
programm1.s:Assembler messages:
3
programm1.s:3:Error:constant value required
4
programm1.s:5:Error:constant value required
5
Error(s) occurred: The exit status was 1.
eigentlich müsste doch nur z.b. das DDRB durch 0x17 ersetzt werden (wenn 
ich das von Hand einfüge erhalte ich an dieser stelle keinen Fehler mehr 
- das kann's jedoch nicht sein?)

Ich benutze Kontrollerlab mit avr-gcc-assembler. Muss ich da im 
Kontrollerlab/Programmlisting vill etwas einstellen/angeben von dem ich 
noch nichts weis? (Anmerkung: in c hab ich bereits einen binärzähler 
über alle 4 ports in einen mega32 gebrannt der auch schön 32 Leds 
blinken lässt jede halb so schnell wie die rechts daneben;-). Aber ich 
will in Assembler programmieren denn c kann ich kaum jedenfals halte ich 
mich in Assembler für etwas besser...)

ja - hilfe!

@sternst

soll das heissen das ich das makro: "_SFR_IO_ADDR" IMMER??? brauche wenn 
ich etwas in ein Register mit Namen statt mit Adresse 
ansprechen/beschreiben will?

von Stefan E. (sternst)


Lesenswert?

> eigentlich müsste doch nur z.b. das DDRB durch 0x17 ersetzt werden

Wird es aber nicht, weil du dann in C nicht schreiben könntest:
DDRB = 0x0f;

> soll das heissen das ich das makro: "_SFR_IO_ADDR" IMMER??? brauche wenn
> ich etwas in ein Register mit Namen statt mit Adresse
> ansprechen/beschreiben will?

Nein, das hängt davon ab, wie du auf das Register zugreifst.
Bei IN und OUT aber z.B. immer.

von Simon K. (simon) Benutzerseite


Lesenswert?

GCC-ASM und AVRASM (Tutorial) sind nicht Syntaxkompatibel.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

LOL

>2   ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
>3   out DDRB, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
>4   ldi r16, 0b11111100 ; 0b11111100 in r16 laden
>5   out PORTB, r16      ; r16 ins IO-Register PORTB ausgeben
>6  ende:
>7   rjmp ende           ; Sprung zur Marke "ende" -> Endlosschleife

Ist das nach dem Strichpunkt die deutsche Übersetzung der Mnemonics???
Das sind Pseudo-Kommentare: Keinerlei wirkliche Aussagekraft...

Dass der Bithaufen nach PORTB geladen wird, ist bereits vor dem 
Strichpunkt zu erkennen. Weshalb gerade die Bits 0+1 nicht gesetzt sind, 
das wäre interessant zu wissen und damit ein sinnvoller Kommentar.

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.