www.mikrocontroller.net

Forum: Compiler & IDEs Datenaustausch C-Assembl funktioniert nicht


Autor: Günther (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
weiß jemand, wie man Daten von
einem C-Programm mit dem inline-Assemblercode
austauscht?

Ich hatte im Tutorial von Christian Schifferle
erfreut gelesen, wie einfach das ist.
Aber pustekuchen, es funktioniert nicht.

Am liebsten wäre mir
  x = inp (0x1B);
Da mault  der avr-gcc-Compiler:
invalid lvalue in unary &. (Was das wohl soll?)

Hingegen wird
  x = inp (PORTA);
nicht beanstandet, obwohl PORTA = 0x1B.

Aber PORTA wollte ich gar nicht, ich wollte
von beliebigen Speicherstellen, die per Assembler
beschrieben sind, im C-Programm lesen (und schreiben).

Es geht auch nicht, wenn ich in die avr/iom16.h
hineinschmuggle
#include  AAA = r16  oder eine normale Adresse.

Bei
  x = inp (AAA); kommt die Fehlermeldung
r16 undeklariert.

Das gleiche lese ich, wenn ich aus Chr. Schifferles
Tutorial abschreibe:
 x = inp (USR);  -- undeklariert.

IOm16.h ist nicht direkt, sondern über io.h eingebunden
und der Compiler verwendet die Datei auch, wie die
Fehlermeldung zeigt.

Was mache ich denn da falsch?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

da der AVR ja alles in den SRAM mappt (inkl. Register und IO-Speicher)
sollte ein Pointer reichen. Für R16 also etwa so:

x = *(unsigned char *)0x15;

Matthias

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

wobei das natürlich
x = *(unsigned char *)0x10;
für R16 heißen sollte. Mift.

Matthias

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Günther:

> Am liebsten wäre mir
>   x = inp (0x1B);

inp() ist `deprecated'.  Don't use it.  Schreibe

    x = PORTA;

> Hingegen wird
>   x = inp (PORTA);
> nicht beanstandet, obwohl PORTA = 0x1B.

Wie kommst Du auf diese Idee?  PORTA ist vielmehr definiert als
(*(volatile unsigned char *)0x3b).  Kannst Du Dir einfach angucken,
indem Du auf die Ausgabe des C-Präprozessors schaust (avr-gcc -E ...).
Spätestens an dieser Stelle sollte Dir auch klar sein, warum Deine
inp(0x1B) Variante nicht funktioniert.

Für ein aktuelles inline assembler tutorial nimm bitte das inline
assembler cookbook, das der avr-libc Doku beiliegt.  Wenn Du WinAVR
hast, liegt das auf Deiner Platte...  (Wenn Du kein WinAVR hast, aber
Windows, dann solltest Du wahrscheinlich besser erstmal einen Upgrade
machen.)

Online:
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

Hier aber besser noch 1...2 Tage warten, so daß dort 1.0.3 oben drüber
steht als Release.  Diese Version hat Ted Roth gestern veröffentlicht,
aber wir sind noch nicht dazu gekommen, die Doku auf dem Webserver zu
aktualisieren.

inp() hat übrigens mit r16 nix am Hut...  Du verwechselst working
registers mit IO registers.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Online:
> http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

> Hier aber besser noch 1...2 Tage warten, so daß dort 1.0.3 oben
> drüber steht als Release.

Ist inzwischen aktualisiert.

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.