Tirador
22.09.2007, 16:56
Hallo, ich habe UART Zeichensalat beim empfangen der Zeichen am PC:
Mein Programm:
// AVR-Includes
#include <avr/io.h>
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
F_CPU im Makefile definiert werden, eine nochmalige Definition
hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
#ifndef/#endif
Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
verwendet wird und dort eine andere, nicht zur Hardware passende
Taktrate eingestellt ist: Dann wird die folgende Definition
nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
von AVRStudio */
#define F_CPU 16000000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
#endif
#define BAUD 9600L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
// Funktionen
// -=> UART initialisieren <=-
void UART_init(void){
// wichtig: UBRRH _vor_ UBRRL
UBRRH = BAUD_REAL >> 8;
UBRRL = BAUD_REAL & 0xFF;
UCSRB = (1<<RXEN)|(1<<TXEN); // aktiviere Empfänger und Sender
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
//UCSRC |= (1<<URSEL)|(3<<UCSZ0); // 8 Bits, 1 Stopbit?
}
// -=> Byte Transmit <=-
void UART_transmit(uint8_t c){
while(!(UCSRA & (1<<UDRE))); // Warte auf leeren Übertragungspuffer (UDRE = USART Data Register Empty flag)
UDR = c;
}
// -=> String Transmit <=-
void UART_transmit_string(uint8_t *string){
while(!(UCSRA & (1<<UDRE)));
while( *string){ UART_transmit (*string++); }
}
int main (void)
{
UART_init(); // UART-Init Funktion ausführen
UART_transmit_string("Hurra, es funktioniert!!!");
while(1){
}
}
Meine Fusebits (laut Ponyprog):
http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PREV=ATmega32&P=ATmega32&V_LOW=E4&V_HIGH=99&M_LOW_0x3F=0x24&M_LOW_0x40=&M_LOW_0x80=0x80&M_HIGH_0x01=&M_HIGH_0x06=0x00&M_HIGH_0x08=&M_HIGH_0x10=&M_HIGH_0x20=0x00&M_HIGH_0x40=0x00&M_HIGH_0x80=&B_BOOTSZ1=P&B_BOOTRST=P&O_BITS=Apply+fuse+bits
Was muss ich nun einstellen? Blicke noch nicht so richtig durch mit den FUSE-Bits des ATMega32 und dem F_CPU Takt.
Mein Programm:
// AVR-Includes
#include <avr/io.h>
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
F_CPU im Makefile definiert werden, eine nochmalige Definition
hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
#ifndef/#endif
Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
verwendet wird und dort eine andere, nicht zur Hardware passende
Taktrate eingestellt ist: Dann wird die folgende Definition
nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
von AVRStudio */
#define F_CPU 16000000L // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden!
#endif
#define BAUD 9600L // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif
// Funktionen
// -=> UART initialisieren <=-
void UART_init(void){
// wichtig: UBRRH _vor_ UBRRL
UBRRH = BAUD_REAL >> 8;
UBRRL = BAUD_REAL & 0xFF;
UCSRB = (1<<RXEN)|(1<<TXEN); // aktiviere Empfänger und Sender
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
//UCSRC |= (1<<URSEL)|(3<<UCSZ0); // 8 Bits, 1 Stopbit?
}
// -=> Byte Transmit <=-
void UART_transmit(uint8_t c){
while(!(UCSRA & (1<<UDRE))); // Warte auf leeren Übertragungspuffer (UDRE = USART Data Register Empty flag)
UDR = c;
}
// -=> String Transmit <=-
void UART_transmit_string(uint8_t *string){
while(!(UCSRA & (1<<UDRE)));
while( *string){ UART_transmit (*string++); }
}
int main (void)
{
UART_init(); // UART-Init Funktion ausführen
UART_transmit_string("Hurra, es funktioniert!!!");
while(1){
}
}
Meine Fusebits (laut Ponyprog):
http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PREV=ATmega32&P=ATmega32&V_LOW=E4&V_HIGH=99&M_LOW_0x3F=0x24&M_LOW_0x40=&M_LOW_0x80=0x80&M_HIGH_0x01=&M_HIGH_0x06=0x00&M_HIGH_0x08=&M_HIGH_0x10=&M_HIGH_0x20=0x00&M_HIGH_0x40=0x00&M_HIGH_0x80=&B_BOOTSZ1=P&B_BOOTRST=P&O_BITS=Apply+fuse+bits
Was muss ich nun einstellen? Blicke noch nicht so richtig durch mit den FUSE-Bits des ATMega32 und dem F_CPU Takt.