AVR-ASM-Makro will nicht

Gast #1875364
Lesenswert?

Morgen zusammen,

ich bin gerade am Versuchen, ein Makro in AVR ASM zum laufen zu bringen.
Hier erst mal der Code:
Functions.asm:

.MACRO SetZPtr ;(Adresse)
        ldi     ZL, LOW(@0)
        ldi     ZH, HIGH(@0)
.ENDMACRO

Main.asm:

.include "m8def.inc"
.include "Functions.asm"
.include "Data.asm"

.def temp = r16
.def param = r17


;.org 0x0000          ; Reset Handler
;  rjmp boot


boot:
  ldi temp, low(ramend)
  out SPL, temp
  ldi temp, high(ramend)
  out SPH, temp      ; Stackpointer initalisieren

  ldi temp, high(UBRR_VAL)
  out UBRRH, temp
  ldi temp, low(UBRR_VAL)
  out UBRLL, temp      ; Baudrate einstellen

  ldi temp, (1<<URSEL)|(3<<UCSZ0)
  out UCSRC, temp      ; Frameformat auf 8 Bit

  sbi UCSRB, TXEN      ; Senden (TX) aktivieren
  sbi UCSRB, RXEN      ; Empfangen (RX) aktivieren

  SetZPtr boot_usart
  rcall Send_StringF
  SetZPtr boot_ok
  rcall Send_StringF

Und Data.asm:

boot_usart: .db  "USART...................",0
boot_ok: .db "OK",10,13,0

Das Makro habe ich von einem Artikel in Mikrocontroller.net übernommen, 
also nehme ich mal an, dass hier alles stimmt.
Ach ja Fehlermeldung:
....asm(38): error: SetZPtr: Unknown instruction or macro
....asm(38): error: boot_usart: Unknown instruction or macro
....asm(40): error: SetZPtr: Unknown instruction or macro
....asm(40): error: boot_ok: Unknown instruction or macro

Wisst Ihr was da los ist, bzw. wie ich die Fehlermeldung weg bekomme?


Danke im Vorraus

I.c.h
Gast #1875367
Lesenswert?

Hi

Irgendwie passen die Fehlermeldungen nicht zu deinem Programm. Aber 
'.include "Data.asm"' gehört nicht an den Anfang der main.asm. In deinem 
Programm steht

boot_usart: .db  "USART...................",0

an der Stelle des Reset-Vektors. Also beim Programmstart fängt der 
Controller dort an.

MfG Spess
Gast #1875372
Lesenswert?

Soll der .org 0x0000 nur ein Kommentar sein: Semikolon davor.?
Um einen String zu laden bedient man sich:
ldi    ZL,     (boot_usart*2)
ldi    ZH,    (boot_usart*2)

also ldi ZL, (@0*2)
Ein Macro macht aber in dem Programm einfach keinen Sinn.
Gast #1876288
Lesenswert?

Danke schon mal für den Hinweis mit der "Data.asm".
@Prof.Dr.Schlau:
Ich habe mir das so gedacht, dass ich dem Makro den String übergebe und 
der den in die Klammern einsetzt.
Geht das oder kann ich wirklich nur Adressen übergeben?
#1876304
Lesenswert?

was heist hier String - das ist ja eine Marke

also ich verwende schon seit Jahren die Makros (bei denen ich auch noch 
das Zielregister angeben kann)
1
.macro  ldiw  ;16-Bit Adresse aus EEProm / Ram laden
2
  ldi  @0L,low(@1)
3
  ldi  @0H,high(@1)
4
.endmacro
5
.macro  ldiw_m  ;16-Bit Adresse aus FLASH laden
6
  ldi  @0L,low(@1*2)
7
  ldi  @0H,high(@1*2)
8
.endmacro

Sascha
#1876397
Lesenswert?

Ich habe das mal lokal (mit den nötigsten Modifikationen, damit es 
durchläuft) abgespeichert und durch avrasm2.exe laufen lassen.  Mit 
Ausnahme von UBRLL (undefined symbol, gibt es ja wirklich nicht) klappt 
das.  Der Macro macht jedenfalls keine Probleme.

Der Fehler liegt vermutlich in den Zeilen, die Du nicht gezeigt hast 
(Macroende vergessen?)
Gast #1876423
Lesenswert?

Hi

>Der Fehler liegt vermutlich in den Zeilen, die Du nicht gezeigt hast
>(Macroende vergessen?)

Das habe ich ihm schon heute früh geschrieben:

>Irgendwie passen die Fehlermeldungen nicht zu deinem Programm.

MfG Spess
Gast #1876563
Lesenswert?

Hi nochmal,

ich habs jetzt hinbekommen. :)
Also: 1.) Hatte ich einen Tippfehler in meiner UART-Ausgabe. Es hieß 
nicht Send_StringF sondern Send_String_F (sorry! Wahrscheinlich war ich 
noch nicht wach als ich den Code geschrieben habe.)
2.) Habe ich das Makro in eine extra Datei gepackt und am Anfang der 
Hauptdatei eingebunden. Die Funktionen und die Daten ans Ende (danke 
nochmal für den Hinweis).
Jetzt klappts.

Vielen Dank noch mal für eure Mühe.


MfG

I.c.h

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren