www.mikrocontroller.net

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


Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
4    LDI r16 , RAMEND 
5    OUT SPH , r16 
gibt mir die fehlermeldung aus:
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!!!

Autor: Artur Lauk (arser05)
Datum:

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

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja das ist ja das dumme: soweit war ich bereits nur erhalte ich für:
4      ldi r16 , high(RAMEND) 
die fehlermeldung:
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!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi r16 , high(RAMEND)
->
ldi r16 , hi8(RAMEND)

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

von welchem Assembler ist denn eigentlich die Rede?

Gruß aus Berlin
Michael

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gcc-asm

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ sternst

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Andreas W. (andiw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok das sph bzw spl beispiel verwirrt nur unnötig.
Ich hab jetzt nochmals einen anderen versuch gestartet:
1 .include "/usr/avr/include/avr/iom32.h"
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
8
Es ist das beispiel aus dem Tutorial. und ich erhalte:
avr-gcc -mmcu=atmega32 -o0 -c programm1.s -o programm1.o
programm1.s:Assembler messages:
programm1.s:3:Error:constant value required
programm1.s:5:Error:constant value required
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?

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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.