Ir ao conteúdo
  • Cadastre-se
diegops

Ajuda com serial pic 18f4550

Recommended Posts

Boa tarde pessoal,

 

Estou com problemas com o a serial do PIC 18F4550, ele esta comunicando com meu pc pela USB, mas além disso ele está comunicando com um outro microcontrolador  16f628A pela serial, para enviar dados do 18F para o 16F funciona beleza, agora quando eu habilito a interrupção de recepção no 18F ele trava, seu eu nem enviar nada a ele pela serial, deixei um led piscando enquanto ele está executando o programa, e quando habilito a interrupção o led pisca muito mais lento e para.. ou seja, para de rodar o programa, codigo esta abaixo. Obrigado pela ajuda.

 

#include <18F4550.h>#device ADC=10;  #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,VREGEN //ORIGINAL   #use delay(clock=48000000) #use rs232(baud=19200,parity=N, bits=8, xmit=PIN_C6,rcv=PIN_C7, ERRORS, STREAM=Wireless) //Define ao firmware que será utilizado o código de manipulação HID.#DEFINE USB_HID_DEVICE  TRUE /*Define a habilitação do endpoint de transmissão e aloca espaço na memória para os bytes de trasmissão*/#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT       #define USB_EP1_TX_SIZE    5        //aloca 5 bytes para transmissão  /*Define a habilitação do endpoint de recepção e aloca espaço na memória para os bytes de recepção*/#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT       #define USB_EP1_RX_SIZE    8        //aloca 8 bytes para recepção   ///////////////////////////////////////////////////////////////////////////////// Inclusão da biblioteca CCS USB/////////////////////////////////////////////////////////////////////////////// #include <pic18_usb.h>         //Microchip 18Fxx5x para o usb.c #include <usb_desc_hid_ACEPIC.h>  //Configuração da USB e Descritor do Dispositivo#include <usb.c>              /*Manipula as configurações USB e obtem o                           relatório do descritor*/ #include "LCD4B.c" ///////////////////////////////////////////////////////////////////////////////// Configura os pinos de entrada e saída///////////////////////////////////////////////////////////////////////////////#define L1 PIN_D0#define L2 PIN_D1#define L3 PIN_D2#define L4 PIN_D3#define RB0 PIN_B0#define RB1 PIN_B1//#define RB2 PIN_B2#define RA4 PIN_A4#define VENT PIN_C2#define AQC PIN_C1#define LED_ON output_high#define LED_OFF output_low int status = 0b00000000;#bit s_L1 = status.0      //Bit de estado para o Led L1#bit s_L2 = status.1      //Bit de estado para o Led L2#bit s_L3 = status.2      //Bit de estado para o Led L3#bit s_L4 = status.3      //Bit de estado para o Led L4#bit s_AQC = status.4      //Bit de estado para o ccto. de aquecimento#bit s_VENT = status.5      //Bit de estado para o ccto. de ventilação int8 in_data[8];         //Buffer para os dados recebidos pela USB /////////////////////////////////////////////////////////////////////////////// Variáveis para a conversão analógica digital /////////////////////////////////////////////////////////////////////////////int32 valor_adc01;int32 valor_adc03; //#############################################################//#########Configuração saídas a relé remotas #################//############################################################# int1 modo_config=0;char num_sens=0; //variáveis de recepção serialInt pacote[10];   #define MAX 2#int_rda   void rd_isr(void)                  {      int i;            disable_interrupts(INT_RDA);           // Disable Serial Recieve Interrupt      disable_interrupts(GLOBAL);            // Disable Global Interrupts            for (i=0; i<=MAX; i++)         {            pacote[i]=fgetc(Wireless);         }       if (pacote[0] == 'o' && pacote[1] == 'k')         {            switch(pacote[2])                   {                case 'C':  modo_config = 1;                                                      break;                }                     }             enable_interrupts(GLOBAL);       enable_interrupts(INT_RDA);   } /////////////////////////////////////////////////////////////////////////////// usb_debug_task()// Quando chamado periodicamente, exibe informações de enumeração e conexão./////////////////////////////////////////////////////////////////////////////void usb_debug_task(void) {   static int8 last_connected;   static int8 last_enumerated;   int8 new_connected;   int8 new_enumerated;    new_connected=usb_attached();   new_enumerated=usb_enumerated();    last_connected=new_connected;   last_enumerated=new_enumerated;} void main() {  enable_interrupts(INT_RDA); //habilito aqui e ele trava  enable_interrupts(GLOBAL);       int8 out_data[20];      //Buffer para os dados enviados   int8 send_timer=0;      //Variável de controle de tempo   int8 send_adc_Timer=0;      //Variável de controle de tempo para ADC   int i=0;          //variaveis teste diego   char n0=0,n1=1;    //  lcd_ini();         //Inicialização do LCD       //inicialização de status dos leds   s_L1=0;   s_L2=0;   s_L3=0;   s_L4=0;      //inicialização das saídas reserva PIC   Output_D(0xFF);      //Faz toda a porta D = 1     output_high(PIN_C2);   output_high(PIN_A4);   output_high(PIN_A5);   output_high(PIN_E0);   output_high(PIN_E1);      output_high(PIN_B3);      //Escreve mensagens de inicialização no LCD  // printf(lcd_escreve,"\fACEPIC PRO V 2.1");  //printf(lcd_escreve,"\n    USB - HID");            usb_init();         //Faz inicialização da USB     // setup_adc_ports(AN0_TO_AN2);    //Configura Portas 0 e 3 para ADC    setup_adc(ADC_CLOCK_INTERNAL);   //Configura clock interno para ADC      while (TRUE) {          usb_task();         //Verifica tarefas USB      usb_debug_task();      //Verifica tarefas USB - Debug            i++;            if(i==50000)         {         output_toggle(PIN_B1);         i=0;            if (modo_config == 1)               {               output_toggle(pin_b3);               }         }            if(input(PIN_A1)){      output_low(PIN_B2);      }            if(input(PIN_A0)){      output_high(PIN_B2);      }            if (usb_enumerated())    //Se dispositivo conectado corretamente à USB         {         if (!send_timer)    //Verifica se variável = 0            {            send_timer=250;            //Retorna o valor 250 à variável send_timer            send_adc_timer++;          //Incrementa a variável send_adc_timer            if (send_adc_timer>=4)     //Envia os valores ADC em aprox. 1 segundo               {                set_adc_channel(2);      //Seleciona o canal analógico 0                delay_us(100);             //Atraso de 100us                valor_adc01 = read_adc();  /*Lê o canal 0 e armazena o valor em                                  valor_adc01*/                            set_adc_channel(0);        //Seleciona o canal analógico 3                delay_us(100);             //Atraso de 100us                valor_adc03 = read_adc();  /*Lê o canal 3 e armazena o valor em                                valor_adc03*/                 send_adc_timer=0;          //zera a variável send_adc_timer                                if (valor_adc03 >= 81)    //Se adc03 Maior que aprox. 40 graus                  {                     output_low(AQC);   //Desliga ccto. aquecimento                     output_high(VENT);   //Liga ccto. ventilação                     s_AQC = 0;      //status Aquecimento                        s_VENT = 1;      //status ventilação                  }                if (valor_adc03 <= 60)   //Se adc03 menor que aprox. 30 graus                   {                     output_low(VENT);   //Desliga ccto. ventilação                     s_VENT = 0;      //status ventilação                   }             //Escreve mensagens no LCD                  // printf(lcd_escreve,"\fAN0 = %04ld mV", (valor_adc01*5000)/1023);           // printf(lcd_escreve,"\nTMP = %02ld %cC", (valor_adc03*500)/1023,0XDF);             }                //Valores a serem armazenados nas posições 0 a 10 do vetor out_data   out_data[0]= valor_adc01>>8;   //Armazena a parte alta da variável valor_adc01   out_data[1]=(int) valor_adc01;   //Armazena a parte baixa da variável valor_adc01   out_data[2]= valor_adc03>>8;   //Armazena a parte alta da variável valor_adc03      out_data[3]=(int) valor_adc03; //Armazena a parte baixa da variável valor_adc03   out_data[4]= status;      //Armazena o status dos leds e Aqc e vent.            ////////////////////////////////////////////////////////////////////////////////////Envia o vetor out_data à USB /////////////////////////////////////////////////////////////////////////////////     if (usb_put_packet(1, out_data, 5, USB_DTS_TOGGLE));              }    if (usb_kbhit(1))       //verifica se existe algum dado vindo da USB      {      //Recebe 8 bytes e armazena na variável in_data         usb_get_packet(1, in_data, 8);                  //Verifica se os índices 0 e 1 da variável in_data formam a string 'LD'      if (in_data[0] == 'L' && in_data[1] == 'D')         {          switch(in_data[2])   //Verifica o índice 2 da variável in_data                 {                case '1': Output_toggle(PIN_B3);   //Caso seja 1                          s_L1 = ~s_L1;       //altera estado do Led L1 led azul placa                          printf("\n\rLS%c",n0);                         printf("\n\rLS%c",n0);                         printf("\n\rLS%c",n0);                          break;                case '2': Output_toggle(L2);   //Caso seja 2                             s_L2 = ~s_L2;      //altera estado do Led L2                          printf("\n\rDS%c",n0);                         printf("\n\rDS%c",n0);                         printf("\n\rDS%c",n0);                          break;                case '3': Output_toggle(L3);   //Caso seja 3                          s_L3 = ~s_L3;       //altera estado do Led L3                          break;                case '4': Output_toggle(L4);   //Caso seja 4                          s_L4 = ~s_L4;      //altera estado do Led L4                          break;                case 'A': Output_High(AQC);   //Caso seja A                          s_AQC = 1;      //altera estado do ccto. aquec                          break;                }         }//#############################################################//#########Configuração saídas a relé remotas #################//#############################################################            if (in_data[0] == 'C' && in_data[1] == 'S')// se receber do supervisorio         {                                       // solicitação de configuração...             printf("\n\rCS%c",num_sens);            printf("\n\rCS%c",num_sens);            printf("\n\rCS%c",num_sens);         }               if (in_data[0] == 'S' && in_data[1] == 'C')// sai do modo config         {                                                        printf("\n\rSC%c",num_sens);            printf("\n\rSC%c",num_sens);            printf("\n\rSC%c",num_sens);         }              }       send_timer--;      //Decrementa a variável sent_timer      delay_ms(1);      //Atraso de 1ms   } }}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem algumas observações.

A comunicação é USB CDC,isto quer dizer que na verdade o Windows esta lendo uma porta serial emulada,logo não sei sei é possivel duas seriais ao mesmo tempo no Windows sem interromper uma e depois outra.

Se voce estivesse usando o 18F com USB nativo,voce poderia se comunicar com o PC pela USB e ao mesmo tempo se comunicar com o PC ou o outro PIC pela serial.

Agora se o problema é quando envia do 16F para o 18F,pode ser porque o USB esta com a interrupção habilitada tambem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, realmente a USB esta com interrupção, eu eu estava utilizando interrupção para USB e Serial, e pelo que entendi não posso ter 2 interrupções.. deixei somente a interrupção para USB. Agora estou testando para ver se vai funcionar a serial sem interrupção. Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O CCS é muito fechado,voce vai ter que ler o manual.

Este PIC trabalha com prioridades de interrupção e não sei se o CCS da acesso a esses detalhes,talvez deixando a USB com prioridade baixa e a serial em alta funcionasse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O CCS é muito fechado,voce vai ter que ler o manual.

Este PIC trabalha com prioridades de interrupção e não sei se o CCS da acesso a esses detalhes,talvez deixando a USB com prioridade baixa e a serial em alta funcionasse.

Realmente desconheço essa função no CCS, a unica forma que eu estou conseguindo trabalhar é com interrupção na USB e sem interrupção serial entre os pics, mas ainda não está 100%..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×