Hallo
Habe ein Problem mit einlesen vom GPS UART0
mit 4Mhz intern Quarz gehts mit 8 Mhz intern Quarz nicht.
#define cpuclock 4000000 //geht
#define cpuclock 8000000 //geht nicht
//MIT umstellung der Fuse von 4 auf 8 Mhz
init_rs232(4800,4800);
void init_rs232(unsigned int baud0,unsigned int baud1)
{
baud0=cpuclock/((baud0*16L)-1);
baud1=cpuclock/((baud1*16L)-1);
//UART 0 INIT
UBRR0H= (unsigned char)(baud0>>8);
UBRR0L = (unsigned char) baud0;
UCSR0A = 0x00; /* USART operates at normal speed */
UCSR0B = ( (1<<RXCIE) | (1<<RXEN)); /* Enable receiver */
UCSR0C = ( (0<<UMSEL) | /* Configure for asynchronous operation */
(0<<UPM1) | /* No parity */
(0<<UPM0) |
(0<<USBS) | /* 1 stopbit */
(1<<UCSZ1) | /* 8 data bits */
(1<<UCSZ0));
//UART 1 INIT
UBRR1H= (unsigned char)(baud1>>8);
UBRR1L = (unsigned char) baud1;
UCSR1B= ((1<<RXCIE)|(1<<RXEN) | (1<<TXEN));
UCSR0C = ( (0<<UMSEL) | /* Configure for asynchronous operation */
(0<<UPM1) | /* No parity */
(0<<UPM0) |
(0<<USBS) | /* 1 stopbit */
(1<<UCSZ1) | /* 8 data bits */
(1<<UCSZ0));
}
Es geht aber nur UART0 nicht wo das GPS direkt dran hängt.
UART 1 un MAX 3232 geht bei 4 Mhz und 8 Mhz.
UART0 nur bei 4Mhz
Warum???
NMEA bei 4Mhz kommen sauber rein.
NMEA bei 8 Mhz sieht es so aus als ob die Baudrate nicht stimmt.
Danke
UART mit dem Internen Taktgeber ist immer Glückssache.
Kann gehen, muss aber nicht.
UBRR0 sollte 104 sein, wenn ich mich nicht verrechnet hab.
Versuch mal 103 und 105 (ohne die Baudratenberechnung), vielleicht
klappts ja.
Der interne Taktgeber (R/C, kein Quarz!)ist per Fabrik auf 10% genau.
Für ein UART darf die Fehlerrate nur maximal 2% betragen. Man kann den
internen Taktgeber auf 1% genau kalibrieren, diese Genauigkeit ist dann
aber auf einen kleinen Temperatur- und Betriebsspannungsbereich
beschränkt. Mit externem Quarz geht´s mit Sicherheit.
herrmann wrote:
> Ja ich werde mir angewöhnen immer einen externen Quarz einzusetzen.
Aber nicht irgendeinen, sondern einen, dessen Frequenz für die zu
lösennde Aufgabe geeignet ist. Für sicheren UART-Betrieb nimmt man
üblicherweise Baudratenquarze.
>> Danke
Hallo
Habe noch ein Problem gehabt das mir bei 4Mhz einige Zeichen vom GPS
gefehlt haben.
Der tip mit dem Manuellen berechnen der Baudrate mit dem Taschenrechner
hat
gezeigt das die bei z.b 4800 und 4Mhz 51,08 nicht genügen ich habe jetzt
50 drinn und mein GPS bringt mir alles was mein AVR zum verarbeiten
braucht aus das durchschleifen des Signals von UDR0 nach UDR1 geht jetzt
und wird vom Testprogramm am PC auber erkannt.
Nun werde ich immer vorher den Wert variable testen.
Das hätte ich nun nicht gedacht hätte mir ca 1 Tag suche erspraren
können.
Besten Dank nochmal es reichen jetzt auch dei 4 Mhz zum Arbeiten lag jja
nur an der koreckten Zahl.
Nochmals besten Dank
Hallo,
auch wenn ich immer Quarz bei UART benutzen würde, gibt es ein Projekt
eines Bekannten, bei dem 2 AVR per UART und beide mit internem RC-Oszi
laufen.
Stabil im täglichen Einsatz sein Monaten, allerdings in relativ
temperaturstabiler Umgebung (Innenraum).
Bei beiden haben wir die Teilerwerte per Versuch ermittelt, mit dem
berechneten Wert lief (immer mit dem PC als Gegenstelle) nicht viel.
Die Baudrate darf nicht zu hoch sein, es muß sich ein UBRR-Wert ergeben,
der möglichst groß ist. Einfach, damit die Schrittweite beim Ändern
recht klein ist.
Dann eben variert, das kann merklich mehr als 1 nach oben oder unten
sein...
Die Mitte zwischen den ersten fehlerhafte Zeichen genommen und gut.
Beim gegenstück genauso. Das ergab sich schon beim Entwickeln, der UART
machte Debug-Ausgaben da merkte man ja die Fehler.
Der Grund war einfach der, daß das Drumherum des Projektes ziemlich
komplett war und die Pins für den Quarz nicht mehr freizuschaufeln war,
als ich mich damit beschäftigt habe.
Ich bleibe bei Quarz für UART, wenn man aber entweder experimentiert
oder keine andere Möglichkeit findet, kann man es mal machen.
Wenn jetzt die Frage kommt, warum wir nicht per Calibrierungs-Byte den
Takt korrigiert haben: es macht einfach mehr Aufwand, als UBRR ein
paarmal zu ändern. Beide Fälle passen am Ende ohnehin nur für dieses
konkrete Exemplar und es sollte von dem Kram nur einen geben.
Gruß aus Berlin
Michael
Bei Angelika kostet ein 16MHz Quarz im HC49/U-Gehäuse 24 Cent. Dazu
braucht man noch zwei keram. Kondensatoren, sodaß die Unkosten für einen
stabilen Prozessortakt rund 0,30 Euro betragen. Ein alternativer
keramischer Resonator wäre kaum billiger.
Es ist somit doch völlig unsinnig, mit dem internen RC-Oszillator seine
Zeit zu verplempern, sobald man den UART verwenden möchte. Auch
irgendwelche sogenannten Baudratenquarze einzusetzen, ist doch Schnee
von gestern. Ein Blick in die Baudratentabelle z.B. beim Mega128 zeigt,
daß man mit 16MHz hinreichende Genauigkeit bei gängigen Baudraten
bekommt.
Wichtiger finde ich, die Leistung der Controller optimal zu nutzen. Dazu
zählen bei mir höchstmögliche Taktfrequenz und genaues internes
Zeitsignal: 1ms oder 10ms. Das erreicht man am besten mit 16 oder 20MHz
Quarzen.
Gut, es gibt Anwendungen, bei der alle IO-Pins gebraucht werden, bei der
die Leistungsaufnahme möglichst gering sein soll, bei der die
Versorgungsspannung nur aus ein bis zwei Batteriezellen besteht. Dann
muß man anders planen.
Aber wer kauft sich heute einen nagelneuen PC mit GHz-Potenz, um ihn
dann auf 300MHz herunterzutakten?
>UART mit dem Internen Taktgeber ist immer Glückssache.>Kann gehen, muss aber nicht.
Quatsch! Die zulässige Toleranz der Baudrate bei einer seriellen
Verbindung ist bekannt, ebenso die Toleranz über alles des internen
RC-Oszillators. Somit kann man sich eine wählen, die noch in dieses
Raster passt.