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:
Postar um comentário