2017-02-06 32 views
1

Я работаю над проектом RGB LED, и это контролируется PIC12F1572. Программное обеспечение, которое я использую, - это MPLAB IDE с компилятором HiTech C. План состоит в том, чтобы использовать последовательную связь для отправки командных данных команды LED RGB в ПИК, которые будут храниться в переменной, которая заставит его выполнять мигание светодиодов и светится. Я смог установить связь UART. Любая функция или код кода I являются правильными по синтаксису и работает на терминале командной строки linux, если я компилирую .. И это не удается, если я пытаюсь имитировать использование регистров в MPLAB. Мне тоже нужно было запустить его в симуляции (кто-нибудь знает, как впрыска регистров работает в MPLAB?) Проблема, с которой я сталкиваюсь, когда пытаюсь отлаживать. он компилируется, но не работает вот мой код: Любая идея или намек на проблему будут высоко оценены. Я лично плату, что размещение кода [иерархический путь] может быть неправильным Спасибо!Нет выхода для встроенного приложения с PIC12, MPLAB и UART

#include <xc.h> 
#include "mcc.h" 
#include "LED.h" 
#include "tmr0.h" 
#include "interrupt_manager.h" 

void SetLedColor(uint16_t R_color, uint16_t G_color, uint16_t B_color); 

void main(void) 
{ 
    uint8_t data, i, j; 

    uint16_t R_value, G_value, B_value; 
    uint8_t value; 
    uint8_t RX_Buffer[FRAMESIZE] ,RGB_data[6] ,HEX_data[6]; 

    // initialize the device 
    SYSTEM_Initialize(); 
    INTERRUPT_GlobalInterruptEnable();   // Enable the Global Interrupts 
    INTERRUPT_PeripheralInterruptEnable(); // Enable the Peripheral Interrupts 

    while (1) 
    { 
     // EUSART_Write(0x61); 
     while (!RCIF) 
     { 
      data = EUSART_Read();      // Read received character 
      for (i = 0; i < FRAMESIZE; i++) 
      { 
       RX_Buffer[i] = data; 
      } 

      EUSART_Write(data); 
     } 

     //check if any data is received 

     for (j = 0; j = 5; j++)  // get the RGB value in the separate array 
     { 
      RGB_data[j] = RX_Buffer[j + 3]; 
      HEX_data[value] = RGB_data[j]/16; 
     } 

     if (RX_Buffer[0] == 'R' && RX_Buffer[FRAMESIZE - 1] == '\n') 
     { 
      //ASCII to HEX separate values 

      // uint32_t number = (uint32_t)strtol(HEX_data, NULL, 16); 
      // R_value = number >>16; 
      // G_value = (number & 0xffff) >> 8; 
      // B_value = (number & 0x0000FF); 

      R_value = (uint16_t) atoh(HEX_data[0], HEX_data[1]); 
      G_value = (uint16_t) atoh(HEX_data[2], HEX_data[3]); 
      B_value = (uint16_t) atoh(HEX_data[4], HEX_data[5]); 

     } 

     SetLedColor(R_value, G_value, B_value); 
    } 

} 

void SetLedColor(uint16_t R_color, uint16_t G_color, uint16_t B_color) 
{ 
    if (R_color == 0xFF) 
    { 
     LATAbits.LATA2 = 1; 
    } 
    else 
    { 
     LATAbits.LATA2 = 0; 
    } 

    if (G_color == 0xFF) 
    { 

     LATAbits.LATA4 = 1; 
    } 
    else 
    { 
     LATAbits.LATA4 = 0; 
    } 
    if (B_color == 0xFF) 
    { 

     LATAbits.LATA5 = 1; 
    } 
    else 
    { 
     LATAbits.LATA5 = 0; 
    } 
} 
+0

Не работайте ... Не могли бы вы немного разобраться? – LPs

+0

'uint8_t RX_Buffer [], RGB_data [], HEX_data [];' ... ?????? Вы объявили массивы без размера ..... – LPs

+0

Цель состоит в том, чтобы отображать светодиод по данным, которые я получаю от UART .. и если я делаю отдельные модули каждой задачи, скажем, «UART» -> он работает .. Я могу получить данные и echod обратно к серийному терминалу тоже .. Конверсия ASCII в HEX работает, проверяется светодиодная прога. Все, что я считаю в порядке, и когда я помещаю код вместе. Ограничения UART, не получая данные .. (функция инициализации системы проверена ранее) – Garryp

ответ

0

Так пока получать UART кадра и возвращается обратно, и из данных Запоминание делают LED мигает, я могу добиться успеха, и это то, что я хотел для первичного шага здесь иерархическим образом

#include "mcc_generated_files/mcc.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include "atoh.h" 
#include "LED.h" 
#define _XTAL_FREQ 16000000 
#define FRAMESIZE 19 

void main(void) 
{ 
    uint8_t data,i,j,got_char; 

    uint8_t R_value, G_value ,B_value; 
    uint8_t value; 
    uint8_t RX_Buffer[FRAMESIZE]; 
    uint8_t RGB_data[6] ,HEX_data[6]; 

    // initialize the device 
    SYSTEM_Initialize(); 
    INTERRUPT_GlobalInterruptEnable();      // Enable the Global Interrupts 
    INTERRUPT_PeripheralInterruptEnable();     // Enable the Peripheral Interrupts 

    while (1) 
{ 

     if (EUSART_DataReady) 
     { 
      for (i = 0; i<FRAMESIZE; i++) 
      { 
       RX_Buffer[i] = EUSART_Read(); 
       if (RX_Buffer[i] == '\n') 
        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); 
      } 
     } 

    }  

 Смежные вопросы

  • Нет связанных вопросов^_^