Introduo
Este projeto nos proporcionou um aprendizado de grande importncia para nossa
formao. Com o desenvolvimento do mesmo, podemos colocar em prtica nossos
conhecimentos adquiridos ao longo do curso de engenharia e a teoria de
microprocessadores visto ao longo deste semestre.
O projeto elaborado foi o controle de entrada e sada de um ambiente. A principio ele
deveria apresentar o nmero mximo de pessoas dentro de um veculo, o nmero total de
pessoas que entraram no veculo durante um determinado perodo e o numero total de
pessoas dentro do ambiente (veculo) em um instante, ou em um momento atual. Estes
dados so gerados em um display de 16x2. Mas apenas conseguimos implementar o
nmero de pessoas atual no ambiente. Um exemplo de utilizao a contagem de pessoas
que entram e saem em uma Lotao.
Apresenta-se neste relatrio, todo o trabalho de pesquisa, software, hardware e dificuldades
emergentes durante o processo de construo do mesmo.
2. Hardware
O sistema baseado no micro-controlador da famlia do 8051, AT89S52, da
ATMEL, que em conjunto com perifricos capaz de realizar a funo a que se prope.
Primeiramente vejamos uma breve listagem dos principais componentes do
hardware, para mais adiante explanarmos detalhadamente seus aspectos.
Micro-controlador
Sensoriamento
Display
Teclado (6 teclas)
Sinalizao Sonora
2.1. Micro-controlador
em projetos futuros.
2.2. Sensoriamento
Para implementao do hardware de deteco, utilizamos basicamente
componentes simples, de fcil aquisio no mercado, o que de certa forma prejudicou a
utilidade real do nosso projeto. A idia inicial era utilizar dois fotosensores excitados por
dois fotoemissores de infravermelho, e ligar diretamente a sada dos fotosensores ao
controlador. Compramos o fototransistor TIL78 para sensor, e o fotodiodo TIL32 para
emissor. Verificamos, no entanto, que a capacidade de excitao desses fotodiodos
medocre, e seria necessria uma amplificao do sinal. Mas conseguimos tambm,
emprestado por um colega, um fotoemissor muito mais poderoso, o TSAL6200. Utilizando
este emissor e os dois TIL32 que tnhamos, sob correntes prximas das mximas,
conseguimos uma resposta razovel dos receptores na distncia de demonstrao que
2.3. Display
A interface com o usurio tem como seu mais importante componente o
display. Ele indispensvel para a correta utilizao do equipamento.
O display adquirido um display LCD, de 16 colunas por 1 linha apenas. A
ligao dos seus 8 bits de dados feita na porta 2 do controlador, porta essa que possui
pull-up interno, e portanto no requer resistores de pull-up externo. Como queremos
apenas escrever o display, aterramos seu pino RD/WR\. Os bits E (enable do display) e RS
(que define se instruo ou dado que vamos enviar) esto ligados na porta 3, tambm sem
necessidade de pull-up externo, nos bits P3.7 e P3.6 respectivamente. Alm dos pinos de
alimentao com +5V e 0V, precisamos tambm ligar a um pino de contraste um
potencimetro; no caso ligamos um resistor de 1k para o terra e 10k para +5V e obtivemos
um contraste satisfatrio.
2.4. Teclado
O teclado no matricial, no precisamos fazer varredura. Ele consiste
simplesmente nos seis botes, do tipo push-button, sendo que 1 deles para o reset (
detectado independentemente dos demais), outros dois so para chamada de interrupo
externa, que tambm so detectados sempre. Apenas 3 botes podem em algum momento
serem acionados qualquer um, e essa varredura simples feita facilmente no software.
3. Software
O software para o sistema foi desenvolvido no programa Keil uVision2 Evaluation Version.
No programa fonte fornecido mais adiante neste relatrio, descrevemos passo
a passo por meio de comentrios o que o programa est fazendo a cada momento. Ento,
aqui vamos apenas dar uma viso geral do que se passa em cada etapa.
3.1. Reset
O programa reinicializa. A Lotao inicial (default) definida em 6 (pessoas).
O Fluxo e o Total so zerados. Habilita as duas interrupes externas e desabilita as demais.
Define que a interrupo TOTAL tem prioridade. Inicializa tambm o display. Durante o
reset, o beep est acionado. Quando termina inicializao, o beep pra, indicando ao
usurio que a medio de fluxo foi iniciada.
_
AB
AB
09H
_
AB
___
AB
___
AB
_
AB
06H
___
AB
AB
AB
03H
_
AB
12H
AB
00H
_
AB
___
AB
_
AB
AB
_
AB
0CH
_
AB
_
AB
0FH
___
AB
___
AB
"CONTROLADOR DE FLUXO"
;---------------------------------------------------------------------------------------;---------------------------------------------------------------------------------------;TABELA DE EQUATES
;Banco de registradores 00
SENSOR
EQU R0 ;guarda o valor atual dos sensores
ULTIMO_ESTADO EQU R1 ;guarda o valor do ltimo estado
PROX_ESTADO EQU R2 ;guarda o valor do novo estado
FLAG0
EQU R3 ;guarda a unidade de contagem em ascii
FLAG1
EQU R4 ;guarda a dezena de contagem em ascii
LOT0
EQU R5 ;guarda a unidade de lotao e de total em ascii
LOT1
EQU R6 ;guarda a dezena de lotao e de total em ascii
CONTADOR EQU R7 ;guarda o total de passantes
;Endereos de portas
ENTRADA
EQU P1 ;guarda o endereo da porta das entradas
LCD
EQU P2 ;guarda o endereo do codigo para o display
;Endereos de bits de portas
BEEP
EQU P0.4 ;guarda o endereo do beep sinalizador
SENSORA
EQU P1.0 ;guarda o endereo do sensor A (ver manual)
SENSORB
EQU P1.1 ;guarda o endereo do sensor B (ver manual)
MAIS
EQU P1.2 ;guarda o endereo do boto '+'
MENOS
EQU P1.3 ;guarda o endereo do boto '-'
OK
EQU P1.4 ;guarda o endereo do boto 'OK'
SINAL0
EQU P3.0 ;bit que sinaliza que a interrupo 'Lotao' ainda no foi encerrada
SINAL1
EQU P3.1 ;bit que sinaliza que a interrupo 'Total' ainda no foi encerrada
E
EQU P3.6 ;guarda o endereo da habilitao do display
RS
EQU P3.7 ;guarda o o endereo de controle do display (0=instruo,1=dado)
;---------------------------------------------------------------------------------------;Inicio do Programa
ORG 0000H
JMP RESET
ORG 0003H
JMP LOTACAO
ORG 0013H
JMP TOTAL
RESET: SETB BEEP
;o beep aqui sinaliza a inicializao
SETB SINAL0
SETB SINAL1
MOV SENSOR,#00H
MOV ULTIMO_ESTADO,#00H
MOV PROX_ESTADO,#00H
MOV FLAG0,#48
;48 cdigo ASCII para 0
MOV FLAG1,#48
MOV LOT0,#54
;54 cdigo ASCII para 6
MOV LOT1,#48
;Lotao default de 6 pessoas
MOV CONTADOR,#00H
MOV DPTR,#TABELA
;O Data Pointer recebe o endereo da tabela na memoria de programa
MOV IE,#00H
;Desabilita todas interrupes pra iniciar 'sossegado'
MOV TMOD,#10H
;Timer 1 funcionando como contador de 16 bits (modo 1)
MOV TCON,#45H
;Interrupes detectadas na mudana de nvel. Alm disso,
;pe timer 1 correndo. Ele no pra nunca no programa,
;mas sempre reiniciado nas rotinas de atraso.
CLR RS
MOV LCD,#38H
;1 linha / matriz 7x5
CALL ESCRITA
CALL DELAY20MS
;delay de 20ms (para instrues o atraso recomendado maior que para dados)
MOV LCD,#06H
;cursor com autoincremento para direita
CALL ESCRITA
CALL DELAY20MS
MOV LCD,#0CH
;liga display / cursor apagado
CALL ESCRITA
CALL DELAY20MS
MOV IE,#85H
MOV IP,#04H
CALL FLUXO
;Escreve no display o Fluxo
;O display ser limpo nessa subrotina
CLR BEEP
TABELA: DB 03H,03H,0CH ;Aqui est nossa tabela. Ela contm em cada linha os dados relativos a cada um dos
DB 02H,00H,06H ;estados possveis (00H,03H,06H,09H,0CH,0FH,12H).
DB 00H,09H,03H
DB 01H,06H,00H ;As colunas significam respectivamente: 'Valor dos sensores na medio anterior',
DB 01H,0FH,00H ;'Valor do prximo estado se mudou o sensor A',
DB 00H,0CH,12H ;e 'Valor do prximo estado se mudou o sensor B.
DB 02H,00H,0FH
;..................Interrupes.............................................
;Rotina de Interrupo 0
LOTACAO: CLR SINAL0
CLR RS
MOV LCD,#01H
;codigo ASCII para acesso coluna 1 do display
CALL ESCRITA
CALL DELAY20MS
SETB RS
;Setamos RS para escrever dados no display!
MOV LCD,#76
;codigo ASCII para letra L
CALL ESCRITA
MOV LCD,#79
;codigo ASCII para letra O
CALL ESCRITA
MOV LCD,#84
;codigo ASCII para letra T
CALL ESCRITA
MOV LCD,#65
;codigo ASCII para letra A
CALL ESCRITA
MOV LCD,#67
;codigo ASCII para letra C
CALL ESCRITA
MOV LCD,#65
;codigo ASCII para letra A
CALL ESCRITA
MOV LCD,#79
;codigo ASCII para letra O
CALL ESCRITA
MOV LCD,#63
;codigo ASCII para '?'
CALL ESCRITA
JB SINAL1,DEZENA
JMP ENCERRA_INT1
DEZENA: CLR RS
MOV LCD,#198
CALL ESCRITA
SETB RS
MOV LCD,LOT1
CALL ESCRITA
UNIDADE: CLR RS
MOV LCD,#199
CALL ESCRITA
SETB RS
MOV LCD,LOT0
CALL ESCRITA
SOMA:
SETB MAIS
;pull-up externo
CALL DELAYMAX
JB MAIS,DIMINUI
;Se o boto 'mais' for pressionado, incrementa o valor de Lotao
INC LOT0
CJNE LOT0,#58,DEFINIDO
MOV LOT0,#48
INC LOT1
CJNE LOT1,#58,DEFINIDO
MOV LOT1,#48
DIMINUI: SETB MENOS
;pull-up externo
CALL DELAYMAX
RETI
; Rotina de Interrupo 1
TOTAL: CLR SINAL1
;Indica que a interrupo 'Lotao' est ativa.
PUSH ACC
PUSH PSW
PUSH 05
PUSH 06
;Salva na pilha os registradores que vai modificar
MOV LOT0,#00H
MOV LOT1,#00H
CLR RS
MOV LCD,#01H
;cdigo ASCII para acesso coluna 1 do display e limpeza do mesmo
CALL ESCRITA
CALL DELAY20MS
SETB RS
MOV LCD,#84
CALL ESCRITA
MOV LCD,#79
CALL ESCRITA
MOV LCD,#84
CALL ESCRITA
MOV LCD,#65
CALL ESCRITA
MOV LCD,#76
CALL ESCRITA
MOV LCD,#58
CALL ESCRITA
CLR C
;Necessrio para que jnc d certo
CLR AC
;Necessrio para que subb d certo
DEFINIR_TOTAL: MOV A,CONTADOR ;O contador guarda o numero total de pessoas que passaram!!!
JZ MOSTRA_TOTAL ;Nesse trecho vamos separar o valor do contador em 2 bytes,
MAIS_DEZ: SUBB A,#0AH
;dezena e unidade, ASCII, para podermos envi-lo ao display.
INC LOT1
JZ MOSTRA_TOTAL
JNC MAIS_DEZ
DEC LOT1
ADD A,#0AH
JZ MOSTRA_TOTAL
MAIS_UM: DEC A
INC LOT0
JNZ MAIS_UM
MOSTRA_TOTAL: MOV A,#48
ADD A,LOT0
CLR RS
MOV LCD,#199 ;cdigo ASCII para acesso coluna 16 do display
CALL ESCRITA
SETB RS
MOV LCD,A
;coloca o valor total da casa de unidade no display
CALL ESCRITA
MOV A,#48
ADD A,LOT1
CLR RS
MOV LCD,#198 ;cdigo ASCII para acesso coluna 15 do display
CALL ESCRITA
SETB RS
MOV LCD,A
;coloca o valor total da casa de dezena no display
CALL ESCRITA
SETB OK
JB OK,$
CALL DELAYMAX
CALL FLUXO
POP 06
POP 05
POP PSW
POP ACC
JB SINAL0,ENCERRA_INT1 ;Se a interrupo 'Lotao' ainda estava sendo executada quando foi chamada
JMP LOTACAO
;a 'Total', retornamos a ela para que o display escreva a mensagem "Lotao".
;para depois encerrar esta.
ENCERRA_INT1: SETB SINAL1 ;Indica que foi encerrada a interrupo total.
RETI
;....................Subrotinas.................................................
FLUXO: CLR RS
MOV LCD,#01H
CALL ESCRITA
CALL DELAY20MS
SETB RS
MOV LCD,#70
CALL ESCRITA
MOV LCD,#76
CALL ESCRITA
MOV LCD,#85
CALL ESCRITA
MOV LCD,#88
CALL ESCRITA
MOV LCD,#79
CALL ESCRITA
MOV LCD,#58
CALL ESCRITA
CALL NUMERO
RET
NUMERO: CLR RS
MOV LCD,#199
CALL ESCRITA
SETB RS
MOV LCD,FLAG0
CALL ESCRITA
CLR RS
MOV LCD,#198
CALL ESCRITA
SETB RS
MOV LCD,FLAG1
CALL ESCRITA
RET
ESCRITA: SETB E
;Setamos e depois zeramos o E (Enable), indicando ao display
CLR E
;que estamos lhe enviando um byte de dados ou instruo
CALL DELAY50US
;O tempo mnimo para que ele receba esse byte 40us (para dados).
RET
;ATRASOS
DELAYMAX: CLR TF1
MOV TH1,#00H
MOV TL1,#00H
JNB TF1,$
CLR TF1
RET
DELAY20MS: CLR TF1
MOV TH1,#HIGH(65535-20000)
MOV TL1,#LOW(65535-20000)
JNB TF1,$
CLR TF1
RET
DELAY800US: CLR TF1
MOV TH1,#HIGH(65535-800)
MOV TL1,#LOW(65535-800)
JNB TF1,$
CLR TF1
RET
DELAY50US: CLR TF1
MOV TH1,#HIGH(65535-50)
MOV TL1,#LOW(65535-50)
JNB TF1,$
CLR TF1
RET
END
4. Concluso
A cada nova etapa da criao e montagem do sistema microcontrolado, no deparamos com
os mais variados problemas.
No caso do software, obtivemos grande auxlio nas ferramentas de debug do compilador
Keil, que se verificaram indispensveis para a elaborao do mesmo. At chegarmos
verso final, devemos ter encontrado mais de 100 erros, desde simples comandos escritos
errado, que impediam a compilao, at graves problemas de lgica, que impediam o
funcionamento desejado.
Quanto ao hardware, os problemas foram ainda maiores, dada a nossa quase total
inexperincia em eletrnica digital. interessante citar os dois que nos tomaram mais
tempo:
o pull-up externo na porta 0: perdemos algumas horas por no termos dado ateno
ao fato de que a porta 0 requer resistores de pull-up externo para funcionar.
os sensores de baixa potncia (luminosa): no item 2.2 deste relatrio, est a descrio
deste problema. S chegamos a ele quando nosso prazo de entrega j estava se
esgotando, e , por isso, embora nossa soluo aparentemente funcionou, isto
precisaria ser longamente revisto para que o sistema fosse implementado em escala
industrial.