mikrocontroller.net

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


Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

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

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, hast recht. Bei anderen Definitionen funktionierts ja.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber an was könnte das liegen?

Autor: Ludger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Ludger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für die Hilfe.
Mit
#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

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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

Autor: Ludger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Patrick

Bitte schoen :-)

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön :-)

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

Autor: neuer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
....manchmal glaub ich wirklich, ich stell mich zu blöd an...


darum, du solltest lieber brötchen backen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.