Forum: Mikrocontroller und Digitale Elektronik ATmega168 (sbis UCSRnA,UDREn)


von Joerg S. (joerg_seemann)


Lesenswert?

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

von ecslowhand (Gast)


Lesenswert?

! 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

von ecslowhand (Gast)


Lesenswert?

vertippt.....

lds Rx, UCSR0A
sbrs Rx, UDRE0



So ist`s richtig.....

von Joerg S. (joerg_seemann)


Lesenswert?

der Seemann dankt...

von Hauke S. (hauke)


Lesenswert?

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

von Tim T (Gast)


Lesenswert?

@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" ...

von senex24 (Gast)


Lesenswert?

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.

von ecslowhand (Gast)


Lesenswert?

"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

von Hauke S. (hauke)


Lesenswert?

@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

von ecslowhand (Gast)


Lesenswert?

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