OUT SPH , r16 -> Constant value required

Gast #937354
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!!!
Gast #937381
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!
#937572
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.
#937634
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?
#937644
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.
Moderator (Firma: Titel) Persönliche Seite #939270
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren