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
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
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
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...
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
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
jetzt
1 | lds R28,SPCR
| 2 | sbr R28,SPE
|
statt
jetzt
1 | lds R28,SPSR
| 2 | sbrs R28,SPIF
|
MfG,
balze
ja das geht, habe auch noch keine Elegantere Methode gefunden.
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ß
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
Und schonwieder ich,
So ist es erst richtig, oder?
statt
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
im AVR Studio F1 drücken da kommt die assemblerhilfe da steht was
welcher Befehl braucht meist sogar mit Beispiel.
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.
|