www.mikrocontroller.net

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


Autor: Joerg Seemann (joerg_seemann)
Datum:

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

Autor: ecslowhand (Gast)
Datum:

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

Autor: ecslowhand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vertippt.....

lds Rx, UCSR0A
sbrs Rx, UDRE0



So ist`s richtig.....

Autor: Joerg Seemann (joerg_seemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Seemann dankt...

Autor: Hauke Sattler (hauke)
Datum:

Bewertung
0 lesenswert
nicht 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/...)
dann sieht man auf Seite 179:
USART_Transmit:
; Wait for empty transmit buffer
sbis UCSRnA,UDREn
rjmp USART_Transmit
; Put data (r16) into buffer, sends the data
out UDRn,r16
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

Autor: Tim T (Gast)
Datum:

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

Autor: senex24 (Gast)
Datum:

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

Autor: ecslowhand (Gast)
Datum:

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

Autor: Hauke Sattler (hauke)
Datum:

Bewertung
0 lesenswert
nicht 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:
sbis UCSRA,UDRE           ;1/2 takte, 1 word
rjmp USART_Transmit       ;2 takte, 1 word

Mega88:
lds r16,UCSRnA            ;2 takte, 2 word
sbrs r16,UDREn            ;1/2 takte 1 word
rjmp USART_Transmit       ;2 takte
Mega 88 doppelt soviel Platz und doppelt soviel Zeit

noch nen Beispiel?
Mega8:
cbi UCSRB,RXEN            ;2 takte, 1 word

Mega88:
lds r16,UCSRnB            ;2 takte, 2 word
cbr r16,RXENn             ;1 takte, 1 word
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

Autor: ecslowhand (Gast)
Datum:

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

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.