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