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?
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
Hi wobei das natürlich x = *(unsigned char *)0x10; für R16 heißen sollte. Mift. Matthias
@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.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.