Forum: Mikrocontroller und Digitale Elektronik Fehlermeldungen beim Assemblieren (ATmega8)


von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo allerseits,

ich wollte mal dieses Assembler-Programm

http://www.mikrocontroller.net/wikifiles/e/e6/Dds.asm

mittels AVR-Studio kompilieren und dachte, es müßte bei einem 
vorgefertigten Programm doch glatt gehen - und habe gleich eine
Fehlermeldung erhalten:


AVRASM: AVR macro assembler 2.1.42 (build 1796 Sep 15 2009 10:48:36)
Copyright (C) 1995-2009 ATMEL Corporation

C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(37): Including file 
'C:\Programme\Atmel\AVR
Tools\AvrAssembler2\Appnotes\m8def.inc'
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(79): warning: Register r28 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(80): warning: Register r29 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(81): warning: Register r30 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(91): warning: Register r21 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(92): warning: Register r22 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(96): warning: Register r26 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(97): warning: Register r27 already defined 
by the .DEF directive
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(121): error: syntax error, unexpected ','
C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(488): info: macro 'locate' called here




    ;LCD-Cursor an bestimmte Position setzen
    .MACRO locate ;(Zeile,Spalte)
          push temp1
(line 121)-->>> ldi temp1, 0b10000000|(((@0)-1)<<6)|((@1)-1)  ; load 
immediate eine Konstante aus Oder-Verknüpfung
          rcall lcd_command
          pop temp1
    .ENDMACRO

das andere sind alles Warnungen:
.def        z1           = R28            ; Dieses Registertripel 
enthält die Phasenposition
.def        z2           = R29            ; zu der die Register changeX 
bei der Phasenakk.
.def        z3           = R30            ; addiert werden

.def        waveform     = R20            ; eingestellte Wellenform
                                          ; (Sinus, Rechteck, Dreieck 
oder Sägezahn)

; Register für die Binär nach Dezimal-Wandlung
.def        fbin0        = R6             ; binary value byte 0 (LSB)
.def        fbin1        = R7             ; binary value byte 1
.def        fbin2        = R21            ; binary value byte 2
.def        fbin3        = R22            ; binary value byte 3 (MSB)
.def        tBCD0        = R21            ; BCD value digits 1 and 0 
(same as fbin2)
.def        tBCD1        = R22            ; BCD value digits 3 and 2 
(same as fbin3)
.def        tBCD2        = R23            ; BCD value digits 4 and 5
.def        tBCD3        = R24            ; BCD value digits 6 and 7
.def        tBCD4        = R25            ; BCD value digits 8 and 9
.def        fbinL        = R26            ; binary value Low byte
.def        fbinH        = R27            ; binary value High byte
_________

Wenn ich nun in m8def.inc hinein schaue, sind einige aber nicht alle der 
angemeckerten Register bereits definiert:
OK, das sind die aus der Literatur bekannten Doppelregister, die auch 
als Zeiger dienen können.

; ***** CPU REGISTER DEFINITIONS 
*****************************************
.def  XH  = r27
.def  XL  = r26
.def  YH  = r29
.def  YL  = r28
.def  ZH  = r31
.def  ZL  = r30

Da meine letzten Übungsprogramme in Assembler bald ihr zehnjähriges 
Bestehen auf meinen Datenträgern feiern, ist mir die

Fehlersuche in Assemblerprogrammen nicht mehr so sehr geläufig.
Früher habe ich für kleinere Programme den WAVRASM verwendet. Mit 
AVR-Studio ist es mein erstes Asm-Projekt. Ich wäre für Tipps dankbar.

Mit freundlichem Gruß
Röhrenvorheizer

von oldmax (Gast)


Lesenswert?

Hi
Ja, die lange Liste von Meldungen müssen schon verwirrend sein, aber 
Lesen hilft.
Da sind Warnungen, die darauf hindeuten, das du bereits definierte 
Register umdefiniert hast. Es sind halt Warnungen, nicht mehr. 
Entscheidend ist dies:
>C:\Dokumente und Einstellungen\erster\Eigene
>Dateien\dds_mega8_mit_LCD.asm(121): error: syntax error, unexpected ','

Das Wort "Error" deutet auf einen Fehler hin und es steht auch da, wie 
dieser Fehler aussieht.
"unexpected ','" ist nichts anderes wie "unerwartetes Komma". Das 
solltest du wohl finden.

Gruß oldmax

von chris (Gast)


Lesenswert?

> .def  XH  = r27
> .def  XL  = r26
> .def  YH  = r29
> .def  YL  = r28
> .def  ZH  = r31
> .def  ZL  = r30

die sind doch eh schon in der AVR-INC deklariert also warum nochmal in 
deinem Programm extra ?

von spess53 (Gast)


Lesenswert?

Hi

Das gab es schon mal:

Beitrag "Frage zu DDS, von Andreas Schwarz"

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>Das Wort "Error" deutet auf einen Fehler hin und es steht auch da, wie
>dieser Fehler aussieht.
>"unexpected ','" ist nichts anderes wie "unerwartetes Komma". Das
>solltest du wohl finden.

Das gemeine daran ist, das der Fehler nicht dort liegt. Der Fehler wird 
durch die Klammern im Unterprogramm 'update' erzeugt:
1
update:
2
        locate (1,1)         <<<<<<<
3
        mov temp1, waveform
4
        rcall printstring
5
        locate (2,1)         <<<<<<<

Mit
1
update:
2
        locate 1,1         <<<<<<<
3
        mov temp1, waveform
4
        rcall printstring
5
        locate 2,1         <<<<<<<

funktionert es auch im Assembler2.

MfG Spess

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo allerseits,

vielen Dank für die Beiträge. Nun sehe ich mich in meiner Vermutung 
bestätigt, daß es sich um ein nicht ganz triviales Problem handelt, denn 
warum sollte das Komma an dieser Stelle unerwartet sein?! Wieder einmal 
ist ein Kompatibilitätsproblem zwischen alten und neuen Schreibwseisen 
für alte und neuere Compiler-/ Assembler-Versionen. Gerade kürztlich 
hatte ich mit der RC5-Geschichte von Peter Dannegger gekämpft, in der 
die Variable, die den Wert von der Interrupütroutine an das 
Hauptprogramm übergibt, als Volatile deklariert sein muß, was aber bei 
der alten Compilerversion nicht nötig war. Natürlich steht überall, daß 
so eine Variable "volatile" sein muß, nur wenn man vorgefertigte 
Programme übernimmt, denkt man daran nicht.

"
Der Fehler lag im Detail...

Anstatt

extern uint rc5_data;        //RC5 Ergebnis

muss es

extern volatile uint rc5_data;        //RC5 Ergebnis

heißen."
__________________________________________________________

AVR-Studio umgestellt auf AVR-Assembler Version1 unter Beibehaltung der 
Klammern ergibt folgendes erfolgreich Assemblierte Programm:

AVRASM: AVR macro assembler version 1.77.3 (Nov  3 2009 14:11:39)
Copyright (C) 1995-2005 ATMEL Corporation


Assembling 'C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm'
Including  'C:\Programme\Atmel\AVR 
Tools\AvrAssembler\Appnotes\m8def.inc'
dds_mega8_mit_LCD.asm(81) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(82) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(83) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(93) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(94) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(98) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(99) : warning : Register already defined by the 
.DEF directive

Program memory usage:
Code             :  409 words
Constants (dw/db):  256 words
Unused           :  226 words
Total            :  891 words

Assembly complete with no errors.
______________________________________________________________________ 
_
"Das gemeine daran ist, das der Fehler nicht dort liegt. Der Fehler wird
durch die Klammern im Unterprogramm 'update' erzeugt:"

Aha, das ist der Aufruf eines Macros, an das die alte Version die 
Argumente mit Klammern übergeben haben möchte.

So, nun mal ohne die Klammern Assembliert mit Version1:

AVRASM: AVR macro assembler version 1.77.3 (Nov  3 2009 14:11:39)
Copyright (C) 1995-2005 ATMEL Corporation


Assembling 'C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm'
Including  'C:\Programme\Atmel\AVR 
Tools\AvrAssembler\Appnotes\m8def.inc'
dds_mega8_mit_LCD.asm(81) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(82) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(83) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(93) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(94) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(98) : warning : Register already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(99) : warning : Register already defined by the 
.DEF directive

Program memory usage:
Code             :  409 words
Constants (dw/db):  256 words
Unused           :  226 words
Total            :  891 words

Assembly complete with no errors.

___________________________________________

Und ohne die Klammern klappt's auch mit Version2:

AVRASM: AVR macro assembler 2.1.42 (build 1796 Sep 15 2009 10:48:36)
Copyright (C) 1995-2009 ATMEL Corporation

C:\Dokumente und Einstellungen\erster\Eigene 
Dateien\dds_mega8_mit_LCD.asm(39): Including file 
'C:\Programme\Atmel\AVR

Tools\AvrAssembler2\Appnotes\m8def.inc'
dds_mega8_mit_LCD.asm(81): warning: Register r28 already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(82): warning: Register r29 already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(83): warning: Register r30 already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(93): warning: Register r21 already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(94): warning: Register r22 already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(98): warning: Register r26 already defined by the 
.DEF directive
dds_mega8_mit_LCD.asm(99): warning: Register r27 already defined by the 
.DEF directive

ATmega8 memory use summary [bytes]:
Segment   Begin    End      Code   Data   Used    Size   Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x0006f6    818    512   1330    8192  16.2%
[.dseg] 0x000060 0x000060      0      0      0    1024   0.0%
[.eseg] 0x000001 0x00002d      0     44     44     512   8.6%

Assembly complete, 0 errors. 7 warnings


Danke für die Tipps, wieder was gelernt!!! Die Klammern hätte ich nie 
gefunden...

Gruß Roehrenvorheizer

von Spess53 (Gast)


Lesenswert?

Hi

>Wieder einmal
>ist ein Kompatibilitätsproblem zwischen alten und neuen Schreibwseisen
>für alte und neuere Compiler-/ Assembler-Versionen.

Nein. Ich benutze Das AVR Studio seit Version 2.xy. Die korrekte 
Übergabe der Parameter an Makros war schon immer ohne Klammern. Der 
Fehler liegt eigentlich bei den älteren Assemblern, die auch die 
Schreibweise mit Klammern akzeptieren.

MfG Spess

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.