This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

using PCA FOR baud rate generation i am acing problem

HEllo we are using silabs c8051f340 controller.we try to implement software uart using programle counter arrays(PCA)for baud rate generation and i am not able get to desired baudrate .we are using internal clk of 12000000 and baudrate is 9600 please try to give sloution

  • void UART0_Init (void)
    { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is ignored // RX enabled // ninth bits are zeros // clear RI0 and TI0 bits if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx CKCON |= 0x08; } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 CKCON |= 0x09; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 } else { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10 CKCON |= 0x02; }

    TL1 = TH1; // init Timer1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 TI0 = 1; // Indicate TX0 ready
    }

  • 5 points for unreadable code.

    What was wrong with posting the code according to the Keil instructions? Would that have made the code too easy to read?

  • Wow that came out to one line this is kind of what it was supposed to be I think.

    void UART0_Init (void)
    {
    SCON0 = 0x10; // SCON0: 8-bit variable bit rate
    // level of STOP bit is ignored
    // RX enabled
    // ninth bits are zeros
    // clear RI0 and TI0 bits
    if (SYSCLK/BAUDRATE/2/256 < 1) {
    TH1 = -(SYSCLK/BAUDRATE/2);
    CKCON &= ~0x0B; // T1M = 1;
    SCA1:0 = xx CKCON |= 0x08;
    }
    else
    if (SYSCLK/BAUDRATE/2/256 < 4)
    {
    TH1 = -(SYSCLK/BAUDRATE/2/4);
    CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
    CKCON |= 0x09;
    }
    else
    if (SYSCLK/BAUDRATE/2/256 < 12)
    {
    TH1 = -(SYSCLK/BAUDRATE/2/12);
    CKCON &= ~0x0B;
    // T1M = 0; SCA1:0 = 00
    }
    else
    {
    TH1 = -(SYSCLK/BAUDRATE/2/48);
    CKCON &= ~0x0B;
    // T1M = 0; SCA1:0 = 10
    CKCON |= 0x02;
    }
    
    TL1 = TH1; // init Timer1
    TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
    TMOD |= 0x20;
    TR1 = 1; // START Timer1
    TI0 = 1; // Indicate TX0 ready
    }
    


    Dubious translation caveats added.

    Stephen