mikrocontroller.net

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


Autor: I.c.h (Gast)
Datum:

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

Autor: Prf.Dr.Schlau (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Prof.Dr.Schlau (Gast)
Datum:

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

Autor: I.c.h (Gast)
Datum:

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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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)
.macro  ldiw  ;16-Bit Adresse aus EEProm / Ram laden
  ldi  @0L,low(@1)
  ldi  @0H,high(@1)
.endmacro
.macro  ldiw_m  ;16-Bit Adresse aus FLASH laden
  ldi  @0L,low(@1*2)
  ldi  @0H,high(@1*2)
.endmacro

Sascha

Autor: Hc Zimmerer (mizch)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: I.c.h (Gast)
Datum:

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

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.