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.
... 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
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.
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
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
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.
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
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
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.
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
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.
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.