hallo, ich sitz grad vor meinem AVR-Studio und will UART in Assembler basteln. Eigentlich kein Problem, aber "sbis UCSR0A,UDRE0" will nicht. Register out of range, wird mir sagt. Hab schon rumprobiert, naja jetz bin ich hier. Kann mir jemand helfen? joerg
! SBIS - Skip if Bit in I/O Register is Set. ! UCSR0A ist aber kein I/O-Register sondern liegt im Extented I/O Memory. also: lds Rx, UCSR0A SBRS, Rx, UDRE0 LG EC
So falsch liegt joerg gar nicht. Oder vielmehr der Fehler liegt nicht an ihm. Wenn man mal in das aktuelle Datenblatt 2545J–AVR–12/06 des 168 schaut, (http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf) dann sieht man auf Seite 179:
1 | USART_Transmit: |
2 | ; Wait for empty transmit buffer |
3 | sbis UCSRnA,UDREn |
4 | rjmp USART_Transmit |
5 | ; Put data (r16) into buffer, sends the data |
6 | out UDRn,r16 |
7 | ret |
Der Fehler liegt also eindeutig bei Atmel selber. Sowieso funktionieren die Ganzen USART-ASM Beispiele nicht. Die haben sich in der Doku vertan. Wenn der UART wirklich im extendet IO Bereich ist, dann ist er, gelinde gesagt, unbrauchbar (zumindest im Vergleich zum Mega8) cu Hauke
@Hauke Das liegt daran, daß weite Teile des Textes einfach in die Doku verschiedener AVRs übernommen werden. Ist eben nicht mit soviel Arbeit für Atmel verbunden als es wirklich individuell zu machen :-) Bei manchen Controllern sind diverse IO-Adressen extended, bei anderen nicht. Immerhin schreiben sie unter die ASM-Beispiele ausdrücklich: "For I/O Registers located in extended I/O map, "IN","OUT","SBIS"... instructions must be replaced with instructions that allow access to extended I/O. Typically "LDS" and "STS" ...
an Hauke Sattler: Wenn schon zitieren, dann bitte komplett: auf Seite 179 steht nämlich eine Fußnote mit Verweis auf Seite 8, und dort wird der Zugriff auf das extended I/O erläutert. Etwas ungeschickt das Ganze, aber korrekt.
"Wenn der UART wirklich im extendet IO Bereich ist, dann ist er, gelinde gesagt, unbrauchbar" Verstehe ich nicht, wieso ist der unbrauchbar ??? Ich hab eden MEGA8 schon länger durch den MEGA88/168 ersetzt. Alle Module/Baugruppen waren brauchbar.... "Die haben sich in der Doku vertan." Stimmt nicht, vieleicht einfach mal weiterlesen. Auf Seite 179 steht auch folgendes: Note: 1. See ”About Code Examples” on page 8. Schaut man dann mal auf Seite 8 nach, ist man vielleicht ein bischen schlauer... LG EC
@all Bevor ihr mich jetzt alle zerreist. Ich hab bis grade die Fußnote nicht bemerkt. Aber ich finde es schon seltsam wenn der Beispielcode den man angibt nun überhaupt nicht funktionieren kann. Im 48/88/168 ist kein einziges der USART Register mehr im normalen IO Bereich. Also sind ALLE UART-Zugriffe falsch (sbi, cbi, sbic, sbis, in, out). Es ist ja nicht so das Atmel für jeden einzelnen AVR das Rad nochmal neu erfinden muß. Das extendet IO Design gilt ja mittlerweile für eine ganze Gruppe von AVR. Und für diese Gruppe könnte man ohne Probleme mal die Bespiele anpassen. Das haben die beim Übergang vom UART zum USART ja auch hinbekommen. Was ich mit dem Unbrauchbar gemeint habe, ist das ich der Zugriff auf den UART langsamer und sehr viel umständilicher damit wird. Mega8:
1 | sbis UCSRA,UDRE ;1/2 takte, 1 word |
2 | rjmp USART_Transmit ;2 takte, 1 word |
Mega88:
1 | lds r16,UCSRnA ;2 takte, 2 word |
2 | sbrs r16,UDREn ;1/2 takte 1 word |
3 | rjmp USART_Transmit ;2 takte |
Mega 88 doppelt soviel Platz und doppelt soviel Zeit noch nen Beispiel? Mega8:
1 | cbi UCSRB,RXEN ;2 takte, 1 word |
Mega88:
1 | lds r16,UCSRnB ;2 takte, 2 word |
2 | cbr r16,RXENn ;1 takte, 1 word |
3 | sts UCSRnB,r16 ;2 takte, 2 word |
Mega 88 5x soviel Platz und 2,5x soviel Zeit Ich progge in ASM um meine Routinen möglichst schnell hinzubekommen. Wichtige Peripherie wie den UART in den extendet IO zu verbannen halte ich für Unsinn. In den neuen AVR finden sich in den unteren 32 IO Registern nur noch nen paar Ports und eine paar Timer Register (jeweils längst nicht alle) Bis io-Reg# 64 sind dann noch SREG, Stack, extINT, SPI, Timer0 und AC Das wars. Schnell auf ADC, TWI, USART oder SPI reagieren ist nicht mehr. Bei den Alten war da eine bessere Mischung. TWI, ADC, USART, SPI, AC und nen paar PORTs bis io-Reg# 32. Und bis io-Reg# 64 dann halt noch nen 16 bit Counter zusätzlich. Wenn man schnell mal nachschauen will ob nen Puffer wieder frei ist, oder ob irgendwo nen Byte angekommen ist, dann ist SBIC/SBIS sehr viel praktischer als wenn man jedes mal sich durch ne ISR hangeln muß. Manche Sachen sind nicht wichtig genug das die das Hauptprogramm jederzeit per Interrupt unterbrechen dürfen, um so schlimmer wenn für diese Sachen, dann noch unnötig Zeit bei draufgeht. cu Hauke
@Haucke: Nein, zerreissen will Dich hier keiner (ich zumindest nicht...) . Gebe Dir zu Deinem o.g. sogar Recht, habe mich beim Wechsel auf den 168 auch schon mehrfach darüber geärgert. Letzlich kann man damit aber leben. Zugegeben: Schön ist was anderes ! Lg EC
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.