2017-01-23 101 views
0

我想通過PIC12F1572發送命令到另一個PIC12F1572通過UART 和我想發送一個功能,將閃爍從屬PIC上的LED。 我已經做了一些代碼,但我有點困惑 任何人都可以幫我嗎? PS-我使用MPLAB X IDE V3.50PIC到PIC UART通信閃爍LED

主/變送器PIC12F1572:

#include <xc.h> 
    #include "main.h" 
    #include "config.h" 
    #include "TYPEDEF_Definitions.h" 
    #include "PIC_12_Timer0.h" 
    #include "PIC_12_UART.h" 
    #include "System_init.h" 
    #include "Pin_manager.h" 
    #include "LED.h" 

    #define _XTAL_FREQ 16000000 
void main() 
{ 
    SYSTEM_Initialize(); 
    //pin_config(); 
    LATA = 0x00; 
    UART_Init();     //Initialize UART 
    // StartLedBlinkingWithColor(color); 

    TRISAbits.TRISA2 = 1; //make RA2 as input 

    while (1) 
    { 
     //LATAbits.LATA2 = 1; 
     uint8_t Var = 0x61; 
     //uint8_t Var = LATAbits.LATA2; 

     if(TXSTAbits.TRMT == 1) 
      { 

        UART_write(LED_Blink()); // is it possible?? or how it will be possible 

       // __delay_ms(1000); 
      } 

     LATAbits.LATA2 = 1; 


    } 
} 

void LED_Blink() 
{ 
     LATAbits.LATA2 = 1; 
     LATAbits.LATA5 = 1; 

     __delay_ms(1000); 


     LATAbits.LATA2 = 0; 
     LATAbits.LATA5 = 0; 


} 

接收器/ SLAVE PIC12F1572:

#include <xc.h> 
#include "config.h" 
#include "PIC_12F_GPIO.h" 
#include "Led.h" 
#include "Interruptmanage.h" 
#include "PIC_12F_UART.h" 
#include "PIC_12F_TIMER0.h" 
#include "main.h" 

void main(void) 
{ 
    uint8 data; 

    InterruptInit(); 
    TIMER0_Init(); 
    UART_Init(); 
    InitLeds(); // here I init GPIO pin..no prb here 

    // SetLedOff(); 

    /*-------------R E C E I V E R*------------*/ 
    while (1) 
    { // Endless loop 

     if (UART_DataReady())  // I get prob here .. 
     { 
      PORTA = UART_ReadOneByte(); // read the received data, [how can I receive my Led_Blink() function?? 
      LATAbits.LATA2 = 1;  
      //LATAbits.LATA2 = data; 

      //SendByteSerially(data); 
     } 
    } 
} 
+0

這看起來可能是一個有趣的問題,但目前還不清楚你在問什麼?你期望什麼,你的代碼工作方式有什麼不同?查看[如何提問](https://stackoverflow.com/help/how-to-ask)頁面獲取一些指導。 – FriendFX

+0

okay.now我想通過UART發送一個led_blink()函數,這樣這個函數就會使其他PIC上的LED閃爍..總之我想控制LED的閃爍..我編輯上面的代碼:) – Garryp

回答

0

所以對於從UART接收數據並保存在陣列和利用這些數據來VLINK n此LED我這樣做代碼:任何有興趣可以去看看

while (1) 
{ 

     if (EUSART_DataReady) 
     { 
      for (i = 0; i<FRAMESIZE; i++) //#define FRAMESIZE 19 
      { 
       RX_Buffer[i] = EUSART_Read(); 
       if (RX_Buffer[i] == '\n')  //check'\n' in the end of frame 
        break; 
      } 

      RX_Buffer[i] = '\n';      //append '\n' at the end of stoaring array for detection of frame 
      RX_Buffer[i+1] = '\0';      // End of an array 
      EUSART_WriteAnArrayOfBytes(RX_Buffer); 


     if(RX_Buffer[0]=='R' && RX_Buffer[FRAMESIZE-2] == '\n') //check for correct frame 
      { 

      LATAbits.LATA2 = 1; 
      __delay_ms(2000); 
      LATAbits.LATA2 = 0; 
      __delay_ms(1000); 
      } 
     } 

    } 
+0

不錯的工作。注意RX_Buffer [i] ='\ n';'和'RX_Buffer [i + 1] ='\ 0'這兩行;如果你的RX_Buffer是FRAMESIZE字節長的話, *超出緩衝區的結尾處 - 這就是我們所說的[緩衝區溢出](https://en.wikipedia.org/wiki/Buffer_overflow)。 – FriendFX

+0

請upvote我的傢伙然後我不能發佈新的查詢了......我的配額是完整的.. – Garryp

1

有幾件事情考慮:

  • 您不能通過UART「發送功能」。因此,LED_Blink()功能需要位於接收端。在做任何其他事情之前,請驗證該功能在接收端工作,無需任何UART交互。
  • 接下來,您可以定義一個protocol,它基本上決定您通過UART發送的哪些字節值應觸發接收方的LED_Blink()呼叫。例如,如果你決定使用42字節值觸發LED閃爍,你的發送者會打電話UART_write(42)並在接收端,你就必須像下面這樣:

    data = UART_ReadOneByte(); 
    if (data == 42) { 
        LED_Blink(); 
    } 
    
+0

謝謝你@FriendFX我得到了這部分,現在我有新的疑問,我必須發送一個幀命令可以說格式... RGBXXYYZZMAABBCCDD其中RGBis固定值和XXYYZZ是RGB十六進制vakue和M是LED的模式像閃爍或輝光和ABC是發光強度的十六進制值,它如何通過UART發送。如果你有任何解決方案或提示,我會感激你。:)我已經爲這個'void UART_WriteAnArrayOfBytes(uint8 * data,uint8長度) { uint8 i;對於(i = 0; data [i]!='\ 0'; i ++) UART_WriteOneByte(data [i]); } }' – Garryp

+0

你不需要將LED連接到某種D-A或A-D上嗎? – cup

+0

@Garryp,這將是一個新問題 - 你可以創建一個新的問題,並在這裏寫下一個評論鏈接,所以我會看看。如果它解決了你的問題,請不要忘記[標記我的答案爲「接受」](https://stackoverflow.com/help/someone-answers):-) – FriendFX