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.
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
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.
... 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
Du musst erst UBRRH und dann UBRRL in das Register schreiben. In der Regel ist UBRRH 0, muss aber trotzdem übergeben werden.
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
Ä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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.