www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART URBBH-Register Probleme


Autor: Eric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich befasse mich gerade ein wenig mit dem uart und bin in sagen
progammieren nicht allzu fit.Ich hab vor, mir über ein Terminal
Programm etwas an den einen Controller zu senden. Das ergebnis soll
erstmal sein, daß etwas leuchtet.
Ich benutze das STK500 mit einem Atmega16.
Ich habe das problem, wenn ich etwas in das Register ucsrc schreibe, es
mir das Register UBRRH verstellt und anders herum.


Kann mir bitte bitte bei diesem Problerm weiterhelfen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal ins Datenblatt Seite 160.

Um in UCSRC reinschreiben zu können muss das MSB 1 sein und für BRRH
0.
Das hast du nicht beachtet.

Seb

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke mal,
hier habe ich den Link zu dem Datenblatt.
http://users.belgacombusiness.net/cd011566/pdfs/atmega16.pdf
Leider kann ich dort kein MSB Bit finden.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danker, der kam gut.

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wenn Du's ganz genau wissen willst, schau auf Seite 155 Deines
Datenblattes "Accessing the UBRRH/UCSRC Registers" bzw. Seite 161 mit
der Registerbeschreibung UBRRH/L.

Ich bin mir nicht sicher, ob Du Dir darüber klar bist, deshalb schreib
ichs lieber mal rein: MSB ist die allgemeine Bezeichnung für das "Most
Significant Bit" in einem Datenwort, also das Bit mit der höchsten
Wertigkeit. In diesem Falle hat das Bit die Nummer 15 (sh. Seite 161)
und das Kürzel URSEL. Über dieses Bit wird ausgewählt, ob in UBRRH oder
UCSRC geschrieben wird.

mfG

Kai Markus

Autor: Eric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe es nicht! Im Datenblatt steht wortwörtlich: The URSEL must
be one when writing the UCSRC.
Das habe ich gebacht und trotzdem (siehe Anhang) bekomme ich das was in
UCRSC steht in das UBRRH Register geschieben.

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, hast Du das denn schon mal in "echt" ausprobiert?!? Möglicherweise
liegt ja auch hier ein Fehler im Debugger vor, daß einfach die Ausgabe
nicht dem entspricht, was ein realer AVR machen würde...

KMT

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist wohl ein Anzeigefehler. UBRRH kann nicht größer als 0x0F werden,
das siehst du ja an den grauen Stellen.

ldi r16,(1<<URSEL)    unnötig
out UCSRC,R16         unnötig

Diese Zeilen reichen völlig.
ldi r16,0x86
out UCSRC,R16

solltest du nämlich 0x06 anstelle der 0x86 reinschreiben, wird das
URSEL Bit gelöscht und die 0x06 geht in das UBRRH.  Am besten du
schreibst als erstes bevor du irgendwas machst ne 0x80 in UCSRC und ne
0x00 ind das UBRRH. Dann sollte auch der Anzeigefehler weg sein.

Seb

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst erst UBRRH und dann UBRRL in das Register schreiben.
In der Regel ist UBRRH 0, muss aber trotzdem übergeben werden.

Autor: Eric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist doch das UBRRH und UCSRC die selbe Adresse habe ( siehe
Anhang). Ich vermute einfach, da keine Ausgabe an meinem STK500
stattfindet,daß UBRRH durch das UCSRC verstellt wird und somit ja auch
meine Baudrate (Wie man es auch im Debugger auch sieht).In UBRRH soll
ja nicht stehen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja schon klar aber hast du dir mal die Antworten durch gelesen. Alle
Werte die 0x80 oder größer sind, gehen automatisch ins UCSRC. Alles was
darunter ist, geht in UBRRH. Es kann in UBRRH also NIE 0x86 drin stehen
wie in deinem Bild zu sehen ist das ist nur ein Anzeigefehler. Solange
du nichts in UBRRH reinschreibst, kann da irgendwas drinstehen. Das
Beispiel ist von nem ATMEGA162, sollte aber nach ein paar Änderungen
funktionieren.

;UART1 Init    9600,1,N,2
    ldi  TEMP1,  0x00
    out  UBRR1H,  TEMP1
    ldi  TEMP1,  N
    out  UBRR1L,  TEMP1
    ldi  TEMP1,  (1<<TXEN)|(1<<RXEN)
    out  UCSR1B,  TEMP1
    ldi  TEMP1,  (1<<URSEL1)|(1<<USBS1)|(1<<UCSZ10)|(1<<UCSZ11)
    out  UCSR1C,  TEMP1

Der Simulator hat noch andere Fehler, also im Zweifel nicht drauf
verlassen.

Seb

Autor: Eric (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke, mein Programm tut trotzdem nicht.
Ich hab das aus dem Tutorial abgeschrieben und da funktioniert es
auch.
Meine Frage: Ich schick jetzt eine 8 an meinem Controller, dann kommt
eine 0x38 an. Jetzt will ich aber, daß die 8. LED angeht.
Wie stell ich das an?
Ich weiß das sind alles Grundlagen, aber wäre trotzdem nett wenn jemand
Tips übrig hätte.
Danke

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORT "B" mit PORT "D" verwechselt ?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was für eine 8 schickst du? 0x08 oder die ASCII-8 von der Tastatur? Die
ist nämlich exakt 0x38, da das so schön passt, vermute ich dein Problem
mal da.
Umwandlung von ASCII-Zahlen in die entsprechende Binärzahlen: 0x30
subtrahieren.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da muss ich dich entäuschen.

ldi temp, (1<<URSEL),(3<<UCSZ0)

Was macht das? Bei binärzahlen kommen nur 0 und 1 vor aber keine 3.

Der Befehl << schiebt ne 1 an die Stelle die z.B. UCSZ0 angibt.
Das muss schon so

ldi  TEMP,  (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1)

geschrieben werden.
Mit
out DDRB, temp
änderst du nur ob deine Pins Ein- oder Ausgänge sind.

Das muss out PORTB, temp lauten. Das gibt allerdings alles an Port B
und nicht an Port D aus, wie in deinen Komentaren.
Wenn du willst, das die 8. LED leuchtet muss du an PortB
0b10000000 übergeben. Das ist 0x80. Wo die 0x38 herkommt kann ich dir
nicht sagen, da fehlen die wichtigsten Info's.
Welches Terminalprogramm, Quelltext, ....

Seb

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh ja genau.

http://www.torsten-horn.de/techdocs/ascii.htm

hier hast du die Tabelle und da siehst du, dass das Zeichen 8 Hex 0x38
ist.

Seb

Autor: Eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich drücke auf der Tastur die 8 dann sollte ja
am controller 38 hex ankommen.
das ergebnis sollte sein, daß jetzt in DDRB 1000000 steht.
Wenn ich von der hex38,hex30 abziehe steht ja in DDRB
0000100  hex8.

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.