Ich bin beim Programmieren nun wieder bei meinem alten UARTPROBLEM mit dem UBRR Wert gelandet da ich die Baudrate erhöhen wollte.
Kann es sein das MYUBRR_VAL 16000000/16/UART_BAUD_RATE-1 nur zufällig funktioniert?
Sobald ich die Baudrate erhöhe funktioniert der Code schon nichtmehr.
Defines... Fehlerhaft?
PHP-Code:
#define F_CPU 16000000UL
#define UART_BAUD_RATE 9600 //9600
#define UBRR_VAL ((F_CPU+UART_BAUD_RATE*8)/(UART_BAUD_RATE*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD_RATE-1000) // Fehler in Promille
Makro nicht korrekt???
PHP-Code:
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL)
Aufruf in der MAIN verkehrt???
PHP-Code:
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
oder die Initfunktion von p.fleury ansich nicht geeignet???
PHP-Code:
void uart_init(unsigned int baudrate)
{
UART_TxHead = 0;
UART_TxTail = 0;
UART_RxHead = 0;
UART_RxTail = 0;
#if defined( AT90_UART )
/* set baud rate */
UBRR = (unsigned char)baudrate;
/* enable UART receiver and transmmitter and receive complete interrupt */
UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
#elif defined (ATMEGA_USART)
/* Set baud rate */
if ( baudrate & 0x8000 )
{
UART0_STATUS = (1<<U2X); //Enable 2x speed
baudrate &= ~0x8000;
}
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char) baudrate;
/* Enable USART receiver and transmitter and receive complete interrupt */
UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
#ifdef URSEL
UCSRC = (1<<URSEL)|(3<<UCSZ0);
#else
UCSRC = (3<<UCSZ0);
#endif
#elif defined (ATMEGA_USART0 )
/* Set baud rate */
if ( baudrate & 0x8000 ) //Baudrate
{
UART0_STATUS = (1<<U2X0); //Enable 2x speed
baudrate &= ~0x8000; //Baudrate
}
UBRR0H = (unsigned char)(baudrate>>8); //Baudrate
UBRR0L = (unsigned char) baudrate; //Baudrate
/* Enable USART receiver and transmitter and receive complete interrupt */
UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
#ifdef URSEL0
UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
#else
UCSR0C = (3<<UCSZ00);
#endif
#elif defined ( ATMEGA_UART )
/* set baud rate */
if ( baudrate & 0x8000 )
{
UART0_STATUS = (1<<U2X); //Enable 2x speed
baudrate &= ~0x8000;
}
UBRRHI = (unsigned char)(baudrate>>8);
UBRR = (unsigned char) baudrate;
/* Enable UART receiver and transmitter and receive complete interrupt */
UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
#endif
}/* uart_init */
Ich verstehe einfach nicht wo das Problem liegen soll.... irgendwie ist es völlig unlogisch für mich das der Code so nicht funktioniert aber ich lass mich gerne eines besseren belehren...
FUSES korrekt gesetz! DSOSC_16KCK_65MS_XOSXC_SLOWPWR
und CKDIV 8 haken nicht gesetzt!
Ich bin am verzweifeln.... hat keiner einen heißen Tipp für mich???
VIELEN DANK
Lesezeichen