PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 644P Uart0 StopBit Problem



shedepe
08.10.2010, 14:40
Wenn ich das Datenblatt des Atmega 644P richtig verstanden habe sollte folgender Code doch bewirken, dass der Uart0 mit 8 Datenbits und 1 Stoppbit arbeitet


UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);


Jetzt habe ich allerdings durch ausprobieren herausgefunden, dass der Uart0 immer noch mit 2 Stoppbits arbeitet obwohl USBS0 nicht gesetzt wird.
Hat jemand schon mal das Problem gehabt bzw. weis wie man es lösen kann ?

Slein
08.10.2010, 20:25
Mahlzeit!

UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
Sagt ihm 8 Datenbits, da gehört aber noch UCSZ02 im UCSR0B dazu.
Evtl. setzt du den ja auch und das 9. Datenbit sieht aus wie ein Stopbit?
Oder schreibst im UCSR0C ja doch noch irgendwo anders rum?

Das hier reichte für mich immer für GPS empfangen und in einen FT232 schreiben (asynchron mit 8N1):



// --- baud rate 4800 bps (bei 14,746MHz)
unsigned int baud = 191;
UBRR0H = (unsigned char) (baud>>8);
UBRR0L = (unsigned char) baud;

// --- UCSRB/C
UCSR0B = (1 << RXEN0) | (1 << RXCIE0) | (1 << TXEN0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);

shedepe
10.10.2010, 14:14
Also ich habe 2 Init Funktionen, einmal für Usart0 und einmal für Usart1



void Init_Usart0()
{

UBRR0H = ((F_CPU +BAUD*8 )/ (BAUD * 16L) - 1) >>8;
UBRR0L = ((F_CPU +BAUD*8 )/ (BAUD * 16L) - 1) & 0xFF;

UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);

}
void Init_Usart1()
{
UBRR1H = ((F_CPU +BAUD1*8 )/ (BAUD1 * 16L) - 1) >>8;
UBRR1L = ((F_CPU +BAUD1*8 )/ (BAUD1 * 16L) - 1) & 0xFF;

UCSR1B = (1<<RXEN1)|(1<<TXEN1) | (1<<RXCIE1);
UCSR1C = (1<<UCSZ10) | (1<<UCSZ11) ;
}


Wenn ich jetzt die Kommunikation über Usart1 mache, muss ich auf PC seite einstellen 8 Datenbits und 1 Stopbit damit die Daten sauer ankommen
Wenn ich die kommunikation über Usart0 mache, muss ich am Pc 8 Datenbits und 2 Stopbits einstellen damit die Daten sauber ankommen

Sollte ja eig nicht sein, da ich beide Usarts gleich konfiguriert habe

Slein
10.10.2010, 21:41
Hast du mal nen anderen Controller versucht?
Ansonsten kann ich mir wirklich nur vorstellen, dass du irgendwo anders im code in einem config register rumschreibst. Ein aus dem Ruder gelaufener Pointer oder sowas.

Hab noch mal nachgesehen, in einem anderen Projekt sende ich mit dieser Initialisierung an nem 644p über uasrt0 was an nen PC, 8N1.

Viel Glück :)

shedepe
11.10.2010, 14:42
Ich hab meinen Code grad extra nach mal durchgeschaut...ich setz das Register wirklich nur in der Init Funktion. Dann liegts wohl am Controller. Leider hab ich grad keinen ersatz Controller da.

Trotzdem vielen Dank