Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Microcontrolador 8051, Notas de estudo de Tecnologia Industrial

Apostila do CEFET-SP

Tipologia: Notas de estudo

2010
Em oferta
30 Pontos
Discount

Oferta por tempo limitado


Compartilhado em 25/05/2010

roberto-cesar-possebon-10
roberto-cesar-possebon-10 🇧🇷

5

(2)

1 documento

Pré-visualização parcial do texto

Baixe Microcontrolador 8051 e outras Notas de estudo em PDF para Tecnologia Industrial, somente na Docsity! Wilson Ruiz 1 CEFET-SP Microcontroladores – Família MCS-51 Conceitos, Aplicações e Projetos versão 6.0 2004 Wilson Ruiz Harpia harpyja Harpia ou Águia Real Brasil Wilson Ruiz 2 CAPÍTULO 1: HARDWARE DOS MICROCONTROLADORES DA FAMÍLIA INTEL 8051 (MCS-51) 1.1 CARACTERÍSTICAS PRINCIPAIS COMUNS AOS MICROCONTROLADORES DA FAMÍLA INTEL MCS-51: • Família de microcontroladores mais usada atualmente. • CPU de 8 bits otimizada para aplicações de controle. • Clock típico de 12MHz (valor usado em aplicações gerais existindo também versões mais rápidas). • Capacidade de 64 Kbytes de memória de programa (ROM) e 64 Kbytes de memória de dados (RAM). • 4 Kbytes de memória de programa interna (ROM interna). • RAM interna com 128 bytes (há versões com capacidades superiores). • 4 portas de I/O de 8 bits cada, com bits individualmente endereçáveis. • Interrupções mascaráveis em dois níveis de prioridades (três internas e duas externas). • 2 temporizadores / contadores internos de 16 bits programáveis. • Oscilador de clock interno. • Canal de comunicação serial. • Capacidade de execução de complexas operações aritméticas e lógicas (multiplicação, divisão, permuta e deslocamento de bits etc). • Família com grande variedade de CPU’s, com versões diferenciando-se na especialização, porém apresentando mesma arquitetura interna básica. • Fornecido por diferentes fabricantes que personalizam o seu produto mantendo a compatibilidade com as versões originais. Wilson Ruiz 5 1.4 DESCRIÇÃO DA PINAGEM DO 8051 Número dos Pinos Nome Descrição resumida de sua função 1 a 8 P1.0 a P1.7 Port 1 Porta de I/O número 1 9 RST/ VPD “Reset” do sistema (é necessário a aplicação de um nível alto TTL, durante 2 ou mais ciclos de máquina) 10 a 17 P3.0 a P3.7 Port 3 Porta de I/O número 3 Possibilita também funções especiais relacionadas ao Canal Serial, Interrupções e “Timer/Counter” 18 XTAL 2 Ligação do cristal oscilador 19 XTAL 1 Ligação do cristal oscilador 20 Vss Terra 21 a 28 P2.0 a P2.7 Port 2 ou A8 a A15 Porta de I/O número 2 Saída do byte mais significativo do endereço, para memória externa. 29 PSEN’ Program Store Enable “Strobe” da memória de programa externa. Quando o sistema lê instruções ou operandos na memória externa, vai para nível zero e não é ativado (nível 1) durante busca na memória interna de programa. 30 ALE / PROG Address Latch Enable Saída para habilitar o “latch” de endereços. Serve para separar, a parte menos significativa do endereço, dos dados, na aplicação de memória externa. Entrada do pulso de programação durante a gravação da EPROM. 31 EA’ / Vpp External Access Enable – Programming Supply Voltage Entrada de seleção da memória de programa. Quando em nível zero, a CPU trabalha apenas com a memória de programa externa.. Se em nível lógico 1, a CPU executa instruções da memória de programa interna, desde que o PC seja menor que 4096. Este pino recebe +21 volts durante a programação da ROM interna. Recebe +21V durante a programação da EPROM 32 a 39 P0.0 a P0.7 ou AD0 a AD7 Porta de I/O número 0 Fornece o byte menos significativo de endereço multiplexado com os dados. 40 Vcc + 5 volts Wilson Ruiz 6 FUNÇÕES ESPECIAIS DOS PINOS DA PORTA 3 Nomes do Pino Descrição resumida de sua função P3.0 = RXD/data Receptor da porta serial assíncrona ou entrada e saída de dados síncronos (expansão de I/O pela porta serial). P3.1 = TXD/ clock Saída de transmissão da porta serial assíncrona, ou saída de clock para os registradores de deslocamento externos (expansão de I/O pela porta serial). P3.2 = INT0’ Interrupção externa número 0, ou Bit de controle para o “timer/counter” 0. P3.3 = INT1’ Interrupção externa número 1, ou Bit de controle para o “timer/counter” 1. P3.4 = T0 Entrada externa para o “timer/counter” 0. P3.5 = T1 Entrada externa para o “timer/counter” 1. P3.6 = WR’ “Strobe” (sincronismo) de escrita na memória de dados externa (escrita na memória RAM). P3.7 = RD’ Strobe (sincronismo) de leitura da memória de dados externa (leitura da memória RAM). Wilson Ruiz 7 1.5 ORGANIZAÇÃO DA MEMÓRIA DA FAMÍLIA 8051 (e equivalentes) MAPA DA MEMÓRIA DE PROGRAMA (ROM) 65535 = FFFFh 60K bytes à 4096 = 1000h ROM externa 60 Kbytes expansão 4095 = 0FFFh 4K bytes à 0 = 0000h ROM Interna do chip conteúdo inviolável 4 Kbytes Modo mínimo 65535 = FFFFh 64K bytes à 0 = 0000h ROM Externa 64 Kbytes Para o 8051: pino EA’=1 à OU ß Para o 8031: pino EA’ = 0 MAPA DA MEMÓRIA DE DADOS (RAM) 255 = FFh 128 bytes superiores à 128 = 80h Registros de funções especiais 128 bytes 127 = 7Fh 128 bytes inferiores à 0 = 00h RAM Interna uso geral e stack 128 bytes 65535 = FFFFh 64K bytes à 0 = 0000h RAM Externa Uso geral RAM interna à E ß RAM externa ***** A RAM externa não é endereçada diretamente pela CPU. O endereço de acesso deve estar em um registrador usado pela CPU como índice. Wilson Ruiz 10 1.7 PROGRAM STATUS WORD (PSW) - endereço D0h Este byte, localizado no espaço SFR (Special Status Word – RAM interna de 80h a FFh), possui alguns bits de status que refletem o estado da CPU. Mostrado na figura abaixo, contém as flags: Carry, Auxiliay Carry, Overflow, Paridade, dois bits (RS1 e RS0) de seleção de banco de registradores e dois bits de status definidos pelo usuário. Registrador PSW ( Program Status Word ) Flag Descrição C = PSW.7 Flag carry C = 1 indica o transporte no bit 7 (vai 1 ou vem 1), C = 0 caso contrário AC = PSW.6 Flag auxiliar carry C = 1 indica o transporte entre os bits 3 e 4 (vai 1 ou vem 1), C = 0 caso contr. F0 = PSW.5 Flag de uso geral Pode-se setar ou resetar esta flag, indicando o status da condição escolhida RS1 RS0 = 00 à banco 0 RS1 RS0 = 10 à banco 2 RS1 = PSW.4 RS0 = PSW.3 Seleção do banco de registradores RS1 RS0 = 01 à banco 1 RS1 RS0 = 11 à banco 3 OV = PSW.2 Flag de overflow OV = 1 indica uma condição de erro, o resultado não pode ser representado como um no sinalizado (ex. soma de nos negativos resultando em positivo) P = PSW.0 Flag de paridade P = 0 p/ paridade par do acumulador e P = 1 p/ paridade impar do acumulador Wilson Ruiz 11 1.8 RESET – principais características: • Ativo quando o pino RST (9) permanecer em “nível 1” por 2 ou mais ciclos de máquina. • RESET interno: § PC, Acumulador, B, Flags, DPTR, registros dos temporizadores / contadores são zerados. § SP ß 07h § SBUF (buffer serial) estará com conteúdo indeterminado e o registro de controle da porta serial (SCON) será zerado. § PCON terá apenas o seu bit +significativo zerado. § IE e IP (registros de controle de interrupção) terão xxx00000. § As portas P0 a P3 terão o valor FFh. (durante o RESET, o nível nos pinos é indeterminado, indo a “nível 1” após a execução da rotina interna de RESET assim, o hardware externo, dependendo da aplicação, deve prever essa situação, evitando o acionamento indesejado de algum periférico. § A RAM interna não é afetada pelo RESET “forçado”, sendo que após o “power-up” seu valor é aleatório. Wilson Ruiz 12 1.9 INTERRUPÇÃO Existem três fontes de interrupção: • A interrupção por software (instrução) • A interrupção solicitada por um periférico externo • A interrupção solicitada por um periférico interno (Timer/Counter ou Porta Serial) Vantagem da interrupção: • Simplificação do hardware, pois o sistema não necessita ficar monitorando o funcionamento de alguns dispositivos externos. Características das Interrupções: • Mascaramento: § Possibilidade do sistema atender ou não uma solicitação de interrupção (mascaráveis). § Existem sistemas com interrupções não mascaráveis. • Prioridades: § Para um sistema que tenha mais de uma interrupção, existe uma tabela de prioridades, que determina qual deve ser atendida primeiramente no caso de solicitações coincidentes. • Interrupção vetorada: § Possuem o “Vetor de Interrupção” (endereço de início da interrupção) fixo, não sendo definido pelo usuário ( família 8051). • Interrupção não vetorada: § Os endereços de tratamento da interrupção são escolhidos pelo programador (outras famílias). § OBS: O significado das expressões “interrupção vetorada” e “interrupção não vetorada” pode ser exatamente contrário ao descrito, dependendo da convenção do fabricante da família de microcontroladores usada. • Reconhecimento da interrupção: § Pelo nível (1 ou 0). § Pela borda de subida ou de descida. § Pela soma de borda (subida ou descida) e um nível correspondente. Wilson Ruiz 15 REGISTRADORES DE CONTROLE DAS INTERRUPÇÕES O 8051 possui dois registradores, na Região conhecida como SFR (Registradores de Funções Especiais) para controle das interrupções. à IE (Interrupt Enable) – Endereço A8h Tem por função indicar quais interrupções estão habilitadas. Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 EA X X ES ET1 EX1 ET0 EX0 EA (Enable All): • p/ = 0, desabilita todas as interrupções • p/ = 1, permite selecionar qual interrupção será habilitada, em função dos bits de controle individuais (abaixo). ES (Enable Serial): • p/ = 0, inibe a interrupção solicitada pelo canal serial, independentemente do valor de EA. • p/ = 1, libera a interrupção solicitada pelo canal serial, se EA = 1. ET1 (Enable Timer 1): • p/ = 0, inibe a interrupção solicitada pelo Timer/Counter 1, independentemente do valor de EA. • p/ = 1, libera a interrupção solicitada pelo Timer/Counter 1, se EA = 1. ET0 (Enable Timer 0): • p/ = 0, inibe a interrupção solicitada pelo Timer/Counter 0, independentemente do valor de EA. • p/ = 1, libera a interrupção solicitada pelo Timer/Counter 0, se EA = 1. EX1 (Enable External 1): • p/ = 0, inibe a interrupção solicitada pelo dispositivo externo ligado no pino INT1’, independentemente do valor de EA. • p/ = 1, libera a interrupção solicitada pelo dispositivo externo ligado no pino INT1’, se EA = 1. EX0 (Enable External 0): • p/ = 0, inibe a interrupção solicitada pelo dispositivo externo ligado no pino INT0’, independentemente do valor de EA. • p/ = 1, libera a interrupção solicitada pelo dispositivo externo ligado no pino INT0’, se EA = 1. Wilson Ruiz 16 à IP (Interrupt Priority) – Endereço B8h Tem por função fixar qual nível de prioridade das interrupções, sendo assim possível alterar a prioridade de atendimento de uma interrupção durante o processamento. Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 X X X PS PT1 PX1 PT0 PX0 PS (Priority Serial): • p/ = 0, indica prioridade baixa para a interrupção solicitada pelo canal serial. • p/ = 1, indica prioridade alta para esta interrupção, se a mesma estiver habilitada. PT1 (Priority Timer 1): • p/ = 0, indica prioridade baixa para a interrupção solicitada pelo Temporizador/Contador 1. • p/ = 1, indica prioridade alta para esta interrupção, se a mesma estiver habilitada. PT0 (Priority Timer 0): • p/ = 0, indica prioridade baixa para a interrupção solicitada pelo Temporizador/Contador 0. • p/ = 1, indica prioridade alta para esta interrupção, se a mesma estiver habilitada. PX1 (Priority External 1): • p/ = 0, indica prioridade baixa para a interrupção solicitada pelo dispositivo externo ligado no pino INT1’. • p/ = 1, indica prioridade alta para esta interrupção, se a mesma estiver habilitada. PX0 (Priority External 0): • p/ = 0, indica prioridade baixa para a interrupção solicitada pelo dispositivo externo ligado no pino INT0’. • p/ = 1, indica prioridade alta para esta interrupção, se a mesma estiver habilitada. Wilson Ruiz 17 AJUSTE DA FORMA DE RECONHECIMENTO DAS INTERRUPÇÕES EXTERNAS É possível ajustar as interrupções externas para serem detectadas pela transição de “1” para “0” ou pelo nível “0”. à TCON (Timer Control) – Endereço 88h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 IE1 IT1 IE0 IT0 IT1: Bit para a escolha da forma de reconhecimento do INT1 • p/ = 0, indica que será aceita a interrupção apenas pelo nível “0” presente no pino INT1’. • p/ = 1, indica que será aceita a interrupção na transição de “1” para “0” no nível desse pino’. IT0: Bit para a escolha da forma de reconhecimento do INT0 • p/ = 0, indica que será aceita a interrupção apenas pelo nível “0” presente no pino INT0’. • p/ = 1, indica que será aceita a interrupção na transição de “1” para “0” no nível desse pino’. IE1: Bit para o hardware de controle da interrupção INT1 • É setado pelo hardware interno quando for detectada uma transição de “1” para “0” no pino INT1’. • Tem por função sinalizar internamente o pedido da interrupção. É resetado logo que a interrupção é atendida. IE0: Bit para o hardware de controle da interrupção INT0 • É setado pelo hardware interno quando for detectada uma transição de “1” para “0” no pino INT0’. • Tem por função sinalizar internamente o pedido da interrupção. É resetado logo que a interrupção é atendida. Wilson Ruiz 20 M1.1 e M0.1 : M1.0 e M0.0 : • Escolha de um dos possíveis modos de operação para cada T/C. MODOS DE OPERAÇÃO DOS T/C’s. MODO 0 • Contador ou Temporizador de 8 bits, com divisor de freqüência de até 32 (freqclock / 32). • Selecionado fazendo-se: M1.x = 0 e M0.x = 0 • Os registradores TL0 e TL1 servem como divisores de 5 bits (até 32). TH0 ou TH1 | TL0 ou TL1 | Contagem (bits 15...8) | ignorar (bits 7...5) Prescaler (bits 4...0) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 § Registrador TH0 (endereço 8Ch) ou registrador TH1 (endereço 8Dh) recebe o valor inicial da contagem (valor escrito pelo software, até FFh). § Ao ocorre um overflow nesse registrador, o T/C em uso gera um pedido de interrupção interno, que poderá ser ou não aceito pela CPU. § O valor presente nesse registrador pode ser lido pelo software a qualquer momento. § O sinal de contagem (interno ou externo) será dividido pelo valor binário presente nos bits “0” a “4” do registrador TL0 (endereço 8Ah) ou TL1 (endereço 8Bh), no T/C usado. § Os bits “5”a “7” devem ser ignorados em caso de leitura. Exemplo: É desejada uma contagem com as seguintes características: De 9Bh até FFh e que a cada 20 pulsos aplicados na entrada externa do T/C 0 (pino T0), este incremente seu registro de uma unidade. Assim temos: 9Bh – FFh = 64h = 100 contagens em decimal, sendo desejado então que a cada 100 contagens internas uma interrupção seja gerada e, possibilitar assim que um determinado controle do sistema seja feito pela CPU. Dessa forma temos uma interrupção a cada 2000 sinais externos. Isso é conseguido programando-se T/C 0 como contador no modo 0, carregando-se TH0 com 9Bh e TL0 com 14h (20 decimal). A rotina de interrupção, além do tratamento desta, deverá escrever o valor inicial em TH0 (máx. contagem = 255 x 32) Wilson Ruiz 21 MODO 1 • Contador ou Temporizador de 16 bits. • Selecionado fazendo-se: M1.x = 0 e M0.x = 1 • Temos um par de registradores TH0 e TL0 ou TH1 e TL1 escolhido para efetuar a contagem. • É possível contagens de até FFFFh (65535 em decimal) com o valor inicial programável por software. • Ao correr um overflow, o sistema recebe um pedido de interrupção interna que poderá ou não ser aceito. TH0 ou TH1 | TL0 ou TL1 | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 MODO 2 • Contador ou Temporizador de 8 bits com recarga automática. • Selecionado fazendo-se: M1.x = 1 e M0.x = 0 • Nos registradores TL0 e TL1 ocorre a contagem. • Nos registradores TH0 e TH1 temos os valores que serão carregados automaticamente nos registradores TL0 e TL1, sempre que ocorrer um overflow (interrupção), prosseguindo o sistema sob o comando do sinal externo (contador) ou interno (temporizador). • Com este modo, temos um sistema no qual não é necessário escrever novamente via software o valor a ser contado. • Todos os registradores podem ser alterados a qualquer momento pelo software, resultando em uma grande flexibilidade no trabalho com temporizações e contagens. • O pedido de interrupção interna poderá ou não ser aceito pela CPU. | TH0 ou TH1 | TL0 ou TL1 à à à à à à à à 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Wilson Ruiz 22 MODO 3 • Contador de eventos de 8 bits e temporizador de 8 bits. • Selecionado fazendo-se: M1.x = 1 e M0.x = 1 • Neste modo T/C 1 para sua operação e fica inerte, sem receber pulsos de contagem. • Para T/C 0 temos dois sistemas de 8 bits, um em TH0 e outro em TL0. • O T/C agora formado por TL0 será controlado pelos bits TR0 e TF0 do registrador TCON. • O T/C agora formado em TH0 será controlado pelos bits TR1 e TF1 do registrador TCON. • O T/C 0 será habilitado pelo bit de controle do T/C1 (TR1) e ao ocorrer um overflow de TH0, é o bit TF1, que será setado e não o TF0. • Neste modo, o overflow em TH0 acionará o flag de requisição de interrupção referente ao T/C 1 e o overflow de TL0 acionará o flag de requisição de interrupção de T/C 0. • Os pedidos de interrupções internas poderão ou não serem aceitos pela CPU. | TH0 ou TH1 | TL0 ou TL1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Apenas temporizador de 8 bits | Temporizador / contador de 8 bits Ativa a interrupção do T/C 1 | ativa interrupção do T/C 0 | Wilson Ruiz 25 CANAIS SIMPLEX, HALF-DUPLEX E FULL-DUPLEX Canal SIMPLEX • Este modo é constituído pela interligação de dispositivos no qual temos um elemento que apenas transmite e outro que apenas recebe. Canal HALF-DUPLEX, ou SEMIDUPLEX • Neste modo de comunicação, temos elementos que recebem e transmitem dados, embora as duas operações não possam ocorrer simultaneamente. Canal FULL-DUPLEX ou simplesmente DUPLEX • Consiste em um modo pelo qual os sistemas podem transmitir e receber dados simultaneamente. Wilson Ruiz 26 A COMUNICAÇÃO SERIAL NO 8051 • No 8051, a interface serial é do tipo Full-Duplex. • O controle da transmissão e recepção de dados é feito por um registro denominado SBUF (serial Buffer – Endereço 99h). • Uma escrita no SBUF implica em automática transmissão deste dado. • Um dado ao “chegar” no pino correspondente será automaticamente recebido pelo sistema independentemente do usuário (p/ o canal serial habilitado e ajustado). • Existem dois registradores SBUF, um destinado para a recepção e outro para a transmissão de dados. • O reconhecimento é feito pelo sistema através das instruções que acessarão o mesmo, assim para uma instrução de escrita o registro de transmissão será alterado e para uma instrução de leitura o registro de recepção será acessado. • A transmissão inicia-se assim que o dado é escrito no SBUF. • A recepção é controlada pelo registro SCON. à SCON (Serial Control) – Endereço 98h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 SM0 SM1 SM2 REN TB8 RB8 T1 R1 SM0 e SM1 (Serial Mode): • Estes dois bits controlam o funcionamento do canal serial. SM0 SM1 Modo de Funcionamento Taxa de transmissão 0 0 0 1 0 0 1 1 0 1 2 3 Fclock/12 Variável Fclock/32 ou Fclock/64 Variável SM2 • No modo 0, não impõe qualquer efeito no funcionamento do canal serial, devendo permanecer em 0. • No modo 1, não produzirá pedido de interrupção se estiver setado e se o stop bit recebido for ilegal. • Nos modos 2 e 3, habilita a comunicação entre várias cpu’s 8051 p/=1. Wilson Ruiz 27 REN (Reception Enable): • Se estiver setado (=1), habilita a recepção tão logo um start bit seja detectado. • Se estiver resetado (=0), desabilita a recepção, e o pino RXD pode ser usado como I/O. TB8 • Nos modos 2 e 3, indica o estado do nono bit a ser transmitido. • Pode ser setado ou resetado por software. RB8 • Não é usado no modo 0. • No modo 1 indica o estado do stop bit recebido, desde que SM2 seja igual a 0. • Nos modos 2 e 3, indica o estado do nono bit de dados que foi recebido. TI • Flag de requisição de interrupção de transmissão. • É setado pelo hardware após a transmissão do oitavo bit de dados quando no modo 0 e nos outros no início do stop bit. • Permite que o programa de transmissão seja independente do programa principal, pois a cada final de transmissão a interrupção do canal serial pode gerenciar todo o processo, evitando assim os processos de varredura de alguns sistemas. • Deve ser resetado pelo software da rotina de interrupção para permitir novas interrupções. RI • Flag de requisição de interrupção da recepção. • É setado pelo hardware após a recepção do oitavo bit de dados quando no modo 0 e nos outros modos, ao moio do tempo de recpção do stop bit. • Deve ser resetado pelo software da rotina de interrupção para permitir novas interrupções. Wilson Ruiz 30 EXEMPLOS DA ESCRITA DE ALGUMAS INSTRUÇÕES Mnemônico Descrição ADD A, @R1 A ß A + (R1) ADDC A, #58 A ß A + 58 + carry SUBB A, R0 A ß A – R0 – carry INC DPTR DPTR ß DPTR + 1 MUL AB B A ß A x B DIV AB A ß A/B B ß resto ANL 58, #66 (58) ß (58) [and] #66 XRL A, @R1 A ß A [exclusive or] (R1) RL A d7ßd6ßd5ßd4ßd3ßd2ßd1ßd0ßd7 RRC A cyàd7àd6àd5àd4àd3àd2àd1àd0àcy SWAP A em A: d7 d6 d5 d4 ßà d3 d2 d1 d0 MOV A, 1Fh A ß (1Fh) MOV A, #3Ch A ß #3Ch ;hexadecimal MOV A, #10101110b A ß #10101110b ;binário MOV A, #78 A ß 78 ;decimal MOV @R0, #0F2h (R0) ß F2h { atenção para o caractere “0” } MOV DPTR, #2000h DPTR ß 2000h MOVC A, @A+DPTR A ß (A + DPTR) ;única forma de ler uma constante na memória de programa MOVX A, @R0 A ß (R0) ;leitura da RAM externa MOVX @DPTR, A (DPTR) ß A ;escrita na RAM externa XCH A, 28 A ßà (28) XCHD A, @R0 Para: A = 21h e (R0) = 4Dh, após a instrução temos: A = 2Dh e (R0) = 41h POP 70 (70) ß (SP) SP ß SP + 1 PUSH 70 SP ß SP – 1 (SP) ß (70) CLR EX1 bit EX1 ß0 CLR ABh Bit ABh ß 0 CPL A A ß complemento de A ORL C, 1Ah cy (or) (bit 1Ah)’ JNB P1.1, 2Ch se P1.1 = 0 ;PC ß PC + 2Ch o programa desvia se P1.1 =1 ;programa prossegue Wilson Ruiz 31 2.2 TABELAS DE INSTRUÇÕES DA FAMÍLIA 8051 Para diferenciar os modos de endereçamento, o tratamento dado a variáveis, constantes e endereços, registradores e seus conteúdos, além de valores numéricos genéricos de diferentes formatos e para diversas aplicações, é utilizada por alguns fabricantes a seguinte notação: Rn Indica registrador R0 a R7 genericamente, dependendo de “n”. Ri Indica o registrador R0 ou R1 genericamente, dependendo de “i”. @ Significa “endereçado pelo valor de ... “ #dado8 Indica valor constante de 8 bits. #dado16 Indica valor constante d 16 bits. direto Indica um endereço de memória de 8 bits (primeiras 256 posições internas ou externas). rel Indica que o endereço é relativo. end2k Indica endereço dentro de uma faixa de 2Kbytes. end16 Indica um endereço de 16 bits. bit Indica um bit individualmente endereçado. CICLOS DE MÁQUINA Corresponde a um período de tempo equivalente a 12 períodos do clock, portanto para um microcontrolador com um cristal de 12M Hz, um ciclo de máquina tem a duração de 1 x 10-6 s. Todas as instruções sempre são executadas em um número inteiro de ciclos de máquina, que na família 8051 são de 1, 2 ou 4 ciclos. Wilson Ruiz 32 INSTRUÇÕES PARA TRANSFERÊNCIA DE DADOS Mnemônico Descrição No de bytes No de pulsos de clock MOV A, Rn Move o registrador para o acumulador 1 12 MOV A, direto Move a memória para o acumulador 2 12 MOV A, @Ri Move RAM endereçada por Ri para o acumulador 1 12 MOV A, #dado8 Move o dado para o acumulador 2 12 MOV Rn, A Move o acumulador para o registrador 1 12 MOV Rn, direto Move a memória para o registrador 2 12 MOV Rn, #dado8 Move o dado para o registrador 2 12 MOV direto, A Move o acumulador para a memória 2 12 MOV direto, Rn Move o registrador para a memória 2 24 MOV direto1, direto2 Move o conteúdo da memória direta2 para a memória direta1 3 24 MOV direto, @Ri Move RAM endereçada por Ri para a memória 2 24 MOV direto, #dado8 Move o dado para a memória 3 24 MOV @Ri, A Move o acumulador para a RAM endereçada por Ri 1 12 MOV @Ri, direto Move a memória para a RAM endereçada por Ri 2 24 MOV @Ri, #dado8 Move o dado para a RAM indireta 2 12 MOV DPTR, #dado16 Move dado de 16 bits para o DPTR 3 24 MOVC A, @A + DPTR Soma: A + DPTR obtendo um endereço de 16 bits na memória de programa e carrega acumulador com esta memória 1 24 MOVC A, @A + PC Idem a anterior mas soma A + PC 1 24 MOVX A, @Ri Move RAM externa (endereço de 8 bits) para o acumulador 1 24 MOVX A, @DPTR Move RAM externa (endereço de 16 bits) para o acumulador 1 24 MOVX @Ri, A Move acumulador para a RAM externa (endereço de 16 bits) 1 24 MOVX @DPTR, A Move acumulador para a RAM externa (endereço de 16 bits) 1 24 PUSH direto Incrementa o SP e então coloca a memória no stack 2 24 POP direto Retira o dado do stack e o coloca na memória, depois decrementa o SP 2 24 XCH A, Rn Troca os conteúdos do acumulador e do registrador 1 12 XCH A, direto Troca a memória com o conteúdo do acumulador 2 12 XCH A, @Ri Troca RAM indireta com o conteúdo do acumulador 1 12 XCHD A, @Ri Troca o nibble menos significativo do acumulador e da RAM indireta entre si 1 12 Wilson Ruiz 35 INSTRUÇÕES DE DESVIO Mnemônico Descrição No de bytes No de pulsos de clock ACALL end2K Chama sub-rotina numa contida faixa de 2Kbytes da posição atual (dentro do espaço de –1024 a +1024 posições de memória). 2 24 LCALL end16 Chama sub-rotina em qualquer posição da memória de programa (até 64K bytes). 3 24 RET Retorna da sub-rotina. 1 24 RETI Retorna da interrupção. 1 24 AJMP end2K Desvia para endereço dentro de uma faixa de 2Kbytes da posição atual (dentro do espaço de –1024 a +1024 posições de memória). 2 24 LJMP end16 Desvia para qualquer posição da memória de programa (até 64K bytes). 3 24 SJMP rel Desvio curto relativo em uma faixa de 255 bytes (dentro do espaço –128 a +127 posições de memória). 2 24 JMP @A + DPTR Desvia para o endereço obtido da soma do acumulador com o DPTR. 1 24 JZ rel Desvia se o acumulador “for zero”. 2 24 JNZ rel Desvia se o acumulador “não for zero”. 2 24 CJNE A, direto, rel Compara e desvia se o acumulador for diferente da memória endereçada. 3 24 CJNE A, #dado8, rel Compara e desvia se o acumulador for diferente do dado. 3 24 CJNE Rn, #dado8, rel Compara e desvia se o registrador for diferente do dado.. 3 24 CJNE @Ri, #dado8, rel Compara e desvia se a RAM indireta for diferente do dado. 3 24 DJNZ Rn, rel Decrementa o registrador e desvia se for “diferente de zero”. 2 24 DJNZ direto, rel Decrementa a memória e desvia se for “diferente de zero”. 3 24 NOP Nenhuma operação. 1 12 Wilson Ruiz 36 INSTRUÇÕES PARA VARIÁVEIS BOOLEANAS Mnemônico Descrição No de bytes No de pulsos de clock CLR C Zera o carry flag 1 12 CLR bit Zera o bit endereçado 2 12 SETB C Seta o carry flag 1 12 SETB bit Seta o bit endereçado 2 12 CPL C Inverte o estado do carry flag 1 12 CPL bit Inverte o estado do bit endereçado 2 12 ANL C, bit “E” entre o carry flag e o bit endereçado. Resultado no carry flag. 2 24 ANL C, /bit “E” entre o carry flag e o complemento do bit endereçado. Resultado no carry flag. 2 24 ORL C, bit “OU” entre o carry flag e o bit endereçado. Resultado no carry flag. 2 24 ORL C, /bit “OU” entre o carry flag e o complemento do bit endereçado. Resultado no carry flag. 2 24 MOV C, bit Move o bit endereçado para o carry flag. 2 12 MOV bit, C Move o carry flag para o bit endereçado. 2 24 JC rel Desvia se o carry flag estiver setado. 2 24 JNC rel Desvia se o carry flag estiver zerado. 2 24 JB bit, rel Desvia se o bit endereçado estiver setado. 3 24 JNB bit, rel Desvia se o bit endereçado estiver zerado. 3 24 JBC bit, rel Desvia se o bit endereçado estiver setado e depois zera o bit. 3 24 Wilson Ruiz 37 CAPÍTULO 3: PROGRAMAÇÃO E SIMULAÇÃO 3.1 “COMPILAÇÃO” E “LINKAGEM” Um programa escrito em linguagem assembly (PROGRAMA FONTE), não pode ser diretamente processado pelo microcontrolador do sistema, devendo primeiramente ser traduzido para a sua linguagem de máquina, com o uso de tabelas ou através de um programa destinado para tal tarefa chamado de COMPILADOR, que fornece então como saída o PROGRAMA OBJETO. Define-se COMPILADOR como um programa aplicativo que transforma um arquivo constituído por códigos ASCII (PROGRAMA FONTE: obrigatoriamente com extensão “.ASM”), gerado normalmente por um editor de textos, em um arquivo binário que contém os bytes correspondentes às instruções (códigos de máquina) do microcontrolador. Como resultado da compilação são criados dois arquivos: • Arquivo de mesmo nome porém com a extensão “.OBJ” (PROGRAMA OBJETO). • Arquivo de mesmo nome, porém com a extensão “.PRN”, que corresponde a um arquivo texto que mostra o resultado da compilação, contendo para cada linha de programa, o código de máquina correspondente à instrução, sendo muito útil na depuração de erros de compilação. A “linkagem” tem a finalidade de reunir, em um único arquivo, todos as rotinas escrita em um ou vários arquivos diferentes. Após a “linkagem” são gerados dois arquivos: • Arquivo de mesmo nome, sem extensão, usado pelo programa simulador. • Arquivo de mesmo nome, porém com a extensão “.HEX”, usado por gravadores de memórias e microcontroladores e também pelo programa simulador. PROGRAMA à COMPILADOR à PROGRAMA à LINKER à PROGRAMA FONTE OBJETO EXECUTÁVEL .ASM .OBJ .HEX O compilador, o “Linker” e o Simulador usados no laboratório são produzidos pela AVOCET. Wilson Ruiz 40 3.4 SIMULADOR DOS MICROCONTROLADORES DA FAMÍLIA 8051 ****** TELA DE ENTRADA DO SIMULADOR: ****** _______________________________________________________________ AVSIM 8051 Simulator/Debugger Licensed by Avocet Systems, Inc. To receive updates, see 'Help Registration' Copyright (C) 1985-1992 by Ken Anderson Software Inc All Rights Reserved Intel 8051 Family Microcomputers HMOS ROM HMOS ROMless CMOS ROM A: 8051/8751 C: 8031 E: 80C51 B: 8052/8752 D: 8032 F: 80C31 Choose a CPU for simulation: ______________________________________________________________ ****** DEVE-SE SELECIONAR UMA OPÇÃO EM FUNÇÃO ****** ******DA CPU ESCOLHIDA PARA O PROJETO ****** Wilson Ruiz 41 ****** TELA DE SIMULAÇÃO: ****** _________________________________________________________________________ LABEL OPERATION 8051/8751 AVSIM 8051 Simulator/Debugger V1.6 0000H no memory CPUREGISTERS FLAGS SCL SPD DSP SKPCURSOR 0001H no memory C Accumulator AC F0 OV P OFF HI ON OFF MENU 0002H no memory 0 00000000:00:_ 0 0 0 0 Cycles: 0003H no memory EA: 0004H no memory PC:0000 »FF FF FF FF TimersTH/TL TF /TR G/T/M1/M0 0005H no memory SP: 07 » 00 00 00 00 T0: 00 00 0 0 0 0 0 0 0006H no memory 00 00 00 00 T1: 00 00 0 0 0 0 0 0 0007H no memory DP:0000 »FF FF FF FF 0008H no memory R0:00:_ » 00:_ RB:00 Ints A S T1 X1 T0 X0 Edg IT IE 0009H no memory R1:00:_ » 00:_ B:00 En 0 0 0 0 0 0 X0: 0 0 000AH no memory R2:00 R4:00 R6:00 Pr 0 0 0 0 0 X1: 0 0 000BH no memory R3:00 R5:00 R7:00 SBUF: In Out PCON:0xxxxxxx 000CH no memory Data S pace 00:_ 00:_ SCON:00000000 000DH no memory 00 00 00 00 00 00 00 00 00 _____________ Ports 000EH no memory 08 00 00 00 00 00 00 00 00 _____________ P0 11111111 000FH no memory 10 00 00 00 00 00 00 00 00 _____________ FF:_:11111111 0010H no memory 18 00 00 00 00 00 00 00 00 _____________ P1 11111111 0011H no memory Data Space FF:_:11111111 0012H no memory 20 00 00 00 00 00 00 00 00 _____________ P2 11111111 0013H no memory 28 00 00 00 00 00 00 00 00 _____________ FF:_:11111111 0014H no memory 30 00 00 00 00 00 00 00 00 _____________ P3 11111111 0015H no memory 38 00 00 00 00 00 00 00 00 _____________ FF:_:11111111 >Select Command - or use arrow keys Dump Expression commandFile Help IO Load --space-- ESC to screen Wilson Ruiz 42 OPERAÇÃO BÁSICA DO SIMULADOR Para uma rápida ambientação com o programa simulador, é apresentada uma seqüência de testes para as principais teclas e/ou comandos: • Visualização geral da tela, tentando reconhecer os seus principais campos (coloridos) e funções correspondentes. • Teclas: ESC CTRL C • Comandos: Help à Commands Display Simulation Avocet Registration Load à Avocet Quit à Exit setUp à Cursor à Yes No View à Memory-map Symbols à Alpha Registers Data Bit SFR eXecute • Seqüência para carregar um arquivo no simulador e informações sobre a simulação: Load à Avocet à ... .OBJ Help à Simulation • Teclas para a simulação F1 :executa o programa inteiro. F10 :executa um programa instrução por instrução. F9 :volta para a condição anterior, após a execução de uma instrução. Wilson Ruiz 45 EXERCÍCIO 4 Escrever um programa para controlar a operação das duas esteiras da figura, com os seguintes passos: A. Posicionar a caixa na esteira 2. B. Acionar a esteira 1 para encher a caixa com um total de 20 peças. C. Retirar a caixa cheia e posicionar uma nova. Definição das variáveis de entrada e saída: sensor 0 = 1 à peça detectada sensor 0 = 0 à caso contrário sensor 1 = 1 à caixa detectada sensor 1 = 0 à caso contrário sensor 2 = 1 à caixa detectada sensor 2 = 0 à caso contrário motor 1 = 1 à motor ligado motor 1 = 0 à motor desligado motor 2 = 1 à motor ligado motor 2 = 0 à motor desligado OBS: • O emprego dos sensores 1 e 2 evita que uma eventual posição intermediária da caixa seja aceita como correta (por exemplo, no momento em que o sistema é ligado). • Pela diferença de dimensões entre o objeto e a área ativa do sensor, deve-se evitar que uma peça seja contada mais de uma vez, ao passar na frente do sensor 0. • O enunciado é propositadamente aberto, assim qualquer dado ou condição adicional pode ser adotada pelo programador. Wilson Ruiz 46 EXERCÍCIO 5 Escrever um programa que execute os seguintes passos: A. Inicie o sistema carregando: R0 ß 00h , R1 ß 01h , R2 ß 02h , R3 ß 03h , R4 ß 04h , R5 ß 05h , R6 ß 06h , R7 ß 07h B. Reset a carry flag. C. Faça uma leitura de uma porta de entrada (P1) e através da análise deste byte possibilite a escolha de uma das funções descritas na tabela a seguir. D. Programa entra em loop e volta ao passo “ C ”. Bit = 0 = 1 P1.7 ------------------------ Envia p/ P2 o conteúdo de R0, R1,...R7 Separados por um “pequeno” delay P1.6 ------------------------ Incrementar o conteúdo de todos Rn P1.5 ------------------------ Decrementar o conteúdo de todos Rn P1.4 ------------------------ Rotacionar todos Rn de 4 bits ou Trocar os seus respectivos nibbles P1.3 ------------------------ Rotacionar todos Rn de 3 bits P1.2 ------------------------ Rotacionar todos Rn de 2 bits P1.1 ------------------------ Rotacionar todos Rn de 1 bit P1.0 Escolha do sentido de Rotação: p/ esquerda Escolha do sentido de rotação: p/ direita OBS: p/ os bits 4 ou 3 ou 2 ou 1 = “1” OBS: • Admitir que o sistema nunca fornecerá 2 bits iguais a “1” simultaneamente nos pinos: P1.7, P1.6, P1.5, P1.4 P1.3, P1.2 e P1.1. • Antes de iniciar a simulação fazer P1 = 00h (condição inicial). • Simular “passo a passo” o programa observando sua execução. Wilson Ruiz 47 SUGESTÕES: • Usar as instruções: RL A ; RR A ; SWAP A ; CLR C ; JNB bit, rel ; LJMP end • Executar cada uma das tarefas solicitadas em sub-rotinas especializadas e selecionadas pelo programa principal como mostrado no fragmento de programa a seguir: . . . JNB P1.7, L1 ACALL SUB_7 L1: JNB P1.6, L2 ACALL SUB_6 L2: JNB P1.5, L3 ACALL SUB_5 L3: JNB P1.4, L4 ACALL SUB_4 L4: JNB P1.3, L5 ACALL SUB_3 L5: JNB P1.2, L6 ACALL SUB_2 L6: JNB P1.1, L7 ACALL SUB_1 L7: . . . EXERCÍCIO / EXEMPLO 6 Escrever um programa que realize as seguintes operações: A. Inicialmente leia o byte presente na porta P0. B. Depois atualize o display ligado na porta P1 com o valor em hexadecimal correspondente. ao número binário formado pelos bits presentes nos pinos: P0.3 P0.2 P0.1 P0.0 . C. O programa deve entrar em loop. Características do display e da conexão: • Display de LED’s, catodo comum e de 7 segmentos + ponto decimal • Ligação dos segmentos (através de um resistor de 220 ohms): pinos da porta 1: P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 segmentos: h g f e d c b a Wilson Ruiz 50 EXERCÍCIO 9 Escrever um programa para controlar o reservatório da figura a seguir, com o objetivo de manter o nível do líquido deste, que é c consumido pelo sistema, entre a posição dos sensores 0 e 1 (sensores 0 e 1), além de também gerar continuamente um sinal indicador de que o sistema está em operação em um LED, ligado no bit P1.7, alternado o status deste entre “0” e “1” , separado por um pequeno delay. Definição das variáveis: sensor 0 = 1 à líquido detectado sensor 0 = 0 à caso contrário sensor 1 = 1 à líquido detectado sensor 1 = 0 à caso contrário bomba = 1 à acionada bomba = 0 à desligada válvula = 1 à aberta válvula = 0 à fechada OBS: • Apesar do sistema apresentado ser semelhante ao do exercício número 3 o programa deve ser diferente, pois nessa aplicação são usadas as duas interrupções externas no seu controle (ligação dos sensores). • Para que o uso desse recurso seja possível é necessário que o programa salte os endereços de memória reservados para todas as interrupções (diretiva “ORG”) e também configure aquelas usadas pelo sistema, através dos registradores “IE”, “IP” e “TCON”. • O uso de interrupções é uma das características mais importantes em aplicações de controle envolvendo microcontroladores e microprocessadores, pois evita-se que a CPU fique monitorando continuamente os dispositivos de entrada. Assim o sistema proposto no exercício tem “liberdade” para ficar alternando o bit de saída da porta P1 (P1.7), entre “0” e “1”, enquanto nenhuma interrupção é ativada. • Para a resolução deste problema recomenda-se inicialmente a elaboração de um fluxograma ou algoritmo e após, a sua codificação em assembly, (notar que as rotinas de interrupção possuem fluxogramas separados do principal). • O enunciado é propositadamente aberto, assim qualquer dado ou condição adicional pode ser adotada pelo programador. • Após a simulação comparar esta solução com a empregada no exercício número 3. EXERCÍCIO / EXEMPLO 10 • Dado o seguinte sistema microcontrolado baseado na CPU 8751: Motor de passo ligado nos bits: P1.3 , P1.2 , P1.1 e P1.0 conforme a tabela: Tabela de acionamento do motor Aà P1.3 Bà P1.2 A’à P1.1 B’à P1.0 0 0 0 1 Passo 1 0 0 1 0 Passo 2 0 1 0 0 Passo 3 1 0 0 0 Passo 4 Wilson Ruiz 51 Escrever um programa que execute o controle do sistema da seguinte forma: • Movimente o motor continuamente, com o sentido de rotação selecionado pelo bit de entrada P3.7: P3.7 = 0 à sentido horário P3.7 = 1 à sentido anti-horário ;*********************************************************************************************** ; EXERCÍCIO / EXEMPLO 10 – CONTROLE DE MOTOR DE PASSO ; OBS: Necessário o ajuste do delay em função da velocidade do microcomputador usado para a simulação. ;*********************************************************************************************** ORG 0000H LJMP INICIO ORG 0050H INICIO: MOV A, #00010001B ;estabelece o byte inicial ;para o chaveamento do motor L2: JNB P3.7, L1 ;testa o bit de controle MOV P1, A ;movimenta no sentido anti-horário ACALL DELAY ;fornece uma pausa "entre passos" RR A ;desloca um bit para a direita AJMP L2 ;retorna para novo teste L1: MOV P1, A ;movimenta no sentido horário ACALL DELAY ;fornece uma pausa "entre passos" RL A ;desloca um bit para a esquerda AJMP L2 ;retorna para novo teste DELAY: MOV R0, #1FH ;pausa (ajustar se necessário) L3: DEC R0 CJNE R0, #00H, L3 RET END EXERCÍCIO 11 Acrescentar ao sistema anterior uma chave para habilitar o movimento, ligada no pino P3.0 e operando da seguinte forma: para P3.0 = 0 à motor parado para P3.0 = 1 à motor em movimento (com sentido escolhido por P3.7). EXERCÍCIO 12 Acrescentar ao sistema anterior um controle de posição angular (contador de passos) da seguinte forma: • O número de passos (em binário) desejado para o movimento do motor é lido da porta P2 (até 255 passos ou 11111111b). • Até o término do movimento escolhido (quando habilitado, com sentido de rotação selecionado e número de passos definido) o sistema ignora qualquer mudança nas variáveis de controle. • Uma nova leitura das variáveis de controle deve acontecer somente após o final do movimento anterior. EXERCÍCIO 13 Incluir no sistema anterior um controle de velocidade, possibilitando a escolha gradual desta através dos bits: P0.3, P0.2, P0.1 e P0.0 da seguinte forma: • Bits para a seleção de velocidade dos dois motores: para P0.3 P0.2 P0.1 P0.0 = 1111 à temos a menor velocidade para P0.3 P0.2 P0.1 P0.0 = 0000 à temos a maior velocidade (Possibilitando 16 valores diferentes de velocidades). Wilson Ruiz 52 EXERCÍCIO 14 Alterar o sistema / programa anterior para: • Incluir um “push-button” de controle (sinal de emergência) ligado no pino de interrupção: P3.2 = INT0’ • Onde “push-button” pressionado equivale a “0” lógico. • O motor deve ficar parado enquanto o “push-button” estiver pressionado e em movimento caso contrário. EXERCÍCIO 15 Ampliar o sistema anterior incluindo um outro motor com o seu bit de controle de sentido de rotação e o sinal de parada de emergência ligado na interrupção, formando o seguinte conjunto: • Bits de ligação do motor 1 e motor 2 conforme a tabela: Tabela de acionamento do motor 2 Tabela de acionamento do motor 1 Aà P1.7 Bà P1.6 A’à P1.5 B’à P1.4 Aà P1.3 Bà P1.2 A’à P1.1 B’à P1.0 0 0 0 1 Passo 1 0 0 0 1 Passo 1 0 0 1 0 Passo 2 0 0 1 0 Passo 2 0 1 0 0 Passo 3 0 1 0 0 Passo 3 1 0 0 0 Passo 4 1 0 0 0 Passo 4 • Bits de controle do sentido de rotação dos motores: P3.7 = 0 à motor 1 operando no sentido horário P3.7 = 1 à motor 1 operando no sentido anti-horário P3.6 = 0 à motor 2 operando no sentido horário P3.6 = 1 à motor 2 operando no sentido anti-horário • Bits para habilitação do movimento dos dois motores: P3.1 P3.0 = 00 à motor 2 parado e motor 1 parado P3.1 P3.0 = 01 à motor 2 parado e motor 1 em movimento P3.1 P3.0 = 10 à motor 2 em movimento e motor 1 parado P3.1 P3.0 = 11 à motor 2 em movimento e motor 1 em movimento • Bits para a determinação do número passos dos dois motores: O número de passos de é lido da porta P2 . • Bits para a seleção de velocidade dos dois motores: para P0.3 P0.2 P0.1 P0.0 = 1111 à temos a menor velocidade para P0.3 P0.2 P0.1 P0.0 = 0000 à temos a maior velocidade (Possibilitando 16 valores diferentes de velocidades). • Sinais de emergência (interrupção) dos motores: P3.2 = INT0 para o motor 1 e 2 EXERCÍCIO 16 Ampliar o sistema anterior incluindo um “push-button” (sinal de emergência) específico para cada motor formando o seguinte conjunto: • Sinais de emergência (interrupção) dos motores: P3.2 = INT0 para o motor 1 P3.3 = INT1 para o motor 2 EXERCÍCIO 17 Alterar o sistema anterior para que os motores possam operar com velocidades diferentes, da seguinte forma: • Bits para a seleção de velocidade do motor 1: para P0.3 P0.2 P0.1 P0.0 = 1111 à temos a menor velocidade para P0.3 P0.2 P0.1 P0.0 = 0000 à temos a maior velocidade (Possibilitando 16 valores diferentes de velocidades para o motor 1). Wilson Ruiz 55 LJMP CNT0 ORG 0050H INICIO: MOV P0, #00H ;apaga painel luminoso CLR P1.0 ;apaga iluminação de emergência SETB P1.7 ;fecha cancela de entrada CLR P1.6 ;apaga luz indicadora de funcionamento ACALL DELAY_2 ;delay para o movimento mecânico L1: JB P3.0, L1 ;espera pressionar START L2: JNB P3.0, L2 ;espera soltar START MOV TL0, #0F6H ;estabelece o valor inicial do contador MOV TH0, #0F6H ;calculo: 255 – 10 + 1 = 246 = F6H MOV A, #00000001B ;estabelece o byte inicial do painel MOV IE, #10000011B ;habilita INT0 e T/C0 MOV IP, #00000001B ;prioridades: INT0 alta e T/C0 baixa MOV TMOD, #00000110B ;define modo 2 para T/C0 MOV TCON, #00010001B ;INT0 ativa por rampa e liga T/C0 SETB P1.6 ;acende luz indicadora funcionamento CLR P1.7 ;abre cancela de entrada ACALL DELAY_2 ;delay para movimento mecânico L3: JNB P3.2, L4 ;desvia se energia elétrica OK CLR P1.0 ;apaga iluminação de emergência L4: MOV P0, A ;controle do painel luminoso RL A ;desloca o bit da lâmpada acesa ACALL DELAY_1 ;delay para as lâmpadas AJMP L3 INT0: SETB P1.0 ;acende iluminação de emergência RETI ;retorna da interrupção CNT0: SETB P1.7 ;fecha cancela de entrada ACALL DELAY_2 ;delay para movimento mecânico CLR P1.6 ;apaga luz de funcionamento LJMP L1 ;volta para aguardar o START RETI ;esta instrução nunca é executada DELAY_1: MOV R7, #0AH ;fornece delay para as lâmpadas L5: DEC R7 CJNE R7, #00H, L5 RET DELAY_2: MOV R6, #50H ;fornece delay para movimento L6: DEC R6 ;mecânico CJNE R6, #00H, L6 RET END EXERCÍCIO 23 Modificar o sistema anterior incluindo outros sinais de entrada (sensor para os automóveis) e de saída (controle de uma cancela de saída), para possibilitar que este considere os automóveis que saem do estacionamento, liberando vagas durante o período de funcionamento. Wilson Ruiz 56 ENTRADAS ADICIONAIS AO SISTEMA: porta Descrição: bits / pinos níveis lógicos OBS: P3 Sinal indicador de saída de veículo P3.6 0 = saída de veículo 1 = caso contrário SAÍDAS ADICIONAIS AO SISTEMA: porta Descrição: bits / pinos níveis lógicos OBS: P1 Controle da portaria de saída (cancela). P1.5 0 = abre 1 = fecha Fecha no início e abre quando é detectado um veículo saindo. Considerar o tempo necessário para o movimento da cancela. EXERCÍCIO 24 Sofisticar o sistema anterior, incluindo um contador para controlar o número de funcionários do estacionamento presentes durante o período de funcionamento. ENTRADAS ADICIONAIS AO SISTEMA: porta Descrição: bits / pinos níveis lógicos OBS: P3 Sinal de contagem dos funcionários que chegam ao trabalho P3.5 = T/C1 Transição de 1 p/ 0 indica chegada do funcionário Fornecido pelo sistema de entrada EXERCÍCIO 25 Incluir no sistema anterior o controle de uma lâmpada indicadora de que o número de funcionários presentes no estacionamento é suficiente para o funcionamento do mesmo. OBS: • Por razões de segurança, o estacionamento só entrará em funcionamento quando o número de funcionários presentes for maior ou igual a 5. SAÍDAS ADICIONAIS AO SISTEMA: porta Descrição: bits / pinos níveis lógicos OBS: P1 Controle da lâmpada indicadora de número de funcionários suficiente. P1.4 0 = apagada 1 = acesa Acende quando o número de funcionários é suficiente. EXERCÍCIO 26 Incluir no sistema a utilização da porta P2 como saída, com um display de 7 segmentos conectado (anodo comum), que sempre indica o número de vagas disponíveis naquele instante no estacionamento (em decimal) da seguinte forma: para nenhuma vaga disponível manter o display apagado e para 10 vagas acender o número zero. OBS: • Tomar como referência a solução do exercício 6 Wilson Ruiz 57 • Ligação dos segmentos (através de um resistor de 220 ohms): pinos da porta 2: P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 segmentos: h g f e d c b a EXERCÍCIO / EXEMPLO 27 Projetar um sistema de controle de um elevador para 3 níveis, baseado no microcontrolador 8751, com as seguintes características: Entradas do sistema: P0 e INT0 Sinal Descrição Pino de ligação Níveis lógicos CH1 Botão para enviar o elevador ao 1o andar (1o nível ou térreo) P0.0 1=acionada 0=caso contrário CH2 Botão para enviar o elevador ao 2o andar P0.1 1=acionada 0=caso contrário CH3 Botão para enviar o elevador ao 3o andar P0.2 1=acionada 0=caso contrário Sensor1 Sensor indicador de presença da cabine no 1o andar P0.4 1= há cabine no andar 0=caso contrário Sensor2 Sensor indicador de presença da cabine no 2o andar P0.5 1= há cabine no andar 0=caso contrário Sensor3 Sensor indicador de presença da cabine no 3o andar P0.6 1= há cabine no andar 0=caso contrário SAFETY Botão de emergência P3.2 = INT0’ 0=acionado 1=caso contrário Saídas do sistema: P1 Sinal Descrição Pino de ligação Níveis lógicos Motor do elevador Bits usados para a movimentação do motor P1.1 P1.0 P1.1 P1.0 0 0 elevador parado 0 1 elevador desce 1 0 elevador sobe 1 1 não usado Porta Bit usado para a movimentação da porta P1.2 0=fecha porta 1=abre porta LED1 Led para indicar que a cabine está no 1o andar P1.4 0=led apagado 1=led aceso LED2 Led para indicar que a cabine está no 2o andar P1.5 0=led apagado 1=led aceso LED3 Led para indicar que a cabine está no 3o andar P1.6 0=led apagado 1=led aceso OBS: • Se desejável é possível associar-se o 1o andar da tabela anterior ao andar térreo de um edifício, deslocando-se também os outros níveis, sem alterações no funcionamento da solução fornecida como exemplo a seguir. • Assim que o sistema é iniciado o elevador desloca-se para o primeiro andar com a porta fechada e lá chegando abre a porta. • O elevador somente desloca-se com a porta fechada. Wilson Ruiz 60 SETB TR0 ;liga o timer0 L21: JNB 00, L21 ;espera o término da temporização CLR 00 ;reseta a FLAG DO TIMER0 CLR P1.1 ;desce o elevador SETB P1.0 RET ;************************************************************************************************** ; sub-rotina: PARAR ;************************************************************************************************** PARAR: CLR P1.1 ;para o elevador CLR P1.0 SETB P1.2 ;abre a porta SETB TR0 ;liga o timer0 L22: JNB 00, L22 ;espera o término da temporização CLR 00 ;reseta a FLAG DO TIMER0 RET TIMER0: CLR TR0 ;desliga o timer0 MOV TH0, #3CH ;valor inicial para a contagem / temporização MOV TL0, #0B0H SETB 00 ;seta a FLAG DO TIMER0 RETI ;retorna para o programa INT0: CLR P1.1 ;para o elevador CLR P1.0 SETB P1.2 ;abre a porta L23: JNB P3.2, L23 ;espera o término da situação de emergência RETI END EXERCÍCIO 28: Ampliar o sistema anterior para que este seja aplicado em um edifício com 4 níveis, adicionando os seguintes recursos: Entradas do sistema: P0 Sinal Descrição Pino de ligação Níveis lógicos CH4 Botão para enviar o elevador ao 4o andar P0.3 1=acionada 0=caso contrário Sensor4 Sensor indicador de presença da cabine no 4o andar P0.7 1= há cabine no andar 0=caso contrário Saídas do sistema: P1 Sinal Descrição Pino de ligação Níveis lógicos LED4 Led para indicar que a cabine está no 4o andar P1.7 0=led apagado 1=led aceso EXERCÍCIO 29: Melhorar a função da “rotina de tratamento da interrupção INT0” (rotina de emergência) do sistema anterior, para que ao ser acionada no momento em que o elevador estiver parado em um andar, abra a porta da cabine e para a situação do elevador estar entre andares, leve o mesmo ao andar imediatamente inferior antes de abrir sua porta. Incluir no sistema o recurso de um alarme sonoro, que deve ser disparado caso o elevador demore mais que um tempo determinado para chegar no andar inferior, após o acionamento deste botão de emergência, onde: Saídas do sistema: P1 Sinal Descrição Pino de ligação Níveis lógicos ALARME Alarme sonoro P1.3 0=alarme desligado 1=alarme ligado Wilson Ruiz 61 EXERCÍCIO 30: Incluir no sistema anterior um teclado fora da cabine e em cada andar do edifício, com o objetivo de ampliar o controle do elevador, ligado na porta P2 do microcontrolador da seguinte forma: Entradas do sistema: P0 Sinal Descrição Pino de ligação Níveis lógicos CH1-up Botão no 1o andar, para chamar o elevador para andares superiores. P2.0 1=acionada 0=caso contrário CH2-down Botão no 2o andar, para chamar o elevador para andares inferiores. P2.1 1=acionada 0=caso contrário CH2-up Botão no 2o andar, para chamar o elevador para andares superiores. P2.2 1=acionada 0=caso contrário CH3-down Botão no 3o andar, para chamar o elevador para andares inferiores. P2.3 1=acionada 0=caso contrário CH3-up Botão no 3o andar, para chamar o elevador para andares superiores. P2.4 1=acionada 0=caso contrário CH4-down Botão no 4o andar, para chamar o elevador para andares inferiores. P2.5 1=acionada 0=caso contrário OBS: • Durante um movimento, o elevador somente deve atender um pedido de chamada, se a cabine estiver no mesmo andar onde foi feito essa chamada ou o chamado ocorrer em um andar que ainda irá ser transposto durante o seu atual movimento. EXERCÍCIO 31: Incluir no sistema anterior o recurso de enviar o elevador para o 1o andar e após abrir a sua porta, se não houver nenhuma chamada durante um tempo determinado. Wilson Ruiz 62 CAPÍTULO 4: PROJETOS 4.1 RECOMENDAÇÕES SOBRE PROJETOS E MONTAGENS DE SISTEMAS MICROCONTROLADOS ALIMENTAÇÃO: • Deve ser externa a placa. • Conectar um capacitor de poliester (aproximadamente 10nF) ligado entre os pinos “Vcc” e “GND” , ao lado do microcontrolador. • Conectar um capacitor eletrolitico (mínimo 10uF) na entrada da alimentação na placa. MONTAGEM: • Microcontrolador deve ficar em um soquete de pinos torneados. • Usar conectores para os bits das portas envolvidos na aplicação (macho tipo “prego”) ou fios soldados diretamente na placa.. • Usar bornes simples para a alimentação ou fios soldados diretamente na placa. • Usar pés de borracha ou outro isolador, para a sustentação da placa. • Usar uma placa padrão preferencialmente com as trilhas desenhadas como um “proto board” (evitar as placas com ilhas isoladas que são ideais para montagens em wire-wrap). OSCILADOR: • A família 8051 trabalha tipicamente com cristais de 8, 10, 12MHz, conforme o tipo da CPU e de no mínimo 3,5MHz (um valor fácil de ser encontrado é de 11,0592MHz, usado pelo sinal de croma de televisão). • O encapsulamento metálico do cristal deve ser soldado ao GND da placa. • As ligações do circuito oscilador devem ser as mais curtas possíveis. RESET: • Para o reconhecimento da CPU este sinal deve permanecer em “1” por 2 ou mais ciclos de máquina (clock na freqüência do cristal usado). • Após o Reset: • O “PC”, o “Acumulador”, o registrador “B”, os “Flags”, o “DPTR” e os registros dos “TIMERS’ são zerados. • O “SBUF” (buffer serial) estará com o conteúdo indeterminado e o “SCON” (serial control) será zerado. • Os registradores de controle de interrupção “IE” (Interrupt Enable) e “IP” (Interrupt Priority) terão o valor binário XXX00000. • No “SP” (stack pointer) é carregado o valor 07H. • As portas P0, P1, P2 e P3 terão o valor FFH. • Durante o Reset: • O nível lógico dos pinos das portas é indeterminado, indo para “1” após esse período. • Deve-se considerar essas características para evitar o acionamento não desejado de qualquer periférico externo. • A RAM interna não é afetada pelo “Reset forçado” ou partida quente (push-botton de Reset) e após o “Power-On” ou partida fria, o seu conteúdo é aleatório. PORTAS: • P0: Porta bidirecional de 8 bits. Cada pino desta porta pode suprir / drenar 2 cargas TTL. Quando configurada como entrada, terá o nível lógico de seus pinos flutuando na ausência de sinal. • P1: Porta bidirecional de 8 bits com pull-ups internos. Cada pino desta porta pode suprir / drenar uma carga TTL ou várias CMOS sem pull-ups externos. Seus pinos tem sempre um estado definido (“1”ou “0”), possibilitando que o nível lógico do pino possa ser medido, mesmo quando usado como entrada. • P2: Porta bidirecional de 8 bits com pull-ups internos. Cada pino desta porta pode suprir / drenar uma carga TTL ou várias CMOS sem pull-ups externos. Seus pinos tem sempre um estado definido (“1”ou “0”), possibilitando que o nível lógico do pino possa ser medido, mesmo quando usado como entrada. 4.2 CPU PARA UM SISTEMA MÍNIMO +54 RESET + 10Ur A tetsis io nr Bsu E] 82H om Wilson Ruiz LED*S indicadores ve] PEU 220 chm NNONINANNAA NAAS p o ESEL cu ATESEEL PE.s 4 IL p3:a > TO PSB > INTIS P3:B 4 INTO? a E3:1 4 TXD 4 clock a F3.0 4 RXD “ data 65 Wilson Ruiz 66 4.3 CIRCUITO DO GRAVADOR (para as cpu’s AT89S51, AT89S52, AT89S53 e AT89S8252) Wilson Ruiz 67 4.4 CPU DO SISTEMA MÍNIMO E GRAVADOR (para as cpu’s AT89S51, AT89S52, AT89S53 e AT89S8252) Wilson Ruiz 70 65 ; E2. Lê byte espelho de M0 66 ; E3. Atualiza byte espelho de M0 67 ; E4. Gira M0, no sentido horário, um passo 68 ; E5. Verifica sensor SDE 69 ; E5.1 Se SDE = F vai para E2 70 ; E6. Lê byte espelho de M0 71 ; E7. Atualiza byte espelho de M0 72 ; E8. Gira M0, no sentido anti-horário, um passo 73 ; E9. Verifica S0 74 ; E.9.1 Se S0 = F vai para E6 75 ; E10. Atualiza Leds dos sensores e byte status 76 ; E11. Retorna 77 ;F. CORREÇÃO DIANTEIRA PARA A ESQUERDA 78 ; F1. Atualiza status correspondente 79 ; F2. Lê byte espelho de M0 80 ; F3. Atualiza byte espelho de M0 81 ; F4. Gira M0, no sentido anti-horário, um passo 82 ; F5. Verifica sensor SDD 83 ; F5.1 Se SDD = F vai para F2 84 ; F6. Lê byte espelho de M0 85 ; F7. Atualiza byte espelho de M0 86 ; F8. Gira M0, no sentido horário, um passo 87 ; F9. Verifica S0 88 ; F.9.1 Se S0 = F vai para F6 89 ; F10. Atualiza Leds dos sensores e byte status 90 ; F11. Retorna 91 ;Principais variáveis: R0: byte espelho de M0 92 ; R1: byte rascunho de M0 93 ; R2: byte dos LEDs de status dos sensores 94 ; R3: contador de passos 95 ; R4: contador de passos 96 ; R5: uso para temporização 97 ; R6: uso para temporização 98 ; R7: uso para temporização 99 ; A: uso geral 100 ; B: uso geral 101 ;Descrição do hardware: Microcontrolador 8751, operando em 12Mhz. 102 ; Sensores ópticos ligados a comparadores. 103 ; de tensão. 104 ; Circuito de acionamento de motor DC. 105 ; Circuito de acionamento de motor de passo. 106 ; LED's indicadores de status. 107 ; Dip switch e teclas. 108 ; Portas: 109 ; P0: Entrada dos sensores 110 ; p/ sensor = V = 0 para faixa ou marca detectada 111 ; P0.7 ß S0: Alinhamento do motor de passo 112 ; P0.6 ß S1: Parada definitiva 113 ; P0.5 ß SPE: Parada esquerda (temporizada) 114 ; P0.4 ß SPD: Parada direita (temporizada) 115 ; P0.3 ß SDE: Dianteiro esquerdo 116 ; P0.2 ß SDD: Dianteiro direito 117 ; P1: Saída para controle dos motores 118 ; P1.7 à M1: acionado para bit = 1 119 ; P1.6 120 ; P1.5 121 ; P1.4 122 ; P1.3 à fase A de M0 A B A' B' 123 ; P1.2 à fase B de M0 0 0 0 1 passo 1 124 ; P1.1 à fase A' de M0 0 0 1 0 passo 2 125 ; P1.0 à fase B' de M0 0 1 0 1 passo 3 126 ; 1 0 0 0 passo 4 127 ; P2: Saída para os LEDs indicadores de status dos sensores 128 ; LED aceso para bit = 1 129 ; P2.7 130 ; P2.6 131 ; P2.5 à LED do sensor SDD 132 ; P2.4 à LED do sensor S0 133 ; P2.3 à LED do sensor SDE 134 ; P2.2 à LED do sensor SPE 135 ; P2.1 à LED do sensor S1 136 ; P2.0 à LED do sensor SPD 137 ; P3: Entrada para a dip switch e tecla INÍCIO 138 ; P3.7 ß Tecla INÍCIO, quando acionada = 1 139 ; P3.6 ß dip switch número 4 Wilson Ruiz 71 140 ; P3.5 ß dip switch número 3 141 ; P3.4 142 ; P3.3 143 ; P3.2 144 ; P3.1 ß dip switch número 2 145 ; P3.0 ß dip switch número 1 146 ;Arquivo fonte: AGV20.asm 147 ;Programas: X8051: Compilador assembly 148 ; Link: Ligador 149 ; AVSIM51: Simulador 150 ;#################################################################### 151 152 ;************** A = INÍCIO ************************************************** 153 0000 ORG 0000H ;reset 154 0000 02 00 50 LJMP INICIO 155 156 0050 ORG 0050H ;início do programa 157 0050 75 90 00 INICIO: MOV P1, #00000000B ;desliga M0 e M1 158 0053 75 A0 00 MOV P2, #00000000B ;apaga LEDs de status 159 0056 75 A8 00 MOV IE, #00000000B ;desabilita todas interrupções 160 0059 75 81 30 MOV SP, #0030H 161 005C 78 11 MOV R0, #11H ;byte espelho de M0 162 005E 79 00 MOV R1, #00H ;rascunho do byte espelho de M0 163 0060 7A 00 MOV R2, #00H ;byte status dos sensores 164 0062 7B 00 MOV R3, #00H ;contador de passos 165 0064 7C 00 MOV R4, #00H ;contador de passos 166 167 ;************** B = POSICIONAMENTO AXIAL/FRONTAL *************** 168 0066 20 B7 FD L1: JB P3.7, L1 ;espera tecla INÍCIO 169 0069 E5 80 L2: MOV A, P0 ;lê sensores 170 006B FA MOV R2, A ;atualiza byte status sensores 171 006C 31 79 ACALL ATUALIZA ;atualiza LEDs de status 172 006E 30 A1 F8 JNB P2.1, L2 ;S1 (verifica os sensores 173 0071 30 A2 F5 JNB P2.2, L2 ;SPE e se o AGV está fora 174 0074 30 A0 F2 JNB P2.0, L2 ;SPD da posição axial / 175 0077 20 A3 EF JB P2.3, L2 ;SDE frontal inicial 176 007A 20 A5 EC JB P2.5, L2 ;SDD volta) 177 178 ;************* C = INICIALIZAÇÃO DE M0 ****************************** 179 180 007D 20 B7 FD L20: JB P3.7, L20 ;espera tecla INÍCIO 181 0080 7B 28 MOV R3, #28H ;contador com 40 = 28H passos 182 0082 7C 50 MOV R4, #50H ;contador com 80 = 50H passos 183 0084 20 87 13 JB P0.7, L21 ;verifica S0 184 0087 31 0E L22: ACALL MOVE_M0_H ;move M0 no sentido horário 185 0089 20 87 0E JB P0.7, L21 ;verifica S0 186 008C DB F9 DJNZ R3, L22 ;decrementa e se > 0 volta 187 008E 20 87 09 JB P0.7, L21 ;verifica S0 188 0091 31 1F L23: ACALL MOVE_M0_AH ;move M0 no sentido anti-horário 189 0093 20 87 04 JB P0.7, L21 ;verifica S0 190 0096 DC F9 DJNZ R4, L23 ;decrementa e se > 0 volta 191 0098 192 0098 31 E2 ACALL FALHA_S0 193 194 009A E5 80 L21: MOV A, P0 ;lê sensores 195 009C FA MOV R2, A ;atualiza byte status sensores 196 009D 31 79 ACALL ATUALIZA ;atualiza LEDs de status 197 009F 198 009F 7B 00 MOV R3, #00H ;zera contador de passos 199 00A1 7C 00 MOV R4, #00H 200 201 ;************** D = OPERACAO *********************************** 202 00A3 20 B7 FD L24: JB P3.7, L24 ;espera tecla INÍCIO 203 00A6 D2 97 SETB P1.7 ;aciona M1 204 00A8 E5 80 L32: MOV A, P0 ;leitura dos sensores 205 00AA FA MOV R2, A ;atualiza byte status 206 00AB 31 79 ACALL ATUALIZA ;atualiza LEDs de status 207 00AD 208 00AD 30 A3 02 JNB P2.3, L25 ;verifica SDE 209 00B0 11 DC ACALL VIRA_FRENTE_D ;correção dianteira direita 210 211 00B2 30 A5 02 L25: JNB P2.5, L26 ;verifica SDD 212 00B5 11 F5 ACALL VIRA_FRENTE_E ;correção dianteira esquerda 213 00B7 214 00B7 20 A2 08 L26: JB P2.2, L27 ;verifica SPE Wilson Ruiz 72 215 00BA C2 97 CLR P1.7 ;desliga M1 216 00BC 31 5F ACALL DELAY_10 ;parada de 10 segundos 217 00BE D2 97 SETB P1.7 ;aciona M1 218 00C0 31 C8 ACALL DELAY_1 ;pausa de 1 segundo 219 00C2 220 00C2 20 A0 0A L27: JB P2.0, L29 ;verifica SPD 221 00C5 C2 97 CLR P1.7 ;desliga M1 222 00C7 31 5F ACALL DELAY_10 ;pausa de 20 segundos 223 00C9 31 5F ACALL DELAY_10 224 00CB D2 97 SETB P1.7 ;aciona M1 225 00CD 31 C8 ACALL DELAY_1 ;pausa de 1 segundo 226 00CF 227 00CF 20 A1 07 L29: JB P2.1, L31 ;verifica S1 228 00D2 C2 97 CLR P1.7 ;desliga M1 229 00D4 20 B7 CC JB P3.7, L24 ;espera tecla INÍCIO 230 00D7 D2 97 SETB P1.7 ;aciona M1 231 00D9 232 00D9 02 00 A8 L31: LJMP L32 ;volta 233 00DC 234 ;##################################################################### 235 ;subrotina: VIRA_FRENTE_D 236 ;descrição: Correção dianteira para a direita 237 ; Atualiza status correspondente 238 ; Chama MOVE_M0_H 239 ; Verifica sensor SDE e se este = F 240 ; continua correção 241 ; Chama MOVE_M0_AH 242 ; Verifica S0 e se este = F continua 243 ; correção contrária 244 ; Atualiza Leds sensores e byte status 245 ;entradas: 246 ;saídas: 247 ;variáveis internas: 248 ;hardware: 249 ;OBS: 250 ;##################################################################### 251 00DC C0 E0 VIRA_FRENTE_D: PUSH A 252 00DE E5 80 MOV A, P0 ;leitura dos sensores 253 00E0 31 79 ACALL ATUALIZA ;atualiza LEDs de status 254 00E2 FA MOV R2, A ;atualiza byte status 255 00E3 31 0E L35: ACALL MOVE_M0_H 256 00E5 20 83 FB JB P0.3, L35 257 00E8 31 1F L36: ACALL MOVE_M0_AH 258 00EA 30 87 FB JNB P0.7, L36 259 00ED E5 80 MOV A, P0 ;leitura dos sensores 260 00EF 31 79 ACALL ATUALIZA ;atualiza LEDs de status 261 00F1 FA MOV R2, A ;atualiza byte status 262 00F2 D0 E0 POP A 263 00F4 22 RET 264 265 ;##################################################################### 266 ;subrotina: VIRA_FRENTE_E 267 ;descrição: Correção dianteira para a esquerda 268 ; Atualiza status correspondente 269 ; Chama MOVE_M0_AH 270 ; Verifica sensor SDD e se este = F 271 ; continua correção 272 ; Chama MOVE_M0_H 273 ; Verifica S0 e se este = F continua 274 ; correção contrária 275 ; Atualiza Leds sensores e byte status 276 ;entradas: 277 ;saídas: 278 ;variáveis internas: 279 ;hardware: 280 ;OBS: 281 ;##################################################################### 282 00F5 C0 E0 VIRA_FRENTE_E: PUSH A 283 00F7 E5 80 MOV A, P0 ;leitura dos sensores 284 00F9 31 79 ACALL ATUALIZA ;atualiza LEDs de status 285 00FB FA MOV R2, A ;atualiza byte status 286 00FC 31 1F L38: ACALL MOVE_M0_AH 287 00FE 20 82 FB JB P0.2, L38 288 0101 31 0E L39: ACALL MOVE_M0_H 289 0103 30 87 FB JNB P0.7, L39 Wilson Ruiz 75 440 01A6 02 01 AB LJMP L12 441 01A9 D2 A3 L11: SETB P2.3 442 01AB 20 82 05 L12: JB P0.2, L13 443 01AE C2 A5 CLR P2.5 444 01B0 02 01 B5 LJMP L14 445 01B3 D2 A5 L13: SETB P2.5 446 01B5 20 81 05 L14: JB P0.1, L15 447 01B8 C2 A6 CLR P2.6 448 01BA 02 01 BF LJMP L16 449 01BD D2 A6 L15: SETB P2.6 450 01BF 20 80 03 L16: JB P0.0, L17 451 01C2 C2 A7 CLR P2.7 452 01C4 22 RET 453 01C5 D2 A7 L17: SETB P2.7 454 01C7 22 RET 455 456 ;##################################################################### 457 ;subrotina: DELAY_1 458 ;descrição: Fornece uma pausa de aproximadamente 459 ; 1 segundo (com clock do sistema de 12 MHz) 460 ;entradas: 461 ;saídas: 462 ;variáveis internas: 463 ;hardware: 464 ;OBS: equação: 465 ; 84 + 204.X + 132.X.Y + 60.X.Y.Z = 12000000 466 ; onde X, Y e Z são os valores em 467 ; R5, R6 e R7 respectivamente 468 ;##################################################################### 469 01C8 C0 E0 DELAY_1: PUSH A 470 01CA 7D FF MOV R5, #FFH ;carrega valor X 471 01CC 7E 1B L53: MOV R6, #1BH ;carrega valor Y 472 01CE 7F 1B L52: MOV R7, #1BH ;carrega valor Z 473 01D0 EF L51: MOV A, R7 474 01D1 14 DEC A 475 01D2 FF MOV R7, A 476 01D3 70 FB JNZ L51 477 01D5 EE MOV A, R6 478 01D6 14 DEC A 479 01D7 FE MOV R6, A 480 01D8 70 F4 JNZ L52 481 01DA ED MOV A, R5 482 01DB 14 DEC A 483 01DC FD MOV R5, A 484 01DD 70 ED JNZ L53 485 01DF D0 E0 POP A 486 01E1 22 RET 487 488 ;##################################################################### 489 ;subrotina: FALHA_S0 490 ;descrição: Indica falha no posicionamento de M0 491 ;entradas: 492 ;saídas: LED de status do S0 piscando 493 ;variáveis internas: 494 ;hardware: 495 ;OBS: 496 ;##################################################################### 497 01E2 00 FALHA_S0: NOP 498 01E3 D2 A7 L55: SETB P2.7 499 01E5 31 C8 ACALL DELAY_1 500 01E7 C2 A7 CLR P2.7 501 01E9 31 C8 ACALL DELAY_1 502 01EB 21 E3 JMP L55 503 01ED 504 01ED END Lines Assembled : 504 Assembly Errors : 0 Wilson Ruiz 76 4.5.3 O formato HEXA intel Todos os arquivos fornecidos para a gravação seguem o formato hexa intel abaixo. Cada linha do arquivo mostrado indica: • O início sempre é com : • No primeiro campo é indicado a quantidade de bytes (em hexadecimal) presentes na linha. • No segundo campo é indicado o endereço do primeiro byte da linha. • O terceiro campo é sempre 00. • No quarto campo temos os bytes do programa. • No quinto campo, um byte de checksum (CS), para verificação de integridade do arquivo. • A última linha serve apenas como referência de final de arquivo. • O arquivo abaixo é mostrado em colunas apenas para facilitar a identificação dos respectivos campos. O arquivo AGV20.HEX :03 0000 00 020050 AB :10 0050 00 75900075A00075A80075813078117900 41 :10 0060 00 7A007B007C0020B7FDE580FA317930A1 71 :10 0070 00 F830A2F530A0F220A3EF20A5EC20B7FD C8 :10 0080 00 7B287C50208713310E20870EDBF92087 D8 :10 0090 00 09311F208704DCF931E2E580FA31797B F0 :10 00A0 00 007C0020B7FDD297E580FA317930A302 B9 :10 00B0 00 11DC30A50211F520A208C297315FD297 5A :10 00C0 00 31C820A00AC297315F315FD29731C820 72 :10 00D0 00 A107C29720B7CCD2970200A8C0E0E580 64 :10 00E0 00 3179FA310E2083FB311F3087FBE58031 F7 :10 00F0 00 79FAD0E022C0E0E5803179FA311F2082 20 :10 0100 00 FB310E3087FBE5803179FAD0E022E803 3D :10 0110 00 F8540FF9E59054F049F59031304922E8 50 :10 0120 00 23F8540FF9E59054F049F59031304922 05 :10 0130 00 C005C006C007C0E0E5B05403FDE5B054 FB :10 0140 00 600303034DFD7E257F251FBF00FC1EBE FF :10 0150 00 00F61DBD00F0D007D005D006D0E022C0 CB :10 0160 00 E07DFF7E577F57EF14FF70FBEE14FE70 AB :10 0170 00 F4ED14FD70EDD0E022208705C2A40201 49 :10 0180 00 83D2A4208605C2A102018DD2A1208505 BB :10 0190 00 C2A2020197D2A2208405C2A00201A1D2 6C :10 01A0 00 A0208305C2A30201ABD2A3208205C2A5 71 :10 01B0 00 0201B5D2A5208105C2A60201BFD2A620 A8 :10 01C0 00 8003C2A722D2A722C0E07DFF7E1B7F1B 37 :10 01D0 00 EF14FF70FBEE14FE70F4ED14FD70EDD0 23 :0D 01E0 00 E02200D2A731C8C2A731C821E338 :00 0000 01FF ENTRADAS DOS SENSORES 4.5.4 ESQUEMAS ELETRÔNICOS +EM 120 nF 33 PF +EM 14 2olenD — amjyco 1 [EE Elias ER/uP pa.a é PB. Em xa po. PB. pa. 4 Ss er) 18lyo po.s RESET Po.s — Pa.? FESET p=. avsiH EE:O INTO FE. INTA FE. To paia DIP SH E o EEE E, 2K ohm Wilson Ruiz ef SATDAS PARA Ma as Liz PO 6 DIF SN A Hr HE PSEN ES— ACP, ese TD His SAIDA 19 E CIP SH 1 gaRESa =— Epil? a INICIO am EM Z20 ohm 1H hm TIPIZ2 TIPIE2 iNS004 1K hm 220 ohm Z20 ohm inaoos 1K ohm TIFIZa 1Na004 1K chm EM 220 ohm 77
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved