2017-01-23 103 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