PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : F_CPU bei RN-Control 1.4 ? UART Zeichensalat...



Tirador
22.09.2007, 15: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.

Tirador
22.09.2007, 16:36
Ok ich habs nun, habe im AVR-Demoprogramm folgendes entdeckt und meine Zeilen durch diese getauscht:

// UBRRH = BAUD_REAL >> 8;
//UBRRL = BAUD_REAL & 0xFF;
UBRRH = 0; //Highbyte ist 0
UBRRL = 103; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!

Hubert.G
22.09.2007, 16:41
Probiers mal damit: http://palmavr.sourceforge.net/cgi-bin/fc.cgi?P_PREV=ATmega32&P=ATmega32&V_LOW=DE&V_HIGH=CA&M_LOW_0x3F=0x1E&M_LOW_0x40=&M_LOW_0x80=0x80&M_HIGH_0x01=0x00&M_HIGH_0x06=0x02&M_HIGH_0x08=&M_HIGH_0x10=0x00&M_HIGH_0x20=0x00&M_HIGH_0x40=&M_HIGH_0x80=0x00&B_SUT1=P&B_SPIEN=P&B_CKOPT=P&B_BOOTSZ1=P&B_CKSEL0=P&B_BOOTRST=P