-         

Ergebnis 1 bis 5 von 5

Thema: CMPS 10 von 9600 auf 19200 oder sogar 38400 Baud umstellen ....

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332

    CMPS 10 von 9600 auf 19200 oder sogar 38400 Baud umstellen ....

    Anzeige

    Hallo Zusammen,

    ich will derzeit die Verbindung zu einem CMPS10 Board von seriell 9600 Baud auf 19200, lieber aber auf 38400 Baud setzen.
    Die Kommunikation klappt mit 9600 Baud ohne Probleme, ist mir aber zu langsam.

    Leider arbeitet die Kommunikation nur mit 9600 und die Routinen scheinen in den Warteschleifen sich zu verewigen.

    Ich verwende die Routinen aus dem Mirokontroller Forum hierfür: http://www.mikrocontroller.net/artic...orial/Der_UART

    Das mache ich mit folgenden Routinen im Startup:

    Teile der Startup routine:

    Code:
        RS232_Init(BAUD_RATE9600);                                    // Init Port for the stand of the Compass
        RS232_PutByte(0xA1);                                        // Setup the Compass for 38400Baud
        RS232_Init(BAUD_RATE38400);                                    // Init Port now to 38400Baud as well 
        Delay_ms(500);                                                // Wait unit external hardware is ready
        iRs232State=RS232_GetByte(&(m_RS232_Buffer[0]));            // get the Baudrate Ok
        InitSPIInterface();
        sei();                                                        // release the interrupts

    Hier die Definition der Baurate
    Code:
    /** 
     Baud rates for the serial communication
    */
    #define BAUD_RATE9600        9600UL            // Ul definition, otherwise problems
    #define BAUD_RATE19200        19200UL
    #define BAUD_RATE38400        38400UL
    
    #define UBRR_VAL ((SYSCLOCK+BAUD_RATE38400*8)/(BAUD_RATE38400*16)-1)        //clever runde
    #define BAUD_REAL (SYSCLOCK/(16*(UBRR_VAL+1)))            //reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD_RATE38400)        //Fehler in Promille
    
    #if ((BAUD_ERROR<990)||(BAUD_ERROR>1010))
    #error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
    #endif
    Hier die Init Routine und die RS232 Put routine

    Init RS232
    Code:
    /*******************************************************
     Function: RS232_Init
     Purpose: Initialise the RS232 serial link
     Input Parameter: Baurate for the UART to use
     Return Value: None
    *******************************************************/
    void RS232_Init(uint32_t    iBaurate)
        {
    /*
    ** Enable TXEN and RXEN in register UCSRB
    */
        UCSRB |= (1 << TXEN);
        UCSRB |= (1 << RXEN);
    /*
    ** Set transmission type, Asynchron 8Bit None Parity 2 Stop bit
    */
        UCSRC = (1 << URSEL)|(1<< USBS)| (1<<UCSZ0) | (1<<UCSZ1);
    
    /*
    ** Set baud rate 
    */
        UBRRH = ((SYSCLOCK / (iBaurate * 16L) - 1)>>8);
        UBRRL = (SYSCLOCK / (iBaurate * 16L) - 1);
    
       do
       {
           UDR;
       }
       while (UCSRA & (1 << RXC));
    }
        
    /*******************************************************
     Function: RS232_PutByte
     Purpose: Send to the UART a data byte
     Input Parameter: the byte
     Return Value: None
         Value = 0
    *******************************************************/
    void RS232_PutByte (uint8_t Byte)
        {
    /*
    ** Wait until previous character is sent
    */
        while (!(UCSRA & (1<<UDRE)));
    /*
    ** Send byte to UART
    */
        UDR = Byte;
    
        return;
        }
    Die Verkabelung ist nicht länger als 8 cm und auf reiner TTL Ebene.

    Hat jemand eine Idee, wo ich noch weiter suchen kann.
    Mein Program bleibt komplett in den RS232 Routinen stecken.

    Meine Vermutung, der CMPS ist weiterhin auf 9600 Baud, da ich nach neuladen
    des Controllers und aktivieren von 9600Baud wieder mit dem Board reden kann,
    obwohl ich keine 9600 Init Sequenze an den Kompass sende.

    Viele Grüße

    R.
    Kaum macht man es richtig, schon funktioniert's ...

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @Ritchie:
    Meine Vermutung, der CMPS ist weiterhin auf 9600 Baud, da ich nach neuladen des Controllers und aktivieren von 9600Baud wieder mit dem Board reden kann, obwohl ich keine 9600 Init Sequenze an den Kompass sende.
    Ich weiß nicht wirklich, woran's bei dir liegt. Aber dass der CMPS10 nach Abschalten der Versorgungsspannung (war das bei dir so?) wieder auf 9600 Baud ist, wäre normal.
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Das stimmt, nur programmiere ich den atmega8 unter spannung um. Hierbei wird der Compass nicht spannungsfrei geschaltet.

    Gruss R.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Ok, habe ich mir schon gedacht ...
    Sendet der CMPS10 denn OK (0x55)?
    Gruß
    Dirk

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hallo Dirk,

    ich habe heute morgen eine Testfunktion eingebaut und erst kommt nicht 0x55 zurück.
    Die Routine geht sogar in einen Timeout, was wohl aus der falschen Baudrate sich ergibt.

    Edit: Lösung gefunden

    Code:
        RS232_Init(BAUD_RATE9600);                                    // Init Port for the stand of the Compass
        InitSPIInterface();
        sei();                                                        // release the interrupts    
        getGyroZerovalue();                                            // read the middle point of the Gyro for calibration
        initFilterArray();
        Delay_ms(500);                                                // Wait unit external hardware is ready    
        RS232_PutByte(0xA1);                                        // Setup the Compass for 19200Baud
        Delay_ms(500);                                                // Wait unit external hardware is ready
        RS232_Init(BAUD_RATE38400);                                    // Init Port now to 19200 as well
        Delay_ms(500);                                                // Wait unit external hardware is ready
        iRs232State=RS232_GetByte(&(m_RS232_Buffer[0]));            // get the Baudrate Ok

    Ich habe eine Verzögerungszeit nach dem Senden eingefügt, bevor ich die Baudrate umschalte.
    Jetzt scheint es zu gehen. Siehe Code oben.

    Danke für den Tip mit dem Status auswerten. Hiermit kam ich erst auch die Idee mit der Verzögerung.

    Gruss R.
    Geändert von Ritchie (28.04.2013 um 09:41 Uhr)
    Kaum macht man es richtig, schon funktioniert's ...

Ähnliche Themen

  1. Bascom Vollversion kaufen oder auf Assembler umstellen?
    Von seseb im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 24
    Letzter Beitrag: 19.06.2012, 12:36
  2. PIC16f873a mit 4Mhz und 19200 Baud
    Von wurm im Forum PIC Controller
    Antworten: 0
    Letzter Beitrag: 06.07.2007, 16:45
  3. C-Control mit 19200 Baud - Warum ?
    Von fiexx77 im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 27.06.2007, 12:59
  4. Welchen Quarz für 19200 Baud? Wie errechnen/ermittel?
    Von Jon im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 22.01.2007, 14:06
  5. dos-ide und 19200 baud
    Von CityJumper im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 1
    Letzter Beitrag: 13.02.2004, 23:27

Berechtigungen

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