Forum: Compiler & IDEs Assembler SPI routine läuft nicht


von Jörn (Gast)


Lesenswert?

Hi,

Ich habe folgendes Problem, ich habe in Assembler eine "Libary" für
ein disply geschrieben, nun möchte ich diese assembler routinen in C
nutzen, das funzt auch soweit, doch bei meiner SPI routine erhalte ich
immer noch einen Fehler: "Error: Number must be less than 32"

Hier die Routine:

spi_send:
      out  SPDR, r24
spi_send_0:    sbis  SPSR, SPIF  ;verursacht den Error
      rjmp  spi_send_0
      in  r24,SPDR
      ret

Was mache ich Falsch? Hat jemand von euch eine Idee??

Danke schonmal im Vorraus!

MFG Jörn

von Berndt Brandes (Gast)


Lesenswert?

Ich vermute Du versuchst für den MEGA169 zu übersetzen? Ist das so?

Bei diesem Prozessor ist das SPSR Register auf Adresse 0x2D (bei allen
anderen auf 0x0E).

sbis lässt als I/O-Register Operand aber leider nur Adressen bis 0x1f
zu. In diesem Fall mußt Du einen anderen Test machen (erst in Register
laden, dann testen über andi oder so)

hoffe ich konnte helfen
Berndt

von Jörn (Gast)


Lesenswert?

Hi,

erstmal danke für die Antwort! Das Programm ist für einen Mega162, und
das Programm konnte ich auch immer ohne Probleme mit dem ATMEL
Assembler kompiliren, das lief astrein. Doch jetzt macht der Assembler
von AVRGCC mucken! Hat wer eine fertige routine die das selbe macht wie
meine, nur das sie halt in AVRGCC läuft?

Außerdem verstehe ich nicht warum ich mein Assemblerprogramm was vorher
lief umschreiben muss, damit es in AVRGCC läuft, Assembler ist doch
Assembler oder??

MFG Jörn

von Joerg Wunsch (Gast)


Lesenswert?

Du kannst das so nicht mehr tun.  Siehe auch

http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/group__avr__sfr__notes.html

Du mußt entweder (faule Variante, für Rückwärtskompatibilität
gedacht)

#define __SFR_OFFSET 0

(vor dem #include <avr/io.h>) schreiben oder (saubere Variante, für
Neuentwicklungen empfohlen)

out _SFR_IO_ADDR(SPDR), r24

von Jörn (Gast)


Lesenswert?

Hi,

Danke das hat mein Problem gelöst, doch welchen nachteil hat es wenn
man die "fauhle Variante wählt", für die ich mich wegen der
einfachheit halber entschieden habe?

MFG Jörn

von Joerg Wunsch (Gast)


Lesenswert?

Bißchen unsauberer, außerdem verweist die Doku auf Möglichkeiten,
wie man mit der neuen Version bspw. für Register, die in
verschiedenen AVRs in verschiedenen Speicherbereichen liegen, dennoch
automatisch das richtige tun kann.  Das geht mit der faulen Variante
nicht.

Bezüglich ,,der Einfachheit halber'' -- sowas kann man ja in Makros
verstecken, dann ist das eine fast so einfach wie das andere.  Oder
man schreibt gleich in C. :-)

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.