quarta-feira, 26 de agosto de 2015

Comando Serial I

Este exemplo tem como objetivo mostrar como podemos controlar a velocidade de piscada do led usando comando pela USB do micro em uma placa de desenvolvimento.

Supondo que queremos controlar a abertura dos injetores de um veículo que seque a sequencia 1-3-4-2 usando os leds 1 3 5 e 6.

O valor enviado é guardado dentro da EEPROM do micro, e depois lido pela lógica para controlar o comando de tempo delay_ms

Para enviar os códigos, usei o programa de envio de informações pela Serial ACE Pic
(o link esta no post que fiz neste blog em agosto 2015 - ferramental)

O envio de comando se faz na seguinte maneira:

         (w - para escrever) + (0 - endereço da EEPROM) + ( d - valor)

Lembrando também que os caracteres são enviados em ASCII, ou seja:

         w - equivale a 0x77 em hexadecimal ASCII
         0 - equivale a 0x30 em hexadecimal ASCII
         d - equivale a 0x64 em hexadecimal ASCII

A leitura do endereço da EEPROM se faz da seguinte maneira:

        (r - desejo de ler a memória) + (0 - endereço da EEPROM que se quer ler)


O código principal: 

#include "C:\Users\main.h"

#priority int_RDA    //Da prioridade a interrupção da porta serial

char resp=0;      
char rec[3];        
char end,cal,sw;  
int a;
int temp_inj=1000;   //Valor inicial do tempo de injeção (um segundo)

#int_RDA             //interrupção pela porta serial
void trata_serial()
{
   gets(rec);                    //Pega os bytes vindos da serial
   sw=rec[0];                    //aramazena o primeiro byte relativo ao comando (w - escreve / r - lê a                                                    EEPROM)
 
   printf("%c",'s');             //Devolve na serial que "s" (sim) para avisar que a interrupção foi ativada

   
      if(sw=='r')
      {
         end = rec[1];                    //Armazena o endereo da EEPROM que se quer ler
         cal = read_eeprom(end); //Armazena o valor lido noendereço "end" excrever da EEPROM
         printf("%c",cal);              //Envia para serial o valor lido "cal" no endereço "end"
      }
      if(sw=='w')                         // Write EEprom
      {
         end = rec[1];                   //Armazena o endereo da EEPROM que se quer escrever
         cal = rec[2];                    //Armazena o valor que se quer excrever na EEPROM
         write_eeprom(end,cal);  //escreve no endereço "end" da EEPROM o valor armazenado na                                                            variável "cal"
         resp=read_eeprom(end);  //Lê o endereço "end" da EEPROM e armazena na variável resp
         printf("%c",resp);
     
      }

}
 
//Incia bloco principal

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_Vref(FALSE);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab


temp_inj=read_eeprom(0x30);   //Carrega valor desejado de tempo de injeção da do endereço (0x30)h da EEPROM

     while(true)
   {

       temp_inj=read_eeprom(0x30); //Atualiza a variável
     
       //sequencia de injeção 1 - 3 - 4 - 2
     
       //Injetor 1
     
       output_high(pin_d0);         //abre injetor 1
       delay_ms(temp_inj);           //carrega o tempo de abertura desejado
       output_low(pin_d0);          //Fecha injetor 1
     
       //Injetor3
     
       output_high(pin_d4);         //abre injetor 3
       delay_ms(temp_inj);           //carrega o tempo de abertura desejado
       output_low(pin_d4);          //Fecha injetor 3
     
       //Injetor4
     
       output_high(pin_d6);         //abre injetor 4
       delay_ms(temp_inj);           //carrega o tempo de abertura desejado
       output_low(pin_d6);          //Fecha injetor 4
     
       //Injetor2
     
       output_high(pin_d2);         //abre injetor 2
       delay_ms(temp_inj);           //carrega o tempo de abertura desejado
       output_low(pin_d2);          //Fecha injetor 2
     
       //printf("%c",temp_inj);
   
   }

}

ARQUIVO main.h

#include <18F4550.h>
//#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High Speed Crystal/Resonator with PLL enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                    //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV1                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES ICPRT                    //ICPRT enabled

#use delay(clock=8000000)

#use rs232(baud=256000,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Nenhum comentário: