Ich möchte mit Hilfe der Fleury-UART-Bibliothek Zeichen an meinen PC
senden. Das hab ich auch getan und ich empfange schon mal ein Zeichen.
Leider entspricht das Zeichen, was ich empfange, nicht dem Zeichen, dass
ich versend.
Senden tue ich eine 1:
uart_putc ('1');
Empfangen tue ich mit PuTTY ein "g"
Oder ich sende ein y:
uart_putc ('y');
im PuTTY-Anzeigefenster erscheint ein "C"
Mein erster Gedanke war, check mal, ob die Einstellungen stimmen
in PuTTY eingestellt:
-Baudrate 2400
-Databits 8
Stop bits 1
Parity None
FlowControl XON/XOFF
Im Atmega88
1
2
...
3
/* define CPU frequency in Mhz here if not defined in Makefile */
4
#ifndef F_CPU
5
#define F_CPU 1000000UL
6
#endif
7
...
8
#define UART_BAUD_RATE 2400
9
...
Die Baudraten stimmen überein, wie die anderen Sachen sind, konnte icn
nicht herausfinden. In der ausgedruckten Anleitung zu den
Fleury-Funktionen werden nur die allg. Funktionen erklälrt wie die
Funktionen uart_putc und die anderen funktionieren. Andere spezifische
Einstellungen schein ich da nicht einstellen zu können, leider habe ich
bis jetzt noch nicht rausbekommen, wie genau die Einstellungen da sein
müssen.
Andere Möglichkeit wäre vielleicht, dass bei PuTTY der falsche
Zeichensatz eingestellt ist? Ich hab da einfach mal verschiedene
ausprobiert, Latin-1-WestEurope war standardmässig eingestellt ..., ich
weis es halt nicht.
Falls mir da jemand von Euch einen Tipp geben könnte, freute ich mich
sehr darüber.
HI
>ach so, der Atmega88 benutzt seinen internen Oszillator. Der hat wohl,>wie ich es gelesen habe, eine Frequenz von 1MHz.
Ja. Aber der ist für die serielle Schnittstelle ungeeignet.
MfG Spess
Spess53 schrieb:> Ja. Aber der ist für die serielle Schnittstelle ungeeignet.>> MfG Spess
Hmm, dass ist ja blöd :-(
Und wenn ich eine ganz langsame Baudrate nehme, zB. statt 2400 100 oder
10 - ganz langsam halt?
Liegt es daran, dass der Fehler zu groß ist? Oder ist der interne
Oszillator zu ungenau?
Müssten dann aber die Zeichen nicht auch schwanken? Ich erhalte immer
das gleiche Zeichen.
Du kannst runter gehen bis 1 baud - der Fehler bleibt immer gleich.
Der Name sagt es schon - asynchrone Datenübertragung. D.h. auf gut
deutsch, beide Übertragungspartner gehen von einer einigermassen
stabilen Zeitbasis aus, um eintreffende Daten einsortieren zu können.
Lösungsmöglichkeiten:
-stabile Zeitbasis auf beiden Seiten, dann funktioniert es so, wie
gedacht
-synchrone Übertragung, erfordert eine eigene Taktleitung
-eine Übertragungsmethode, die den Takt mitführt (verdoppelt aber die
Frequenz bzw. halbiert die effektive Übertragungsgeschwindigkeit bei
gegebener Bandbreite)
-"intelligente" Methoden, die sich aufeinander abstimmen und auch mal
mit einer Baudrate von z.B. 21700 klar kommen
Hi
>Liegt es daran, dass der Fehler zu groß ist? Oder ist der interne>Oszillator zu ungenau?
Ersteres resultiert aus letzterem.
Du könntest mit dem OSCCAL-Register die Frequenz des internen
RC-Oszillators in einen brauchbaren Bereich verschieben. Bleibt aber
eine Frickellösung. Stabil wird es erst mit einem Quarz, Quarzoszillator
oder Keramikoszillator.
MfG Spess
Spess53 schrieb:> Du könntest mit dem OSCCAL-Register die Frequenz des internen> RC-Oszillators in einen brauchbaren Bereich verschieben. Bleibt aber> eine Frickellösung. Stabil wird es erst mit einem Quarz, Quarzoszillator> oder Keramikoszillator.
Da ich ein Anfänger bin und mir das, was Du vorschlägst, noch zu tief in
die Materie geht - verschieben der internen Frequenz - ist es einfacher,
einen externen Quarz anzuschließen.
Aber ich danke Euch für den Hinweis mit der mangelnden
Taktfrequenzgenauigkeit.
Port an serielle oder ist ein pegelkonverter dazwischen?
Einfach mal die bits invertieren. Den fehler habe ich auch noch vor ein
paar tagen gemacht.
Gruss,
Jörg
Anfänger schrieb:> Und wenn ich eine ganz langsame Baudrate nehme, zB. statt 2400 100 oder> 10 - ganz langsam halt?
Das meinst du nicht ernst, oder. Ein 2% Baudratenfehler bleibt ein 2%
Baudratenfehler, egal wie schnell. Der Fehler ist relativ, in diesem
Fall relativ zu groß.
Meine Erfahrung:
Der interne Oszillator von moderneren Atmel-Controllern ist durchaus
recht stabil und auch bei den in Wohnräumen vorkommenden
Temperaturschwankungen kann man den schon für UART verwenden, wenn man
weiss was man tut.
Für kritische Sachen natürlich Resonator oder Quarz!
Hi
Nachtrag:
>uart_putc ('1');>Empfangen tue ich mit PuTTY ein "g">uart_putc ('y');>im PuTTY-Anzeigefenster erscheint ein "C"
Das Verhalten lässt sich allerdings durch einen (kleinen)
Baudratenfehler nicht so richtig erklären (LSB links) :
1->g 10001100 -> 11100110
y->C 10011110 -> 11000010
Jackfritt (Gast) könnte Recht haben:
1 (invertiert) 01110011
g (verschoben) 11100110
y (invertiert) 01100001
C (verschoben) 11000010
Da sollte der TO mal die Schaltung preigeben.
MfG Spess
Ein Gast schreibt schrieb:>> Und wenn ich eine ganz langsame Baudrate nehme, zB. statt 2400 100 oder>>> 10 - ganz langsam halt?>>>> Das meinst du nicht ernst, oder. Ein 2% Baudratenfehler bleibt ein 2%>> Baudratenfehler, egal wie schnell. Der Fehler ist relativ, in diesem>> Fall relativ zu groß.
ja und nein: Der Fehleranteil, der durch den ungenauen Systemclock
bedingt ist, bleibt konstant. Der Fehleranteil, der durch den nicht
ganzzahligen Quotienten von Fosc/Baudrate auftritt, wird jedoch mit mit
abnehmender Baudrate kleiner. bei 1Mhz und 2400 Baud sind das jedoch nur
0,2%, also kein Ding. (Zum Vergleich 1Mz/9600 Baud sind 7% Fehler. Das
ist dann schon relevant) Im Nomalfall ist der interne Osc. ausreichend
genau, um bei langsamen Baudraten den UART fehlerfrei befeuern zu
können.
Ich tippe auf das, was Spess da ausgerechnet hat: Signal ist invertiert
und die jeweils fehlende 0 ist dann das Startbit.
Jackfritt schrieb:> Port an serielle oder ist ein pegelkonverter dazwischen?
Ja genau, ein MAX232 hängt noch dazwischen. Ich habe jetzt eben
festgestellt, dass ich den Pegelwandler falsch angeschlossen habe :-(
Ich habe nur die Pins 15 und 16 angeschlossen und an die Pins 15 und 16
auch die beiden Kondensatoren drangehängt, die eigentlich an die Pins 2
und 6 gehören. Aber an die Pins 15 und 16 liegt ja dann auch noch eine
Spannung an. Darum war im Oszi das Signal vorher zwar auch immer
sichtbar, aber es lag auch immer nur so bei 3 Volt. Jetzt schwingt das
Signal im Oszi auch richtig bis 12 Volt hoch und das Zeichen wird
korrekt empfangen.
Was mir in dem Tutorial Kopfzerbrechen bereitet hat war, dass man für
den MAX232 zwei Anschlussbilder gezeichnet hat, dass hat mich Anfänger
verwirrt. Dort werden in dem ersten Bild die Verknüpfungen zwischen uC,
Kondensatoren und dem Stecker zur seriellen Schnittstelle gezeigt, dann
aber nochmal ein zweites Bild, wo ICP2 steht und was anscheinend auch
für den MAX232 gilt, wo dann gesondert nochmal zu 5V und GND eine
Verbindung stattfindet.
Mal noch eine andere Frage - der MAX232 erhöht ein Signal auf bis zu 12
Volt - aber ich schließe als Versorgungsspannung doch "nur" 5 Volt an.
Und es ist doch Gleichstrom, also ein kleiner eingebauter Trafo, der mir
aus 5 Volt 12 Volt macht, ist wohl nicht in dem MAX232 drinnen verbaut?
> Mal noch eine andere Frage - der MAX232 erhöht ein Signal auf bis zu 12> Volt - aber ich schließe als Versorgungsspannung doch "nur" 5 Volt an.> Und es ist doch Gleichstrom, also ein kleiner eingebauter Trafo, der mir> aus 5 Volt 12 Volt macht, ist wohl nicht in dem MAX232 drinnen verbaut?
Eine Ladungspumpe. http://de.wikipedia.org/wiki/Ladungspumpe
Hi
>also ein kleiner eingebauter Trafo, der mir>aus 5 Volt 12 Volt macht, ist wohl nicht in dem MAX232 drinnen verbaut?
Nein. Stichwort ist Ladungspumpe.
MfG Spess
Ich hab nochmal eine Frage. Im Internet hab ich einfach mal diese
Beschaltung des MAX232 gefunden:
http://www.botskool.com/images/forums/microcontroller_uart_max232_circuit.jpg
Dort steckt im Gegensatz zu der Beschaltung im AVR-Tutorial zw. PIN2 und
PIN6 nur ein Kondensator. Im AVR-Tutorial befinden sich daran zwei
Kondensatoren, die dann weiter zu Masse und +5V führen.
Geht diese Beschaltung auch oder erfüllt sie eine ganz andere Aufgabe?
Hi
>Ich hab nochmal eine Frage. Im Internet hab ich einfach mal diese>Beschaltung des MAX232 gefunden:>http://www.botskool.com/images/forums/microcontrol...
Für dem MAX232 gibt es ein gültiges Datenblatt des Herstellers. Das ist
maßgebend.
MfG Spess
Spess53 schrieb:> Für dem MAX232 gibt es ein gültiges Datenblatt des Herstellers. Das ist> maßgebend.
Warum macht man eigentlich bei dem MAX232 die Kondensatoren extern?
Warum kann man die nicht gleich noch in dem Chip mit integrieren? Oder
gibt es nicht so kleine Kondensatoren, die in den Chip reinpassen
wuerden?
Spess53 schrieb:> Weil es dann kein MAX232 ist. Du kannst aber gern einen anderen nehmen,> der keine Kondensatoren benötigt:
Vielen Dank für den Hinweis.
Gibt es auch einen fertigen MAX XXX, der auch gleich Optokoppler zur
galvanischen Trennung integriert hat?