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