www.mikrocontroller.net

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


Autor: Avr Noob (balze)
Datum:
Angehängte Dateien:

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

Autor: Stephan Henning (stephan-)
Datum:

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

Autor: Avr Noob (balze)
Datum:

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

Autor: Stephan Henning (stephan-)
Datum:

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

Autor: Avr Noob (balze)
Datum:

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

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht 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
sbi SPCR,SPE

jetzt
lds R28,SPCR
sbr R28,SPE

statt
sbis    SPSR,SPIF

jetzt
lds R28,SPSR
sbrs R28,SPIF


MfG,

balze

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das geht, habe auch noch keine Elegantere Methode gefunden.

Autor: Jean Player (fubu1000)
Datum:

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

Autor: Avr Noob (balze)
Datum:

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

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und schonwieder ich,

So ist es erst richtig, oder?

statt
sbi SPCR,SPE

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

da sbi Bitnummer und sbr Bitmaske verwendet, richtig?

(Gibt es bei sbr etwas aehnliches zu bedenken?)

THX,

MfG,

balze

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Avr Noob (balze)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
80

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

THX,

Balze

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.