Você está na página 1de 8

//******************************************************************

// ELEVADOR PARA 4 ANDARES


// CRIADO POR: DAVID PEREIRA DA SILVA JUNIOR
// JANEIRO/2016
//******************************************************************
//Definies de programa
//
// - Todos os defines so em letras maisculas
// - Todas as variveis globais so com primeira letra maiscula
// - Todas variveis locais so minusculas
//******************************************************************
#include <16F887.h>
#use delay (clock=4000000)
#fuses INTRC_IO,NOWDT,NOBROWNOUT,NOPROTECT,NOMCLR
//******************************************************************
//Entradas
//#define FIM_CURSO_0
pin_e2
//Sensores fim d
e curso
//#define FIM_CURSO_1
pin_a2
//#define FIM_CURSO_2
pin_e1
//#define FIM_CURSO_FREIO
pin_a1
//Sensor fim de curso usado para
iniciar a frenagem durante a descida, para elevador hidraulico
//#define BOTAO_0
pin_a4
//Botes
//#define BOTAO_1
pin_a7
//#define BOTAO_2
pin_a3
//#define SEGURANCA_EMERGENCIA
pin_a5
//Sensores de segurana ou
emergencia cabine
//#define SERIE
pin_a0
//Resultado srie
de emergencia cabine, sensores de segurana, cortina de luz e portas
//#define PULSO_PRESSAO
pin_b5
//Entrada que de
termina se o funcionamento ser por pulso ou presso contnua. 1 = pulso
//#define OPERACAO_NORMAL
pin_c6
//Entrada que de
termina se o funcionamento manual ou normal. 1 = modo normal
//#define ENERGIA
pin_e0
//Entrad
a que determina se existe tensao de alimentacao (220V); entrada so eh relevante
//para elevador hidraulico, com bateria e carregador.
//#define B4
pin_b4
//Entrad
a que determina o tempo para descida automatica do elevador hidraulico
//#define B3
pin_b3
//Entrad
a que determina o tempo para descida automatica do elevador hidraulico
//----------------------------------------------------------------//Sadas
#define SAIDA_TRAVA_0
pin_a6
//Sada para as travas
#define SAIDA_TRAVA_1
pin_c0
#define SAIDA_TRAVA_2
pin_c1
#define SAIDA_ELEVADOR_SOBE
pin_c4
//Sada que comanda subir o elevad
or
#define SAIDA_ELEVADOR_DESCE
pin_d3
//Saida que comanda descer o elevado
r
#define SAIDA_ELEVADOR_DESCE1 pin_d2
//Saida que comanda a segunda valvul
a de descida, para o elevador hidraulico
#define SAIDA_SIRENE
pin_d1
//Sada para a sirene
#define SAIDA_LED_B0
pin_d0
//Sadas para leds dos botoes
#define SAIDA_LED_B1
pin_c3
#define SAIDA_LED_B2
pin_c2
#define SAIDA_HABILITA
pin_c5
//Entradas: A7, , A5, A4, A3, A2, A1, A0

//Saidas:
//Entradas:
//Entradas:
//Saidas:

A6,
B5, B4, B3,
C6,
, C5, C4, C3, C2, C1, C0

//Saidas:

D3, D2, D1, D0

//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
//******************************************************************

short Elevador_desce = 0, Elevador_sobe = 0;


//0 --> Bobina desenergizada = NA aberto e NF fechado
short Elevador_desce_1 = 0, Elevador_desce_2 = 0 , Elevador_sobe_1 = 0;
//1 --> Bonina energizada
= NA fechado e NF aberto
short Elevador_valvula2desce = 0, Elevador_valvula2desce1 = 0;
long Contador_tempo_partida = 0; // 16 bits
short
short
short
short
short
short
short
short
short
short
short
short
short
short

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;

char Debounce_port_A = 0, Debounce_port_B = 0, Debounce_port_C = 0, Debounce_por


t_D = 0, Debounce_port_E = 0;
short Estado_anterior_elevador_sobe = 0;
short Estado_anterior_elevador_desce = 0;
char Estado_anterior_fim_curso_1 = 0;
short Borda_fim_curso_1 = 0;
short Borda_elevador_desce = 0;
short Borda_elevador_sobe = 0;
short Lugar_0 = 0, Lugar_1 = 0;
//quando
nenhum sensor est acionado, diz se o elevador est p cioma ou p baixo do fim_curso
_1.
//******************************************************************

// 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;
}

Elevador_valvula2desce = !(B4 & B3) & auxiliarValv2 & Elevador_d


esce & !(Fim_curso_freio & lugar_0);
Elevador_valvula2desce1 = !(B4 & B3) & auxiliarValv2 & Elevador_
desce_1 & !(Fim_curso_freio & lugar_1);
if(Elevador_valvula2desce || Elevador_valvula2desce1)
output_low(SAIDA_ELEVADOR_DESCE1);
else
{
if(Elevador_desce || Elevador_desce_1 || Elevador_desce_
2)
{
output_high(SAIDA_ELEVADOR_DESCE1);
habilita_contagem_delay_freio=1;//para dar um de
lay quando parar, para desligar a vlvula freio (Desce1) um pouco depois da desce
contador_delay_freio=0;//zerar a contagem do del
ay do freio
}
}
//////////////Parte responsvel pela saida habilita
if(Habilita)
output_high(SAIDA_HABILITA);
else
output_low(SAIDA_HABILITA);
//////////////Parte responsvel pela sirene
auxiliar = Operacao_normal & (!Seguranca_emergencia || (!Fim_cur
so_0 & !Fim_curso_1 & !Fim_curso_2 & !Elevador_desce & !Elevador_desce_1 & !Elev
ador_desce_2 & !Elevador_sobe & !Elevador_sobe_1));
if (auxiliar)
contador_sirene++;
else
contador_sirene = 0;
if(contador_sirene > 180)
{
contador_sirene = 181;
output_high(SAIDA_SIRENE);
}
else
output_low(SAIDA_SIRENE);
//////////////Parte responsvel pelos leds dos botoes
if (Botao_0||Elevador_desce)
output_high(SAIDA_LED_B0);
else
output_low(SAIDA_LED_B0);
if (Botao_1||Elevador_desce_1||Elevador_sobe_1)
output_high(SAIDA_LED_B1);
else
output_low(SAIDA_LED_B1);
if (Botao_2||Elevador_sobe)
output_high(SAIDA_LED_B2);
else
output_low(SAIDA_LED_B2);
//////////////Parte responsvel pelas portas
elevador_parado = !Elevador_sobe & !Elevador_sobe_1 & !Elevador_
desce & !Elevador_desce_1;

//////////////Parte responsvel pela porta 0


auxiliar = (Fim_curso_0 & (Borda_elevador_desce || (Botao_0 & el
evador_parado))) || (!Operacao_normal & Botao_0);
if (auxiliar)
{
Estado_anterior_elevador_desce = 0;
output_high(SAIDA_TRAVA_0);
delay_ms(5000);
output_low(SAIDA_TRAVA_0);
}
//////////////Parte responsvel pela porta 2
auxiliar = (Fim_curso_2 & (Borda_elevador_sobe || (Botao_2 & ele
vador_parado))) || (!Operacao_normal & Botao_2);
if (auxiliar)
{
Estado_anterior_elevador_sobe = 0;
output_high(SAIDA_TRAVA_2);
delay_ms(5000);
output_low(SAIDA_TRAVA_2);
}
//////////////Parte responsvel pela porta 1
auxiliar = (Fim_curso_1 & (Borda_elevador_sobe || Borda_elevador
_desce || (Botao_1 & elevador_parado))) || (!Operacao_normal & Botao_1);
if (auxiliar)
{
Estado_anterior_elevador_desce = 0;
Estado_anterior_elevador_sobe = 0;
output_high(SAIDA_TRAVA_1);
delay_ms(5000);
output_low(SAIDA_TRAVA_1);
}
}
}

Você também pode gostar