Escolar Documentos
Profissional Documentos
Cultura Documentos
Circuito de Interface para Microcontroladores - v2
Circuito de Interface para Microcontroladores - v2
Microcontroladores
ndice
2. Interfaceamento do Microcontrolador
Neste captulo iremos explicar como realizar as interfaces para que diferentes
dispositivos de entrada e de sada possam ser ligados ao microcontrolador.
Iremos tratar dos seguintes dispositivos:
-high 1
-low 1
2.2.5. Micromotores
Muitos projectos requerem a utilizao de motores de corrente contnua (CC)
baratos para criar movimento circular. Existem vrias possibilidades de
interfacear motores ao microcontrolador.
O circuito da figura utiliza transistores Darlington para accionar o motor. Este
circuito funciona bem com motores CC de brinquedos baratos. No entanto
importa acautelar o facto de que os motores produzem muito rudo elctrico
nas linhas de alimentao do microcontrolador, podendo lev-lo a deixar de
funcionar.
; Toggle pino 1
; Espera 200 ms
10
toggle 2
pause 200
goto steps
; Toggle pino 2
; Espera 200ms
; Ciclo
11
O programa junto faz o motor rodar 100 passos para a esquerda e a seguir 100
passos para a direita, utilizando duas subrotinas. A subrotina lstep faz o motor
rodar um passo para a esquerda, a subrotina rstep faz o motor rodar um passo
para a direita. A varivel b1 utilizada para guardar a posio do passo e
dever ser utilizada em qualquer outra parte do programa.
main:
for b3 = 0 to 99
gosub lstep
next b3
for b3 = 0 to 99
gosub rstep
next b3
lstep: let b1 = b1 + 1
goto step
rstep: let b1 = b1 - 1
step: let b1 = b1 & 2
lookup b1,(%1010,%1001,%0101,%0110),b2
let pins = b2
return
; soma 1 varivel b1
; salta para tabela lookup
; subtrai 1 da varivel b1
; mascara os dois bits menos pesados de b1
; guarda o cdigo lookup em b2
; faz sair o valor de b2 para os pinos de controlo
12
13
2.3.1. Interruptores
14
Com este primeiro circuito o pino de entrada (Pin 0) fica baixo (0) quando o
interruptor est aberto e alto (1), quando o interruptor fechado.
Um programa possvel
Vai para salta quando o interruptor est
aberto:
if pin0 = 0 then salta
Vai para salta quando o interruptor fechado:
if pin0 = 1 then salta
Com o circuito seguinte o pino de entrada (Pin 0) fica alto (1) quando o
interruptor est aberto e baixo (0), quando o interruptor fechado.
Um programa possvel
Vai para salta quando o interruptor est aberto:
if pin 0 = 1 then salta
simplesmente
acrescentando um tempo de espera (pause 100)
depois de cada instruo if. Se a seco de cdigo
a seguir presso do boto for longa, este atraso
ocorre naturalmente, j que cada instruo leva certo
tempo a ser executada. No entanto, se o cdigo no
for longo, deve incluir-se um atraso. Outra soluo
consiste em utilizar a instruo button.
Os dois programas seguintes mostram o efeito dos
ressaltos. O programa deveria acender o LED no
pino 1 quando o interruptor ligado ao pino 0 fosse
pressionado mais do que cinco vezes. Contudo o
15
init: let b0 = 0
main: if pin 0 = 1 then add
goto main
add: pause 100
let b0 = b0 + 1
if b0 < 5 then main
high 1
goto main
2.3.2. Potencimetro
16
O programa abaixo acende trs LEDs diferentes (ligados aos pinos 1,2 e 3),
dependendo da leitura do sensor analgico (potencimetro)
main:
readadc 0,b1
if b1<75 then light1
if b1<175 then light2
goto light3
light1:
high 1
low 2
low 3
goto main
; LED 1 on
; LED 2 off
; LED 3 off
; loop
light2:
low 1
high 2
low 3
goto main
; LED 1 off
; LED 2 on
; LED 3 off
; loop
light3:
low 1
low 2
high 3
goto main
; LED 1 off
; LED 2 off
; LED 3 on
; loop
Convm lembrar que a resposta de uma LDR no linear, pelo que as leituras
no variam como num potencimetro. Em geral, existe uma grande variao de
resistncia para nveis de iluminao elevados. Isso pode ser compensado por
software, utilizando gamas de variao menores para os nveis escuros.
Experimente at encontrar os ajustes adequados ao circuito e s condies de
iluminao.
main:
readadc 0,b1
if b1<50 then light1
if b1<100 then light2
if b1<145 then light3
if b1<175 then light4
goto main
; leitura do valor
; gama 0-50 = 50
; gama 50-100 = 50
; gama 100-145 = 45
; gama 145-175 = 30
17
2.3.4. Termistor
Um termistor uma resistncia varivel com a temperatura. Na realidade todas
as resistncias variam com a temperatura, s que os termistores so feitos
para terem uma grande variao com a temperatura. A ligao do termistor ao
microcontolador muito simples, mas convm tambm calibr-lo (com o BAS810,
por exemplo).
; leitura do valor
; gama 0-50 = 50
; gama 50-100 = 50
; gama 100-145 = 45
; gama 145-175 = 30
19
LCD. Claro que, sendo assim, alguns LCD podero mostrar caracteres
diferentes dos da tabela ao lado.
Do caracter 0 ao 15 so normalmente designados como caracteres userdefined e assim, devem ser definidos antecipadamente, de acordo com os
manuais de cada fabricante, para evitar que, para esses cdigos, apaream
caracteres aleatrios.
O funcionamento de um display LCD relativamente complexo dado que cada
display pode mesmo armazenar mais caracteres do que aqueles que ele tem
capacidade de mostrar na sua janela. E, na sua janela, de uma maneira geral,
o display s consegue mostrar 16 caracteres de cada vez.
S que na maioria dos displays LCD h uma memria que permite armazenar
40 caracteres por cada linha que o display tenha. Cada espao na memria
RAM uma caixa para um character e tem um endereo que o descreve. A
primeira linha tem os endereos 128 a 191. A segunda linha, os endereos de
192 a 255.
Os displays de 16x2 tm uma janela com duas linhas. Quer dizer, podemos ver
16 caracteres em cada uma das duas linhas. O caracter que para aparecer
na segunda linha, obriga-nos a mover o cursor para o incio dessa linha.
Para mover o cursor, para para qualquer posio do display, basta enviar o
endereo da RAM como instruo. Isto quer dizer que para enviar para a
primeira posio da primeira linha (endereo 128), enviar este endereo
como instruo. Ora, para mover o cursor para o incio da linha 2 basta enviar o
endereo (192) da RAM como instruo para o mdulo LCD. Para mover o
cursor para a quinta posio da segunda linha tem que se enviar a instruo
197 (=192+5).
serout 7,T2400,(Hello)
21
main:
gosub init
initializa o LCD
let b1 = 1
gosub wrins
for b3 = 0 to 4
read b3, b1
b1=EEPROM[b3]
gosub wrchr
next b3
continua
let b1 = 192
gosub wrins
for b3 = 5 to 11
read b3, b1
b1=EEPROM[b3]
gosub wrchr
next b3
continua
22
start:
main:
gosub init
initializa o LCD
let b1 = 1
gosub wrins
for b3 = 0 to 22
read b3, b1
b1=EEPROM[b3]
gosub wrchr
next b3
continua
let b1 = 12
gosub wrins
let b1 = 24
gosub wrins
pause 250
pausa 0.25s
goto main
23
A funo das trs subrotinas standard (init, wrins e wrchr) levar a cabo toda
esta tarefa complicada quando trabalhamos com displays LCD.
init:
let pins = 0
let b4 = 0
let dirs = 252
pause 200
let pins = 48
pulsout 3,1
pause 10
pulsout 3,1
pulsout 3,1
let pins = 32
pulsout 3,1
pulsout 3,1
let pins = 128
pulsout 3,1
let b1 = 14
gosub wrins
return
Todas sadas=0
Reset variavel
Pins 2-7 como sada (%11111100).
200 ms para reset ao LCD.
Funcionamento LCD a 8-bit.
Envia comando (enable)
Espera 10 ms
Envia comando outra vez(enable)
Envia comando outra vez(enable)
Funcionamento LCD a 4-bit.
Envia comando(enable)
Envia comando outra vez(enable)
Funcionar em duas linhas
Envia comando (enable).
LCD ON e com cursor.
Ecrever instruco no LCD
Nota: na subrotina init, o comando let dirs =252(%11111100) vai afectar os 8 pinos e
no apenas os 6 usados pelo LCD. Como se pode ver, nem wrins nem wrchr
necessitam dos pinos 0 e 1. Se o nosso programa usar estas rotinas deve ter em
conta que, quando retorna da chamada, o valor de b2 vem alterado (assim como w0).
24
12 Sem cursor
13 Cursor a piscar
14 Visualizao do LCD (e cursor) on
16 Move cursor para a esquerda uma posio
20 Move cursor para a direita uma posio
24 Faz o scroll da janela uma posio para a esquerda
28 Faz o scroll da janela uma posio para a direita
128 Move o cursor para o incio da primeira linha
192 Move o cursor para o incio da segunda linha
Exemplos
Limpar o display
clear: let b1 = 1 b1=instruo clear
call wrins Envia para o LCD
Mover o cursor para a segunda linha
clear: let b1 = 192 b1=incio da segunda linha
call wrins Envia para o LCD
Piscar uma menssagem 10 vezes
flash:for b3 = 1 to 10
for...next usando variable b3(nunca b1!!)
let b1 = 10
b1= Visualizao do LCD off
gosub wrins
Envia para o LCD
pause 200
Pausa de 0.2 segundos
let b1 = 14
b1= Visualizao do LCD on
gosub wrins
Envia para o LCD
pause 200
Pausa de 0.2 segundos
next b3
Fim do loop for...next
Fazer scroll a uma mensagem longa (30 caracteres)
scroll: for b3 = 1 to 30
for...next usando variable b3(nunca b1!!)
let b1 = 28
b1= Scroll da janela uma posio p/ direita
gosub wrins
Envia para o LCD
pause 200
Pausa de 0.2 segundos
next b3
Fim do loop for...next
let b1 = 1
b1=instruo clear
gosub wrins
Envia para o LCD
pause 200
Pausa de 0.2 segundos
goto scroll
Loop
25