Forum: Mikrocontroller und Digitale Elektronik AVR-ASM-Makro will nicht


von I.c.h (Gast)


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

von Prf.Dr.Schlau (Gast)


Lesenswert?

Hi,
du übergibst dem Macro einen String statt einer Adresse (z.B. die 
Adresse im EEPROM, SRAM, etc., wo er den gewünschten String findet).

von spess53 (Gast)


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

von Prof.Dr.Schlau (Gast)


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.

von I.c.h (Gast)


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?

von Sascha W. (sascha-w)


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

von Hc Z. (mizch)


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?)

von spess53 (Gast)


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

von I.c.h (Gast)


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

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.