Hallo Mikrocontrollerfreunde,
ich versuche gerade mit meinem ATmega über UART zu sprechen. Leider
verstehen wir uns aber noch nicht so gut. Wenn ich ein Zeichen vom PC an
den AVR übertrage, soll es u. a. gleich wieder zurückgeschickt werden:
1
receivedByte=UDR0;
2
...
3
UDR0=receivedByte:
Was ich dann aber im Terminal (screen oder minicom) sehe ist nicht das
Zeichen, das es sein sollte, eher irgend ein Zeichensalat. Auf beiden
Seiten liegen soweit die gleichen Einstellungen vor, also gleiche
Baudrate, ein Stoppbit, kein Paritätsbit.
Kann vielleicht jemand nen Tipp geben, was hier noch falsch läuft bzw.
was ich vergessen habe?
0xf3
0xf3 schrieb:> Kann vielleicht jemand nen Tipp geben, was hier noch falsch läuft bzw.> was ich vergessen habe?
Hast du eine Quarz dran? Wie sieht die Hardware aus? MAX232 oder ähnlich
verwendet?
>Was ich dann aber im Terminal (screen oder minicom) sehe ist nicht das>Zeichen, das es sein sollte, eher irgend ein Zeichensalat. Auf beiden>Seiten liegen soweit die gleichen Einstellungen vor, also gleiche>Baudrate, ein Stoppbit, kein Paritätsbit.
Nö, wenn auf beiden Seiten die gleichen Einstellungen
wären, würdest du das korrekte Echo sehen.
Falsche Taktrate des uC angegeben ist der wahrscheinlichste
Grund für deinen Zeichensalat.
Wie sehen deine Fuses aus?
holger schrieb:> Nö, wenn auf beiden Seiten die gleichen Einstellungen> wären, würdest du das korrekte Echo sehen.
außer wenn das Signal invertiert ist, weil falsch verkabelt
Richtig, vergessen zu erwähnen. Ein Quarz ist dran mit 3,6864 MHz. Den
habe ich extra genommen, damit beim Prescaler für UART eine gerade Zahl
rauskommt. Außerdem benutze ich ein Kabel mit USB-Adapter. Bin mir nicht
ganz sicher, aber ich glaube da steckt ein FT232-Chip drin. Jedenfalls
kann ich damit prima mit meinem Raspberry reden. Die Strippen sind so,
wie sie meines Wissens auch sein sollen, also RX -> TX und TX -> RX.
Ansonsten:
#define F_CPU 3686400UL
#define BAUDRATE 57600UL
uint8_t myUBRR = (F_CPU / (16 * BAUDRATE)) - 1;
FUSES = -U lfuse:w:0xc8:m -U hfuse:w:0xd8:m -U efuse:w:0xff:m
Es ist ein ATmega328P. Die Schaltung wird ausschließlich über das
Adapterkabel mit Strom versorgt. Bin daher ziemlich sicher, dass Masse
und 5V an der richtigen Stelle stecken. Die sonstigen Einstellungen
müssen auch passen, hab mir gerade nochmal die minicom-Konfiguration
angeschaut: 8 Bit pro Zeichen, ein Stoppbit und kein Paritätsbit.
Im Controller sieht das so aus:
Ich wurde zu Beginn meiner uc-Basteleien von einem vorinstallierten
Bootloader verarscht, der bei der UART das double-speed-Bit gesetzt hat.
Die Symptome waren ähnlich, die Ursache zu finden hat etwas gedauert.
>Ich wurde zu Beginn meiner uc-Basteleien von einem vorinstallierten>Bootloader verarscht, der bei der UART das double-speed-Bit gesetzt hat.>Die Symptome waren ähnlich, die Ursache zu finden hat etwas gedauert.
Hm, also das scheint hier wohl nicht der Fall zu sein. Habe jetzt
explizit
1
UCSR0A&=~(1<<U2X0);
gesetzt. Sieht aber alles noch genau so doof aus wie vorher.
0xf3 schrieb:> FUSES = -U lfuse:w:0xc8:m -U hfuse:w:0xd8:m -U efuse:w:0xff:m
Und du bist sicher, dass ein 3,6864 MHz Quarz mit einer Frequenz im
Bereich zwischen 0,4 und 0,9 MHz schwingt, oder warum hast du CKSEL so
gewählt?
>Und du bist sicher, dass ein 3,6864 MHz Quarz mit einer Frequenz im>Bereich zwischen 0,4 und 0,9 MHz schwingt, oder warum hast du CKSEL so>gewählt?
Oh, stimmt. Da habe ich wohl nicht beachtet, dass die Fusebits
invertiert gesetzt werden ^^
0xdc und 0xd6 habe ich probiert. Hat aber nichts geändert. Allerdings
sind diese beiden Werte laut Datenblatt doch für Keramikoszillatoren,
oder?! Ich hätte glaube ich eher 0xf7 gewählt. Naja, aber das
funktioniert genau so wenig ;)
0xf3 schrieb:> Außerdem benutze ich ein Kabel mit USB-Adapter
Sicher das dies ein USB<->UART und keine USB<->RS232 Umsetzer ist?
Oder hast du auf auf der µC Seite eine UART<->RS232 Umsetzer drin?
Um zu prüfen ob der Takt richtig eingestellt ist, hat es sich bewährt
beim Start eine LED ein paar mal im Sekundentakt blinken zu lassen...
Und anschliessend SetBaud.h verwenden statt einer eigenen Definition ;-)
Das Kabel macht USB auf TTL. Ist doch richtig so, oder?!
Ah, Tatsache. Habe jetzt auch LEDs dran und offenbar ist der uC-Takt ein
ganzes Stück langsamer als er sein sollte. Jedenfalls leuchten sie
deutlich länger als vorgegeben. Hab zwar gerade keine Stoppuhr zur Hand
aber es ist gut möglich, dass sie ca. 3,6864 mal länger leuchten ;) ich
weiß bloß nicht wieso ^^
Hm... Also den Quarz habe ich mal ausgetauscht. Kaputt scheint er nicht
zu sein. Er steckt zwischen XTAL1 und 2 und von jedem Pin gehen noch 22
pF nach Masse.
Die Fusebits habe ich mir vom Calculator auf engbedded.com abgeschaut:
lfuse:w:0xc6:m hfuse:w:0xd9:m efuse:w:0xff:m
Ist sicher ein ganz dummer Fehler für den ich einfach nur zu blind bin.
Hier mal die main.c:
Schreib die Fuses mal manuell in den AVR. Wenn die LEDs tatsächlich 3,x
mal so lang leuchten wie sie sollten läuft der AVR wohl auf
standardmäßigen 1MHz.
Jetzt passt die Taktung und auch die Zeichen kommen richtig ins Terminal
zurück. Aber diese Meldung verstehe ich nicht. Und lesen kann ich die
Fuses auch nicht.
Die fuse.txt wird nicht erzeugt (ja, ich habe Schreibrechte). Und warum
klappt das anscheinend nur manuell?
Naja, immerhin bin ich schon mal ein ganzes Stück weiter. Vielen Dank
bis dahin für die Hilfe!