Top Banner
1. Introdução Este projeto nos proporcionou um aprendizado de grande importância para nossa formação. Com o desenvolvimento do mesmo, podemos colocar em prática 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 saída de um ambiente. A principio ele deveria apresentar o número máximo de pessoas dentro de um veículo, o número total de pessoas que entraram no veículo durante um determinado período e o numero total de pessoas dentro do ambiente (veículo) em um instante, ou em um momento atual. Estes dados são gerados em um display de 16x2. Mas apenas conseguimos implementar o número de pessoas atual no ambiente. Um exemplo de utilização é a contagem de pessoas que entram e saem em uma “Lotação”. Apresenta-se neste relatório, todo o trabalho de pesquisa, software, hardware e dificuldades emergentes durante o processo de construção do mesmo.
23

Relatorio Final Microprocessadores

Apr 14, 2016

Download

Documents

manogiacomelli

Microprocessadores
8051
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Relatorio Final Microprocessadores

1. Introdução

Este projeto nos proporcionou um aprendizado de grande importância para nossa formação. Com o desenvolvimento do mesmo, podemos colocar em prática 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 saída de um ambiente. A principio ele deveria apresentar o número máximo de pessoas dentro de um veículo, o número total de pessoas que entraram no veículo durante um determinado período e o numero total de pessoas dentro do ambiente (veículo) em um instante, ou em um momento atual. Estes dados são gerados em um display de 16x2. Mas apenas conseguimos implementar o número de pessoas atual no ambiente. Um exemplo de utilização é a contagem de pessoas que entram e saem em uma “Lotação”.Apresenta-se neste relatório, todo o trabalho de pesquisa, software, hardware e dificuldades emergentes durante o processo de construção do mesmo.

Page 2: Relatorio Final Microprocessadores

2. Hardware

O sistema é baseado no micro-controlador da família do 8051, AT89S52, da ATMEL, que em conjunto com periféricos é capaz de realizar a função a que se propõe.

Primeiramente vejamos uma breve listagem dos principais componentes do hardware, para mais adiante explanarmos detalhadamente seus aspectos.

Micro-controlador Sensoriamento Display Teclado (6 teclas) Sinalização Sonora

2.1. Micro-controlador

O micro-controlador utilizado, como já foi dito anteriormente, é o AT89S52. Foi escolhido pois é capaz de atender as exigências do projeto, e poderá ser reaproveitado em projetos futuros.

Page 3: Relatorio Final Microprocessadores

Figura 2.1 – Microcontrolador AT89S52

As propriedades que nos foram úteis:

Memória de Programa Flash: Nos permitiu gravar e ‘des’-gravar o programa tantas vezes quantas foram necessárias. A capacidade de 8kBytes não foi bem aproveitada, uma vez que nosso programa possui apenas 633 Bytes.

Memória de Dados: 256 Bytes de RAM interna, que também foi pouco utilizada.

Clock: Trabalhamos com um clock interno de 12MHz. Para garantir essa freqüência utilizamos um cristal de quartzo ligado entre os pinos 18 e 19 do controlador.

Figura 2.2 – Gerador para Clock Interno

Reset: O reset é feito por um push-button.

Interrupções: Foram utilizadas as 2 interrupções externas para implementação das funções “Lotação” e “Total”, que são ativadas por push-button’s. As interrupções dos timers e da serial, não foram utilizadas.

Temporizadores: Apenas um dos timers foi utilizado, para rotinas internas de atraso e debouncing.

Canal Serial: O canal serial não foi utilizado.

Portas de Entrada/Saída: A porta 0 só foi utilizada para ativar a sinalização sonora, ativando o buzzer quando necessário; a porta 1 foi utilizada para entradas (sensores e botões de interface); a porta 2 é a saída de dados para o display; e a porta 3 possui as entradas de solicitação de interrupção e duas saídas para comunicação com o display.

Page 4: Relatorio Final Microprocessadores

2.2. Sensoriamento

Para implementação do hardware de detecção, utilizamos basicamente componentes simples, de fácil aquisição no mercado, o que de certa forma prejudicou a utilidade real do nosso projeto. A idéia inicial era utilizar dois fotosensores excitados por dois fotoemissores de infravermelho, e ligar diretamente a saída dos fotosensores ao controlador. Compramos o fototransistor TIL78 para sensor, e o fotodiodo TIL32 para emissor. Verificamos, no entanto, que a capacidade de excitação desses fotodiodos é medíocre, e seria necessária uma amplificação do sinal. Mas conseguimos também, emprestado por um colega, um fotoemissor muito mais poderoso, o TSAL6200. Utilizando este emissor e os dois TIL32 que tínhamos, sob correntes próximas das máximas, conseguimos uma resposta razoável dos receptores na distância de demonstração que pretendíamos usar (cerca de 20 cm). Ao tentar ligar a saída do receptor ao controlador, descobrimos que realmente, ele não é capaz de ser aplicado diretamente ao mesmo. Para resolver este problema, recorremos ao que foi aprendido na disciplina de Eletrônica II, no que diz respeito a comparadores. Bolamos um circuito que compara a saída dos fotosensores com a tensão sobre um led (aproximadamente 1,95V). O operacional utilizado foi o LM741, alimentado por +5 volts e 0, e, portanto a saída deveria variar entre esses extremos. Quase certo, pois a baixa qualidade do operacional, colocou tensão de saída entre 1,5 e 5 volts. No datasheet do AT89S52, temos que ele detecta o nível lógico 1 para tensões maiores que 1,9V e nível lógico 0 para tensões menores que 1,1V. Mais uma vez, driblamos o problema com o que tínhamos à disposição: colocamos dois diodos 1N4007 em série na saída, ligados à um resistor de 8k2 (caminho para o terra). O circuito final que vem a seguir, funcionou perfeitamente nos dando uma variação entre 0,5V e 3,5V na saída, que é perfeitamente discernida pelo controlador!

Page 5: Relatorio Final Microprocessadores

Figura 2.3 – Dispositivo de Sensoriamento

2.3. Display

A interface com o usuário tem como seu mais importante componente o display. Ele é indispensável para a correta utilização do equipamento.

O display adquirido é um display LCD, de 16 colunas por 1 linha apenas. A ligação dos seus 8 bits de dados é feita na porta 2 do controlador, porta essa que possui pull-up interno, e portanto não 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 é instrução ou dado que vamos enviar) estão ligados na porta 3, também sem necessidade de pull-up externo, nos bits P3.7 e P3.6 respectivamente. Além dos pinos de alimentação com +5V e 0V, precisamos também ligar a um pino de contraste um potenciômetro; no caso ligamos um resistor de 1k para o terra e 10k para +5V e obtivemos um contraste satisfatório.

Page 6: Relatorio Final Microprocessadores

Figura 2.4 – Display LCD 16x1

2.4. Teclado

O teclado não é matricial, não precisamos fazer varredura. Ele consiste simplesmente nos seis botões, do tipo push-button, sendo que 1 deles é para o reset (é detectado independentemente dos demais), outros dois são para chamada de interrupção externa, que também são detectados sempre. Apenas 3 botões podem em algum momento serem acionados qualquer um, e essa varredura simples é feita facilmente no software.

Page 7: Relatorio Final Microprocessadores

Figura 2.5 – Ligação dos Botões

O botão RESET não necessita de debouncing. Ele simplesmente liga por alguns instantes o +5V no pino de RST do controlador, e mantém o pino em 0 no resto do tempo por um resistor de pull-down.

Os botões de interrupção são LOTAÇÃO e TOTAL. Eles possuem um sistema de debouncing por filtro passa-baixas simples: um capacitor de 10uF em paralelo com eles, de modo que temos uma constante de tempo de 100ms (para o resistor de 10k utilizado no pull-up), que é muito maior do que os teóricos 10ms (máximo) de “efeito-mola”, garantindo uma perfeita rejeição ao bouncing.

Os botões de entrada no programa, estão ligados na P1, são ‘—‘ (menos), ‘+’ (mais), e OK. O seu debouncing é feito pelo software.

2.5. Sinalização Sonora

Sinalização sonora é simplesmente um Buzzer conectado a P0.4 com um resistor de 10k indo para +5V (porta 0 necessita de resistor de pull-up externo). O Buzzer não precisa de driver de corrente pois a corrente que a P0 é capaz de fornecer ou drenar é de até 23mA, que é muito mais do que o Buzzer precisa quando está sozinho sob 5 volts.

Figura 2.6 – Alerta Sonoro (Buzzer)

Page 8: Relatorio Final Microprocessadores

3. Software

O software para o sistema foi desenvolvido no programa Keil uVision2 - Evaluation Version.

No programa fonte fornecido mais adiante neste relatório, descrevemos passo a passo por meio de comentários o que o programa está fazendo a cada momento. Então, aqui vamos apenas dar uma visão geral do que se passa em cada etapa.

3.1. Reset

O programa reinicializa. A Lotação inicial (default) é definida em 6 (pessoas). O Fluxo e o Total são zerados. Habilita as duas interrupções externas e desabilita as demais. Define que a interrupção TOTAL tem prioridade. Inicializa também o display. Durante o reset, o beep está acionado. Quando termina inicialização, o beep pára, indicando ao usuário que a medição de fluxo foi iniciada.

3.2. Medição de Fluxo

Essa rotina cuida os sensores, e verifica quando eles mudaram de valor. Cada mudança define o estado em que o programa está de acordo com o diagrama de estados a seguir. Foi considerado que é humanamente impossível que dois sensores troquem de valor simultaneamente (antes da nova medida), por isso, se isso acontecer, o programa emitirá um beep curto (indicando erro), e retornará ao estado 00.

00H

12H

03H

06H

09H

0CH

0FHAB

_AB

AB AB

AB

AB

_AB

_AB

_AB

_AB

_AB

_AB

_AB

_AB

_AB

___AB

___AB

___AB

___AB

___AB

___AB

Page 9: Relatorio Final Microprocessadores

Figura 3.1 – Diagrama de Estados dos Sensores

Quando completamos uma transição, isto é, chegamos de novo ao estado 00, o programa decidirá baseado na ordem em que os sensores foram ‘sombreados’, se conta mais uma pessoa (incrementa) ou se conta menos uma (decrementa).

Incrementa: ao incrementar, o programa verifica se não chegamos ao valor estipulado para lotação; se chegamos a esse liga o beep, que só irá parar se uma pessoa (ou quantas a mais que o permitido tiverem entrado) sair, “deslotando” o ambiente. No incremento, além de incrementar o fluxo, também incrementa-se uma variável hexadecimal chamada Contador, que vai contar quantas pessoas entraram, mas não vai descontar quando elas saírem. Isso será usado na interrupção TOTAL.

Decrementa: ao decrementar não decrementamos o Contador, apenas o fluxo. O programa verifica se estava lotado para então considerar se “deslotou”. E ainda, no caso de termos 00 pessoas contabilizadas no local, se decrementarmos, o programa apita um beep curto de erro, e mantém em 00 a contagem de fluxo!

Depois de incrementar ou decrementar, escreve no display o novo valor, e retorna ao inicio da rotina.

3.3. Interrupção Lotação

LOTAÇÃO é uma interrupção detectada quando o nível lógico no pino P3.2 cai de 1 para 0. Ela tem baixa prioridade. Serve para que o usuário defina qual é a lotação, isto é o número máximo de pessoas que podem estar ‘dentro’, que ele quer que o controlador permita.

Esse interfaceamento é realizado pelos botões ‘+’, ‘--’ e ‘OK’. O ‘+’ aumenta o valor, ‘--’ diminui, e o ‘OK’ encerra a interrupção, voltando ao programa principal.

Durante o atendimento da interrupção, o fluxo não está sendo contado!

Se estava lotado, e aumentarmos o valor da lotação para um numero maior que o de pessoas que estão no local, o programa não identificará que “deslotou” tão facilmente, pois nada foi planejado a esse respeito.

Lotação máxima é 99, e mínima é 00.

Page 10: Relatorio Final Microprocessadores

3.4. Interrupção Total

TOTAL é a interrupção de maior prioridade, isto é, se estivermos atendendo outra interrupção e ela for chamada, ela será atendida! É detectada pela queda de nível no pino P3.3. Sua utilidade é fornecer uma aproximação de quantas pessoas diferentes passaram pelos sensores. Ela utiliza o registrador Contador, para nos indicar quantos entraram, sem descontar os que saíram! Podemos assim, se considerarmos que todas as pessoas que entraram, entraram apenas uma vez, informar ao usuário o número de freqüentadores do local!

O valor de saída aqui, assim como em todos os outros instantes do programa, é limitado em 99 (pois isto é apenas um programa de teste de conhecimentos). Assim, se ultrapassarmos aqui esse valor, o display indicará caracteres que não fazem sentido para o usuário.

3.5. Sub-rotina Escrita

Cada vez que vamos escrever algo no display, precisamos setar o E (enable do display), e em seguida zerá-lo. Além disso, para escrevermos um dado precisamos de no mínimo 40us de espera antes de enviar um novo dado. Por isso, criamos uma sub-rotina que fará tudo isso, chamada Escrita.

Se estivermos enviando uma instrução, precisamos de 15ms, por isso, sempre que enviamos uma, além de chamar a sub-rotina de escrita, chamamos também uma sub-rotina de atraso maior.

3.6. Sub-rotina Fluxo

Escreve a mensagem “Fluxo:” no display. Além disso, chama outra sub-rotina, Numero, para escrever o valor desse fluxo no display.

3.7. Sub-rotina Numero

Escreve o valor do fluxo no display

3.8. Sub-rotinas de Atrasos

Temos quatro sub-rotinas de atrasos, todas utilizando o timer 1 apenas. São elas:

Delay50us: atraso de 50us para escrita de dados no display. Delay800us: atraso de 800us na leitura dos sensores Delay20ms: atraso de 20ms para escrita de instruções no

display DelayMax: atraso de 66ms para debouncing de teclas

Page 11: Relatorio Final Microprocessadores

O atraso de debouncing foi definido pelo teste do equipamento; com um delay menor ficou muito difícil para o controle das teclas pelo usuário.

3.9. Programa Fonte

Uma vez explicados os principais aspectos do programa, colamos a seguir o Programa Fonte final de nosso programa , e encerramos nossa descrição do software.

Note-se que a edição do Word posicionou os comentários em nova linha, mas no programa a ser compilado eles devem todos estar depois de ponto e virgula.

;Programa Fonte para Projeto de Sistema Microcontrolado: ; "CONTROLADOR DE FLUXO"

;----------------------------------------------------------------------------------------;----------------------------------------------------------------------------------------

;TABELA DE EQUATES;Banco de registradores 00SENSOR EQU R0 ;guarda o valor atual dos sensoresULTIMO_ESTADO EQU R1 ;guarda o valor do último estadoPROX_ESTADO EQU R2 ;guarda o valor do novo estadoFLAG0 EQU R3 ;guarda a unidade de contagem em asciiFLAG1 EQU R4 ;guarda a dezena de contagem em asciiLOT0 EQU R5 ;guarda a unidade de lotação e de total em asciiLOT1 EQU R6 ;guarda a dezena de lotação e de total em asciiCONTADOR EQU R7 ;guarda o total de passantes

;Endereços de portasENTRADA EQU P1 ;guarda o endereço da porta das entradasLCD EQU P2 ;guarda o endereço do codigo para o display

;Endereços de bits de portasBEEP EQU P0.4 ;guarda o endereço do beep sinalizador

SENSORA EQU P1.0 ;guarda o endereço do sensor A (ver manual)SENSORB EQU P1.1 ;guarda o endereço do sensor B (ver manual)MAIS EQU P1.2 ;guarda o endereço do botão '+'MENOS EQU P1.3 ;guarda o endereço do botão '-'OK EQU P1.4 ;guarda o endereço do botão 'OK'

SINAL0 EQU P3.0 ;bit que sinaliza que a interrupção 'Lotação' ainda não foi encerradaSINAL1 EQU P3.1 ;bit que sinaliza que a interrupção 'Total' ainda não foi encerrada

Page 12: Relatorio Final Microprocessadores

E EQU P3.6 ;guarda o endereço da habilitação do displayRS EQU P3.7 ;guarda o o endereço de controle do display (0=instrução,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 inicialização SETB SINAL0 SETB SINAL1 MOV SENSOR,#00H MOV ULTIMO_ESTADO,#00H MOV PROX_ESTADO,#00H MOV FLAG0,#48 ;48 é código ASCII para 0 MOV FLAG1,#48 MOV LOT0,#54 ;54 código ASCII para 6 MOV LOT1,#48 ;Lotação default é de 6 pessoas MOV CONTADOR,#00H MOV DPTR,#TABELA ;O Data Pointer recebe o endereço da tabela na memoria de programa

MOV IE,#00H ;Desabilita todas interrupções pra iniciar 'sossegado' MOV TMOD,#10H ;Timer 1 funcionando como contador de 16 bits (modo 1) MOV TCON,#45H ;Interrupções detectadas na mudança de nível. Além disso, ;põe timer 1 correndo. Ele não pára nunca no programa,

;mas é sempre reiniciado nas rotinas de atraso.

CLR RS ;Para escrever instruções no display zeramos o bit RS

MOV LCD,#38H ;1 linha / matriz 7x5 CALL ESCRITA CALL DELAY20MS ;delay de 20ms (para instruções 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 ;Habilita agora as interrupções externas, e desabilita as outras MOV IP,#04H ;Indica que a interrupção 'Total' tem prioridade sobre 'Lotação'.

CALL FLUXO ;Escreve no display o Fluxo ;O display será limpo nessa subrotina

CLR BEEP ;A inicialização foi encerrada... o beep pára.

MEDIR_FLUXO: MOV ENTRADA,#0FFH ;Necessário para o pull-up externo CALL DELAY800US ;Atraso para que o programa não leve em consideração alterações rápidas demais. MOV A,ENTRADA ;O acumulador recebe as entradas (porta 1)

Page 13: Relatorio Final Microprocessadores

ANL A,#03H ;Descartamos os seis ultimos bits. Os dois primeiros tem o valor atual dos sensores. MOV SENSOR,A ;O resultado do 'and' nos dará portanto os sensores iluminados (ativos), que serão guardados no registrador MOV A,ULTIMO_ESTADO ;Então o acumulador recebe o valor do último estado... MOVC A,@A+DPTR ;e esse valor indicará na tabela o valor dos sensores nesse ultimo estado. XRL A,SENSOR ;De posse do valor dos sensores antes, verificamos aqui qual mudou! JZ MEDIR_FLUXO ;Se nenhum mudou, reiniciamos a medida.

;Se os dois sensores mudaram então ocorre um erro! (ver a seguir) CJNE A,#03H,CORRETO ;Nesse trecho o programa verifica se não ocorreu

SETB BEEP ;algum erro de 'pular' estado. Se sim ele toca um CALL DELAYMAX ;sinal de alerta, e retorna para verificar os sensores CALL DELAYMAX ;de novo, sem atualizar o estado corretamente. CALL DELAYMAX ;Se não, ele continua. MOV ULTIMO_ESTADO,#00H ;O último estado volta então para o estado inicial. CLR BEEP JMP MEDIR_FLUXO

CORRETO: ADD A,ULTIMO_ESTADO ;Se um, e apenas um sensor mudou, o resultado do 'ou exclusivo' nos dirá qual foi. MOVC A,@A+DPTR ;Se for 01, mudou o sensor A, se for 02, mudou o B. Somando com o valor do estado MOV PROX_ESTADO,A ;em que estavamos e olhando na tabela, teremos o valor do próximo estado!!! Esse ;valor será então amazenado no registrador.

CJNE PROX_ESTADO,#00H,ATUALIZAR_ESTADO ;Se não chegamos no estado, ainda não atualizamos o display TESTE1: CJNE ULTIMO_ESTADO,#09H,TESTE2 ;Se chegamos no estado 00H, verificamos de onde viemos. Se foi de 09H, JMP DECREMENTA ;decrementamos a saída. TESTE2: CJNE ULTIMO_ESTADO,#12H,ATUALIZAR_ESTADO ;Se chegamos de 12H, incrementamos a saída JMP INCREMENTA ;Em qualquer outro caso, simplesmente atualizamos o estado.

ATUALIZAR_ESTADO: MOV A,PROX_ESTADO ;Atualizar o estado significa aqui que: MOV ULTIMO_ESTADO,A ;o 'próximo estado' passa a ser o 'ultimo estado'. JMP MEDIR_FLUXO ;Reiniciamos daqui a medida

;Atualização das Saídas ;Atualizar as saídas significa mudar o valor indicado no display. DECREMENTA: DEC FLAG0 ;Ao decrementar, decrementamos uma unidade. CJNE FLAG0,#47,DISPLAY ;Se já estavamos em unidade '0', precisamos então DEC FLAG1 ;decrementar a dezena, e colocar a unidade em '9'. MOV FLAG0,#57 CJNE FLAG1,#47,DISPLAY ;Se a dezena também estava em zero, então significa que uma pessoa saiu de onde SETB BEEP ;não havia ninguém!!! O programa não aceita isso, então apita rapidamente, e reinicia JMP ERRO ;a medição de fluxo a partir de '0', desconsiderando o passante. INCREMENTA: INC CONTADOR ;Ao incrementar, incrementamos uma unidade e também um contador que será usado depois. INC FLAG0 CJNE FLAG0,#58,DISPLAY ;Se já estavamos em unidade '9', precisamos então INC FLAG1 ;incrementar a dezena, e colocar a unidade em '0'. MOV FLAG0,#48

DISPLAY: JB BEEP,DESLOTOU ;Se o beep está setado, é porque estava 'lotado'. Precisamos verificar se a lotação foi ;'terminada', ou se continua lotado no trecho 'Deslotou'.

Page 14: Relatorio Final Microprocessadores

;ESSA INSTRUÇÃO NÃO FUNCIONOU COMO QUERÍAMOS (explicações no relatório) MOV A,FLAG0 ;Aqui ele faz uma comparação entre os flags que

XRL A,LOT0 ;contam o número de pessoas que entraram (flag0 JNZ NAO_LOTOU ;e flag1) com os que definem a lotação (lot0 e MOV A,FLAG1 ;lot1). Se iguais é porque lotou e senão é porque

XRL A,LOT1 ;ainda não lotou. JNZ NAO_LOTOU LOTOU: SETB BEEP ;Se lotou, aciona beep que só para se deslotar! JMP NAO_LOTOU DESLOTOU: MOV A,FLAG0 ;Aqui ele faz uma comparacao entre os flags que

INC A ;contam o número de pessoas que entraram (flag0 XRL A,LOT0 ;e flag1) (com (flag0)+1), com os que definem a JNZ NAO_LOTOU ;lotação (lot0 e lot1). Se iguais é porque ainda MOV A,FLAG1 ;está lotado, senão é 'porque deslotou'. XRL A,LOT1 JNZ NAO_LOTOU

CLR BEEP ;Se deslotou, pára o beep.JMP NAO_LOTOU

ERRO: CALL DELAYMAX ;A sinalização de erro é um beep curto. CALL DELAYMAX CALL DELAYMAX CALL DELAYMAX CALL DELAYMAX MOV FLAG1,#48 ;Quando acontece o erro, o contador de fluxo é reiniciado. MOV FLAG0,#48 CLR BEEP NAO_LOTOU: CALL NUMERO ;Finalmente, atualiza o valor do display! JMP ATUALIZAR_ESTADO ;E então retorna para atualizar o estado.

TABELA: DB 03H,03H,0CH ;Aqui está nossa tabela. Ela contém em cada linha os dados relativos a cada um dos DB 02H,00H,06H ;estados possíveis (00H,03H,06H,09H,0CH,0FH,12H). DB 00H,09H,03H DB 01H,06H,00H ;As colunas significam respectivamente: 'Valor dos sensores na medição anterior', DB 01H,0FH,00H ;'Valor do próximo estado se mudou o sensor A', DB 00H,0CH,12H ;e 'Valor do próximo estado se mudou o sensor B´. DB 02H,00H,0FH

;..................Interrupções.............................................

;Rotina de Interrupção 0

LOTACAO: CLR SINAL0 ;Indica que a interrupção 'Lotação' está ativa. 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

Page 15: Relatorio Final Microprocessadores

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 ;Se a interrupção 'Total' ainda não foi encerrada, JMP ENCERRA_INT1 ;ela será encerrada agora.

DEZENA: CLR RS MOV LCD,#198 ;codigo ASCII para acesso à coluna 15 do display CALL ESCRITA SETB RS MOV LCD,LOT1 ;coloca o valor lotacao da casa de dezena no display CALL ESCRITA

UNIDADE: CLR RS MOV LCD,#199 ;codigo ASCII para acesso à coluna 16 do display CALL ESCRITA SETB RS MOV LCD,LOT0 ;coloca o valor lotacao da casa de unidade no display CALL ESCRITA

SOMA: SETB MAIS ;pull-up externo CALL DELAYMAX JB MAIS,DIMINUI ;Se o botão 'mais' for pressionado, incrementa o valor de Lotação 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 JB MENOS,DEFINIDO ;Se o botão 'menos' for pressionado, decrementa o valor de Lotação DEC LOT0 CJNE LOT0,#47,DEFINIDO MOV LOT0,#57 DEC LOT1 CJNE LOT1,#47,DEFINIDO MOV LOT1,#57 DEFINIDO: SETB OK ;pull-up externo CALL DELAYMAX JB OK,DEZENA ;Se o botão 'OK' for pressionado, encerra a interrupção Lotação.

SETB SINAL0 ;Setamos esse bit indicando que a lotação foi definida.

CALL FLUXO ;Retornamos com valor do fluxo ao programa principal.

RETI

; Rotina de Interrupção 1

TOTAL: CLR SINAL1 ;Indica que a interrupção 'Lotação' está ativa. PUSH ACC PUSH PSW PUSH 05 PUSH 06 ;Salva na pilha os registradores que vai modificar

MOV LOT0,#00H

Page 16: Relatorio Final Microprocessadores

MOV LOT1,#00H

CLR RS MOV LCD,#01H ;código ASCII para acesso à coluna 1 do display e limpeza do mesmo CALL ESCRITA CALL DELAY20MS SETB RS MOV LCD,#84 ;código ASCII para letra T CALL ESCRITA MOV LCD,#79 ;código ASCII para letra O CALL ESCRITA MOV LCD,#84 ;código ASCII para letra T CALL ESCRITA MOV LCD,#65 ;código ASCII para letra A CALL ESCRITA MOV LCD,#76 ;código ASCII para letra L CALL ESCRITA MOV LCD,#58 ;código ASCII para ':' CALL ESCRITA

CLR C ;Necessário para que jnc dê certo CLR AC ;Necessário 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 ;código 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 ;código 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,$ ;Aguarda que o usuário aperte 'OK' para sair da interrupção.

CALL DELAYMAX

Page 17: Relatorio Final Microprocessadores

CALL FLUXO

POP 06 ;Desempilha os registradores, retornando os valores de antes da interrupção. POP 05 POP PSW POP ACC

JB SINAL0,ENCERRA_INT1 ;Se a interrupção 'Lotação' ainda estava sendo executada quando foi chamadaJMP LOTACAO ;a 'Total', retornamos a ela para que o display escreva a mensagem "Lotação". ;para depois encerrar esta.ENCERRA_INT1: SETB SINAL1 ;Indica que foi encerrada a interrupção total. RETI

;....................Subrotinas.................................................

FLUXO: CLR RS MOV LCD,#01H ;código ASCII para acesso à coluna 1 do display e limpeza do mesmo CALL ESCRITA CALL DELAY20MS

SETB RS

MOV LCD,#70 ;código ASCII para letra F CALL ESCRITA MOV LCD,#76 ;código ASCII para letra L CALL ESCRITA MOV LCD,#85 ;código ASCII para letra U CALL ESCRITA MOV LCD,#88 ;código ASCII para letra X CALL ESCRITA MOV LCD,#79 ;código ASCII para letra O CALL ESCRITA MOV LCD,#58 ;código ASCII para ':' CALL ESCRITA

CALL NUMERO RET

NUMERO: CLR RS MOV LCD,#199 ;código ASCII para acesso à coluna 16 do display CALL ESCRITA SETB RS MOV LCD,FLAG0 ;coloca o valor da casa de unidade no display CALL ESCRITA

CLR RS MOV LCD,#198 ;código ASCII para acesso à coluna 15 do display CALL ESCRITA SETB RS MOV LCD,FLAG1 ;coloca o valor da casa de dezena no display 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 instrução CALL DELAY50US ;O tempo mínimo para que ele receba esse byte é 40us (para dados). RET

;ATRASOS

Page 18: Relatorio Final Microprocessadores

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. Conclusão

Page 19: Relatorio Final Microprocessadores

A cada nova etapa da criação e montagem do sistema microcontrolado, no deparamos com os mais variados problemas.

No caso do software, obtivemos grande auxílio nas ferramentas de debug do compilador Keil, que se verificaram indispensáveis para a elaboração do mesmo. Até chegarmos à versão final, devemos ter encontrado mais de 100 erros, desde simples comandos escritos errado, que impediam a compilação, até graves problemas de lógica, que impediam o funcionamento desejado.

Quanto ao hardware, os problemas foram ainda maiores, dada a nossa quase total inexperiência em eletrônica digital. É interessante citar os dois que nos tomaram mais tempo:

o pull-up externo na porta 0: perdemos algumas horas por não termos dado atenção ao fato de que a porta 0 requer resistores de pull-up externo para funcionar.

os sensores de baixa potência (luminosa): no item 2.2 deste relatório, está a descrição deste problema. Só chegamos a ele quando nosso prazo de entrega já estava se esgotando, e , por isso, embora nossa solução aparentemente funcionou, isto precisaria ser longamente revisto para que o sistema fosse implementado em escala industrial.

Concluída a versão final do software, e do hardware, não há muito mais o que dizer.

Realmente, o mais importante para o grande aproveitamento deste projeto, foram exatamente os erros com os quais nos confrontamos, pois foram eles que nos permitiram uma maior compreensão de quase todos os aspectos desta disciplina, e de outras, além de nos propiciarem uma vivência real em engenharia elétrica, no que diz respeito à contornar os obstáculos físicos usando o que se tem a disposição, e procurando minimizar os custos de fabricação.

O projeto “Controlador de Fluxo” é relativamente simples, se comparado à maioria dos projetos propostos por outros colegas na data da especificação dos projetos, mas é para nós uma grande satisfação tê-lo concluído, pois partimos praticamente do ‘limbo’ no que diz respeito a conhecimento de microcontroladores e sua programação, e chegamos ao fim capacitados a criar novos projetos mais complexos.