Você está na página 1de 6

Controlando um LED com um PIC - Parte I

Este mais um post sugerido pelas buscas que trouxeram alguem a este blog. Nesta
srie vamos ver como controlar um LED usando um microcontrolador PIC.

O Objetivo
O objetivo desta srie mostrar o projeto do hardware e software de um pequeno
dispositivo que ilustra como controlar um LED usando um PIC. O dispositivo possui
um LED e um boto que ser usado para controlar o estado do LED (apagado, piscando
ou aceso).

O Projeto de hardware
Para este projeto selecionei um modelo de PIC bastante simples, o 12F675. O modelo
12F629 pode ser usado sem nenhuma alterao e simples alterar tanto o hardware
como o software para outros modelos.
O PIC 12F675 tem as seguintes vantagens para este projeto:

pode operar com alimentao de 2 a 5.5V, o que simplifica a operao com


baterias e pilhas

disponvel em encapsulamento DIP de 8 pinos, o que simplifica a montagem

possui um oscilador interno de 4MHz, dispensando a conexo de um cristal ou


ressonador

memria Flash para o programa, o que simplifica a gravao e regravao

O primeiro passo para o projeto de hardware examinar o datasheet do


microcontrolador, que pode ser baixado do site da Microchip.
No datasheet verificamos que podemos operar de 4 a 10 MHz com uma alimentao de
3 a 5.5 V (a operao com tenses entre 2 e 3 Volts requer clock inferior a 4MHz).
Minha opo foi operar com o oscilador interno de 4MHz usando uma bateria de 3V
(Duracell DL2032 ou equivalente). O positivo da bateria deve ser conectado ao pino 1
(VDD) do PIC e o negativo ao pino 8 (VSS).
O LED e o boto so conectados a pinos de entrada/sada de uso geral, que no 12F675
so qualquer um dos outros 6 pinos (para ser mais preciso, o boto no pode ser ligado
ao pino 4 pois vou usar o pull-up interno que no est disponvel no GP3). Escolhi o
pino 7 para o LED e o pino 2 para o boto.
O LED, como diz a sigla, um diodo emissor de luz. Quando submetido a uma tenso
direta acima de sua tenso de queda ele emite uma luz com intensidade proporcional
corrente. Existem vrios modelos de LEDs, que emitem as mais diversas cores. A tenso
de queda tipicamente de 2V e uma intensidade boa para um LED montado em painel

pode ser obtida com uma corrente de 10 mA.


Voltando ao datasheet do PIC, verificamos que um pino de entrada/sada capaz de
gerar ou absorver uma corrente de at 125mA e tem uma tenso de 0,6V (nvel zero) ou
VDD-0.7V (nvel um). A capacidade de corrente do PIC permite ligar um LED
diretamente das duas maneiras abaixo:

Na primeira maneira, com o LED ligado entre o pino do PIC e VSS, o valor do resistor
em srie (conforme a lei de Ohm) deve ser
(VDD - 0.7 - 2,0)/0,01 = 30 ohms
Analogamente, com o LED ligando entre o pino do PIC e VDD, o valor do resistor deve
ser
(VDD - 0.6 - 2,0)/0,01 = 40 ohms
No primeiro caso, o LED acende quando o pino do PIS est no nvel um, no segundo
quando est no nvel zero. No meu circuito adotei a primeira maneira com um resistor
de 33 ohms.
Para a ligao do boto poderia ser usado uma forma semelhante s vistas para o LED.
Olhando mais uma vez o datasheet, o PIC considera nvel zero um valor abaixo de
0.15*VDD (0.45V) e nvel um um valor acima de 0.25*VDD+0,8 (1,55V). Poderamos
calcular a partir destes dados valores apropriados para o resistor em srie com o boto
que garantam os nveis apropriados com um valor reduzido de corrente.
Entretanto, a Microchip j fez estes clculos e disponibiliza internamente ao PIC um
resistor de weak pull-up, que faz com que um pino aberto seja lido como em nvel um.
Desta forma, o boto pode ser ligado diretamente ao VSS e er lido como nvel zero
quando fechado e como nvel um quando aberto.
A lista de componentes para o circuito fica sendo:

1 PIC 12F675 (ou 12F629)

1 LED

1 Boto de contato momentneo

1 Resistor de 33 Ohms 1/8 W

1 Bateria de 3V

1 Suporte para a bateria

O circuito completo fica:

Tera-feira, Junho 26, 2007


Controlando um LED com um PIC - Parte II
Nesta parte vamos ver o software do nosso projeto.
Uma vez que o software bastante simples, vamos desenvolv-lo em
linguagem assembler e usar o ambiente de desenvolvimento MPLab,
disponibilizado gratuitamente pela Microchip.
Definido o algortmo s pegar o manual de referncia do PIC e enfrentar as
esquisitices do conjunto de instrues. Alguns pontos a destacar:

a execuo comea sempre no endereo 0, a interrupo desvia


sempre para o endereo 4. No endereo 0 foi colocado um GOTO para
desviar para o corpo do programa, que fica aps o tratamenteo da
interrupo.

preciso tomar cuidado com o fato dos registradores de controle


(SFR) estarem armazenados em dois bancos (BANK0 e BANK1). Antes
de acessar um registrador de controle preciso garantir que o banco
correto est selecionado.

no incio da rotina de interrupo preciso salvar os registradores W


e STATUS. Ao final da interrupo estes registradores precisam ser
restaurados.

o PIC no possui instrues de desvio condicional convencionais. As


instrues condicionais so sempre na forma de Skip If, na qual a
instruo seguinte pulada se uma determinada condio for
verdadeira.

No inicio do programa deve-se definir a configurao do PIC, que ser


gravada em uma rea especial da Flash:
; Configurao do PIC;
- habilita BrownOut Detect;
- desabilita pino MCLR;
- desabilita Watchdog;
- usa o oscilador interno
__CONFIG _BODEN_ON & _MCLRE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT

Uma varivel (MODO_LED) usada armazenar o modo atual de atuao do


LED (APAGADO, ACESO ou PISCANDO). Quando for detectado o
pressionamento do boto o modo ser avanado para o modo seguinte
(circularmente).
; Estados do LED
#define APAGADO 0
#define ACESO
1
#define PISCANDO 2
; Loop principal
PRINC
BTFSS MODO_BOTAO, BOTAO_APERT
GOTO PRINC ; aguarda apertar o boto
BCF
MODO_BOTAO, BOTAO_APERT ; limpa indicao
MOVF MODO_LED,W
XORLW APAGADO
BTFSC STATUS,Z
GOTO ACENDER
MOVF MODO_LED,W
XORLW ACESO
BTFSC STATUS,Z
GOTO PISCAR
; Estava
MOVLW
MOVWF
BCF
GOTO

piscando, vamos apagar


APAGADO
MODO_LED
LED
PRINC

; Estava
ACENDER
MOVLW
MOVWF
BSF
GOTO

apagado, vamos acender

; Estava
PISCAR
MOVLW
MOVWF
GOTO

aceso, vamos piscar

ACESO
MODO_LED
LED
PRINC

PISCANDO
MODO_LED
PRINC

O tratamento do boto possui uma pequena dificuldade: quando o boto


apertado ou solto, por alguns instantes o contato abre e fecha rapidamente.
Isto chamado de 'bounce' (algo como 'quicar'). Para evitar que cada uma
destas aberturas/fechamentos seja tratada como um aperta/solta do boto,
preciso aguardar que o sinal do boto fique estvel por um certo tempo.
Para fazer o LED piscar e executar o 'debounce' do boto, vamos configurar
o Timer 0 do PIC para gerar interrupes periodicamente. O valor que adotei
foi aproximadamente 50 milisegundos, o que permite um piscar ntido e
fazer o debounce simplesmente exigindo duas leituras iguais em
interrupes consecutivas.
; Inicia
BANK0
BCF
MOVLW
MOVWF
BSF
BSF

o timer
INTCON,T0IF ; limpa a interrupo do timer
.256-CNT_TIMER
TMR0 ; programa o timer
INTCON,T0IE
INTCON,GIE ; permite interrupes

O piscar do LED fica bastante simples: na interrupo testamos se o modo


atual piscar; se sim invertemos o sinal no pino do LED.
MOVF MODO_LED,W
XORLW PISCANDO
BTFSS STATUS,Z
GOTO TRATA_BOTAO
MOVLW 0x01
XORWF GPIO,F ; pisca o LED
TRATA_BOTAO

A lgica do boto um pouco mais complicada. So usados trs valores


lgicos, armazenados em trs bits de uma varivel (MODO_BOTAO):

o estado do boto na interrupo anterior, que atualizado ao final


de toda interrupo

o estado do boto aps o debounce, que atualizado somente


quando o estado atual do boto igual ao estado anterior

uma indicao de que o boto foi apertado, que ligado na


interrupo quando o estado aps o debounce passa de solto para
apertado. Esta indicao limpa no lao principal do programa, aps
tratar o acionamento da tecla.

; Controles do estado do
#define BOTAO_ANT
0x01
#define BOTAO_DEB
0x02
#define BOTAO_APERT 0x04

boto
; este bit indica o estado anterior
; este bit tem o valor c/ "debounce"
; este boto indica que foi detectado
; um pressionmento do boto

TRATA_BOTAO
BTFSC BOTAO
GOTO SOLTO

; testa o boto

; botao apertado
BTFSC MODO_BOTAO,BOTAO_ANT ; testa leitura anterior
GOTO APERT_10
BSF
MODO_BOTAO,BOTAO_ANT ; mudou
GOTO FIM_INT
APERT_10
; igual a vez anterior
BTFSC MODO_BOTAO,BOTAO_DEB
GOTO FIM_INT ; ja estava apertado
BSF
MODO_BOTAO,BOTAO_APERT ; apertou agora
BSF
MODO_BOTAO,BOTAO_DEB
GOTO FIM_INT
SOLTO
BTFSS
GOTO
BCF
GOTO
SOLTO_10
BCF

; botao solto
MODO_BOTAO,BOTAO_ANT
SOLTO_10
MODO_BOTAO,BOTAO_ANT ; mudou
FIM_INT
; igual a vez anterior
MODO_BOTAO,BOTAO_DEB

O fonte completo est aqui


Na prxima parte vamos encerrar esta srie, vendo como montar o circuito
e as referncias para maiores detalhes.

No prximo post da srie vamos ver o software.