PIC18F4431上的UART和内部时钟

PIC18F4431上的UART和内部时钟,c,embedded,pic,mplab,C,Embedded,Pic,Mplab,我用PIC18F4431在带有XC8的MPLABX上制作了一个程序。它根据在UART上接收到的值发送PWM,该值为DMX,250000kbit/s。该程序工作正常,使用10MHz的外部时钟石英运行 配置位: // CONFIG1H #pragma config OSC = HSPLL // Oscillator Selection bits (HS oscillator, PLL enabled (clock frequency = 4 x FOSC1)) #pragma config

我用PIC18F4431在带有XC8的MPLABX上制作了一个程序。它根据在UART上接收到的值发送PWM,该值为DMX,250000kbit/s。该程序工作正常,使用10MHz的外部时钟石英运行

配置位:

// CONFIG1H
#pragma config OSC = HSPLL      // Oscillator Selection bits (HS oscillator, PLL enabled (clock frequency = 4 x FOSC1))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal External Oscillator Switchover bit (Internal External Switchover mode disabled)
UART配置:

void Config_UART1 (void)
{
    BAUDCTLbits.BRG16 = 0;  // Générateur 8 bits
    SPBRG = 9; // Vitesse de transmission 250kbits/seconde
    TXSTAbits.BRGH = 1; //Haute vitesse
    TXSTAbits.SYNC = 0; // Asynchronous mode
    RCSTAbits.SPEN = 1; // Serial port enabled
    RCSTAbits.RX9 = 1; //Selects 9-bit reception
    RCSTAbits.CREN = 1; // Enables receiver
}
void Config_Oscill (void)
{
    OSCCONbits.IDLEN = 0b0; // Run mode enabled; CPU core is clocked in power-managed modes
    OSCCONbits.IRCF = 0x7; // 8 MHz (8 MHz source drives clock directly)
    OSCCONbits.SCS = 0x02; // Internal oscillator block (RC modes)
}
void Config_UART1 (void)
{
    BAUDCTLbits.BRG16 = 0;  // Générateur 8 bits
    SPBRG = 1; // Vitesse de transmission 250kbits/seconde
    TXSTAbits.BRGH = 1; //Haute vitesse
    TXSTAbits.SYNC = 0; // Asynchronous mode
    RCSTAbits.SPEN = 1; // Serial port enabled
    RCSTAbits.RX9 = 1; //Selects 9-bit reception
    RCSTAbits.CREN = 1; // Enables receiver
}
为了改进我的程序,我想使用8MHz的内部时钟。我更改配置位和UART配置;我的程序坏了:你知道为什么吗

配置位:

    // CONFIG1H
#pragma config OSC = IRC      // Oscillator Selection bits (Internal oscillator block, CLKO function on RA6 and port function on RA7)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal External Oscillator Switchover bit (Internal External Switchover mode disabled)
振荡器配置:

void Config_UART1 (void)
{
    BAUDCTLbits.BRG16 = 0;  // Générateur 8 bits
    SPBRG = 9; // Vitesse de transmission 250kbits/seconde
    TXSTAbits.BRGH = 1; //Haute vitesse
    TXSTAbits.SYNC = 0; // Asynchronous mode
    RCSTAbits.SPEN = 1; // Serial port enabled
    RCSTAbits.RX9 = 1; //Selects 9-bit reception
    RCSTAbits.CREN = 1; // Enables receiver
}
void Config_Oscill (void)
{
    OSCCONbits.IDLEN = 0b0; // Run mode enabled; CPU core is clocked in power-managed modes
    OSCCONbits.IRCF = 0x7; // 8 MHz (8 MHz source drives clock directly)
    OSCCONbits.SCS = 0x02; // Internal oscillator block (RC modes)
}
void Config_UART1 (void)
{
    BAUDCTLbits.BRG16 = 0;  // Générateur 8 bits
    SPBRG = 1; // Vitesse de transmission 250kbits/seconde
    TXSTAbits.BRGH = 1; //Haute vitesse
    TXSTAbits.SYNC = 0; // Asynchronous mode
    RCSTAbits.SPEN = 1; // Serial port enabled
    RCSTAbits.RX9 = 1; //Selects 9-bit reception
    RCSTAbits.CREN = 1; // Enables receiver
}
UART配置:

void Config_UART1 (void)
{
    BAUDCTLbits.BRG16 = 0;  // Générateur 8 bits
    SPBRG = 9; // Vitesse de transmission 250kbits/seconde
    TXSTAbits.BRGH = 1; //Haute vitesse
    TXSTAbits.SYNC = 0; // Asynchronous mode
    RCSTAbits.SPEN = 1; // Serial port enabled
    RCSTAbits.RX9 = 1; //Selects 9-bit reception
    RCSTAbits.CREN = 1; // Enables receiver
}
void Config_Oscill (void)
{
    OSCCONbits.IDLEN = 0b0; // Run mode enabled; CPU core is clocked in power-managed modes
    OSCCONbits.IRCF = 0x7; // 8 MHz (8 MHz source drives clock directly)
    OSCCONbits.SCS = 0x02; // Internal oscillator block (RC modes)
}
void Config_UART1 (void)
{
    BAUDCTLbits.BRG16 = 0;  // Générateur 8 bits
    SPBRG = 1; // Vitesse de transmission 250kbits/seconde
    TXSTAbits.BRGH = 1; //Haute vitesse
    TXSTAbits.SYNC = 0; // Asynchronous mode
    RCSTAbits.SPEN = 1; // Serial port enabled
    RCSTAbits.RX9 = 1; //Selects 9-bit reception
    RCSTAbits.CREN = 1; // Enables receiver
}

内部振荡器的精度通常很差,与外部晶体相比非常差。在您使用250K波特的情况下,基频的最小抖动会使您的RX超出波特容差。如果我记得很清楚,PICs有INTOSC reg来校准内部振荡器。请注意,温度会导致内部振荡器改变其精度。我知道温度。我不明白,因为我用示波器在图片上测量8Mhz。你的第二个代码将UART设置为250kb/s,但你的第一个代码没有。你的FOSC是10MHz,而不是40MHz,所以你得到62.5kb/s。还有,你有什么问题?你什么也没说。图片开始了吗?您在UART上收到信号了吗?关于波特率,如果您只使用BRGH=7尝试第二个代码,它会更快。如果它仍然不起作用,那么数据表中确实存在错误。无论如何,这将有助于了解如何测试通信另一端的内容,如LPs所说。