2017-01-23 6 views
0

Я хочу отправить команду PIC12F1572 на другой PIC12F1572 через UART и в этом хочу отправить функцию, которая будет мигать светодиодом на подчиненном ПОС. Я сделал какой-то код, но я несколько запутанный Может ли кто-нибудь помочь мне здесь? PS- Я использую MPLAB X IDE v3.50PIC to PIC UART-связь для мигания светодиода

Master/передатчик 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; 


} 

RECEIVER/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 Я хочу отправить функцию led_blink() через UART, чтобы эта функция мигала светодиодами на другом PIC. Короче, я хочу управлять миганием светодиодов. Я редактирую приведенный выше код :) – Garryp

ответ

0

Таким образом, для Получение данных из UART и сохранить его в массив и использовать эти данные для VLink Nthe 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

Пожалуйста, возвыси меня, ребята, я больше не могу отправлять новые запросы ... Моя квота полна. – Garryp

1

Есть несколько вещей, рассмотреть:

  • Вы не можете «отправить функцию» через UART. Следовательно, функция LED_Blink() должна быть на стороне приемника. Прежде чем делать что-либо еще, убедитесь, что функция работает на стороне приемника без какого-либо взаимодействия с UART.
  • Далее вы можете определить protocol, который в основном определяет, какие значения байтов, отправляемые через UART, должны вызывать вызов LED_Blink() на стороне приемника. Например, если вы решили использовать значение байта 42, чтобы вызвать LED мигает, ваш отправитель назовет UART_write(42) и на приемной стороне, вы бы что-то вроде следующего:

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

thank вы @FriendFX Я получил эту часть, и теперь у меня есть новые сомнения, что я должен отправить команду фрейма, скажем в формате ... RGBXXYYZZMAABBCCDD, в котором значение исправления RGBis и XXYYZZ - это RGB hex vakue, а M - режим светодиода, как мигать или свечение и ABC - это шестнадцатеричное значение для яркости интенсивности. Как он может отправить UART. Я буду благодарен, если у вас есть какое-либо решение или подсказка .. :) Я написал эту функцию для этого 'void UART_WriteAnArrayOfBytes (uint8 * data, uint8 длина) { uint8 i; для (i = 0; данных [i]! = '\ 0'; i ++) { UART_WriteOneByte (данные [i]); } } ' – Garryp

+0

Вам не нужно подключать светодиод к D-A или A-D, чтобы сделать это? – cup

+0

@Garryp, это будет новый вопрос - вы можете создать новый и написать комментарий здесь со ссылкой на него, поэтому я посмотрю. Также, пожалуйста, не забудьте [отметить мой ответ как «принято»] (https://stackoverflow.com/help/someone-answers), если он решил вопрос для вас :-) – FriendFX