Прервав и с помощью UART

голоса
0

Я изо всех сил над проектом так, я здесь.

Моя проблема заключается в отправке данных через 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;
}

И я получаю хорошо.

Но, Iwant использовать прерывание 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

Приветствия.

Задан 15/07/2015 в 14:41
источник пользователем
На других языках...                            


1 ответов

голоса
0

Так, я отправляю его для кого-то, кто может иметь ту же самую проблему, в один прекрасный день. Проблема была только часы. Даже если у вас есть специальный кварц, вам необходимо определить системные часы. И, когда ваша система часы установлены, вы должны определить периферические часы, да еще один. Но будьте осторожны, не все периферийные контакты работают на периферийные часах, я думаю.

Итак, у меня есть 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 = 4МГц

4 * 20 = 80МГц

80/2 = 40МГц System_CLOCK = 40МГц

40/8 = 5Mz Периферийное тактового сигнала = 5 МГц

Для остальной части кода, я не могу объяснить вам, я обнаружил целый блок, и это работает как это так ...

Ответил 17/07/2015 в 06:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more