- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: P.fleurys_Uartlib auf Mega2560 zum laufen bringen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Idee

    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_initUART_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 charbaudrate;
       
        
    /* 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 charbaudrate;     //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 charbaudrate;

        
    /* 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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Du hast in einer Zeile, nach Makro nicht korrekt???, "xtalCPU" anstelle von "F_CPU" stehen.
    Ich komme allerdings mit deinen Codeschnippsel nicht ganz klar und der Compiler sollte auch meckern.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521
    Hatte das gleiche Problem an einem anderem Atmega auch schon, da half nur die Werte direkt aus dem Atmega Datenblatt zu nehmen, etwa 19200Baud:
    UBRR0H = 0;//(unsigned char)(Funk_UBRR_BAUD>>;
    UBRR0L = 51;//(unsigned char)Funk_UBRR_BAUD;
    Das Makro ergibt bei Nachrechnen ebenso die Werte 0 und 51, aber anscheinend rechnet der Compiler falsch.
    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

Ähnliche Themen

  1. HILFE! rp6loader auf mac zum laufen bringen?
    Von Al freddo im Forum Robby RP6
    Antworten: 1
    Letzter Beitrag: 21.02.2012, 18:50
  2. RN-Mega2560 blaue LED an PortD5 zum leuchten bringen
    Von super-robman im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 18
    Letzter Beitrag: 01.09.2011, 09:25
  3. Ringmagnet zum Schwimmen bringen
    Von Lordcyber im Forum Mechanik
    Antworten: 10
    Letzter Beitrag: 21.03.2008, 12:37
  4. Habe Probleme, die ISR zu meinem Timer zum laufen zu bringen
    Von LC-HC im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 27.04.2006, 23:14
  5. LCD BATRON BT21605 zum laufen bringen
    Von Spurius im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 12.11.2004, 20:56

Berechtigungen

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

Solar Speicher und Akkus Tests