-         

Ergebnis 1 bis 3 von 3

Thema: F_CPU bei RN-Control 1.4 ? UART Zeichensalat...

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.05.2007
    Beiträge
    14

    F_CPU bei RN-Control 1.4 ? UART Zeichensalat...

    Anzeige

    Hallo, ich habe UART Zeichensalat beim empfangen der Zeichen am PC:

    Mein Programm:

    Code:
    // 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-b...pply+fuse+bits

    Was muss ich nun einstellen? Blicke noch nicht so richtig durch mit den FUSE-Bits des ATMega32 und dem F_CPU Takt.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    30.05.2007
    Beiträge
    14
    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!!!!

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •