relatorio final microprocessadores

23
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.

Upload: manogiacomelli

Post on 14-Apr-2016

24 views

Category:

Documents


0 download

DESCRIPTION

Microprocessadores8051

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.