Forum: Compiler & IDEs Assembler als File in C einbinden


von Marcus B. (Firma: privat) (dermichel)


Angehängte Dateien:

Lesenswert?

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.

von DingsDa (Gast)


Lesenswert?

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?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

STS, ST und STD funktionieren auch im SFR-Bereich.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von DingsDa (Gast)


Lesenswert?

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.

von Marcus B. (Firma: privat) (dermichel)


Lesenswert?

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)

von Peter D. (peda)


Lesenswert?

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/

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

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
Noch kein Account? Hier anmelden.