Ainda não consegui cortar o queijo rs.
Fiz um código simples com entradas de pulsos simulados em um botão no pino RB6 do 16f628a, que é o T1OSO para testes.
Funciona no Proteus porém é de longe a forma correta eu sei.
Não entendo muito bem do modo comparador com TMR1H, flags etc.
Código simples:
#include <16F628A.h>
#include <stdlib.h> //Para strings
#use delay(clock=4000000) // Oscilador interno
#fuses XT,nomclr,nowdt
//***************************************** LCD *****************************************
#define lcd_enable pin_a1 // pino enable do LCD (E)
#define lcd_rs pin_a0 // pino rs (register select)do LCD (RS)
// (0) para comandos (1) para dados
// O pino RW vai no negativo.
#define lcd_db4 pin_b4 // pino de dados d4 do LCD
#define lcd_db5 pin_b5 // pino de dados d5 do LCD
#define lcd_db6 pin_b3 // pino de dados d6 do LCD
#define lcd_db7 pin_b7 // pino de dados d7 do LCD
#include <lcd.h> //declaração da biblioteca do LCD
//***************************************** LCD *****************************************
#define TRISB= 0b01010000; //Difini os pinos 5 e 4 como entrada, o resto saída.
#define TRISA= 0b00000000; //Difini todos como saída.
//ZERANDO OS PINOS, DEFINO QUE ELES NAO TEM VALOR ALGUM NO INÍCIO DO PROGRAMA
#define PORTB= 0;
#define PORTA= 0;
#define rele_bomba PIN_B2 //pino RELÉ BUZINA - (PINO 8)
#define rele_cirene PIN_B1 //pino RELÉ CORTA - (PINO 9)
#define inicia_bomba PIN_B2 //pino INICIA - (PINO 10)
#define pulsos PIN_B6 //pino SINAL - (PINO 12)
//Tipo inteiro
int nivel_minimo = 5;
int pulso = 0;
void main()
{
inicializa_lcd(); //Inicializa o LCD
caracter_inicio(1,4);
printf(escreve_lcd,"AGUARDADNDO!");
while(TRUE) //Loop Principal
{
if (input(pulsos)){
pulso++;
limpa_lcd(); //Limpo LCD
caracter_inicio(1,4);
printf(escreve_lcd,"PULSOS");
delay_ms(100);
caracter_inicio(2,5);
printf (escreve_lcd, "%01u", pulso);
}
if (pulso < nivel_minimo)
{
limpa_lcd(); //Limpo LCD
caracter_inicio(1,4);
printf(escreve_lcd,"MENOR");
delay_ms(100);
pulso = 0; //Limpo a variável
output_low(rele_bomba); //Desligo o relé da bomba
output_high(rele_cirene); //Aciono o relé da cirene
}
}//TRUE
}//void main
Na outra tentativa, já incluí o timer mas não tive sucesso.
Código:
#include <16F628A.h>
#include <stdlib.h> //Para strings
#use delay(clock=4000000) // Oscilador interno
#fuses XT,nomclr,nowdt
//***************************************** LCD *****************************************
#define lcd_enable pin_a1 // pino enable do LCD (E)
#define lcd_rs pin_a0 // pino rs (register select)do LCD (RS)
// (0) para comandos (1) para dados
// O pino RW vai no negativo.
#define lcd_db4 pin_b4 // pino de dados d4 do LCD
#define lcd_db5 pin_b5 // pino de dados d5 do LCD
#define lcd_db6 pin_b3 // pino de dados d6 do LCD
#define lcd_db7 pin_b7 // pino de dados d7 do LCD
#include <lcd.h> //declaração da biblioteca do LCD
//***************************************** LCD *****************************************
#define TRISB= 0b01010000; //Difini os pinos 5 e 4 como entrada, o resto saída.
#define TRISA= 0b00000000; //Difini todos como saída.
//ZERANDO OS PINOS, DEFINO QUE ELES NAO TEM VALOR ALGUM NO INÍCIO DO PROGRAMA
#define PORTB= 0;
#define PORTA= 0;
#define rele_bomba PIN_B2 //pino RELÉ BUZINA - (PINO 8)
#define rele_cirene PIN_B1 //pino RELÉ CORTA - (PINO 9)
#define inicia_bomba PIN_B2 //pino INICIA - (PINO 10)
#define pulsos PIN_B6 //pino SINAL - (PINO 12) INTERNAMENTE JÁ DEFINIDO PARA RECONHECER O PULSO
//Tipo inteiro
unsigned int pulso; //global
int ContadorIntTimer = 0;
int nivel_minimo = 20;
#byte TMR1H = 0xFCF
#byte TMR1L = 0xFCE
void ConfigTimer1(void)
{
ContadorIntTimer=0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
set_timer1(15536);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
#INT_TIMER1
void TrataTimer1()
{
if (input(pulsos)){
pulso++;
pulso=TMR1H*256+TMR1L;
}
ContadorIntTimer++;
if (ContadorIntTimer < 5) // 0,2s. Logo, 5 (5*2) equivalem a 1 segundo
{
set_timer1(15536);
TMR1H=TMR1L=0; //zere a contagem
return;
}
}
//1 segundo se passou.
void main()
{
inicializa_lcd(); //Inicializa o LCD
caracter_inicio(1,4);
printf(escreve_lcd,"AGUARDADNDO!");
delay_ms(100);
caracter_inicio(2,5);
printf (escreve_lcd, "%01u", pulso);
while(TRUE) //Loop Principal
{
if (pulso<nivel_minimo)
{
limpa_lcd(); //Limpo LCD
caracter_inicio(1,4);
printf(escreve_lcd,"OK");
delay_ms(100);
caracter_inicio(2,5);
printf (escreve_lcd, "%01u", pulso);
pulso = 0; //Limpo a variável
output_low(rele_bomba); //Desligo o relé da bomba
output_high(rele_cirene); //Aciono o relé da cirene
}
}//TRUE
}//void main
Qualquer dica vai muito bem vinda.
valeu
Obrigado!