sexta-feira, 22 de fevereiro de 2013

Controlando 8 LEDs com 4 pinos do MCU

Fala galerinha! Pra quem leu meu último post, aqui vai a "continuação", ou seja, vou lhes mostrar um exemplo prático do uso de um shift-register junto à um MCU (o PIC18F4550 mas poderá ser usados em outros. O que vale é a teoria).
Sem mais, vamos lá!

O programa.

Como sempre, este programa foi escrito por mim no mikroBasic. Vamos dar uma olhada:























































Simples não? Não entendeu? Vamos por partes:

Logo no início atribuo um nome para cada pino do MCU (symbol), que é o nome do pino do shift-register. Isso evitará que você se perda no meio do programa.
(putz, qual pino mesmo é o do SCLK? deixa eu olhar no esquema!)
Depois, em cada sub procedure eu crio procedimentos padrões, neste caso, procedimentos de controle do 74HC595 que são:

»Clock: gera um pulso no pino de clock. É o primeiro procedimento pois o sub prcedure dados irá usá-lo;

»Dados: aqui usei a variável img como a variável que contém os dados a serem inseridos no shift-register. Observe o SER=img.x: aqui defino que o pino SER terá o valor do bit x da variável img. Perceba também que eu ensiro os dados de trás para a frente. ISSO É OBRIGATÓRIO!;

»Trans: assim como em clock, também gero um pulso, mas dessa vez no pino RCLK. E por fim ;

»Limpa: Idem ao trans, aqui também gero um pulso, mas no pino SCLR.

Seguindo, configuro os PORTs C e B (o B é desnecessário! Pode-se omití-lo) e chamo o procedimento limpa. Fiz isso por dois motivos: primeiro pois o 74HC595, como já explicado, começará com um valor aleatório, e como o quero "zerado", mando o programa limpá-lo e segundo pois quando configure o estado do PORTC, o configurei como PORTC=$00, ou seja, todos os pinos em 0, porém, o pino SCLR deve ser mantido em nível 1 para que funcione (caso contrário, ele ficará apagando cada dado que você inserir), e quando chamo o procedimento, antes dele retornar ao programa principal, ele deixa o pino SCLR em 1.

Crio um loop eterno no WHILE TRUE e neste loop somo o valor $D5 (hexadecimal) à variável img, chamos os procedimentos dados e trans e por fim dou uma pausa de 1/4 de segundo (250 milisegundos).

Se você prestou atenção, viu que chamei meu programa de aleatório, mas veja que ele é pseudo-aleatório. Quando você chega no valor máximo de uma varíavel, caso você exceda seu valor máximo, ela zerará, então coloquei um valor bem alto e ímpar para que ela resete várias vezes e crie um efeito "aleatório". O programa junto com o arquivo .hex pode ser baixado aqui.

O circuito

O circuito não tem "nada" de novo senão a parte do shift-register:

Acredito não ter o que explicar aqui. Infelizmente não consegui gravar um vídeo mostrando o funcionamento :/ Bem, na próxima acho que trarei o uso de um shift register pra controlar um Display de LEDs (7 segmentos).
Boas montagens e até a próxima!

Nenhum comentário:

Postar um comentário