www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega128: Problem bei USAR-Schnittstelleninitialisierung


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte bei einem atmega128 eine der beiden seriellen Schnittstellen
initialisieren. Ich komme aber nichtmal bis zum Einstellen der
Baudrate. Ich habe sie in r16 und r17 gespeichert und wie folgt
initialisiert:

; Baudrate einstellen
        out UBRR1L, r16
        out UBRR1H, r17

Der Assembler (AVR-Simulator von ARVStudio4) bringt aber immer den
Fehler: "Illigal argument type or count".

Ich hab auch schonmal versucht direkt die Adressen für UBRR1L und
UBRR1H einzugeben ($98 und $99 wenn ich mich nicht irre). Aber der
Fehler tritt generell ab allen Adressen gößer $3F auf. Für kleinere
Adressen funktionniert die Zuweisung.
Kann mir jemand weiterhelfen?

P.S.
Weis jemand wie ich eine 7-Bitübertragung ohne Parität mit einem
Startbit und 2 Stopbits initialisiere. Ich komm da mit dem Datenblatt
nicht so ganz klar...

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Befehle OUT und IN gehen nur in den gemapten I/O-Bereich von 0x00
bis 0x3F (0x20 bis 0x5F).
Zugriff auf die Reister oberhalb der Marke 0x5F geht nur mit LDS statt
IN und STS statt OUT.

Z. B.:
        STS UBRR1L, r16
        STS UBRR1H, r17

Eine Umrechnung der Adresse (+0x20) ist nicht erforderlich da für die
"hohen" Register über 0x5F die ware Adresse definiert ist.

MfG
Andi

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, um sich damit nicht herumschlagen zu müssen, kann man das mit
Macros gut handeln:

.macro OUTI    ;OUT immediate Byte
  ldi  r16,@1  ;OUTI Adresse,Wert (8 Bit)
  .if @0>0x3F
    sts  @0,r16
  .else
    out  @0,r16
  .endif
.endm

.macro OUTR      ;OUT Byte von Register
  .if @0>0x3F    ;OUTR Adresse,Register
    sts  @0,@1
  .else
    out  @0,@1
  .endif
.endm

;Und noch was zum einlesen:
.macro INR      ;IN Byte in Register
  .if @0>0x3F    ;IN Register,Adresse
    lds  @0,@1
  .else
    in  @0,@1
  .endif
.endm

Bei festen Werten nimmt man einfach OUTI Adresse,Wert und bei in einem
Register berechneten Wert OUTR Adresse,RN (register r0 bis r31).

MfG
Andi

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.