OUT SPH , r16 -> Constant value required

Gast #937354
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
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
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
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
> 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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.