Baixe o app para aproveitar ainda mais
Prévia do material em texto
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA CATARINENSE CÂMPUS LUZERNA Cursos: Engenharia de Controle e Automação Componente Curricular: Microcontroladores Acadêmicos: Jhonatan Rodrigo de Almeida, Ketlyn Munari de Mattos e Thalis Moritz Parize Relatório Microontroladores Exercício 3 Elevador Luzerna, SC, Abril de 2016. DESCRIÇÃO Desenvolver um código como um simulador de funcionamento de um elevador predial. O programa deveria contar com botões de chamada de elevador para cada andar (o número de andares caberia a nós ecolher). Deveria simular os motores de subida e descida através de LEDs, bem como para cada andar uma indicação luminosa seria adicionada para apontar que o elevador estaria sendo esperado pelos mesmos. Também contaria com um display de 7 segmentos que serviria como mostrador de andar, indicando onde o elevador se encontraria em dado momento. Declaramos as bibliotecas que seriam utilizadas ao longo do código. Atribuímos “apelidos” para os pinos, definimos as entradas e as saídas dos pinos nas portas do microcontrolador, habilitamos o pullup interno nos botões, definimos as funções que seriam utilizadas (set_bit, clear_bit, test_bit).. Desenvolvemos o código a seguir, nosso elevador seria instalado em um prédio de 3 andares, sendo eles, o térreo (andar0), o andar 1 e o andar 2, com a lógica de que o elevador seria chamadao em cada andar através de um sensor, simbolizado por uma troca manual no nivel lógico de três pinos do microcontrolador (pinos que foram dedicados a representar os andares). Quando o botão que indica que o elevador foi chamado no térreo (andar 0) fosse pressionado, a indicação luminosa correspondente seria ligada, manualmente seria feita a troca de andares, dependento da localização do elevador, se este estivesse no andar 1, o motor indicando que estava a descer seria acionado (isto é, o LED correspondene a descida ligaria), quando a troca manual de andares fizesse com que o elevador chegasse ao andar onde havia sido solicitado, então a indicação luminosa do andar se apagaria e o motor que estivesse acionado seria desligado. Durante esta transição de localização o display mostraria o andar em que o elevador se encontrasse em cada momento. Para que o display mostrasse o número correspondente ao andar em que o elevador se localizava, foi utilizado a configuração de ligação do display com as portas condizentes ao número binário correspondente. Cada localização foi associada com seu binário correspondente para que o display pudesse mostrar corretamente o andar. Utilizamos a função de comparação test_bit para determinar se o pino se encontrava em nível lógico alto ou baixo, isto é, se estava ativado ou não (com exceção dos pinos em que o pullup foi acionado em que esta situação seria o contrário). Com isto, a ação seguinte foi determinada utilizando o set_bit que selecionou o pino correto para acionar, isto é, ligando o motor ou a indicação luminosa desejada. Após concluído o set_bit, utilizamos o clear_bit para evitar que os LEDs permanecessem ligados mesmo quando a atividade desejada já houvesse sido realizada. PROGRAMA #include <avr/io.h> #define F_CPU 1000000UL #include <util/delay.h> #define test_bit(porta,bit) (porta&(1<<bit)) #define set_bit(porta,bit) (porta|=(1<<bit)) #define clear_bit(porta,bit) (porta&=~(1<<bit)) #define botao1 PC2 #define botao2 PC3 #define botao3 PC4 #define sensor1 PB6 #define sensor2 PB7 #define sensor3 PB0 #define motor_subir PC0 #define motor_descer PC1 #define andar0 PC5 #define andar1 PB1 #define andar2 PB2 int main(void) { int display[3] = {0b00111111,0b00000110,0b01011011}; DDRD = 0b01111111; // display que mostra em qual andar o elevador está PORTC = 0b00011100; // habilita pullup nos 3 botões DDRC = 0b00100011; // 2 LEDs, subindo ou descendo MOTORES e entrada indicação luminosa 1, siginifica que está no andar 0 PORTB = 0b11000001; // entrada dos sensores, PB0 PB6 E PB7 DDRB = 0b00000110; // entrada indicação luminosa 2 e 3, significa que está no andar 1 e no andar 2, respectivamente while(1) { // ANDAR 0 if(test_bit(PINC,botao1)==0) // Se o botão 1 estiver ligado { set_bit(PORTC,andar0); // Liga indicação andar 0 } if((test_bit(PINC,andar0)!=0)&(((test_bit(PINB,sensor2)==0)|(test_bit(PINB,sensor3)==0))&(test_bi t(PINB,sensor1)!=0)&(test_bit(PINC,motor_subir)==0))) { // Se indicação andar 0 estiver ligado, e sensor 2 ou sensor 3 estiver ligado, e sensor1 estiver desligado, e motor subir está desligado set_bit(PORTC,motor_descer); // Liga motor descer } if((test_bit(PINC,andar0)!=0)&(test_bit(PINB,sensor1)==0)) //Se indicação andar 0 estiver ligado, e sensor1 estiver ligado { clear_bit(PORTC,motor_descer); // Desliga motor descer } if(test_bit(PINB,sensor1)==0) // Se sensor1 estiver ligado { PORTD=display[0]; // Mostra 0 no display } if(test_bit(PINB,sensor1)==0) // Se sensor1 estiver ligado { clear_bit(PORTC,andar0); // desliga a indicação andar 0 } // ANDAR 1 if(test_bit(PINC,botao2)==0) // Se botão 2 estiver ligado { set_bit(PORTB,andar1); //Liga a indicação andar 1 } if((test_bit(PINB,andar1)!=0)&(test_bit(PINB,sensor3)==0)&(test_bit(PINB,sensor2)!=0)&(test_bit( PINB,sensor1)!=0)&(test_bit(PINC,motor_subir)==0)) { //Se indicação andar 1 estiver ligado, e o sensor3 estiver ligado e sensor2 e sensor1 estiver desligado, e motor não estiver subindo set_bit(PORTC,motor_descer); // Liga motor descendo } if((test_bit(PINB,andar1)!=0)&(test_bit(PINB,sensor2)==0)) // Se indicação andar 1 estiver ligado, e sensor 2 estiver ligado { clear_bit(PORTC,motor_descer); // Desliga motor descendo } if((test_bit(PINB,andar1)!=0)&(test_bit(PINB,sensor1)==0)&(test_bit(PINB,sensor2)!=0)&(test_bit( PINB,sensor3)!=0)&(test_bit(PINC,motor_descer)==0)) { // Se indicação andar 1 estiver ligado, e sensor1 estiver ligado, e sensor2 estiver desligado, e motor não estiver descendo set_bit(PORTC,motor_subir); // Liga motor subir } if((test_bit(PINB,andar1)!=0)&(test_bit(PINB,sensor2)==0)) // Se indicação andar 1 estiver ligado, e sensor2 estiver ligado { clear_bit(PORTC,motor_subir); // Desliga motor subir } if(test_bit(PINB,sensor2)==0) // Se sensor2 estiver ligado { PORTD=display[1]; // Mostra 1 no display } if(test_bit(PINB,sensor2)==0) // Se sensor2 estiver ligado { clear_bit(PORTB,andar1); // Desliga indicação andar 1 } //ANDAR 2 if(test_bit(PINC,botao3)==0) // Se botão3 estiver ligado { set_bit(PORTB,andar2); // Liga indicação andar2 } if((test_bit(PINB,andar2)!=0)&((test_bit(PINB,sensor1)==0)|(test_bit(PINB,sensor2)==0))&(test_bit( PINB,sensor3)!=0)&(test_bit(PINC,motor_descer)==0)) { // Se indicação andar 2 estiver ligado, e sensor1 ou sensor2 estiver ligado e sensor3 estiver desligado, e motornão estiver descendo set_bit(PORTC,motor_subir); // Liga motor subir } if((test_bit(PINB,andar2)!=0)&(test_bit(PINB,sensor3)==0)) // Se indicação andar 2 estiver ligado e sensor3 estiver ligado { clear_bit(PORTC,motor_subir); // Desligar motor subir } if(test_bit(PINB,sensor3)==0) //Se sensor3 estiver ligado { PORTD=display[2]; // Mostra 2 no display } if(test_bit(PINB,sensor3)==0) // Se sensor3 estiver ligado { clear_bit(PORTB,andar2); // Desliga indicação andar 2 } } } FOTOS DO CIRCUITO Imagem 01: O elevador está no térreo Imagem 02: Foi chamado no andar 1: LED de subida e o LED do andar 1 ascenderam. Imagem 03: Elevador chegou no andar 1, os LED’s apagaram. Imagem 04: Foi chamado no andar 2: LED de subida e o LED do andar 2 ascenderam. Imagem 05: Elevador chegou no andar 2, os LED’s apagaram.
Compartilhar