中断和使用 UART

Interrupting and using UART

我正在为一个项目苦苦挣扎,所以,我来了。

我的问题是通过 UART 发送数据。事实上,这不是问题,因为我成功发送数据感谢:

 int x=1;
#define var 00000001
        void InitUART()
        {
        mPORTFClearBits(BIT_8);
        TRISFbits.TRISF8=0;        // RF8 output==>TX1
        TRISFbits.TRISF1=1;        // RF1 input==>RX1
        U1STA = 0x1400; // Enable Tx(inv) and Rx
        //U1BRG = 8332; // value = (80000000 / BAUD) - 1 = 9600
        U1MODE = 0x8008; // Enable UART with 1 stop bit, no parity and BRGH
        OpenUART1(UART_EN | UART_BRGH_FOUR, UART_RX_ENABLE | UART_TX_ENABLE,U1BRG(UART1_BAUD) );
        }

int main(void) {

    InitUART;
 while (1)
      {
 x|=var;

              x=x<<1; //=> 0000 0010

               x=x<<1; //=> 0000 0101
               x|=var;

               x=x<<1; //=> 0000 1011
               x|=var;



              x=x<<1; //=> 0001 0110

              x=x<<1; //=> 0010 1101
              x|=var;

              x=x<<1; //=> 0101 1010

              x=x<<1; //=> 1011 0100

                //uart_send_data((BYTE*)x,8);

            U1TXREG=x;
}

而且我收到的很好。

但是,我想使用 ChangeNotice 中断。这是代码,它有效:

void InitISR()
{
        SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
        PORTSetPinsDigitalIn(IOPORT_B, BIT_2);          //RB2 as input for CN4 operation
        mPORTBClearBits(BIT_2);
        mCNOpen(CONFIG, PINS, PULLUPS);
       // mCNClearIntFlag();                            // clear interrupt flag
        temp=mPORTBRead();                              // clear port mismatch
        ConfigIntCN(INTERRUPT);                         // enable CN interrupt
        INTEnableSystemMultiVectoredInt();
        TRISEbits.TRISE0= 1;                //E0 input   // SCL EST BRANCHE EN E0/D0
        TRISEbits.TRISE1= 1;                //E1 input   // SDA EST BRANCHE EN E1/D1
        TRISEbits.TRISE2= 0;                //D2 output
        TRISEbits.TRISE3=0;
        LATEbits.LATE2=0;
        LATEbits.LATE3=0;

}

void __ISR(_CHANGE_NOTICE_VECTOR,ipl6) ChangeNotification_Handler(void)
{   
            LATEbits.LATE2=0; //To know
            LATEbits.LATE2=1; // that interrupt
            LATEbits.LATE2=0; // is working

        if ((mPORTEReadBits(BIT_0))!=0) //Check if clock is high==> sending data
        {
            nbr++;
            SDA=mPORTEReadBits(BIT_1);

                           if (SDA==0)       // data =0?
                          {
                                i=i<<1;
                          }
                    else                // data !=0 ==> 1
                          {
                                i=i<<1;
                                i|=var;
                          }              }
     else
    {
             if (nbr==8) // 8bits=>1byte
            {

                 U1TXREG = i;
                    nbr=0;

            }
             else
             {
             }

    }

    temp=mPORTBReadBits(BIT_2);
    mCNClearIntFlag();

}

但是,当我同时执行这两项操作时,它正在发送一些东西,但根本不是我要找的东西,它正在发送(六进制)000 224 224 000 224 224 00 224 224 000。而不是接收每个字节一个字节,我每 14 个字节接收 14 个字节。

所以,我虽然 UART 带来了中断,但我尝试使用 asm("di");IEC0bits.U1TXIE=0;IEC0bits.U1TXIE=0; 禁用它但没有任何效果...... 所以,如果有人知道我为什么有这个问题,我会很高兴=D

干杯。

所以,有一天我会把它发给可能有同样问题的人。 问题只是时钟。即使你有一个特殊的石英,你也需要定义你的系统时钟。并且,当您设置系统时钟时,您必须定义您的外设时钟,是的另一个。但要小心,我认为并非所有外设引脚都在外设时钟上工作。

所以,我有一个 48Mhz 石英,我的代码在这里:

  //48Mhz
//I want SYS_CLOKC=40Mhz
    #pragma config UPLLEN   = OFF   // USB PLL Enabled, OFF si quartz 48 MHz
    #pragma config FPLLIDIV = DIV_12 // PLL Input Divider, il faut obtenir 
                                     //      entre 4 et 5 MHz
    #pragma config FPLLMUL  = MUL_20        // PLL Multiplier
    #pragma config FPLLODIV = DIV_2         // PLL Output Divider


    // périphérique clock 5Mhz = SYSCLK/FPBDIV
    #pragma config FPBDIV   = DIV_8         // Peripheral Clock divisor


    // oscillateur : Primary Osc w/PLL (XT+,HS+,EC+PLL)
    #pragma config POSCMOD  = HS            // Primary Oscillator
    #pragma config FNOSC    = PRIPLL        // Oscillator Selection
    #pragma config FWDTEN   = OFF           // Watchdog Timer
    #pragma config CP       = OFF           // Code Protect

48/12=4Mhz

4*20=80Mhz

80/2=40Mhz System_CLOCK=40Mhz

40/8=5Mz 外围时钟=5Mhz

对于其余的代码,我无法向您解释,我找到了整个块并且它是这样工作的所以...