Hallo zusammen, ich versuche gerade einen Assembler Code in einem GCC C Projekt mit Atmel Studio zu integrieren. Der Grund: Ich möchte ein Projekt in Assembler schreiben, da vieles in dem Projekt sehr stark von der Zeit abhängig ist und diese in Assembler besser ausgerechnet werden kann. Da meine Kenntnisse und fertigkeiten noch nicht so ausgeprägt sind, schreibe ich vieles zunächst in C um die Übersicht zu behalten (später wird dann alles in Assembler übersetzt). Nun stehe ich vor dem Problem, dass der Code, der in einem AVR Assembler Projekt funktioniert. Als Item eingebunden in einem GCC C Projekt nicht funktioniert. Der Befehl out bewirkt garnichts. Nach etwas ausprobieren habe ich alle Ausgaben an PORTD mit sts gemacht (ist das richtig?) und die Ausgabe scheint zu funktionieren. Nach dieser Änderung tut aber leider keine Funktion was sie soll (=das LCD mach keine Ausgabe). Um den Fehler zu suchen habe ich Schritt für Schritt endlosschleifen im Assembler Code eingebaut und die Ausgabe an PORTD mit einer LED geprüft. Bei jeder Prüfung lag das richtige Bitmuster an PORTD an. Was mach ich falsch? lcd-routines.asm ist die funktionierende Form im Assembler Projekt lcd-routines.S ist die nicht funktionierende Form im C Projekt Ich danke schonmal jedem für Hinweise.
Marcus Beyer schrieb: > PORTD mit sts gemacht (ist das richtig?) Falsch! >>>>STS k, Rr Store Direct to SRAM (k)! Kann mit Ports nicht funktionieren! Wie kommst Du darauf sts zu verwenden?
Verwende doch einfach die lcd-routines.asm. Wenn die in GNU-Assembler steht einfach mit
1 | $ avr-gcc -c -x assembler-with-cpp lcd-routines.asm -o lcd-routines.o <OPTIONEN> |
übersetzen und dann linken wie ein normales compiliertes C-Modul.
Marcus Beyer schrieb: > Der Befehl out bewirkt garnichts. Für in/out brauchts ein Macro, um die 16Bit Adresse in 6Bit umzurechnen. Schau Dir einfach mal unter Examples die asmdemo an.
Info direkt aus dem Atmel Handbuch: 4. When using the I/O specific commands IN and OUT, the I/O addresses 0x00 - 0x3F must be used. When addressing I/O Registers as data space using LD and ST instructions, 0x20 must be added to these addresses. Johann L. schrieb: > STS, ST und STD funktionieren auch im SFR-Bereich. Danke für die Info. Habe ich bisher nie verwendet. Werde beim nächsten Projekt mal testen.
Johann L. schrieb: > Verwende doch einfach die lcd-routines.asm. Wenn die in GNU-Assembler > steht einfach mit$ avr-gcc -c -x assembler-with-cpp lcd-routines.asm -o > lcd-routines.o <OPTIONEN> > übersetzen und dann linken wie ein normales compiliertes C-Modul. Ich müsste leider noch hinzufügen, dass ich mit Atmel Studio noch so ziemlich gar nicht umgehen kann. Wie kann ich das mit Atmel Studio machen? Peter Dannegger schrieb >Schau Dir einfach mal unter Examples die asmdemo an. Danke für den Hinweis Das Makro hab ich gefunden und kann dessen Funktion nachvollziehen. Währe ja für mich also STS richtig. (fragt sich höchstens warum es in dem Assembler Projekt funktionierte)
Marcus Beyer schrieb: > (fragt sich höchstens warum es in dem Assembler Projekt funktionierte) Weil GCC-Assembler != Atmel Assembler https://sourceware.org/binutils/docs/as/
Das hängt vermutlich mit den Offset's des GCC-ASS zusammen für die SFR. Beginne deinen Assemblercode mal so: #include <avr/io.h> #define __SFR_OFFSET 0
:
Bearbeitet durch User
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.