Hallo zusammen, ich habe ein Problem mit dem Einbinden eines Assembler-Codes in einen C-Code. Und zwar handelt es sich bei dem Assemblerfile um eine Software-UART von Atmel. Nun habe ich aber das Problem, dass mein Compiler (AVR Studio GCC) beim Compilieren rummeckert. Problem besteht hierbei bei der Definition einer Konstanten. Für die Zeilen 60, 63, 129 und 130 kommt der Fehler: "Error: number must be less than 32" Aber ich habe doch mit TxD = 0x00 gesagt, dass er hierfür 0 nehmen soll. Oder ist da noch irgendwas anderes falsch? Gruß Patrick
>"Error: number must be less than 32" >Aber ich habe doch mit TxD = 0x00 gesagt, dass er hierfür 0 nehmen soll. >Oder ist da noch irgendwas anderes falsch? Damit ist wohl PORTA gemeint. Prozessor im makefile eingetragen ?
Ja, ist eingetragen. Ich hab das Makefile vom AVR-Studio genommen und wie im Tutorial beschrieben umgeschrieben. Habs mal in den Anhang gepackt.
Stimmt, hast recht. Bei anderen Definitionen funktionierts ja.
Du musst in Deinem Assembler Quellcode die io.h so einfuegen! #define __SFR_OFFSET 0 .nolist #include "avr\io.h" .list Siehe auch: Beitrag "AVR-GCC in Assembler-Modus" gruss, Ludger
> Du musst in Deinem Assembler Quellcode die io.h so einfuegen! Hast du dir den Code angeschaut? Das macht er als erstes. @Patrick: Um was für einen AVR geht es denn? Ich tippe darauf, daß es sich um einen Typ handelt, bei dem PORTA nicht in dem Bereich liegt, der mit cbi ansprechbar ist. Das geht nämlich nur mit den ersten 32.
Ich habe die Assembler Source genommen, ein makefile hinzugefuegt, auf attiny26 umgestellt und dann das rs232.s assembliert und gelinkt. Den Code geprueft oder veraendert habe ich nicht :-) Gruss, Ludger
Ah, ich kann mir vorstellen, woran es liegt. Auf dem Tiny26 sind die PORT/DDR-Register alle unter 32. Aber ihre Adresse hat in der avr/io.h einen Offset von 0x20. Du mußt also bei allen I/O-Registern 0x20 abziehen, auf die du per sbi/cbi/in/out zugreifst.
Ok, danke für die Hilfe. Mit
1 | #define __SFR_OFFSET 0
|
hats funktioniert. Ich denke mal, dass hierbei OFFSET 0 bedeutet, dass er bei der Adresse von 0 anfängt. Thx Gruß Patrick
So, da jetzt das erste Problem gelöst ist, habe ich nun noch ein zweites. Ich möchte jetzt dieser Funktion aus dem C-Code eine Variable übergeben. Wie muss ich diese Variable deklarieren damit ich dies übergeben kann und muss ich am ASM-Code noch was ändern? Habe versucht schon einen Wert in den Aufruf (" send(0x35); ") zu schreiben, kam aber dann " too many arguments " . Aus dem Tutorial konnte ich dazu leider nicht genügend Infos erhalten, wie genau das geht. Hoffe ihr könnt mir nochmals weiter helfen. Gruß Patrick
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Assembler-Dateien_2 steht eigentlich alles drin. send nimmt keine Parameter, das ist das Hauptprogramm. Das brauchst du nicht mehr, dein Hauptprogramm ist schließlich "main". Du kannst sinnvoll nur getchar und putchar verwenden. Dessen Variablen Txbyte und Rxbyte müssen, wie im Tutorial gezeigt, angelegt werden, sowie die passenden externen Funktionsprototypen im C-File deklariert werden (siehe im Tutorial ultrafunc für putchar und gigafunc für getchar). Oliver
Dankeschön :-) manchmal glaub ich wirklich, ich stell mich zu blöd an... aber hier gibts ja zum Glück sehr kompetente Hilfe :-)
....manchmal glaub ich wirklich, ich stell mich zu blöd an... darum, du solltest lieber brötchen backen.
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.