mikrocontroller.net

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


Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Berndt Brandes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst das so nicht mehr tun.  Siehe auch

http://savannah.nongnu.org/download/avr-libc/doc/a...

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

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.