Escolar Documentos
Profissional Documentos
Cultura Documentos
//Saidas:
//Entradas:
//Entradas:
//Saidas:
A6,
B5, B4, B3,
C6,
, C5, C4, C3, C2, C1, C0
//Saidas:
//Entradas:
E2, E1, E0
//******************************************************************
#define SEM_DESCIDA_AUTOMATICA
0
#define TEMPO_15_MINUTOS
900
// --> 90.000 contagens em uma base de
~10ms: ~15 minutos
#define TEMPO_2_HORAS
7200
// --> 720.000 contagens em uma base de
~10ms: ~2 horas
//******************************************************************
Fim_curso_0;
Fim_curso_1;
Fim_curso_2;
Fim_curso_freio;
Botao_0;
Botao_1;
Botao_2;
Seguranca_emergencia;
Habilita;
Botao_pulso;
Operacao_normal;
Energia;
B4;
B3;
// SUBROTINAS
void
inicializacao (void);
void
debounce
(void);
//Funo para fazer o Debounce dos botoes
void
borda
(void);
//***********************Debounce do fim de curso 0*********************
void inicializacao (void)
//Inicializao dos pinos
{
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
SET_TRIS_A(0b10111111);
//1 - entrada, 0 - sada
SET_TRIS_B(0b11111111);
SET_TRIS_C(0b11000000);
SET_TRIS_D(0b11110000);
SET_TRIS_E(0b11111111);
PORT_B_PULLUPS(0b00011000);
//habilita pull-ups nos bino
s B4 e B3 (pinos para selecao de elevador eletrico x elev hidraulico com descida
automatica)
OUTPUT_A(INPUT_A()
0 nas sadas
OUTPUT_B(INPUT_B()
OUTPUT_C(INPUT_C()
OUTPUT_D(INPUT_D()
OUTPUT_E(INPUT_E()
& 0b10111111);
&
&
&
&
//Coloca
0b11111111);
0b11000000);
0b11110000);
0b11111111);
}
//***********************Debounce dos botes****************************
void debounce(void)
// faz Debounce
dos 10 pinos de entrada
{
Debounce_port_A = INPUT_A();
Debounce_port_B = INPUT_B();
Debounce_port_C = INPUT_C();
Debounce_port_D = INPUT_D();
Debounce_port_E = INPUT_E();
delay_ms(2);
Debounce_port_A = Debounce_port_A & INPUT_A();
Debounce_port_B = Debounce_port_B & INPUT_B();
Debounce_port_C = Debounce_port_C & INPUT_C();
Debounce_port_D = Debounce_port_D & INPUT_D();
Debounce_port_E = Debounce_port_E & INPUT_E();
Fim_curso_0
= Debounce_port_E >> 2;
Fim_curso_1
= Debounce_port_A >> 2;
Fim_curso_2
= Debounce_port_E >> 1;
Fim_curso_freio
= Debounce_port_A >> 1;
Botao_0
= Debounce_port_A >> 4;
Botao_1
= Debounce_port_A >> 7;
Botao_2
= Debounce_port_A >> 3;
Seguranca_emergencia
= Debounce_port_A >> 5;
Habilita
= Debounce_port_A;
Botao_pulso
= Debounce_port_B >> 5;
Operacao_normal
= Debounce_port_C >> 6;
Energia
= Debounce_port_E;
B4
B3
= Debounce_port_B >> 4;
= Debounce_port_B >> 3;
}
//*********************************************************
void borda (void)
//verifica se ouve borda em S1,
ou nas sadas elevador_sobe, elevador_sobe_1, elevador_desce e elevador_desce_1
{
short estado_atual_elevador_desce;
short estado_atual_elevador_sobe;
debounce();
if ((!Fim_curso_1) && (Estado_anterior_fim_curso_1))
Borda_fim_curso_1 = 1;
else
Borda_fim_curso_1 = 0;
Estado_anterior_fim_curso_1 = Fim_curso_1;
estado_atual_elevador_desce = Elevador_desce || Elevador_desce_1;
if ((!estado_atual_elevador_desce) && (Estado_anterior_elevador_desce))
Borda_elevador_desce = 1;
else
Borda_elevador_desce = 0;
Estado_anterior_elevador_desce = estado_atual_elevador_desce;
estado_atual_elevador_sobe = Elevador_sobe || Elevador_sobe_1;
if ((!estado_atual_elevador_sobe) && (Estado_anterior_elevador_sobe))
Borda_elevador_sobe = 1;
else
Borda_elevador_sobe = 0;
Estado_anterior_elevador_sobe = estado_atual_elevador_sobe;
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//
MAIN
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void main(void)
{
short auxiliar, auxiliarValv2;
short elevador_parado;
//Indica se o elevador e
st parado(1) ou nao(0)
unsigned long contador_sirene = 0;
unsigned long contador_timeout_descAutom = TEMPO_15_MINUTOS, contador_au
xiliar_descAutom=0, tempo_timeout_descAutom=0; // variaveis para controlar a des
cida automatica no elevador hidraulico
//unsigned long contador_delay_parada=0;
unsigned long contador_delay_freio=31;
short habilita_contagem_delay_freio=0;
inicializacao();
//Inicia os pino
s
for(;;)
{
delay_ms(8);
uma base de tempo de aprox. 10ms
borda();
za as informaes de debounce e borda
if (Fim_curso_0)
{
Lugar_0 = 1;
//Para fornecer
//Atuali
Lugar_1 = 0;
contador_auxiliar_descAutom = 0;
contador_timeout_descAutom = tempo_timeout_descAutom; // reinicializ
a contagem para descida automatica
}
if (Fim_curso_2)
{
Lugar_0 = 0;
Lugar_1 = 1;
}
if (Borda_fim_curso_1 & (Elevador_sobe || Elevador_sobe_1))
{
Lugar_0 = 0;
Lugar_1 = 1;
}
if (Borda_fim_curso_1 & (Elevador_desce | Elevador_desce_1))
{
Lugar_0 = 1;
Lugar_1 = 0;
}
if ((Lugar_0 == Lugar_1))
{
Lugar_0 = 0;
Lugar_1 = 0;
}
//////////////Seta valor do timeout para descida automatica do elevador (se elev
ador hidraulico); decrementa o contador
if (B4 & B3)
// Elevador eltrico
tempo_timeout_descAutom = SEM_DESCIDA_AUTOMATICA;
else if (B4 & !B3)
// Elevador hidraulico com d
escida automatica de 15 min
tempo_timeout_descAutom = TEMPO_15_MINUTOS;
else if (!B4 & B3)
// Elevador hidraulico com d
escida automatica de 2 horas
tempo_timeout_descAutom = TEMPO_2_HORAS;
else
// Elevador hidraulico sem descida automatica
tempo_timeout_descAutom = SEM_DESCIDA_AUTOMATICA;
if (!Fim_curso_0 & Seguranca_emergencia & Habilita & Operacao_no
rmal & !Elevador_sobe & !Elevador_sobe_1 & !Elevador_desce & !Elevador_desce_1 &
!Elevador_desce_2)
{
contador_auxiliar_descAutom ++;
if (contador_auxiliar_descAutom == 100)
{
contador_auxiliar_descAutom = 0;
if (contador_timeout_descAutom > 1)
contador_timeout_descAutom --;
//
decrementa a cada ~1 segundo, se > 1;
}
}
//////////////Parte responsvel por subir
auxiliar = !Fim_curso_2 & Seguranca_emergencia & Habilita & !(!E
nergia & !(B4 & B3)) & Operacao_normal & !Elevador_desce & !Elevador_desce_1; //
nao sobe se no tiver energia e hidraulico
Elevador_sobe =
auxiliar & (Botao_2 || (Botao_pulso & El
evador_sobe));
Elevador_sobe_1 =
auxiliar & (Botao_1 || (Botao_pulso & El
evador_sobe_1)) & !Fim_curso_1 & Lugar_0;
if(Elevador_sobe || Elevador_sobe_1)
{
output_high(SAIDA_ELEVADOR_SOBE);
contador_auxiliar_descAutom = 0;
contador_timeout_descAutom = tempo_timeout_descAutom; // reinicializ
a contagem para descida automatica
}
else
{
output_low(SAIDA_ELEVADOR_SOBE);
}
//////////////Parte responsvel por descer
auxiliar = !Fim_curso_0 & Seguranca_emergencia & Habilita & Oper
acao_normal & !Elevador_sobe & !Elevador_sobe_1;
Elevador_desce =
auxiliar & (Botao_0 || (Botao_pulso & El
evador_desce));
//--- descer para andar 0
Elevador_desce_1 =
auxiliar & (Botao_1 || (Botao_pulso & El
evador_desce_1)) & !Fim_curso_1 & Lugar_1;
//--- descer para andar 1
Elevador_desce_2 = auxiliar & (contador_timeout_descAutom == 1);
//--- descida automatica para andar0
if(Elevador_desce || Elevador_desce_1)
{
output_high(SAIDA_ELEVADOR_DESCE);
contador_auxiliar_descAutom = 0;
contador_timeout_descAutom = tempo_timeout_descAutom; // reinicializ
a contagem para descida automatica
}
else if (Elevador_desce_2)
{
output_high(SAIDA_ELEVADOR_DESCE);
}
else
{
output_low(SAIDA_ELEVADOR_DESCE);
if (habilita_contagem_delay_freio==1) //inicio bloco del
ay freio
{
contador_delay_freio++;
}
if (contador_delay_freio>5) //o nmero o ajuste de tempo,
mexer se necessrio
{
output_low(SAIDA_ELEVADOR_DESCE1);
habilita_contagem_delay_freio=0;
}
//fim bloco delay freio
Contador_tempo_partida = 0;
}
// ---- parte responsavel pelo acionamento da saida DESCE1, para
segunda valvula de descida no elevador hidraulico
if (Contador_tempo_partida < 30)
//se nao passou 0.3 segundos desde a
abertura da valvula 1 //*** Ajustar tempo se necessario
{
auxiliarValv2 = 0;
Contador_tempo_partida ++;
}
else
{
auxiliarValv2 = 1;
}