You are on page 1of 15

IESB - Instituto de Educao Superior de Braslia Engenharia Computao/Eltrica Sistemas Computacionais - Hardware

Sistema contador Microcontrolado

Perodo/Turma: 6 semestre Engenharia Computao/ Eltrica. Alunos:


LUCIANO FRANKLIN DOS SANTOS - 1012081027 WEULLER MARCOS DA SILVA SANTOS - 1012082037

Professor: Gustavo Cotta.

Braslia-DF 2012

1. INTRODUO
Os sistemas computacionais se desenvolveram de uma forma impressionante. Hoje englobam setores que inicialmente no faziam parte de seu escopo. Estes sistemas proporcionaram uma significativa evoluo em todos os setores que aderiram o seu uso como ferramenta de facilitao, de forma que se torna inevitvel nos dias atuais no utiliz-los. O nosso projeto consiste em um sistema contador Microcontrolado, que efetua uma contagem progressiva (0 a 9) caso o valor de um determinado pino esteja em nvel lgico baixo e uma contagem regressiva (9 a 0) caso o mesmo pino esteja em nvel lgico alto. A verificao do estado do pino de controle de contagem (progressiva ou regressiva) realizada a cada segundo. Ou seja, possvel alterar de progressiva para regressiva no meio da contagem. Como sada o sistema escreve o valor dos segundos em um display de 7 segmentos ctodo comum.

2. COMPONENTES UTILIZADOS
Para a realizao deste trabalho foi necessria utilizao dos seguintes componentes eletrnicos:

Componente Resistor 220 Ohms Protoboard Display de 7 segmentos Arduino Uno Chave Liga\Desliga Fios (Jumpers) Total:

Quantidade 7 1 1 1 1 20

Valor unitrio R$0,10 R$13,90 R$3,50 R$90,00 R$1,00 R$5,50

Valor Total R$0,70 R$13,90 R$3,50 R$90,00 R$1,00 R$5,50

R$114,60
Tabela 01: Componentes Utilizados

2.1.

Descrio dos componentes

Resistor 220 Ohms: Resistores so componentes que tm por finalidade oferecer uma oposio passagem de corrente eltrica, a essa oposio damos o nome de resistncia eltrica. Objetivo do resistor de 220 no circuito do projeto limitar a corrente que chega aos Leds do display de 7 em 20 mA, para evitar a queima dos mesmos. Clculo para corrente de entrada nos Leds do Display:

Equao 01: Lei de Ohm.

I = 5V/220 = 22,7 mA.

Protoboard: uma placa com furos e conexes condutoras para montagem de circuitos eltricos experimentais. A grande vantagem da placa de ensaio na montagem de circuitos eletrnicos a facilidade de insero de componentes, uma vez que no necessita soldagem. O objetivo do Protoboard no projeto dar suporte para interligar os componentes.

Figura 01: Protoboard.

Display de 7 segmentos: Display de sete segmentos um componente eletrnico usado para exibir nmeros decimais. Tambm possvel a exibio de algumas letras, embora essa no seja a funo especfica desse display. Cada segmento formado por um led e o conjunto desses organizado com um pino em comum (positivo ou negativo). Assim, os displays de sete segmentos so classificados como nodo ou ctodo, ou seja, o terminal comum pode ser positivo (nodo), ou negativo (ctodo). O objetivo do display de 7 segmentos no projeto mostrar a contagem crescente 0 a 9 e regressiva de 9 a 0, como foi utilizado um Display ctodo comum o pino comum foi ligado no GND.

Ctodo comum
Figura 02: Display de 7 segmentos.

nodo comum

Arduino: Arduino uma plataforma open-source de prototipagem eletrnica baseada na flexibilidade, projetada com um microcontrolador Atmel AVR de placa nica, com suporte de entrada/sada embutido, uma linguagem de programao padro, na qual tem origem em Wiring, e essencialmente C/C++. Em nosso projeto foi utilizado a placa Arduino Uno com Microcontrolador ATMega328, Tenso de funcionamento 5V, Tenso de entrada Recomendada 7-12V, 6 Pinos de entrada analgica, Velocidade do clock 16MHz, EEPROM 1KB, SRAM 2KB, Memria Flash 32KB, funcionando como crebro do projeto, ficando responsvel por receber a programao e instruir o funcionamento dos demais componentes.

Figura 03: Placa Arduino Uno.

Chave Liga\Desliga: A chave liga\desliga tem como objetivo interromper ou ligar um circuito eltrico. O objetivo da chave no projeto alterar o estado de 0 para 1 ou 1 para 0, mudando o estado de leitura no PINx, fazendo com que o display mostre a contagem progressivamente ou regressivamente.

Figura 04: Chave Liga\Desliga.

Fios (Jumpers): Chamamos de "Fio Jumper" um segmento de fio condutor com a funo de interligar dois pontos do circuito. Foram usados os fios jumpers, interligando os componentes inseridos na Protoboard a placa Arduino.

Figura 05: Fios Jumpers.

2.2.

Ligando os componentes

Figura 06: Ligao dos componentes.

3. LOGICA DE PROGRAMAO 3.1. Fluxograma


Inicio

3.2.

Inicializaes

Seta valor inicial no Display

Funo verifica (recebe estado atual do display)

Se chave liga/desliga fechada Mantem valor da varivel de controle em 0 Muda valor da varivel de controle para 1

Verifica estado do Display

Se varivel de controle manteve seu valor

Seta valor anterior ao estado do Display exceto para o estado 0 em que setado o valor atual (0).

Seta valor seguinte ao estado do Display exceto para o estado 9 em que setado o valor atual (9).

Descrio de execuo
Define macros para setar, limpar, inverter e verificar bit; Define varivel auxiliar (tipo byte): inverte e inicializa com valor 0 para controle da chave liga\desliga; Cria funes do tipo void para setar os valores no display (0 a 9) e guardar o estado em que se encontra o display; Define pino 4 da porta d como entrada e o restante dos pinos como sada (DDRD = 0b11101111;); Define pinos da porta b como pinos de sada (DDRB = 0b11111111;); Ativa resistor de Pull-up do pino d4 (PORTD =0b00010000 ;);

Chamada a funo responsvel por setar valor 0 no display (seta_0();); A funo responsvel seta o valor 0 no display, espera 1 segundo chama a funo verifica() e passa para essa o seu valor atual no display (0); A funo verifica() recebe o valor atual do display na varivel atual do tipo byte; A funo verifica() verifica se a chave ttil esta fechada, se estiver fechada muda o estado da varivel auxiliar de controle inverte para 1 seno continua em 0 o valor da varivel auxiliar de controle inverte; Verifica qual o estado atual do display atravs da varivel atual; Se o valor da varivel inverte for 0 chama a funo responsvel por setar nmero seguinte ao estado atual do display exceto para o estado 9, no qual mantido o prprio estado 9 - Seno chama a funo responsvel por setar o nmero anterior ao estado atual do display exceto para o estado 0, no qual mantido o prprio estado 0; Ao ser chamada uma funo para setar um valor no display inicia-se o ciclo novamente no qual ser chamada a funo verifica e ser passado para essa o estado atual do display;

4. ANEXOS 4.1. Anexo A: cdigo fonte

/* Trabalho 01 Hardware Alunos: LUCIANO FRANKLIN DOS SANTOS - 1012081027 WEULLER MARCOS DA SILVA SANTOS - 1012082037 */ #define SETBIT(PORT,BIT) PORT |= (1<<BIT) //SETAR BIT #define CLEARBIT(PORT,BIT) PORT &=~(1<<BIT) //LIMPAR BIT #define TOGGLEBIT(PORT, BIT) PORT^=(1<<BIT) //INVERTER BIT #define CHECKBIT(PORT, BIT) PORT&(1<<BIT) //VERIFICAR SE BIT SETADO

byte inverte=0; //varivel para dar sentido void seta_9(){ /*9*/ SETBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 SETBIT(PORTB, PORTB2); //C=1 SETBIT(PORTB, PORTB1); //D=1 CLEARBIT(PORTB, PORTB0); //E=0 SETBIT(PORTD, PORTD7); //F=1 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(9);

} void seta_8(){ /*8*/ SETBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 SETBIT(PORTB, PORTB2); //C=1 SETBIT(PORTB, PORTB1); //D=1 SETBIT(PORTB, PORTB0); //E=1 SETBIT(PORTD, PORTD7); //F=1 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(8); }

void seta_7(){ /*7*/ SETBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 SETBIT(PORTB, PORTB2); //C=1 CLEARBIT(PORTB, PORTB1); //D=0 CLEARBIT(PORTB, PORTB0); //E=0 CLEARBIT(PORTD, PORTD7); //F=0 CLEARBIT(PORTD, PORTD6); //G=0 delay(1000); verifica(7); } void seta_6(){ SETBIT(PORTB, PORTB4); // A=1 CLEARBIT(PORTB, PORTB3); //B=0 SETBIT(PORTB, PORTB2); //C=1 SETBIT(PORTB, PORTB1); //D=1 SETBIT(PORTB, PORTB0); //E=1 SETBIT(PORTD, PORTD7); //F=1 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(6); } void seta_5(){ SETBIT(PORTB, PORTB4); // A=1 CLEARBIT(PORTB, PORTB3); //B=0 SETBIT(PORTB, PORTB2); //C=1 SETBIT(PORTB, PORTB1); //D=1 CLEARBIT(PORTB, PORTB0); //E=0 SETBIT(PORTD, PORTD7); //F=1 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(5); }

void seta_4(){ CLEARBIT(PORTB, PORTB4); // A=0 SETBIT(PORTB, PORTB3); //B=0 SETBIT(PORTB, PORTB2); //C=1 CLEARBIT(PORTB, PORTB1); //D=0 CLEARBIT(PORTB, PORTB0); //E=0 SETBIT(PORTD, PORTD7); //F=1 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(4); } void seta_3(){ SETBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 SETBIT(PORTB, PORTB2); //C=1 SETBIT(PORTB, PORTB1); //D=1 CLEARBIT(PORTB, PORTB0); //E=0 CLEARBIT(PORTD, PORTD7); //F=0 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(3); } void seta_2(){ SETBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 CLEARBIT(PORTB, PORTB2); //C=0 SETBIT(PORTB, PORTB1); //D=1 SETBIT(PORTB, PORTB0); //E=1 CLEARBIT(PORTD, PORTD7); //F=0 SETBIT(PORTD, PORTD6); //G=1 delay(1000); verifica(2); }

void seta_1(){ CLEARBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 SETBIT(PORTB, PORTB2); //C=1 CLEARBIT(PORTB, PORTB1); //D=0 CLEARBIT(PORTB, PORTB0); //E=0 CLEARBIT(PORTD, PORTD7); //F=0 CLEARBIT(PORTD, PORTD6); //G=0 delay(1000); verifica(1); } void seta_0(){ SETBIT(PORTB, PORTB4); // A=1 SETBIT(PORTB, PORTB3); //B=1 SETBIT(PORTB, PORTB2); //C=1 SETBIT(PORTB, PORTB1); //D=1 SETBIT(PORTB, PORTB0); //E=1 SETBIT(PORTD, PORTD7); //F=1 CLEARBIT(PORTD, PORTD6); //G=0 delay(1000); verifica(0); } void verifica(byte atual){ // PORTD =0b00010000 if(!(PIND & 0b00010000)){ //lendo valor do pino inverte=1; } else{ // inverte=0; } switch(atual){ case 0: if(inverte == 0){ inverte = 0; seta_1(); } else seta_0(); break; case 1:

if(inverte == 0){ inverte = 0; seta_2(); } else seta_0(); break; case 2: if(inverte == 0){ inverte = 0; seta_3(); } else seta_1(); break; case 3: if(inverte == 0){ inverte = 0; seta_4(); } else seta_2(); break; case 4: if(inverte == 0){ inverte = 0; seta_5(); } else seta_3(); break; case 5: if(inverte == 0){ inverte = 0; seta_6(); } else seta_4(); break; case 6: if(inverte == 0){ inverte = 0; seta_7(); }

else seta_5(); break; case 7: if(inverte == 0){ inverte = 0; seta_8(); } else seta_6(); break; case 8: if(inverte == 0){ inverte = 0; seta_9(); } else seta_7(); break; case 9: if(inverte == 1){ inverte = 1; seta_8(); } else{ inverte = 0; seta_9(); } break; } } void setup(){ DDRD = 0b11101111;//DEFININDO PINO 4 COMO ENTRADA e o restante como sada DDRB = 0b11111111; //definindo todos pinos da PORTA B como sada. PORTD =0b00010000 ; //setando alto na porta a ser lida para ativar resistor de Pull-up seta_0(); } void loop(){ }

You might also like