PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uart-Problem nach Microcontroller-Umstellung



Hender
09.05.2006, 15:01
Hallo,
ich habe bei meiner Schaltung den ATMega32L 8AI (8Mhz) aufgrund eines Defektes gegen eine ATMega32 16AU (16Mhz) ersetzen müssen. In der Schlatung gibt es einen externen Quarz mit 8Mhz. Seitdem funktioniert das Uart nicht mehr, obwohl ich meines Wissens nach das Register UBRRL richtig angepasst habe. Ich möchte eine Baud-Rate von 38400 haben.
Was fehlt denn hier? Evtl. habe ich was übersehen. Vielleicht kann mir jemand von Euch helfen. Danke

Hier mein Uart-Init-Code:



// Initialisierung UART
void uart_init (void)
{
/* USART-Init 38400 Baud bei 8MHz für Mega32 */
UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH = 0; // Highbyte ist 0
UBRRL = 25; // beim ATmega32L 8AI stand hier 12
}

Bluesmash
09.05.2006, 15:04
hast du den die fuses am neuen mega32 auf externen quarz gestellt? sonst tickt der mit dem internen 1MHz.....

gruss bluesmash

Hender
09.05.2006, 15:09
Äh, nö habe ich wahrscheinlich nicht gemacht. Bei dem alten Atmel habe ich das wahrscheinlich auch nicht gemacht. Wie stelle ich das denn ein?

uwegw
09.05.2006, 15:09
Hast du jetzt auch nen 16er Quarz drin, oder noch den alten 8er? Wenn du bei 8Mhz gebleiben bist, musst du auch die UBRR-Einstellung auf den alten Werten lassen... ausschlaggebend ist immer der tatsächliche Takt, nicht der maximal mögliche (16Mhz)

Hender
09.05.2006, 15:14
Der 16Mhz Atmel benutzt auch einen 8Mhz Quarz. Ich bin mir aber im Moment überhaupt nicht sicher, ob ich den externen Quarz je benutzt habe. Ich glaube fast, dass ich selbst bei dem alten AtMega32 immer den internen Quarz benutzt habe. Bei den alten UBRR-Werten funktioniert das Uart aber auch nicht richtig.

uwegw
09.05.2006, 15:23
Die 12 würde jedenfalls für 8Mhz passen...
Mit den internen 1Mhz kriegst du deine Baudrate nicht hin. Schon deswegen, aber auch wegen der größeren Taktgenauigkeit müsstest du also die Fusebits auf den externen Quarz umstellen.
Mit welcher Übertragungssoftware und mit welcher ISP-Variante arbeitest du?

PS: das Berechnen der Werte für die Register kann auch der Präprozessor erledigen (siehe mikrocontroller.net-Tutorial)


/* USART-Init beim ATmega32 */
#ifndef F_CPU
#define F_CPU 8000000 /* Oszillator-Frequenz in Hz hier angeben */
#endif

// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)

#define UART_BAUD_RATE 38400 //gewünschte Baudrate hier angeben

UBRRH = (uint8_t)(UART_UBRR_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL = (uint8_t)UART_UBRR_CALC(UART_BAUD_RATE,F_CPU);

Hender
09.05.2006, 15:31
Ich arbeite mit PonyProg2000 und programmiere den Atmel über parallel AVR-ISP. Wie setze ich den die Fusebits?

uwegw
09.05.2006, 15:34
anleitung:
http://www.elektronik-projekt.de/include.php?path=content/articles.php&contentid=29&PHPKITSID=1858365a4ab3040234d68f3bf5fb43e06

PS: JTAGEN auch gleich ändern, sonst kannst du nicht alle Pins an PortC benutzen.