Datenaustausch C-Assembl funktioniert nicht

Gast #77423
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?
Gast #77424
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
Gast #77426
@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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.