Forum: Mikrocontroller und Digitale Elektronik UART URBBH-Register Probleme


von Eric (Gast)


Angehängte Dateien:

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.

von Sebastian (Gast)


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

von Eric (Gast)


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.

von A.K. (Gast)


Lesenswert?

Danker, der kam gut.

von Kai Markus Tegtmeier (Gast)


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

von Eric (Gast)


Angehängte Dateien:

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.

von Kai Markus Tegtmeier (Gast)


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

von Sebastian (Gast)


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

von Rahul (Gast)


Lesenswert?

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

von Eric (Gast)


Angehängte Dateien:

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.

von Sebastian (Gast)


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

von Eric (Gast)


Angehängte Dateien:

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

von Wolle (Gast)


Lesenswert?

PORT "B" mit PORT "D" verwechselt ?

von crazy horse (Gast)


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.

von Sebastian (Gast)


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

von Sebastian (Gast)


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

von Eric (Gast)


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.

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.