Forum: Mikrocontroller und Digitale Elektronik Baudrate Mega128L 4Mhz intern geht 8Mhz intern nicht


von herrmann (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von herrmann (Gast)


Lesenswert?

Hallo

bringt nichts UART1 geht UART0 nicht bei 8Mhz

UBRR0H= (unsigned char)(105>>8);
UBRR0L = (unsigned char) 105;

von Hannes L. (hannes)


Lesenswert?

Vielleicht bringt ja die Verwendung eines Baudratenquarzes Abhilfe.

...

von herrmann (Gast)


Lesenswert?

Ja ich werde mir angewöhnen immer einen externen Quarz einzusetzen.

Danke

von Hannes L. (hannes)


Lesenswert?

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

von herrmann (Gast)


Lesenswert?

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

von Christian Erker (Gast)


Lesenswert?

Warte mal bis es 10 K wärmer ist .. :D oder kälter...

Gruß,
Christian

von herrmann (Gast)


Lesenswert?

Ja ich weiß es ist ziemlich temp abhängig ist das mit einen externen 
quarz genaus so????

von Gast (Gast)


Lesenswert?

>Ja ich weiß es ist ziemlich temp abhängig ist das mit einen externen
>quarz genaus so????

Nein, überhaupt nicht!

von Michael U. (amiga)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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?

von Jupp (Gast)


Lesenswert?

>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.

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
Noch kein Account? Hier anmelden.