Forum: Mikrocontroller und Digitale Elektronik AVR MEGA88 LCD S65 lcd.asm Assembler Problem


von Avr N. (balze)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

zuerst einmal: Ich bin ein Novize, moechte mich aber trotz meines 
Methusalem (kurz vor seinem Tod) gleichen Alters, zum Spass mit den AVRs 
rumaergern.

Die ersten Gehversuche habe ich erfolgreich hinter mich gebracht. (In C)
Jetzt moechte ich gerne ein S65 (LS020..) Display ansprechen.

Ich habe mir hierzu jetzt alles moegliche (und unmoergliche :) hier im 
Forum durchgelesen und wollte mal mit dem simple.c von Christian Kranz 
anfangen.
Leider ist hier ein (fuer mich als Assembler Jungfrau) nicht so simples 
lcd.asm enthalten, dass mir WinAVR nach ausfuehren des makefiles von 
Christian um die Ohren haut.

Ich habe im Makefile nur das Target auf MEGA88 geaendert und die Ports 
von MEGA128 nach MEGA88 transferiert.

Nach Ausfuehren des makefiles bekomme ich folgende Meldung (nur wenn ich 
als Target MEGA88 ausgewaehlt habe)

Assembling: lcd.asm
avr-gcc -c -mmcu=atmega88 -I. -x assembler-with-cpp 
-Wa,-adhlns=lcd.lst,-gstabs  lcd.asm -o lcd.o
lcd.asm: Assembler messages:
lcd.asm:108: Error: illegal opcode call for mcu atmega88
lcd.asm:219: Error: number must be less than 32
lcd.asm:222: Error: number must be less than 32
make: *** [lcd.o] Error 1

Als Assembler-Unwissender komme ich hiermit leider nicht zurecht.

Ich wuerde mich sehr freuen, wenn mir jemand dabei behilflich ist dieses 
Problem zu beseitigen (und mir vielleicht noch erklaert, was das Problem 
ist. Ich habe in den genannten Zeilen jedenfalls kein Problem erkennen 
koennen, was aber nix zu bedeuten haben muss :).

Vielen Dank, mfG,

Balze

von Stephan H. (stephan-)


Lesenswert?

ich komme zwar nicht aus der AVR Ecke aber für diesen Fall ist es egal,


zeile 108:      call    port_init_io    ;init SPI
Den Befehl "Call" gibt es offensichtlich nicht
Hier muß "RCALL" stehen

Zeile 219/222
Nummer /Zahlen müssen kleiner als 32 sein

von Avr N. (balze)


Lesenswert?

Hallo Stephan, danke fuer die schnelle Antwort.

> zeile 108:      call    port_init_io    ;init SPI
> Den Befehl "Call" gibt es offensichtlich nicht
> Hier muß "RCALL" stehen

Warum laesst es sich dann uebersetzen, wenn ich als Target den MEGA128 
(wie urspruenglich von C. Kranz vorgesehen) im makefile einsetze ?
Der Assembler bleibt doch der selbe !(?)

> Zeile 219/222
> Nummer /Zahlen müssen kleiner als 32 sein

Danke fuer diesen Hinweis ;-) Das habe ich mir schon gedacht. Hier 
stehen aber doch nur Register und Konstanten, oder?

Zeile 219:
    sbi SPCR,SPE        ;enable SPI
Zeile 222;
    sbis    SPSR,SPIF

Ahhhh, jetzt habe ich den Hinweis gefunden, glaube ich.
SBIS und SBI funktionieren beim MEGA88 nur bei den Registern 0x00 - 0x1F 
(0d31 :)

Also ersetze ich SBIS durch SBRS und SBI Durch SBR ?

Nee, geht auch nicht.

Assembling: lcd.asm
avr-gcc -c -mmcu=atmega88 -I. -x assembler-with-cpp 
-Wa,-adhlns=lcd.lst,-gstabs  lcd.asm -o lcd.o
lcd.asm: Assembler messages:
lcd.asm:108: Error: illegal opcode call for mcu atmega88
lcd.asm:219: Error: number must be less than 32
lcd.asm:219: Error: register name or number from 0 to 31 required
lcd.asm:222: Error: number must be less than 32
lcd.asm:222: Error: register name or number from 0 to 31 required
make: *** [lcd.o] Error 1

Interessant ist, das beim Mega88 die Register SPCR (0x2C) und SPSR 
(0x2E) ausserhalb dieser 0x1F Grenze liegen, im Datenblatt aber dies 
steht (Seite 166)

sbis SPSR,SPIF

Kommt mir irgenwie bekannt vor.

Voellig verwirrte Gruess,

Balze

von Stephan H. (stephan-)


Lesenswert?

tja dann muss wohl doch einer von den AVR´lern ran.
Evtl gibts den Call ja beim 128er..... Datenblatt.
Es kann aber auch sein das der Aufruf zu weit "weg" ist.
zB. über 128 Byte
..evtl hilft nen "Zwischensprung"

Tja für das andere musst Du Dir wohl nen anderen Speicherplatz suchen.
Wenn bei 1Fh Schluss ist...

von Avr N. (balze)


Lesenswert?

Hallo nochmal,

Stephan Henning wrote:
> zeile 108:      call    port_init_io    ;init SPI
> Den Befehl "Call" gibt es offensichtlich nicht
> Hier muß "RCALL" stehen

Du hast Recht!

Fussnote 1. an der Instruktion call: :(
(Aus dem Datenblatt der mega48/88/168)
1.  These instructions are only available in ATmega168.

Jetzt habe ich nur noch das SBIS/SBI Problem

Assembling: lcd.asm
avr-gcc -c -mmcu=atmega88 -I. -x assembler-with-cpp 
-Wa,-adhlns=lcd.lst,-gstabs  lcd.asm -o lcd.o
lcd.asm: Assembler messages:
lcd.asm:219: Error: number must be less than 32
lcd.asm:223: Error: number must be less than 32
make: *** [lcd.o] Error 1
Build failed with 2 errors and 0 warnings...

MfG,

Balze

von Avr N. (balze)


Lesenswert?

Nochmal ich,

kann es sein, dass man sbi nicht direkt durch sbr ersetzen kann und 
einen umweg ueber ein Register machen muss?

Koennte mir jemand bestaetigen, dass es so (s.u.) funktioniert !?!

Es laesst sich so immerhin ohne Fehler uebersetzen.

statt
1
sbi SPCR,SPE

jetzt
1
lds R28,SPCR
2
sbr R28,SPE

statt
1
sbis    SPSR,SPIF

jetzt
1
lds R28,SPSR
2
sbrs R28,SPIF


MfG,

balze

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

ja das geht, habe auch noch keine Elegantere Methode gefunden.

von Jean P. (fubu1000)


Lesenswert?

Hi,
Die im Projekt genutzten Assembler-Dateien werden hinter ASRC durch 
Leerzeichen getrennt aufgelistet. Assembler-Dateien haben immer die 
Endung .S (großes S). Haste du das schon gemacht?

Ansonsten übersetzt doch einfach die ASM Datei in C um.

Gruß

von Avr N. (balze)


Lesenswert?

Danke fuer die Antworten,

das ASM Dateien die Endung .S haben sollen habe ich auch schon gelesen, 
bereitet aber auch mit .asm im makefile keinerlei erkennbare Probleme.

MfG,

Balze

von Avr N. (balze)


Lesenswert?

Und schonwieder ich,

So ist es erst richtig, oder?

statt
1
sbi SPCR,SPE

jetzt
1
lds R28,SPCR
2
sbr R28,(1<<SPE)

da sbi Bitnummer und sbr Bitmaske verwendet, richtig?

(Gibt es bei sbr etwas aehnliches zu bedenken?)

THX,

MfG,

balze

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

im AVR Studio F1 drücken da kommt die assemblerhilfe da steht was 
welcher Befehl braucht meist sogar mit Beispiel.

von Avr N. (balze)


Lesenswert?

80

da staun ich nicht schlecht. DARAUF bin ich nun wirklich nicht gekommen.
Das naheliegendste kommt irgendwie immer zum Schluss :)

THX,

Balze

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.