Professional Documents
Culture Documents
#include <xc.h> //Biblioteca geral para os pic's 16f e 18f neste compilador xc8
#include <stdio.h> //Biblioteca para a escrita no display, utilizando o sprintf
#include "time.h" //Biblioteca de dia/mês/ano. Considerei necessário para a utilização da temporização
#include <math.h> //Biblioteca das funções matemáticas
#include <stdlib.h> //Biblioteca de conversãoi de tipos de dados (real para inteiro, por exemplo)
#include <stdbool.h> //Biblioteca para variáveis lógicas (booleanas, por exemplo)
#include "lcd.h" //Biblioteca baixada da internet para o display
Página 2
ECU 16F877A
//AJUSTE PARA SE TER A REFERÊNCIA INICIAL DA CONTAGEM DE TEMPO,
//SE NÃO O PROGRAMA VAI INICIAR O PRIMEIRO CICLO SEM ESTA REFERÊNCIA
ajuste = leitura();
temporeal = (((float)ajuste)*150/1023)+10; // transformar a entrada analógica para frequência de 10 à 160Hz
temporeal = ((1/temporeal)-0.006)*100000; //transformar a frequência em tempo em microsegundos*10
tempoint = (int)temporeal;
while (tempoint%3 != 0) // para saber quantas vezes vai contar 15us
{
tempoint = tempoint+1; // para transformar o número em valor divisível por 3
}
contatempo = tempoint/3;
//FIM
while (1)
{
while (cont < 38)
{
SAIDA361 = 1;
__delay_ms(3);
while (conta != contatempo)
{
__delay_us(15);
conta = conta++;
}
conta = 0;
SAIDA361 = 0;
if (cont%6==0) //gera o pulso do 12+1 a cada 6 pulsos do 36+1
{
SAIDA121 = 1;
}
else
{
SAIDA121 = 0;
}
if (cont2==2) // realiza o pulso de falha do 12+1 após a falha do 36+1
// e a leitura da entrada analógica novamente
{
SAIDA121 = 1;
cont2 = 0;
if (temporeal < 1900.0) ////atualiza a entrada analógica para quando a frequência for maior que 40hz
(atualização mais lenta)
{
ajuste = leitura();
Página 3
ECU 16F877A
temporeal = (((float)ajuste)*150/1023)+10; // transformar a entrada analógica para frequência de
10 à 160Hz
temporeal = ((1/temporeal)-0.006)*100000; //transformar a frequência em tempo em
microsegundos*10
tempoint = (int)temporeal;
while (tempoint%3 != 0) // para saber quantas vezes vai contar 15us
{
tempoint = tempoint+1; // para transformar o número em valor divisível por 3
}
contatempo = tempoint/3;
}
}
if (temporeal >= 1900.0) //atualiza a entrada analógica para quando a frequência for menor que 40Hz
(atualização rápida lenta, pois a frequência é mais lenta)
{
ajuste = leitura();
temporeal = (((float)ajuste)*150/1023)+10; // transformar a entrada analógica para frequência de 10 à
160Hz
temporeal = ((1/temporeal)-0.006)*100000; //transformar a frequência em tempo em microsegundos*10
tempoint = (int)temporeal;
while (tempoint%3 != 0) // para saber quantas vezes vai contar 15us
{
tempoint = tempoint+1; // para transformar o número em valor divisível por 3
}
contatempo = tempoint/3;
}
if (cont2<2) //referência da falha do 12+1
{
Página 5
ECU 16F877A
cont2++;
}
}
}
Página 6