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
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).
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
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.
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?
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
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?)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.