Forum: Compiler & IDEs Software-UART(ASM) in C einbinden


von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Ja, ist eingetragen.
Ich hab das Makefile vom AVR-Studio genommen und wie im Tutorial
beschrieben umgeschrieben. Habs mal in den Anhang gepackt.

von Patrick (Gast)


Lesenswert?

Stimmt, hast recht. Bei anderen Definitionen funktionierts ja.

von Patrick (Gast)


Lesenswert?

Aber an was könnte das liegen?

von Ludger (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

> Das geht nämlich nur mit den ersten 32... I/O-Registern.

von Ludger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Patrick (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

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

von OliverSo (Gast)


Lesenswert?

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

von Ludger (Gast)


Angehängte Dateien:

Lesenswert?

@Patrick

Bitte schoen :-)

von Patrick (Gast)


Lesenswert?

Dankeschön :-)

manchmal glaub ich wirklich, ich stell mich zu blöd an...
aber hier gibts ja zum Glück sehr kompetente Hilfe :-)

von neuer (Gast)


Lesenswert?

....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
Noch kein Account? Hier anmelden.