Hallo Leute! Ich mache erste Gehversuche in C, arbeite das Tutorial durch und dachte zuerst, ich hätte Pkt. 18.2 "Assembler-Dateien" verstanden. Zur Prüfung meines "neuen Wissens" habe ich mir eine fertige Assembler-Datei aus den Code-Beispielen geladen (DCF77 AVR-Assemblerbaustein, Autor: Pit, Datum: 09.01.2006 19:57, Dateianhang dcf77dec.asm). Hierzu ergeben sich 2 Fragen. 1. Frage: Das Tutorial Beispiel zur Funktion superFunc ... // setze alle Pins von PortD auf Ausgang .global superFunc .func superFunc superFunc: push workreg 1ec: 0f 93 push r16 ldi workreg, ALLOUT 1ee: 0f ef ldi r16, 0xFF ; 255 out _SFR_IO_ADDR(DDRD), workreg 1f0: 01 bb out 0x11, r16 ; 17 pop workreg 1f2: 0f 91 pop r16 ret 1f4: 08 95 ret ... beginnt mit "push workreg" und endet mit "pop workreg". Das fand ich auch logisch, da die Registerwerte nach Funktionsende erhalten werden sollen. Im Programm dcf77dec.asm werden 6 Register benutzt. Trotzdem wird nichts gepusht und gepopt. Geht der Autor davon aus, daß das jeder Benutzer "barfuß" hinzufügt, macht das der Compiler automatich oder ist das "retten" der Registerinhalte nicht erforderlich? 2. Frage: Unabgängig von (1.) habe ich versucht dcf77dec.asm in ein C-Programm einzubinden. Also: dcf77dec.asm umbenannt in DCF77.S ins Makefile ASRC = DCF77.S folgendes Miniprogramm Test.c geschrieben #include <avr/io.h> extern void dcf77_init(uint8_t DCF77CT[]); //Deklarieren der init-Funktion innerhalb von dcf77.S extern void dcf77_start(uint8_t DCF77CT[]); //Deklarieren der start-Funktion innerhalb von dcf77.S int main(void) { static uint8_t DCF77CT[20]; //20 Byte im RAM anlegen, weil das DCF77.S 20 Byte benötigt dcf77_init(DCF77CT); //Aufruf der Assemblerfunktion mit Übergabe der Adresse dcf77_start(DCF77CT); } Leider wirft der Compiler massenweise Fehlermeldungen aus die sich alle auf DCF77 beziehen. Compiling: Test.c avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Test.lst -std=gnu99 -MD -MP -MF .dep/Test.o.d Test.c -o Test.o Assembling: DCF77.S avr-gcc -c -mmcu=atmega16 -I. -x assembler-with-cpp -Wa,-adhlns=DCF77.lst,-gstabs,--listing-cont-lines=100 DCF77.S -o DCF77.o DCF77.S: Assembler messages: DCF77.S:26: Error: constant value required DCF77.S:30: Error: junk at end of line, first unrecognized character is `8' DCF77.S:40: Error: constant value required DCF77.S:41: Error: constant value required DCF77.S:53: Error: junk at end of line, first unrecognized character is `1' DCF77.S:66: Error: junk at end of line, first unrecognized character is `1' DCF77.S:68: Error: junk at end of line, first unrecognized character is `2' DCF77.S:76: Error: junk at end of line, first unrecognized character is `1' DCF77.S:79: Error: junk at end of line, first unrecognized character is `2' DCF77.S:82: Error: junk at end of line, first unrecognized character is `2' DCF77.S:85: Error: junk at end of line, first unrecognized character is `2' DCF77.S:88: Error: junk at end of line, first unrecognized character is `3' DCF77.S:91: Error: constant value required DCF77.S:91: Error: register r24, r26, r28 or r30 required DCF77.S:91: Error: `,' required DCF77.S:91: Error: garbage at end of line DCF77.S:93: Error: constant value required DCF77.S:94: Error: constant value required DCF77.S:105: Error: junk at end of line, first unrecognized character is `3' DCF77.S:107: Error: junk at end of line, first unrecognized character is `8' DCF77.S:119: Error: constant value required DCF77.S:119: Error: register number above 15 required DCF77.S:119: Error: garbage at end of line DCF77.S:120: Error: constant value required DCF77.S:120: Error: register number above 15 required DCF77.S:120: Error: garbage at end of line DCF77.S:121: Error: garbage at end of line DCF77.S:122: Error: garbage at end of line DCF77.S:123: Error: junk at end of line, first unrecognized character is `0' make.exe: *** [DCF77.o] Error 1 > Process Exit Code: 2 > Time Taken: 00:00 Ich glaube aber nicht, daß Pit ein fehlerhaftes Programm ins Netz gestellt hat (zur Erinnerung nochmals anbei). Offensichtlich habe ich irgendwas noch nicht gerafft. Kann mir jemand sagen, was ich falsch gemacht habe? Vielen Dank schon jetzt und Bitte um Entschuldigung für mein Halbwissen! Martin
> Im Programm dcf77dec.asm werden 6 Register benutzt. Trotzdem wird > nichts gepusht und gepopt. Geht der Autor davon aus, daß das jeder > Benutzer "barfuß" hinzufügt, macht das der Compiler automatich oder > ist das "retten" der Registerinhalte nicht erforderlich? http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage > avr-gcc -c -mmcu=atmega16 -I. -x assembler-with-cpp -Wa,-adhlns=DCF77.lst,-gstabs,--listing-cont-lines=100 DCF77.S -o > DCF77.o > DCF77.S: Assembler messages: Das Programm scheint für einen anderen Assembler als den gas geschrieben zu sein. Erstens erfährt dieser auf magische Weise über Dinge wie PINB, zweitens benutzt er eine komplett andere Syntax. Du musst das wohl oder übel umschreiben. > DCF77.S:26: Error: constant value required Siehe http://www.nongnu.org/avr-libc/user-manual/assembler.html Schreib #include <avr/io.h> drüber, und packe das PINB in ein _SFR_IO_ADDR(PINB) ein. > DCF77.S:30: Error: junk at end of line, first unrecognized character is > `8' Hexadezimale Konstanten im gas heißen 0x80, nicht $80. > DCF77.S:40: Error: constant value required > DCF77.S:41: Error: constant value required ZH und ZL gibt's ebenfalls über <avr/io.h>. > DCF77.S:91: Error: constant value required > DCF77.S:91: Error: register r24, r26, r28 or r30 required > DCF77.S:91: Error: `,' required > DCF77.S:91: Error: garbage at end of line ADIW benutzt im gas nur den Namen des ersten Registers (r30 bzw. ZL), nicht r30:r31. > DCF77.S:119: Error: constant value required > DCF77.S:119: Error: register number above 15 required > DCF77.S:119: Error: garbage at end of line > DCF77.S:120: Error: constant value required > DCF77.S:120: Error: register number above 15 required > DCF77.S:120: Error: garbage at end of line > DCF77.S:121: Error: garbage at end of line > DCF77.S:122: Error: garbage at end of line LOW und HI heißen lo8 und hi8. Ich denke, dass ich jede Klasse von Fehler einmal in der Auflistung habe, umschreiben musst du es schon selbst. ;-)
Sorry, den alten Thread auszugraben. Würde gerne das IGOR UDP projekt einbinden. Was muss man alles vom AVR-Studio ASM V.1 zu dem gcc-ass. verändern? habe versucht das tutorial und diesen thread zu verstehen, sieht aber schlecht aus.
Gibts vielleicht irgendwo eine Anleitung oder Ähnliches, die beschreibt was man alles für den Assembler verändern muss, um aus einer .asm-Datei eine .S-Datei zu machen? Habe schon dieses Forum durchsucht und auch gegoogelt, habe aber leider nix gefunden. Könnt jemand der so was schon gemacht hat mir dabei helfen?
Um wie im Tutorial ein .s File einzubinden muss man es nur unter Source Files einbinden. Rechte Maustaste "Compile File" Das Makefile wird automatisch erzeugt Beispiel: File: "setzeEinAus.s" ------ // ** Setze alle Pins von PortB auf Ausgang ** // keine Parameter, keine Rueckgabe .global bit1Aus .func bit1Aus bit1Aus: sbi 0x17,1 ret .endfunc .end ------ im c-Programm: ------ int main() { bit1Aus(); // Pin1 DDRB als Ausgang schalten ... -------
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.