Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Microcontroladores Família MCS51® MCS51® Colégio Técnico de Campinas – COTUCA Disciplina – TDM IIII- Departamento Eletroeletrônica Janeiro/2010 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 1 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II MICROCONTROLADOR A figura abaixo mostra a diferença entre um microprocessador e um microcontrolador. O microprocessador (ou CPU) é o gerenciador de um sistema microcontrolado, possui internamente a unidade lógica aritmética (ULA), registradores e a unidade de controle (UC). O microprocessador necessita de unidades de memórias (ROM e/ou RAM) e de dispositivos de entrada e saída (I/O) para se comunicar com o ambiente externo. O microcontrolador é um dispositivo que possui internamente um microprocessador, unidades de memórias e interface com o mundo externo (porta serial, porta paralela, temporizadores). Na figura abaixo o retângulo marrom corresponde ao microprocessador e retângulo azul corresponde ao microcontrolador. O microcontrolador é utilizado para sistemas dedicados, tais como: injeção eletrônica, ignição eletrônica, computador de bordo, relógios microcontrolados, sistemas de automação. Num chão de fábrica é muito utilizado o CLP, sendo que este equipamento possui internamente um microcontrolador. FAMÍLIA MCS-51 Existem vários microcontroladores disponíveis no mercado. Um dos mais utilizados se refere à família MCS-51. Estes microcontroladores possuem a vantagem de serem produzidos por vários fabricantes (Atmel, Philips, Texas...) que mantém núcleo base (core) e diferem em outras características: uns apresentam conversores analógicos digitais (A/D), outros variam na quantidade de memória, no tipo de memória (flash, eeprom), uns possuem PWM, comunicação SPI, I2C, Ethernet, clocks que variam de 2 a 100 MHz. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 2 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II A figura abaixo apresenta o diagrama de um microcontrolador 8051: O MCS51 possui um conjunto de 111 instruções, sendo que 98% destas são instruções de 1 ou de 2 ciclos de máquina, o que fornece uma maior velocidade de processamento. A figura abaixo mostra o encapsulamento de 40 pinos do 80C51: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 3 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II MEMÓRIA EXTERNA O contador de endereço do 80C51 (PC) é de 16 bits, portanto pode ser adicionado até: 64 Kbytes de memória de dados (Pinos RD e WR) 64 Kbytes de memória de programa (Pino PSEN) A habilitação da memória externa de programa é feita através do pino EA: EA = 0 utiliza a memória externa de programa (até 64 Kbytes) EA =1 utiliza a princípio a memória interna (4 Kbytes) e depois a memória externa. Para o uso de memórias externas, os seguintes pinos devem ser utilizados: Pino 17 (RD) – utilizado para leitura na memória de dados (RAM) externa. Pino 16 (WR) – utilizado para escrita na memória de dados (RAM) externa. Pino 29 (PSEN) – utilizado para leitura na memória de programa (ROM) externa. Pino 30 (ALE) – sinal para demultiplexar a porta P0 (enable latch). Pino 31 (EA) – habilita o acesso externo da memória de programa (external Access) Pinos de 1 a 8 (porta 0) – bus multiplexado endereços (A0-A7) e dados (D0-D7). Pinos de 21 a 28 (porta 2) – contém os endereços de A8 a A15. Esquema para ligar uma ROM externa de 64 Kbytes: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 4 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Esquema para ligar uma RAM de 64 Kbytes: Esquema simplificado para ligar uma ROM de 64 Kbytes e uma RAM de 64 Kbytes: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 5 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II ORGANIZAÇÃO DA MEMÓRIA RAM INTERNA O diagrama abaixo mostra a organização interna da memória RAM: É mostrado no diagrama acima que a memória interna RAM é dividida em: - 128 bytes superiores (de 80h a FFh) que são utilizados pelos registradores de funções especiais (acumulador, psw, sp, dptr....). - 128 bytes superiores (de 80h a FFH) com os mesmos endereços do SFR. Esta memória está presentes apenas nos microcontroladores 80C32, 80C52 e 87C52. - 128 bytes inferiores de uso geral (de 00h a 7Fh) divididos em: - 80 bytes de uso geral - 16 bytes que podem ser endereçados bit a bit - 4 bancos (banco 0, Banco 1, Banco 2 e Banco 3) de 8 bytes cada. Pelo diagrama anterior nota-se que os 8 bytes de cada Banco possui uma denominação comum: R0, R1, R2, R3, R4, R5, R6 e R7. Desta forma, deve-se definir qual banco está se utilizando, se nenhum banco for definido o microntrolador trabalhará com o banco 0 (default). Exemplo: O comando MOV é utilizado para transferência (movimento) de dados entre memórias. O movimento é sempre para, de: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 6 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II 1) Se o banco 0 for selecionado a instrução: MOV A, R0 ; isto movimenta o valor que está em R0 do banco 0 (2Eh, no exemplo acima) para o acumulador (que é o principal registrador). Neste comando teríamos: (A) 2Eh os parênteses indicam que o valor no registrador A recebe o valor constante 2Eh. Outra forma de acessar os valores nos registradores sem selecionar o banco seria através da sua posição de memória. Por exemplo, acessando o registrador R0 através de seu endereço: MOV A, 00h ; isto movimenta o valor que está na posição de memória 00h (2Eh, no ;exemplo acima) para o acumulador (que é o principal registrador). Neste comando teríamos: (A) (00h)os parênteses indicam que o valor no registrador A recebe o valor que está na posição de memória 00h (que é 2Eh). Exercício 1) Qual os valores que serão movidos para o acumulador quando for dada a instrução: MOV A, R6 e como esses valores poderiam ser acessados pela posição de memória: Se for selecionado o banco 0:_________ ou O banco 1:_________ ou _______________ O banco 2:_________ ou _______________ O banco 3:_________ ou _______________ _______________ Exercício 2) Qual os valores que serão movidos para o acumulador: MOV MOV MOV MOV MOV A, A, A, A, A, 15h 0CH 06h 0Eh 2Eh (A) (A) (A) (A) (A) [Prof. Corradi – WWW.corradi.junior.nom.br] Página 7 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II REGISTRO DE FUNÇÕES ESPECIAIS (SFR) O mapa abaixo mostra os registradores de funções especiais bem como os valores que eles assumem após o sinal de reset: Registros que podem ser acessados bit a bit 0F8h 0F0h 0E8h 0E0h Endereço Final 0FFh 0F7h B 00000000 0EFh 0E7h ACC 00000000 0D8h 0D0h PSW 0DFh 0D7h 0C8h 0C0h 0B8h IP 0CFh 0C7h 0BFh 0B0h P3 0B7h 0A8h 0AFh 00000000 XX000000 0A0h 98h 90h 88h 80h 11111111 IE 0X000000 P2 11111111 SCON 00000000 P1 11111111 TCON 00000000 PO 11111111 0A7h SBUF 9Fh XXXXXXXX 97h TMOD 00000000 SP 00000111 TL0 TL1 TH0 TH1 00000000 00000000 00000000 00000000 DPL DPH PCON 00000000 00000000 0XXX0000 8Fh 87h Endereço Inicial Pelo mapa, temos os endereços: P0 P1 P2 P3 – – Porta Porta Porta Porta 0, 1, 2, 3, endereço endereço endereço endereço 80h 90h A0h B0h SP (stack point) – pilha, endereço 81h DPTR – ponteiro para endereçar dados externos, é dividido em DPL (82h) e DPH (83h), como cada registro possui 8 bits, o DPTR possui 16 bits, sendo possível com isso acessar 64 Kbytes de memória externa. PCON – controle de potência, endereço 87h TCON – controle do timer/contador, endereço 88h TMOD – modo de controle do timer/contador, endereço 89h [Prof. Corradi – WWW.corradi.junior.nom.br] Página 8 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II TL0 – byte baixo do timer/contador 0, endereço 8Ah TL1 – byte baixo do timer/contador 1, endereço 8Bh TH0 – byte alto do timer/contador 0, endereço 8Ch TH1 – byte alto do timer/contador 1, endereço 8Dh SCON – controle da porta serial, endereço 98h SBUF – porta de dados serial, endereço 99h IE – habilita interrupção, endereço A8h IP – controle de prioridade de interrupção, endereço B8h ACC – acumulador, endereço E0h registrador mais importante contém os resultados das operações aritméticas e lógicas. B – registrador B, endereço F0h utilizado para realizar multiplicação e divisão PSW – contém os flags de registradores, endereço D0h. estado e os bits para selecionar o banco de O PSW é mostrado abaixo: Uso geral Carry auxiliar Carry Seleção do Banco Overflow Paridade CY AC F0 0 0 1 1 RS1 0 1 0 1 RS0 OV banco 0 banco 1 banco 2 banco 3 - P Exemplo: mover o conteúdo do acumulador (A) para o registrador R1 do banco 2. Para isso, o primeiro passo é selecionar o banco de interesse, no caso o banco 2. Para isso RS1=1 e RS0=0: PSW: CY 0 MOV PSW,#10H MOV R1, A AC 0 F0 0 RS1 1 RS0 0 OV 0 0 P 0 ; selecionando o banco 2 ; o conteúdo de R1 recebe o conteúdo do acumulador ; (R1) (A) Exercício 3): Selecione o banco 1 e faça o acumulador receber o valor de R3, depois selecione o banco 3 e faça o registrador R3 receber o valor do acumulador: ________________________ ________________________ ________________________ ________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 9 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II CICLO DE MÁQUINA Na família MCS51, cada ciclo de máquina possui 6 estados (de S1 a S6), cada estado possui 2 períodos do oscilador, portanto: 1 ciclo de máquina no 8051 possui 12 períodos de clock. Se for utilizado um cristal de 12 MHz, o ciclo de máquina será: Tciclo _ de _ máquina = 12 * 1 1 = 12 * = 1µs fcristal 12 Mhz O 80C51 possui instruções de 1 ciclo de máquina – 1 byte (Ex.: inc A); 2 ciclos de máquina – 2 bytes (Ex.: add a,#dado) e 2 ciclos de máquina – 1 byte (Ex.: inc dptr). Abaixo é mostrado o diagrama de tempo da leitura da memória externa de programa: Para leitura de memória externa de dados, o diagrama é mostrado abaixo: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 10 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II RESET Para iniciar o processamento, o microcontrolador necessita de um sinal de reset. Este sinal faz a CPU procurar o endereço 00h da memória de programa para iniciar o programa armazenado nela. Na família MCS51 este sinal corresponde a uma borda de descida no pino 9 (RST), que pode ser feita automaticamente através do seguinte esquema: O valor do capacitor e do resistor pode ser calculado utilizando o tempo de carga no capacitor e considerando que seja necessário: 10 ms para estabilizar a tensão de alimentação 10 ms para partida do oscilador 24 períodos de clock para inicialização do sistema. No diagrama de tempo, vr corresponde a tensão de referência (3,5 V – acima deste valor é considerado nível alto). Considerando que seja utilizado um cristal de 1 MHz, o período do clock será: Tcristal = 1 = 10 −6 s 1MHz Portanto seria necessário um tempo de 20,024 ms (10 m + 10 m + 24 * 1 µs). A tensão no capacitor é dada por: Vr = Vcc * e −t RC Aplicando ln em ambos os lados da equação ln(Vr ) = ln(Vcc) + ln(e −t RC ) Vcc = 5V e Vr = 3,5V t RC t = RC (ln 5 − ln 3,5) ln 3,5 = ln 5 − t = 0,3566 RC Como o tempo t é conhecido (20,024 ms), será necessário assumir um valor para o capacitor (C = 10 µF) e calcular o valor do Resistor: t = 0,3566 RC 20,034.10 −3 = 0,3566.10.10 −6 R R = 5k 62 Valor comercial R = 6k8. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 11 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II CONJUNTO DE INSTRUÇÕES DO MICROCONTROLADOR 8051 Tipos de Endereçamento Endereçamento imediato: um registrador indicado. Ex: valor constante é diretamente transferido para o MOV A,#0Fh Neste caso o acumulador recebe diretamente o valor 0Fh: (A) 0Fh Observe que neste modo de endereçamento existe o sustenido (#) antes do valor a ser transferido. Endereçamento direto: endereça a memória RAM interna (128 bytes inferiores e 128 bytes do SFR). Ex.: Considere a memória da figura abaixo: MOV A, 0Ah Aqui o acumulador irá receber o valor que está dentro do endereço 0Ah da memória (no exemplo FFh): (A) (0Ah) O conteúdo do acumulador recebe o conteúdo da posição de memória 0Ah. Observe que neste tipo de endereçamento não há nenhum caractere especial antes do endereço de memória. Exercício 1: Transfira o valor para a posição de memória 30h: 76h _____________________________________ _ Endereçamento por registrador: utiliza um dos registradores Rn. Rn pode ser qualquer um dos registradores (R0, R1, R2, R3, R4, R5, R6 e R7). Ex.; MOV A, R1 O acumulador irá receber o conteúdo de R1 (utilizando a memória acima e considerando que estamos trabalhando com o banco 0, este valor seria 0Ch). (A) (R1) O conteúdo do acumulador recebe o conteúdo do registrador R1. Endereçamento indireto: utiliza o valor do conteúdo do registrador Ri (neste caso Ri pode ser, ou R0, ou R1) como posição de memória. Ex. Considere a figura abaixo e que esteja selecionado o banco 0: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 12 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II MOV A, @R0 Neste caso o conteúdo de R0 (06h) é transformado em posição de memória, e o valor desta posição (B2h) é transferido para o acumulador, portanto A = B2h (A) ((R0)) substituindo o conteúdo de R0 (A)(06h) substituindo o conteúdo da posição de memória 06h (A) B2h Note que para indicar esta operação deve existir o caractere @ antes dos registradores (ou R0 ou R1). Endereçamento indexado: utilizado para leitura de dados em tabela ou memória externa de programa. A posição da memória é obtida por um endereço base + um índice. É utilizada a instrução MOVC. Ex: MOVC A, @A+DPTR MOVC A, @A+PC Nos dois exemplos o acumulador é o índice e o endereço base é dado por DPTR ou PC. (A) ((A)+(DPTR)) (A) ((A)+(PC)) No primeiro caso o conteúdo do acumulador é somado ao conteúdo do DPTR (endereço base), isto fornece a nova posição da memória, e o conteúdo desta nova posição é transferido para o acumulador. Endereçamento específico: utilizado para transferir dados entre cpu e memória de dados externa. É utilizada a instrução MOVX. Ex: MOVX A, @DPTR MOVX A, @Ri O valor de DPTR é transformado em endereço e o conteúdo deste endereço é transferido ao acumulador (A) ((DPTR)) (A) ((Ri)) Conjunto de Instruções da família MCS51 Abreviaturas utilizadas: A ou Acc acumulador, sendo A o registro e Acc o endereço direto, ou dir endereço da RAM interna Rn um dos registradores: R0, R1, R2, R3, R4, R5, R6 e R7. @Ri R0 ou R1, usado para endereçamento indireto. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 13 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II A família MCS51 possui 111 instruções, sendo: 24 25 28 17 17 instruções instruções instruções instruções instruções aritméticas lógicas de transferência de dados booleanas de desvios INSTRUÇÕES ARITMÉTICAS São instruções de soma, subtração, multiplicação, divisão, incremento e decremento: ADIÇÃO: As somas são todas realizadas entre acumulador e outro operando, e o resultado são sempre transferidos para o acumulador comando ADD A, Rn ADD A, direto ADD A, @Ri byte s 1 2 CM 1 1 2 1 ADD A, #dado C CA 0V descrição X (A) (A) + (Rn) (A) (A) + (posição de memória) (A) (A) + (conteúdo da posição indicado por Ri) (A) (A) + valor do dado 1 1 X X Na tabela acima: Bytes se referem ao número de posição que a instrução ocupa na memória de programa. Quantos menos bytes forem utilizados, menos memória de programa será utilizada. CM – ciclo de máquina – indica quantos ciclos de máquina à instrução utiliza. Lembre-se no 80C51 cada ciclo de máquina corresponde a 12 períodos de clock. Quanto menos ciclo de máquina utilizar, mais rápida será a execução do programa. C – flag de carry se estiver marcado com X, o flag será afetado. CA – flag de carry auxiliar. OV – flag de overflow. ADIÇÃO COM CARRY: Aqui o acumulador é somado com outro operando e com o flag de carry (que pode ser 1 ou 0): comando byte s 1 2 CM ADDC A, @Ri 1 1 ADDC A, #dado 2 1 ADDC A, Rn ADDC A, direto C CA 0V descrição X (A) (A) + (Rn) + (C) (A) (A) + (pos. de memória) + (C) (A) (A) + (conteúdo da posição indicado por Ri) + (C) (A) (A) + (C) + valor do dado 1 1 X X [Prof. Corradi – WWW.corradi.junior.nom.br] Página 14 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II SUBTRAÇÃO COM BORROW: A subtração sempre ocorre com o acumulador menos o outro operando e menos o flag de carry (que pode ser 1 ou 0): comando byte s 1 2 CM SUBB A, @Ri 1 1 SUBB A, #dado 2 1 SUBB A, Rn SUBB A, direto C CA 0V descrição X (A) (A) - (Rn) - (C) (A) (A) (pos. de memória) - (C) (A) (A) - (conteúdo da posição indicado por Ri) (C) (A) (A) - (C) - valor do dado 1 1 X X MULTIPLICAÇÃO E DIVISÃO Na multiplicação e na divisão sempre são utilizados os registros A e B. comando Onde: MUL AB byte s 1 CM 4 DIV AB 1 4 C CA 0V O - X O X O descrição (A) (B) (A) (B) LSB[(A)*(B)] MSB [(A)*(B)] quociente [(A)*(B)] resto [(A)*(B)] LSB – byte menos significativo da multiplicação MSB – byte mais significativo da multiplicação. A e B são registros de 1 byte (8 bits), a multiplicação desses registros podem ultrapassar 1 byte, por isso e apenas neste caso, o registro B é utilizado para armazenar resultados de uma operação. Ex: Multiplicando o valor 80h (128 na base 10) por 02h 128 x 2 = 256 fazendo A = 1000 0000 (128 na base 10) fazendo B = 0000 0010 *(2 na base 10) 0000 0000 1 0000 000 + 1 0000 0000 (256 na base 10, mas 256 passa de 1 byte, tem 9 bits. Portanto os 9 bits são divididos em 2 MSB LSB bytes usando os registros A e B). B A Trecho do programa para o exemplo acima: MOV A, #80h MOV B, #02h MUL AB ; ; ; ; movendo o valor 80h para o acumulador movendo o valor 2h para o registro B multiplicando 128 (80h) por 2, colocando o resultado A = 00h e B = 1h [Prof. Corradi – WWW.corradi.junior.nom.br] Página 15 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II INCREMENTO DE 8 BITS É sempre incrementado de uma unidade o operando comando CM INC A INC Rn INC direto byte s 1 1 2 INC @Ri 1 1 1 1 1 C - CA - 0V descrição - (A) (A) + 1 (Rn) (Rn) + 1 (pos. memória) (pos.memória)+1 ((Ri)) ((Ri)) + 1 DECREMENTO DE 8 BITS É sempre decrementado de uma unidade o operando comando DEC A DEC Rn DEC direto DEC @Ri byte s 1 1 2 CM 1 1 1 1 1 C - CA - 0V - descrição (A) (A) - 1 (Rn) (Rn) - 1 (pos. memória) (pos.memória)-1 ((Ri)) ((Ri)) - 1 INCREMENTO DE 16 BITS Existe apenas incremento de 16 bits, não existe decremento de 16 bits comando byte s 1 INC DPTR CM C CA 0V 2 - - - descrição (DPTR) (DPTR) + 1 AJUSTE DECIMAL Instrução para operação em BCD. Válido apenas após as instruções ADD ou ADDC. comando DA A byte s 1 CM 1 C CA 0V descrição X X - Converte o conteúdo do acumulador em BCD Exemplo: Supondo: A = 56h (0101 0110) representando o valor 56 BCD R1 = 6 (0110 0111) representando o valor 67 BCD C = 1 Se for feita a adição: ADDC A, R1 DA A ; soma o valor do acumulador com o valor de R1 + o carry, ; resultando em A = BEh, com AC = C = 0. ; ajuste para BCD, A = 24h e C = 1. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 16 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II INSTRUÇÕES LÓGICAS São instruções que realizam as operações lógicas AND (E), OR (OU) e XOR (OU-EXCLUSIVO) entre o acumulador (ou uma posição de memória) e outro operando. E LÓGICO (AND) O resultado de uma operação AND só será verdadeiro (1) se os dois operandos forem verdadeiros (1). Ex: resultado AND = 0101 1100 0111 0101 0101 0100 comando ANL A, Rn ANL A, direto ANL A, @Ri ANL A, # dado ANL direto, A ANL direto, #dado byte s 1 2 1 2 2 3 CM 1 1 1 1 1 2 C CA 0V - - - - - - descrição (A) (A) AND (Rn) (A) (A) AND (direto) (A) (A) AND ((Ri)) (A) (A) AND dado (direto) (direto) AND (A) (direto) (direto) AND (dado) OU LÓGICO (OR) O resultado de uma operação OR será verdadeiro (1) se um dos dois operandos for verdadeiro (1). Ex: resultado OR = 0101 1100 0111 0101 0111 1101 comando ORL A, Rn ORL A, direto ORL A, @Ri ORL A, # dado ORL direto, A ORL direto, #dado byte s 1 2 1 2 2 3 CM 1 1 1 1 1 2 C CA 0V - - - - - - descrição (A) (A) OR (Rn) (A) (A) OR (direto) (A) (A) OR ((Ri)) (A) (A) OR dado (direto) (direto) OR (A) (direto) (direto) OR (dado) OU-EXCLUSIVO (XOR) O resultado de uma operação XOR será verdadeiro (1) se um dos operandos for verdadeiro (1) e o outro operando for falso (0). Ex: resultado OR = 0101 1100 0111 0101 0010 1001 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 17 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II comando XRL A, Rn XRL A, direto XRL A, @Ri XRL A, # dado XRL direto, A XRL direto, #dado byte s 1 2 1 2 2 3 CM 1 1 1 1 1 2 C CA 0V - - - - - - descrição (A) (A) XOR (Rn) (A) (A) XOR (direto) (A) (A) XOR ((Ri)) (A) (A) XOR dado (direto) (direto) XOR (A) (direto) (direto) XOR (dado) OPERAÇÕES LÓGICAS COM O ACUMULADOR Algumas acumulador; lógicas só podem bytes 1 1 CM 1 1 C - CA - 0V - RL A RLC A 1 1 1 1 X - - RR A RRC A 1 1 1 1 X - - SWAP A 1 1 - - - comando CLR A CPL A operações ser realizadas com o conteúdo do descrição (A) 00h. Zera acumulador Complementa o valor do acumulador Roda o acumulador à esquerda Roda o acumulador à esquerda com carry Roda o acumulador à direita Roda o acumulador à direita com carry Troca os nibbles do acumulador A figura abaixo mostra exemplos dessas operações: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 18 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II INSTRUÇÕES DE MOVIMENTO DE DADOS PERMUTAÇÃO DE BYTE É a troca de conteúdo entre os operandos: comando XCH A, Rn XCH A, direto XCH A, @Ri byte s 1 2 1 CM C CA 0V descrição 1 1 1 - - - (A) (Rn) e (Rn) (A) (A)(direto)e (direto) (A) (A)((Ri) e ((Ri)) (A) TRANSFERÊNCIA DE DADOS As transferências de dados permitidas são mostradas na tabela abaixo: comando byte s 1 2 1 2 CM 1 1 1 1 (A) (A) (A) (A) MOV Rn, A MOV Rn, direto MOV Rn, #dado 1 2 2 1 2 1 (Rn) (A) (Rn) (direto) (Rn) dado MOV direto, A MOV direto, Rn MOV direto, direto MOV direto, @Ri MOV direto, #dado 2 2 3 1 2 2 2 3 2 2 (direto) ((Ri)) (direto) dado MOV @Ri, A MOV @Ri, direto MOV @Ri, #dado 1 2 2 2 2 1 ((Ri)) (A) ((Ri)) (direto) ((Ri)) dado MOV DPTR, #da16 3 2 Move p/ DPTR o dado de 16 bits MOV MOV MOV MOV A, A, A, A, Rn direto @Ri #dado C - CA - 0V - descrição (Rn) (direto) ((Ri)) dado (direto) (A) (direto) (Rn) (direto) (direto) Nota-se pela tabela acima que com o acumulador e com o endereço de memória são possíveis todas as transferências de dados. O mesmo não ocorre com os registradores, por exemplo, não é permitida a instrução: MOV R1, R4, isto é, não é permitido mover o conteúdo entre registradores. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 19 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II PERMUTAÇÃO DE NIBBLE Esta troca ocorre entre os nibbles baixo do acumulador e a memória interna comando XCHD A, @Ri byte s 1 CM C CA 0V 1 - - - CM C CA 0V 2 2 - - - descrição OPERAÇÕES COM A PILHA comando PUSH direto POP direto byte s 2 2 descrição Armazena o conteúdo na pilha Tira o conteúdo da pilha Para guardar ou retirar o conteúdo do acumulador na pilha, deve-se colocar o endereço do acumulador (Acc). Ex: PUSH ACC POP ACC TRANSFERÊNCIA DE DADOS COM A MEMÓRIA EXTERNA DE DADOS É possível fazer a transferência de dados usando endereçamento de 16 bits (DPTR), ou com endereçamento de 8 bits (@Ri). A instrução utilizada neste caso é MOVX: comando MOVX MOVX MOVX MOVX A, @Ri A, @DPTR @Ri, A @DPTR, A byte s 1 1 1 1 CM C CA 0V 2 2 2 2 - - - descrição Leitura Leitura Escrita Escrita da da em em memória externa memória externa memória memória TRANSFERÊNCIA DE DADOS COM A MEMÓRIA EXTERNA DE PROGRAMA Também, é possível fazer a transferência de dados usando endereçamento de 16 bits (DPTR), ou com endereçamento de 8 bits (@Ri). A instrução utilizada neste caso é MOVC: comando MOVC A, @A+DPTR MOVC A, @A + PC byte s 1 1 CM C CA 0V descrição 2 2 - - - Leitura da memória externa Leitura da memória externa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 20 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II INSTRUÇÕES BOOLEANAS São operações que trabalham com 1 bit: comando CLR C CLR bit SETB C SETB bit CPL C CPL bit comando CA 0V descrição 1 1 1 1 1 1 0 1 X - - Limpa o carry C=0 Limpa um bit Seta o carry C=1 Seta um bit Complementa o carry Complementa o bit C 1 1 X 2 2 1 1 2 2 1 2 2 2 label 2 2 bit, label bit, label bit, label 3 3 3 2 2 2 ANL ORL C, bit C, bit ORL C, bit MOV MOV C, bit bit, C JB JNB JBC C CM C, bit JNC CM byte s 2 2 ANL JC byte s 1 2 1 2 1 2 label CA 0V X X - AND entre carry e bit AND entre carry e o complemento do bit OR entre carry e bit OR entre carry e o complemento do bit - - - - (C) (bit) (bit) (C) - Salta para o label se carry=1 Salta para o label se carry=0 Salta para o label se bit =1 Salta para o label se bit=0 Salta para o label se bit=1 e após o salto faz o bit=0 X X - descrição - INSTRUÇÕES DE DESVIOS As instruções de desvios podem ser realizadas com 8, 11 ou 16 bits (figura ao lado). Com 8 bits (chamados relativos) a instrução pode desviar 256 bytes para cima, ou para baixo do local onde for chamada (SJMP, JMP). Com 11 bits (adr11), a instrução pode pular até 2 kbytes para cima ou para baixo do local onde for chamada (ACALL, AJMP). E com 16 bits (adr16) a instrução pode acessar 64 kbytes para cima ou para baixo (LCALL, LJMP). [Prof. Corradi – WWW.corradi.junior.nom.br] Página 21 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II CHAMADA DE SUBROTINAS comando ACALL adr11 LCALL adr16 byte s 3 2 CM C 2 2 - C A - 0V descrição - Chamada de subrotina a 2 kbyte Chamada de subrotina a 64 kbyte RETORNO SUBROTINAS E INTERRUPÇÕES comando RET RETI byte s 1 1 CM C CA 0V descrição 2 2 - - - Retorno de subrotina Retorno de uma interrupção DESVIOS INCONDICIONAIS comando JMP @A+DPTR SJMP relativo AJMP adr11 LJMP adr16 byte s 1 1 2 3 CM C CA 0V 2 2 2 2 - - - [Prof. Corradi – WWW.corradi.junior.nom.br] descrição Desvio indireto para pos. mem. Desvio curto - 256 bytes Desvio absoluto até 2 kbytes Desvio longo – 64 kbytes Página 22 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II DESVIOS CONDICIONAIS comando CM C CA 0V JZ label JNZ label CJNE A, direto, label byte s 2 2 3 2 2 2 - - - - - - CJNE A, #dado, label 3 2 - - - CJNE Rn,#dado, label 3 2 - - - CJNE label 3 2 - - - C CA 0V - - - - - - @Ri, #dado, descrição Salta para label Salta para label Salta para (A)≠(direto) Salta para (A)≠dado Salta para (Rn)≠dado Salta para ((Ri))≠dado se (A)=0 se (A)≠0 label se label se label se label se LOOPS comando DJNZ Rn, label DJNZ direto, label byte s 2 CM 2 2 2 descrição Decrementa (Rn) e salta para label se (Rn)≠0 Decrementa conteúdo da posição de memória e salta para label se (direto)≠0 SEM OPERAÇÃO Existe uma instrução que não faz nada, apenas consome ciclos da memória: comando NOP byte s 1 CM C CA 0V 1 - - - [Prof. Corradi – WWW.corradi.junior.nom.br] descrição Não faz nada Página 23 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II ESTRUTURA DE UM PROGRAMA EM ASSEMBLY DA FAMÍLA MCS-51 Um pequeno exemplo é mostrado abaixo: Ch EQU P1.0 motor EQU ; atribuição de valores. Ao invés de usar o bit P1.0, o ; mesmo será substituído pela palavra ch P2.1 ; atribuição de valor. ORG 0h ;a diretiva org serve para posicionar a próxima instrução ; na posição indicada da memória de programa. Neste caso ; está posicionando no endereço 00h. inicio: CLR motor JB ch, $ SETB motor SJMP inicio END ;aqui a palavra “inicio” é um label (um endereço de ;memória). Além disso o bit motor (p2.1) é zerado ;testa bit ch (p1.0) se for 1, salta para $. No caso o ;cifrão $ ;representa a mesma linha. Portanto enquanto ch=1, o ;programa fica parado na mesma linha. Se ch =0, o ;programa prossegue para linha de baixo. ;o bit motor é setado (p2.1=1) ;aqui a instrução sjmp é um salto para o endereço “inicio” ; o programa fica em loop. ; indica fim de programa Um programa em assembly sempre deve começar com um ORG e terminar com um END. As atribuições de valores (EQU) são opcionais, se forem utilizadas devem sempre vir antes do ORG. Os “labels” são endereços de referências para os saltos e chamadas de sub-rotinas e interrupções (sjmp, ljmp, acall....). Repare no rótulo “inicio”, o endereço dele é dado por “inicio:”(com os dois pontos), e as referências é dada por “inicio” (sem os dois pontos). Note, também, no exemplo que ponto e vírgula é utilizado para fazer comentário em assembly. O compilador despreza tudo que vier depois do ponto e vírgula até o final da linha. ALGORITMO E FLUXOGRAMA O algoritmo é a descrição passo a passo de um programa. Já o fluxograma é a descrição gráfica do programa. Fluxogramas e algoritmos são utilizados como documentação de um programa. Símbolos do fluxograma: início ou fim de um programa Ou de uma sub-rotina decisão (if) entrada e saída de dados [Prof. Corradi – WWW.corradi.junior.nom.br] atribuição processo chamada de sub-rotina Página 24 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exemplos: 1) Mover para o registrador R1 do segundo banco o valor F3h e realizar a soma entre este registro e o conteúdo do acumulador. O resultado deve ser guardado na posição de memória 34h. Neste exemplo é utilizado R1 do banco 2, portanto antes de acessar este banco o mesmo deve ser selecionado através de PSW (página 8-módulo 1). Fluxograma: Algoritmo: 1) 2) 3) 4) Selecionar banco 2 (PSW=10H) Mover F3h para R1 Somar Acc com R1 Mover para memória 34h o resultado da soma (que fica no acumulador) Início PSW=10h selecionando banco 2 R1=F3h atribuindo F3h a R1 AA+R1 somando acc com R1 (34h) A armazenando na pos.memória 34h a soma Fim PROGRAMA EM ASSEMBLY ORG 0h inicio: MOV PSW, #10h MOV R1, #0F3h ADD A, R1 MOV 34h, A END ; posiciona o programa na posição 00h da memória ; Flash ; seleciona o banco 2. Note o sustenido (#) ; carrega R1 (do banco 2) com o valor F3h. Note o ; sustenido. Repare na inserção do zero (0) antes de F3h ; Isto é necessário quando o valor começa com uma ; letra ; soma os conteúdos do acumulador e de R1, o resultado ; é armazenado no acumulador ; armazena o resultado da soma na posição de memória ; 34h. Note que aqui não existe o sustenido (#), porque é ; uma posição de memória e não um dado. ; fim do programa. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 25 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II 2) Mova para o acumulador o valor #0Fh e criar um programa que faça a operação OU-EXCLUSIVO entre o conteúdo do acumulador (A) e a constante #33h. O resultado deve ser armazenado no conteúdo do registrador R5 do banco 1. _________________ início: _________________ ; posicionar o programa na posição 0h da Flash ; armazenando o valor 0Fh no acumulador _________________ ; fazer o Ou-Exclusivo entre Acc e o valor 33h ________________ ; selecionar o banco 1 ________________ ; mover para R5 do banco 1 o resultado XOR ________________ ; fim de programa 3) Carregue o acumulador com o valor de 03h e faça um programa que adicione o conteúdo do acumulador (A) à constante ACh e que armazene o conteúdo na posição de memória cujo endereço é 4Bh. _________________ ; posicionar o programa na posição 0h da Flash início: _________________ ; ____________________________________ _________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; fim de programa 4) Faça os seguintes carregamentos: A=E7h, R1=20h, R5=FDh e memória 20h=33h. Crie um programa que execute a operação lógica AND dos conteúdos: do acumulador A, da posição de memória cujo endereço é dado pelo conteúdo do registrador R1, e do registrador R5. Armazene o resultado no conteúdo do registrador R1 do banco 2. _________________ início: _________________ ; posicionar o programa na posição 0h da Flash ; ____________________________________ ________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; ____________________________________ ________________ ; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 26 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II 5) Carregue a posição de memória 78h com o valor de D7h e a posição de memória 57h com o valor de 73h. Faça uma operação lógica OU EXCLUSIVA entre os conteúdos dessas duas memórias e armazene o resultado no registrador R3 do banco 3. _________________ ; posicionar o programa na posição 0h da Flash início: _________________ ; ____________________________________ ________________ ; ____________________________________ _________________ ; ____________________________________ ________________ ; ____________________________________ _________________ ; ____________________________________ _________________ ; ___________________________________ _________________ ; fim de programa 6) Carregue a posição de memória 26h com o valor de D7h e a posição de memória 44h com o valor de 73h e carregue o carry com o valor 1 (C=1). Crie um programa que execute a rotação de um bit, a esquerda sem carry, do conteúdo da posição de memória cujo endereço é 26h. O resultado deve ser somado com o carry e o conteúdo da posição de memória cujo endereço é 44h. Com o resultado, faça uma operação lógica OUEXCLUSIVO com a constante 7Dh. O resultado deve ser armazenado no conteúdo da posição de memória 48h. _________________ ; posicionar o programa na posição 0h da Flash início: _________________ ; ____________________________________ ________________ ; ____________________________________ _________________ ; ____________________________________ ________________ ; ____________________________________ _________________ ; ____________________________________ ________________ ; ____________________________________ _________________ ; ____________________________________ _________________ ; ___________________________________ _________________ ; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 27 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II 7) Faça um programa que calcule a quantidade de números pares de um buffer de memória que vai do endereço 30h até o endereço 37h. O resultado deve ser armazenado na posição de memória 38h. Carregue as posições de memória com os valores: (30h)45h; (31h)D8h; (32h)66h; (33h)C9h; (34h)56h; (35h)DAh; (36h)00h; (37h)99h; Dicas: usar endereçamento indireto, isto é, carregar o endereço inicial da memória(30h) em R0 ou R1. Buscar o conteúdo deste endereço (@Ri), verificar se é par ou impar, incrementar Ri e voltar até verificar todas as memórias (no caso 8, de 30h a 37h). Para controlar o loop, haverá necessidade de um contador que pode estar em uma memória ou qualquer registrador. Para verificar se um número é par pode-se: dividir o número por 2 e verificar se o resto é 0 (par) ou 1 (impar). Outro processo consiste em verificar o primeiro bit do número (bit 0), se for 0 é par, se for 1 é impar. A verificação do bit pode ser feita no acumulador, exemplo: JB ACC.0, pula (aqui é testado o bit 0 do acumulador, se for um (impar) o programa pula para o label “pula”, se for zero (par) o programa continua). _________________ ; posicionar o programa na posição 0h da Flash início: _________________ ; carrega a posição de memória 30h com o valor 45h _________________ ; carrega a posição de memória 31h com o valor D8h _________________ ; carrega a posição de memória 32h com o valor 66h _________________ ; carrega a posição de memória 33h com o valor C9h _________________ ; carrega a posição de memória 34h com o valor 56h _________________ ; carrega a posição de memória 35h com o valor DAh _________________ ; carrega a posição de memória 36h com o valor 00h _________________ ; carrega a posição de memória 37h com o valor 99h ________________ ; inicializa o contador de no. Pares (38h) 0h _________________ ; carrega R0 com a posição inicial de memória (30h) ________________ ; quant.de memória a ser verificada (R2)08h _________________ ; acumul. recebe conteúdo da memória apontada R0 _________________ ; Se acumulador é impar, salta para o rótulo “pula” _________________ ; se for par incrementa o contador: memória (38h) ________________ ; decrementa a quantidade de memória verificada (R2) _________________ ; busca a próxima memória (incrementa R0) _________________ ; Compara (R2) com 0h p/ verificar se todas memórias volta: pula: ; foram verificadas. Se não, retorna ao label “volta”. SJMP $ _________________ ; instrução para parar o processamento ; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 28 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II 8) O programa seguinte é para fazer 2 sub-rotinas, uma para multiplicar (MULTI) e outra para dividir (DIVISAO) dois números. Os números devem ser salvos antes da chamada da sub-rotina para que não sejam perdidos. Os resultados da multiplicação devem ser guardados em: (R0) – valor mais significativo e (R1) – valor menos significativo. Os resultados da divisão devem ser guardados em: (R2) – quociente e (R3) - resto A divisão e multiplicação só podem ser efetuadas nos registros A e B, portanto carregue (A) 40h e (B) 5h. O push e pop são podem ser utilizados com o endereço, por isso no caso do acumulador deve-se utilizar: PUSH ACC e POP ACC. ______________ ; posicionar o programa na posição 0h da Flash início: ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ MULTI: _______________; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ DIVISAO: ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; _________________________________________ ______________ ; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 29 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II PORTAS PARALELAS O 8051 possui 4 portas paralelas (P0, P1, P2 e P3) de 8 bits cada uma. Além de poderem ser configuradas como pinos de entrada e/ou de saída, algumas portas podem ser usadas para outras funções: P0 – byte inferior de endereço e dados. Para acessar memória externa. P2 – byte superior de endereço. Para acessar memória externa. P3 – Bit 0 – RXD – entrada serial Bit 1 – TXD – saída serial Bit 2 – INTO – Interrupção externa 0 Bit 3 – INT1 – Interrupção externa 1 Bit 4 – T0 – entrada externa contador 0 Bit 5 – T1 – entrada externa contador 1 Bit 6 – WR – escrita memória externa de dados Bit 7 – RD – leitura memória externa de dados OPERAÇÕES DE ESCRITA E LEITURA NA PORTA Escrita: basta escrever MOV P1, #03h SETB P1.6 CLR P1.0 0 ; ; ; ou 1 na porta. Exemplo; escrevendo nos 8 pinos da porta P1 o valor 0000 0011 escrevendo o valor “1” no bit 6 da porta P1 escrevendo o valor “0” no bit 0 da porta P1 Leitura: para configurar como leitura é só escrever o valor “1” nos bits de interesse. Por default, quando se liga o microcontrolador, todas as portas possuem o valor “1” nos seus bits. ** Se a porta for utilizada como leitura, não pode escrever “0” nela. ** Configuração PORTA P1 CONFIGURAÇÃO PORTA P3 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 30 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II CONFIGURAÇÃO PORTA P2 CONFIGURAÇÃO DA PORTA P0 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 31 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II ** Para a porta P0 é necessário resistores de Pull-up.** Exemplo 1: Ler o pino 3 da porta P2, se for 1 escrever o conteúdo do acumulador na porta P3, se for 0 não fazer nada. Deixar o programa em loop. Fluxograma: Org 0h Inicio: Inicio P2.3 = 1 N JNB P2.3, salta ; se o pino=0 pula MOV P3,A ; senão (P3) (A) S Salta: P3 A SJMP Inicio ; volta para inicio END ; fim de programa Exemplo 2: Utilizando a figura abaixo fazer um contador de 0 até FFh. A contagem será incrementada cada vez que a chave Ch1 for pressionada. Se o contador for igual a “1h” ligar motor, se for igual a “81h” desligar motor. Deixar o programa em loop. Definição: - Quando a chave Ch1 for pressionada o bit P1.0 recebe o nível lógico “0” (vide figura). - necessidade de uma variável para o contador. Escolhendo o acumulador. P3.2 = 1 Motor ligado Inicio (A)0h (30h) 0H Passos: - Ler o bit 0 da porta P1 - se for 0, incrementar contador senão voltar a ler o pino da porta - Contador igual a 01h? - se sim liga motor e volta ler a porta senão continua - Contador igual a 81h? - se sim desliga motor e volta ler a porta senão volta a ler o pino da porta Ch1 = 0 0001 S AA+1 N N A=81h? S N A=01h? S Liga motor P3.2=1 Liga motor P3.2=0 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 32 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II PROGRAMA: Ch1 EQU P1.0 motor EQU P3.2 ; atribui o rótulo Ch1 ao pino P1.0. ; atribui o rótulo motor ao pino P3.2 ORG 00h Inicio: MOV A, #00h Volta: JB Ch1,Volta ; posiciona o programa na posição 00h da mem. Flash ; inicializa o contador (acumulador) com 0. ; ; JNB Ch1, $ ; INC A ; CJNE A,#01h,pula SETB motor SJMP Volta CJNE A,#81h,Volta CLR motor SJMP Volta se a chave Ch1 estiver em “1”, não foi pressionada fica esperando a chave ser pressionada espera a chave Ch1 ser solta Ch1 pressionada, incrementa contador (A) ;se contador ≠ 01h, salta para verificar se é 81h ;se contador = 01h, liga motor ;retorna para ler o pino novamente ;se contador ≠ 81h, volta ler pino ; se contador = 81h, desliga motor ; retorna para ler o pino novamente Conclusão: os comandos JB e JNB são úteis para verificar (LER) os estados dos pinos (bit) da entrada. JB P1.2, salta ; testando se o bit P1.2 = 1, se for vai para “salta” ...... ; senão continua o processamento na linha de baixo JNB P2.5, salta ; testando se o bit P2.5 = 0, se for vai para “salta” ...... ; senão continua o processamento na linha de baixo Para escrever nos pinos (bit) são utilizados os comandos: SETB e CLR SETB P1.1 ; escrevendo “1” no bit P1.1 (setando) CLR P3.5 ; escrevendo “0” no bit P3.5 (zerando) END ; fim de programa. Exemplo 3: Ler a porta P1 e verificar se P1 é igual a 03h, ou 76h, ou FEh. Se for igual a um desses três valores, jogar na porta P2 o valor FFh, senão jogar em P2 o valor 00h. Deixar o programa em loop. Org 0h ; posiciona o programa na ; posição 00h da mem. Flash inicio: mov p2,#00h ; inicializa P2 com 00h LER: mov a, p1 ; lê a porta P1 cjne a,#03h, T76 ; se a≠03h, testa com 76h sjmp setar ; se a=03h, pula p/”setar” P2 T76: cjne a,#76h, TFE ; se a≠76h, testa com FEh sjmp setar ; se a=76h setar porta P2 TFE: cjne a,#0feh, LMP ; limpar P2 setar; mov p2,#0ffh sjmp LER LMP: mov p2,#00h sjmp LER ; setando P2 ; volta ler P1 ; zerando P2 ; volta ler P1 END [Prof. Corradi – WWW.corradi.junior.nom.br] Página 33 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Conclusão: Comando MOV usado para ler ou escrever na porta toda: Escrevendo na porta: MOV P1, #0Fh Lendo da porta: MOV A, P3 Para comparar valor da porta: jogar valor no acumulador (ou Rn) e usar o comando CJNE MOV A, P2 CJNE A,#00h, volta (enquanto conteúdo do A≠ 0h, pula para “volta” senão continua) Exercício 1) Dado o esquema abaixo, fazer um programa que mostre o valor em binário nos leds de quantas vezes a chave Ch foi pressionada. Neste exercício, esperar a chave Ch ser solta para contar. Como há 4 leds a contagem irá de 0 (0000b) até Fh (1111h). OBS: Note que nesta configuração, o acendimento do led é invertido, isto é: Para ter todos leds apagados o valor na porta tem que ser 0Fh, Para acender todos os leds o valor na porta tem que ser 00h ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 34 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 2) Dado o esquema abaixo, fazer um programa que acenda o led 0 e que leia a chave Ch. Se a chave Ch estiver aberta (P3.1=1), o led aceso deve ficar rotacionando à esquerda a cada 1 segundo. Se a chave Ch estiver fechada (P3.1=0), o led aceso deve ficar rotacionando à direita a cada 1 segundo. Para o atraso, faça uma rotina em loop. Calcule quantos ciclos de máquina devem ser utilizados para obter o atraso de 1 segundo, considerando um clock de 12 MHz ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 35 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 3) Uma caixa d’água possui 2 sensores (A e B). Quando a água bate no sensor, ela gera um nível lógico “1” caso contrário é gerado um nível lógico “0”. Deve-se ligar uma bomba d’água (S = 1) para encher a caixa até o nível B quando, então, a bomba é desligada (S=0). A bomba deve permanecer desligada até que não haja água no sensor A (A=0). A figura seguinte mostra um sistema automático para realizar esta automação. Faça o programa para o sistema. ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 36 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 4) Faça um programa utilizando o diagrama abaixo para mostrar no display de sete segmento a conversão dos números binários que estão na porta P2: Notar que os leds do display são acesos em nível lógico “0”. Por exemplo, para mostrar o número 2, devem-se acender os leds “a, b, d, e, g”, portanto: P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 g f e d c b a X 1 1 0 0 1 0 0 P1 = 64h ou B4h, caso P1.7 seja 0 ou 1 Faça o programa utilizando uma tabela (DPTR) ________ _____________ ; posiciona o programa na posição 00h da mem. Flash ________ _____________ ; inicializa o índice da tabela R1=0h (primeira posição) ________ _____________ ; carregue DPTR com o endereço inicial da tabela ________ _____________ ; mova o índice atual para o acumulador ________ _____________ ; busca o valor na tabela do endereço DPTR+Índice ________ _____________ ; mova o valor para a porta 1 p/mostrar no display ________ _____________ ; incremente o índice R1 ________ _____________ ; enquanto não for o último valor, voltar p/ buscar ; novo valor ________ _____________ ; se for o último valor, zerar o índice R1 novamente ________ _____________ ; voltar para buscar novo valor ; Valores da tabela: ________ ________________________________________________________ ________ ________________________________________________________ ________ _____________ ; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 37 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 5) Faça uma calculadora com 2 bytes (um da porta P1 e outro da porta P2). Utilize a seguinte seleção de operação e os seguintes armazenamentos: P0.0 =1 – soma P0.1 =1 – subtração P0.2 =1 – multiplicação P0.3 =1 – divisão (30h) – acumulador (30h) – acumulador (30h) – MSB (B) (30h) – quociente (A) (31h) - carry (31h) – carry (31h) – LSB (A) (31h) – resto (B) Dica: faça no início do programa um menu verificando esses bits de seleção. Se um dos bits estiver em “1” saltar para a rotina adequada. ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 38 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 6) Um estacionamento possui 100 vagas e possui uma porta de entrada e uma porta de saída. Fazer um programa para automatizar o estacionamento considerando o esquema abaixo: Considere: Sensor A = 1 carro querendo entrar Sensor E = 1 carro querendo sair Sensor B = 1 carro entrando Sensor F = 1 carro saindo Fim de curso C = 1 porta aberta FC G = 1 porta aberta (saída) Fim de curso D = 1 porta fechada FC H = 1 porta fechada (saída) Motores M1A/M2A M1B/M2B 0 0 0 1 1 0 1 1 Motor motor travado gira sentido anti-horário gira sentido horário motor livre Funcionamento: se houver um carro querendo entrar (sensor A=1), o sistema deve abrir a porta de entrada se: - houver vagas disponíveis, - ou caso não exista vaga, houver um carro querendo sair. Para abrir a porta o motor deve ser acionado no sentido anti-horário e deve permanecer ligado até atingir o fim de curso C, quando então deve ser desligado. Deve-se esperar o carro entrar verificando o sensor B que deverá ir de 0 para 1 e novamente para 0, onde então o motor é ligado em sentido horário até fechar a porta (FC D=1). A porta de saída tem funcionamento idêntico. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 39 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 7) Considere o esquema abaixo com um teclado simples. Faça um programa que abre e fecha uma trava se for pressionada a seqüência das teclas; 1-7-2. Caso não seja pressionada a seqüência certa, o programa deve acionar um buzzer. (OBS: espere sempre a tecla ser solta para que a mesma não seja lida mais de uma vez). Estude o esquema, qual valor deve ter na porta P1 para ler a tecla 5? ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 40 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 8) Considere o esquema abaixo com um teclado em matriz. Faça um programa que abre e fecha uma trava se for pressionada a seqüência das teclas; 1-7-2. Caso não seja pressionada a seqüência certa, o programa deve acionar um buzzer. (OBS: espere sempre a tecla ser solta para que a mesma não seja lida mais de uma vez). Estude o esquema, por exemplo, com se deve ler a tecla 5? ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 41 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II LCD O LCD é um display de cristal líquido que possui dentro dele um microcontrolador. Abaixo é mostrado a pinagem de um LCD: Pinagem Pino Descrição 1 Vss Terra (GND) 2 Vdd Vcc 3 V0 Tensão de ajuste de contraste 4 RS 1 – Dado 0 - Instrução 5 R/W 1 - Leitura 0 – Escrita 6 E Chip Select – habilita de 1 0 7 D0 DADOS: LSB 8 D1 9 D2 10 D3 11 D4 12 D5 13 D6 14 D7 MSB - dados 15 A Anodo para LED backlight 16 K Catodo para LEd backlight Ligação para ajuste do contraste: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 42 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Escrevendo no LCD LCD Porta Dado ou Instrução Rotina Habilitar Dados ou Instrução Rotina Atraso Dados é o que você quer mostrar no display. Instruções não aparecem no display, servem para configurar o LCD. Inicialização para sistemas com via de dados de 8 bits - Fixação das condições de utilização: depende do lcd utilizado. Se tivermos um lcd de 2 linhas 5x7 e 8 bits código 38h - Controle do display: define como o cursor é mostrado. Ex, código 0Eh display aceso com cursor fixo - Modo de operação: modo como o cursor é deslocado. Ex: código 06h escreve deslocando o cursor à direita. - limpeza do display: código 01h. Característica do Módulo 1 linha – Matriz 7 x 5 (8 x 5) 1 linha – Matriz 10 x 5 2 linhas – Matriz 7 x 5 (8 x 5) Seqüência de Instruções em hexadecimal 30 , ∆ , 30 , ∆ , 06 , ∆ , 0E , ∆ , 01 34 , ∆ , 34 , ∆ , 06 , ∆ , 0E , ∆ , 01 38 , ∆ , 38 , ∆ , 06 , ∆ , 0E , ∆ , 01 ∆ = atraso de tempo de aproximadamente 15 milisegundos. Exemplo de uma sub-rotina só para configurar o display: Supondo que a porta P1 contenha os dados (ou instrução) para o LCD e que a porta P3 tenha o controle dos pinos 4 (RS), 5(R/W) e 6 (E): [Prof. Corradi – WWW.corradi.junior.nom.br] Página 43 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Instrução RS=0 Conf_display: MOV P1,#38H LCALL habi_Inst MOV P1,#38H LCALL habi_Inst MOV P1,#0EH LCALL habi_Inst MOV P1,#06H LCALL habi_Inst MOV P1,#01H LCALL habi_Inst ; display 2 linhas ; habilita enviar instrução ; habilita enviar instrução ; display acesso com cursor fixo ; habilita enviar instrução ; escreve deslocando à direita ; habilita enviar instrução ; Limpa display ; habilita enviar instrução habi_Inst: MOV P3,#02h MOV P3,#00h LCALL ATRASO RET ; criando borda ; de descida ATRASO: MOV R1,#14h VOLTA: MOV R0,#0FAh DJNZ RO, $ DJNZ R1, VOLTA RET [Prof. Corradi – WWW.corradi.junior.nom.br] Página 44 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Tabela de Códigos e Formação dos Caracteres [Prof. Corradi – WWW.corradi.junior.nom.br] Página 45 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Esquema elétrico: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 46 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Fixação das condições de utilização 1 linha 5x7 (8 bits) 2 linha 5x7 (8 bits) 1 linha 5x10 (8 bits) 1 linha 5x7 (4 bits) 2 linha 5x7 (4 bits) Instrução 30H 38H 34H 20H 28H Controle do display Display acesso com cursor fixo Display acesso com cursor intermitente Display acesso sem cursor Display apagado Instrução OEH 0FH 0CH 08H Modo de operação Escreve deslocando a mensagem para a esquerda (cursor fixo) Escreve deslocando a mensagem para a direita (cursor fixo) Escreve deslocando o cursor para a direita Escreve deslocando o cursor para a esquerda Instrução O7H 05H 06H 04H Comandos úteis Limpa display e retorna cursor para o início Retorna o cursor para o início (sem alterar a DDRAM) Desloca somente o cursor para a direita Desloca somente o cursor para a esquerda Desloca o cursor + a mensagem para a direita Desloca o cursor + a mensagem para a esquerda Desloca o cursor para a posição inicial da segunda linha Desloca o cursor para a posição inicial da primeira linha Instrução O1H 02H 14H 10H 1CH 18H C0H 80H Resumo para utilizar o display: Fixação das condições de utilização (38h) Fixação das condições de utilização (38h) Controle do display (0Eh) Modo de operação (06h) limpeza do display (01h) - Configurar o display: colocar a instrução na porta habilitar dados (RS=0, R/W=0, E = 10) rotina de atraso RS – Pino 4 R/W – Pino 5 E – Pino 6 - Enviar dados: colocar dados na porta habilitar dados (RS=1, R/W=0, E = 10) rotina de atraso [Prof. Corradi – WWW.corradi.junior.nom.br] Página 47 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II ROTINA COMENTADA: Considerando a seguinte ligação, escreva uma mensagem no LCD. ORG 0h ; posiciona o programa no endereço 0h da Flash inicio: LCALL config_lcd LCALL config_lcd MOV R7, #0FFh MOV DPTR, #mensa ; chama rotina para configurar o LCD ; “ “ “ “ “ “ ; inicializa o índice da tabela ; carrega mensagem a ser escrita volta: INC R7 MOV A, R7 MOVC A,@A+DPTR MOV P1, A LCALL habi_dado CJNE A,#0FFh, volta SJMP $ ; pega o próximo índice da tabela ; movimenta o índice para o Acc ; obtém o caractere referente ao índice carregado ; coloca o caractere a ser escrito na porta do LCD ; escreve no LCD (habilita escrita de dado) ; se não chegou no fim da mensagem, volta ; se chegou no fim, para o processamento config_lcd: MOV P1, #38h LCALL habi_inst MOV P1, #38h LCALL habi_inst MOV P1, #06h LCALL habi_inst MOV P1, #0Fh LCALL habi_inst MOV P1, #01h LCALL habi_inst RET ; sub-rotina para configurar o LCD ; fixa condições iniciais ; habilita instrução ; fixa condições iniciais ; habilita instrução ; fixa controle do display ; habilita instrução ; fixa modo de operação ; habilita instrução ; limpa display ; habilita instrução ; retorno da rotina de configuração do LCD [Prof. Corradi – WWW.corradi.junior.nom.br] Página 48 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II habi_inst: MOV P2, #02h MOV P2, #00h LCALL atraso RET ; rotina para habilitar instrução ; coloca RS=0 (instrução) e E=1 ; coloca RS=0 (instrução) e E=0 (borda descida) ; chamada da rotina de atraso ; retorno da rotina de habilitar instrução habi_dado: MOV P2, #03h MOV P2, #01h LCALL atraso RET ; rotina para habilitar envio de dados ; coloca RS=1 (dado) e E=1 ; coloca RS=1 (dado) e E=0 (borda descida) ; chamada da rotina de atraso ; retorno da rotina de habilitar dados atraso: ; rotina de atraso ; carrega R1 ; carrega R0 ; fica decrementando R0 enquanto for ≠ 0 ; se R0=0, decrementa R1 e volta ; retorno da rotina de atraso MOV R1,#14h volta: MOV R0,#0FAh DJNZ RO, $ DJNZ R1, volta RET mensa: db ‘escreva aqui a sua mensagem’, 0FFh END ; mensagem ; fim de programa Exercício 1: Faça um programa que leia um teclado simples da porta P3 que mostre no LCD as seguintes mensagens: Se P3 = FFh Se P3.0 = 0 Se P3.1 = 0 Se P3.2 = 0 Funcionamento normal Pressão baixa de óleo Temperatura abaixo do normal Estado de emergência Exercício 2: Utilizando um teclado de 16 teclas (0...9, A,B,C,D,E,F) faça um programa que escreva no LCD qual foi a tecla pressionada. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 49 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II INTERRUPÇÕES A família MCS51 possui cinco [default] tipos de fontes de interrupções: Tipo - 2 externas - 2 timers - 1 serial Externa 0 Externa 1 Timer 0 Timer 1 RXD TXD INT0 INT1 T0 T1 RI TI Pino Endereço P3.2 P3.3 P3.4 P3.5 P3.0 P3.1 03h 13h 0Bh 1Bh 23h 23h INTERRUPÇÕES As interrupções têm prioridades sobre a execução de um programa. Se houver um pedido de interrupção à execução do programa é interrompida para atendimento da interrupção. Assim que a interrupção for atendida, a execução do programa continua de onde parou. Uma das vantagens das interrupções é não ter que ficar verificando o estado do pino de entrada. Uma aplicação para interrupção é o botão de emergência de uma máquina qualquer. Assim que o botão for acionado, a máquina deve ser colocada em estado de segurança independente do estado do processo. REGISTROS DE CONTROLE DAS INTERRUPÇÕES Para controle das interrupções existem 3 registros: IE, IP e TCON. IE (Interrupt Enable) para habilitar as interrupções IE = EA - - 1 – habilita 0 – desabilita ES ET1 EX1 ET0 EX0 todas serial timer/counter 1 [Prof. Corradi – WWW.corradi.junior.nom.br] externa 0 timer/counter 0 externa 1 Página 50 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II IP (Interrupt Priority) define prioridades 1 – alta prioridade 0 – baixa prioridade A prioridade das interrupções é EX0, ET0, EX1, ET1 e ES. Isto quer dizer se por acaso elas acontecerem ao mesmo tempo, a primeira interrupção a ser atendida será a externa 0, depois o timer 0 e assim por diante até a interrupção serial. Através do registro IP, as prioridades podem ser alteradas. default IP = - - - PS PT1 PX1 PT0 PX0 externa 0 timer/counter 0 externa 1 serial timer/counter 1 TCON (Timer CONtrol) configuração da interrupção e do timer Metade deste registro é usado para configurar o timer/couters e a outra metade é usada para configurar as interrupções externas: TIMERS/COUTERS TCON = INTERRUPÇÕES TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0 overflow timer 1 run/stop timer 1 overflow timer 0 run/stop timer 0 TFx flag de overflow borda/nível externa 0 flag da interrupção externa 0 borda/nível externa 1 flag da interrupção externa 1 TFx = 1 houve overflow do contador TFx = 0 não houve overflow TRx liga/ desliga contador/temporizador TRx = 1 liga contador/temporizador TRx = 0 desliga contador/tempor. ITx modo de operação da interrupção ITx = 1 atende na borda de descida ITx = 0 atende no nível baixo IEx flag da interrupção IEx = 1 interrupção detectada IEx =0 interrupção não foi detectada O flag IEx é setado pelo hardware interno e também é apagado por hardware caso o modo de operação esteja configurado para borda de descida. Caso seja utilizado o modo de operação nível, o flag IEx deve ser apagado por software (CLR IEx). [Prof. Corradi – WWW.corradi.junior.nom.br] Página 51 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 1) Programa os registros IE, IP e TCON para: - interrupção externa 1 (INT1) máxima prioridade, sensível a nível - timer/counter 1 segunda prioridade - externa 0 (INT0) terceira prioridade, sensível a borda de descida - serial e timer/counter 0 desabilitadas Valor Hexa ES ET1 EX1 ET0 EX0 EA IE = - IP - - PS PT1 PX1 PT0 PX0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0 TCON = = MOV IE, MOV IP, MOV TCON, Exercício 2) Programa os registros IE, IP e TCON para: - serial máxima prioridade - timer/counter 0 segunda prioridade - externa 1 (INT1) terceira prioridade, sensível a nível - demais interrupções desabilitadas EA - - ES ET1 EX1 ET0 EX0 Valor Hexa = IE - - - PS PT1 PX1 PT0 PX0 IP TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0 = TCON = MOV IE, MOV IP, MOV TCON, [Prof. Corradi – WWW.corradi.junior.nom.br] Página 52 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 3) Utilizando o diagrama abaixo, faça um programa que mantenha 1 dos leds aceso e cada vez que a chave ch for pressionada troque o led aceso. Utilizar Interrupção. -verificar o endereço da da interrupção. - no endereço da interrupção dê um salto para a rotina que irá tratar a interrupção - no início do programa saltar o endereço da interrupção - fazer configurações iniciais e configurar interrupção (IE e TCON) - fazer a troca do led aceso na rotina de interrupção. ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 53 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 4) Faça um programa em assembler para controlar uma linha de produção. O programa deve separar de um lote de 100 peças, as peças 4, 50 e 70 para inspeção. Considere que um sensor infravermelho seja utilizado para contar as peças e que o mesmo está conectado no bit 2 da porta P3 e que o bit 4 da porta P1 seja utilizado para acionar uma solenóide que separe as peças para inspeção. Fazer o programa utilizando interrupção. ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ ________ _____________ ; __________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 54 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 5) Um estacionamento possui 100 vagas e possui uma porta de entrada e uma porta de saída. Fazer um programa para automatizar o estacionamento considerando o esquema abaixo (utilize interrupções na porta de entrada e saída): Considere: Sensor A = 1 carro querendo entrar Sensor B = 1 carro entrando Fim de curso C = 1 porta aberta Fim de curso D = 1 porta fechada Motores 0 0 1 1 M1A/M2A 0 1 0 1 Sensor E = 1 carro querendo sair Sensor F = 1 carro saindo FC G = 1 porta aberta (saída) FC H = 1 porta fechada (saída) M1B/M2B Motor motor travado gira sentido anti-horário gira sentido horário motor livre Funcionamento: se houver um carro querendo entrar (sensor A=1), o sistema deve abrir a porta de entrada se: - houver vagas disponíveis, - ou caso não exista vaga, houver um carro querendo sair. Para abrir a porta o motor deve ser acionado no sentido anti-horário e deve permanecer ligado até atingir o fim de curso C, quando então deve ser desligado. Deve-se esperar o carro entrar verificando o sensor B que deverá ir de 0 para 1 e novamente para 0, onde então o motor é ligado em sentido horário até fechar a porta (FC D=1). A porta de saída tem funcionamento idêntico. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 55 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 6) Uma máquina de cortar chapas de alumínio possui 2 sensores (A e B) para indicar quando a chapa está em posição de corte. Quando os sensores de posição são ativados, a máquina deve parar o motor de alimentação das chapas e acionar o motor DC da lâmina para o corte da chapa. Um sensor C é utilizado para indicar que a chapa foi cortada, devendo então o motor ser revertido para subir a lâmina de corte até acionar o sensor D, após isso é acionado novamente o motor de alimentação das chapas. Caso somente um dos sensores (A ou B) seja ativado, isto indica que a chapa é irregular ou não está bem posicionada, devendo ser enviada para fora do sistema sem realizar o corte e deve também soar um alarme. O sistema deve possuir: - 1 botão para iniciar o processo (start) - 1 botão para término de serviço (stop). Quando pressionado para o processo após um ciclo do processo. - 1 botão de emergência. Quando pressionado para imediatamente o processo colocando a máquina em segurança. O sistema neste caso deve ser reinicializado. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 56 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II TEMPORIZADORES E CONTADORES Os 5 tipos de interrupções do 8051: Tipo - 2 externas Externa 0 Externa 1 Pino Endereço INT0 INT1 P3.2 P3.3 03h 13h - 2 timers Timer 0 Timer 1 T0 T1 P3.4 P3.5 0Bh 1Bh - 1 serial RXD TXD RI TI P3.0 P3.1 23h 23h Interrupções do timers/counters Função: Contagem – o registro incrementa a cada transição de 10( ) no pino Temporização – o registro incrementa a cada ciclo de máquina Contador: o sinal deve permanecer pelo menos 1 ciclo de máquina em nível alto e outro ciclo de máquina em nível baixo. Portanto, a freqüência máxima de resposta do contador será de 1/24 da freqüência do clock. REGISTROS DE CONTROLE DO TEMPORIZADOR Para controle dos timers existem 3 registros: IE, TMOD e TCON. IE (Interrupt Enable) para habilitar as interrupções 1 – habilita 0 – desabilita Já visto no módulo anterior: IE = EA - - ES ET1 EX1 ET0 EX0 todas serial timer/counter 1 externa 0 timer/counter 0 externa 1 TMOD (Timer Mode) modo de operação dos timers TIMER 1 TMOD = TIMER 2 GATE C/T M1 M0 GATE C/T M1 M0 GATE (Porta de controle) 1 habilitado enquanto TRx=1 e INTx=1 (software e hardware) 0 habilitado se TRx=1 (controle somente por software) C/T (seleciona modo) 1 modo contador (pino T0 e T1) 0 modo temporizador [Prof. Corradi – WWW.corradi.junior.nom.br] Modo de operação do timers/counters Página 57 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Modo de Operação dos timers/counters M1 M0 0 0 0 1 1 0 1 1 REGISTROS THi – 8 bits TLi – 5 bits THi – 8 bits TLi – 8 bits THi – recarga TLi – 8 bits TH0 – 8 bits TL0 – 8 bits TH1 e TL1 - parado Contador de 13 bits Compatível com 8048 Contador de 16 bits Contador de 8 bits com recarga 2 contadores de 8 bits TCON (Timer CONtrol) configuração da interrupção e do timer Metade deste registro é usado para configurar o timer/couters e a outra metade é usada para configurar as interrupções externas: TIMERS/COUTERS TCON = INTERRUPÇÕES TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0 overflow timer 1 run/stop timer 1 overflow timer 0 run/stop timer 0 TFx flag de overflow borda/nível externa 0 flag da interrupção externa 0 borda/nível externa 1 flag da interrupção externa 1 TFx = 1 houve overflow do contador TFx = 0 não houve overflow * TFx é apagado por hardware quando o processamento é desviado para a rotina de interrupção. Caso não utilize a interrupção, TFx deve ser apagado por software (ex: CLR TF0, ou CLR TF1). TRx liga/ desliga contador/temporizador TRx = 1 liga contador/temporizador TRx = 0 desliga contador/tempor. ITx modo de operação da interrupção ITx = 1 atende na borda de descida ITx = 0 atende no nível baixo IEx flag da interrupção IEx = 1 interrupção detectada IEx =0 interrupção não foi detectada [Prof. Corradi – WWW.corradi.junior.nom.br] Página 58 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II MODOS DE OPERAÇÃO MODO 0: Para os dois contadores (timer 0 e timer 1) Contador de 13 bits THi – 8 bits TLi - 5 bits Overflow ocorre em 1FFFh 0000h aqui ativa TF1 ou TF0 MODO 1: Para os dois contadores (timer 0 e timer 1) Contador de 16 bits THi – 8 bits TLi - 8 bits Overflow ocorre em FFFFh 0000h aqui ativa TF1 ou TF0 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 59 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II MODO 2: Para os dois contadores (timer 0 e timer 1) TLi – contador de 8 bits THi – recarga de Tli quando ocorrer o overflow MODO3: O timer 1 não é usado neste modo TL0– contador de 8 bits (C/T, GATE 0, INT0 e TF0) TH0 – contador de 8 bits (TR1 e TF1) [Prof. Corradi – WWW.corradi.junior.nom.br] Página 60 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II CÁLCULO DO VALOR A SER CARREGADO NO CONTADOR O cálculo do valor a ser carregado no contador é dado por: N= f clock 12. f desejada ou N= f clok .Tdesejado 12 Os temporizadores/contadores contam de um valor carregado até o overflow, e não de zero até o valor desejado. Portanto, para carregar os registradores THi e TLi deve-se subtrair do valor máximo (que depende do modo utilizado) o valor calculado N. Escolha do modo: Modo 0 = 13 bits 213 = 8.192 contagens possíveis :::: THi, TLi = 8.192-N Modo 1= 16 bits 216 = 65.536 contagens possíveis :::: THi, TLi = 65.536-N Modo 2 = 8 bits 28 = 256 contagens possíveis :::: THi e TLi = 256-N Modo 3 = 8 bits 28 = 256 contagens possíveis :::: TH0 e TL0 = 256-N Comandos para: Ligar temporizador/contador: SETB TR0 Desligar temporizador/contador: CLR TR0 Comandos quando não utiliza rotina de interrupção: Esperar acabar um tempo programado: JNB TF0, $ Apagar flags: CLR TF0 ou ou SETB TR1 CLR TR1 ou ou JNB TF1, $ CLR TF1 Exercício 1) Utilizando um cristal de 12 MHz, programe: - o timer 0 para 100 µs - o timer 1 para 50 µs com auto-recarga Para isso calcule o número de contagens (N) para os dois casos, escolha o modo adequado e calcule o valor a ser carregado em THi e TLi. Exercício 2) Utilizando um cristal de 12 MHz, programe: - o timer 0 para 50 ms - o timer 1 para 10 ms Para isso calcule o número de contagens (N) para os dois casos, escolha o modo adequado e calcule o valor a ser carregado em THi e TLi. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 61 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 3) Utilizando o esquema abaixo acender os leds alternadamente a uma taxa de 100 Hz. Considere que o cristal utilizado seja de 12 MHz. Cálculo de N: 12.10 6 N= = 10.000 12.100 esse valor cabe no modo 1 (até 65.536) valor a ser carregado em TH e TL: vi = 65.536 – 10.000 = 55.536 Escolhendo um dos dois timers: T0 Programando IE EA - - ES ET1 EX1 ET0 EX0 Programando TMOD GATE C/T M1 M0 GATE C/T M1 M0 ________ ______________; atribui a recarga o valor de 55.536 ________ ________ ________ ________ ______________; posiciona o programa no endereço 00h da flash ______________; salta para o inicio do programa ______________; endereço do timer 0 ______________; salta para rotina de interrução do timer 0 (TIM0) inicio: ________ ________ ________ ________ ________ ________ ________ ________ ______________; inicio programa, carrega TL com valor baixo de N ______________; carrega TH com valor alto da contagem N ______________; configura timer 0 no modo 1 ______________; configura a interrução IE ______________; carrega acumulador com um led aceso (10110110) ______________; acende o led na porta (move para P1 o acumulador) ______________; seta o carry (uma vez que ele faz parte da rotação) ______________; liga o temporizador ______________; fica parado nesta linha esperando a interrupção TIMO: ________ ________ ________ ________ ________ ______________; Rotina TIM0, carrega TL com valor baixo de N ______________; carrega TH com valor alto da contagem N ______________; rotaciona o acumulador com o carry ______________; move o valor do acumulador para a porta P1 ______________; retorna para o programa principal ______________; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 62 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 4: Gerar uma onda quadrada nos pinos da porta P1 com uma freqüência de 50 Hz, considerando a freqüência do cristal de 12 MHz. Cálculo de N: N= 12MHz = 10.000 12.100 ∴modo 1 escolhido Escolhendo o timer 0 Modo 1 valor inicial = 65536-10000 = 55536 TMOD = 01h GATE C/T* M1 M0 GATE C/T* M1 M0 0 0 0 0 0 0 0 1 IE = 82h EA 1 - 0 0 ES 0 ET1 EX1 ET0 EX0 0 0 1 0 Programa Sem Interrupção $mod51 recarga equ 55536 _________________ inicio: _________________ ; valor de carga do timer ; posiciona o progr. no endereço 00h da flash ; configurando o modo 1 para o timer 0 _________________ ; inicializando o acumulador volta: _________________ ; carregando os registradores ( TL0 ) _________________ ; do timer 0 ( TH0 ) _________________ ; fazendo a porta 1 receber o conteúdo do A _________________ ; ligando o temporizador _________________ ; esperando o tempo esgotar _________________ ; desligando o temporizador _________________ ; limpando o flag para novas temporizações _________________ ; invertendo os bits do acumulador _________________ ; voltando para o end ; fim do programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 63 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 5: Fazer o mesmo exercício anterior utilizando interrupção. Cálculo de N: N= 12MHz = 10.000 12.100 ∴modo 1 escolhido Escolhendo o timer 0 Modo 1 valor inicial = 65536-10000 = 55536 TMOD = 01h GATE C/T* M1 M0 GATE C/T* M1 M0 0 0 0 0 0 0 0 1 IE = 82h EA 1 - 0 0 ES 0 ET1 EX1 ET0 EX0 0 0 1 0 Programa com Interrupção $mod51 recarga equ 55536 org 0h ___________________ ___________________ ___________________ inicio: ___________________ ; valor de carga do timer ; posiciona o progr. no endereço 00h da flash ; salta para o inicio do programa ; endereço da interrupção 0 ; salta para rotina de interrupção ; configurando o modo 1 para os 2 timers ___________________ ; habilita a interrupção do timer 0 ___________________ ; carregando os registradores ( TL0 ) ___________________ ; do timer 0 ( TH0 ) ___________________ ; inicializo o acumulador com zero ___________________ ; desliga os bits da porta 1 ___________________ ; ligando o temporizador ___________________ ; programa fica parado nesta linha esperando ; a interrupção ;**** ROTINA DE INTERRUPÇÃO ***************** tim0: ___________________ ; carregando os registradores ___________________ ; do timer 0 ___________________ ; invertendo os bits do acumulador ___________________ ; acionando a porta com o conteúdo do Acc ___________________ ; retorna da interrupção ___________________ ; fim de programa [Prof. Corradi – WWW.corradi.junior.nom.br] Página 64 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 6: Gerar a seguinte onda quadrada na porta P1, utilizando um cristal de 12 MHz: 40 µs Nível baixo 1 ms Nível alto Utilize Interrupção. TMOD = 01h GATE C/T* M1 M0 GATE C/T* M1 M0 IE = 82h EA - - ES ET1 EX1 ET0 EX0 _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ _______ ______________; _________________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 65 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 7: Utilizando o esquema abaixo, faça um programa para controlar a velocidade do motor DC através de um PWM. Considere o cristal de 12 MHz e o período do PWM de 25 ms. 25 ms SA 0 0 1 1 SB % nivel alto 0 0 1 20 % 0 50 % 1 80 % PORTA SERIAL Basicamente, existem três tipos de comunicação digital: Modo Simplex neste tipo de comunicação, um dispositivo apenas transmite a informação e outro dispositivo apenas recebe. II) Modo Half-Duplex neste tipo de comunicação os dispositivos recebem e transmitem os dados, mas essas operações não podem ocorrer simultaneamente. III) Modo Full-Duplex neste modo os dispositivos podem receber e transmitir os dados simultaneamente. I) O microcontrolador da família MCS-51 operam no modo Full-Duplex. REGISTROS DA INTERRUPÇÃO SERIAL Para controle dos timers existem 3 registros: IE, SCON e PCON. IE (Interrupt Enable) para habilitar as interrupções [Prof. Corradi – WWW.corradi.junior.nom.br] 1 – habilita 0 – desabilita Página 66 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Já visto nos módulos anteriores: IE = EA - - ES ET1 EX1 ET0 EX0 todas serial timer/counter 1 externa 0 timer/counter 0 externa 1 PCON (Power CONtrol) controle de potência Apenas o bit 7 deste registro é utilizado na interrupção serial: PCON = SMOD - - - GF1 GF0 PD IDL dobrador de Baud-rate ativa modo IDLE modo Power Down Bits de finalidade geral SMOD quando em 1 dobra a baud rate. OBS: não é acessível o bit deste registro. IDL quando em 1, o oscilador continua a trabalhar apenas para três funções (interrupções, timers e porta serial). Consumo de energia é de 85% do consumo normal. Sai do IDL através de uma interrupção ou através do RESET. POWER DOWN quando em 1, o oscilador para de trabalhar. Consumo de energia é de 10µA. Único modo de sair do power down é através do RESET (neste caso mantém os dados da RAM interna). SCON (Serial CONtrol) controle da serial SCON = SM0 SM1 SM2 REN TB8 RB8 TI RI Bit 0 do modo de operação Bit 1 do modo de operação Comunicação multi-processador REN =1, habilita recepção serial TB8 oitavo bit a ser transmitido nos modos 2 e 3 RB8 oitavo bit recebido nos modos 2 e 3 TI flag de interrupção por transmissão (indica término da transmissão) Setado no modo 0 no final do oitavo bit ou Setado nos modos 1, 2 e 3 no começo do stop bit RI flag de interrupção por recepção (indica que há dados recebidos) Setado no modo 0 no final do oitavo bit ou Setado nos modos 1, 2 e 3 no começo do stop bit [Prof. Corradi – WWW.corradi.junior.nom.br] Página 67 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II OBS: TI e RI devem ser zerados por software (CLR TI, CLR RI) Modos de Operação Modo 0 1 SM0 0 0 SM1 0 1 Descrição Registro de deslocamento, modo síncrono UART de 8 bits (assíncrono) 2 1 0 UART de 9 bits (assíncrono) 3 1 1 UART de 9 bits (assíncrono) Baud-Rate fCLOCK/12 variável (timer 1) fCLOCK/32 ou fCLOCK/64 variável (timer 1) MODO 0: (síncrono, 8 bits – registrador de deslocamento) Baud-Rate Fclock/12 Função dos pinos: RXD (P3.0) entrada e saída de dados TXD (P3.1) fornece o clock de deslocamento Este modo pode ser utilizado para aumentar as portas de I/O ou quantidade de memória do microcontrolador: MODO 1: (assíncrono, 8 bits) Baud-Rate variável Função dos pinos: RXD (P3.0) recebe dados TXD (P3.1) transmite dados [Prof. Corradi – WWW.corradi.junior.nom.br] Página 68 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Frame de bits no modo 0: start 0 1 I N F O Sempre 0 na transmissão 2 R 3 4 5 6 M A Ç Ã O Se SMOD=0, a cada 32 overflow do timer 1 Se SMOD=1, a cada 16 overflow do timer 1 7 stop sempre 1 na transmissão envia um pulso para o circuito serial CÁLCULO DO VALOR A SER CARREGADO NO TIMER 1 N= f CLOCK 192.BR.(1 + SMOD) onde: N – valor a ser programado no temporizador 1 BR – Baud Rate desejada Exemplo 1: Calcule o valor a ser carregado no timer 1 para conseguir uma Baud-Rate de 9600 bauds utilizando um cristal de 11,059 MHz e SMOD=0. Cálculo de N: N= 11059000 = 2.999 ≈ 3 192.9600.(1 + 0) usando timer 1 no modo 2 (8 bits) valor inicial do temporizador: vi = 256 – 3 = 253 (ou FDh) MOV TL1, #0FDh ou MOV TH1, #0FDh ou MOV TL1,#253 MOV TH1,#253 O registro SBUF é responsável por enviar e receber os dados. O dado recebido é carregado em SBUF se RI=0 e (SM2=0 ou stop bit=1) MODO 2: (assíncrono, 9 bits) Baud-Rate Fclock/32 (SMOD=0) ou Fclock/64 (SMOD=1) [Prof. Corradi – WWW.corradi.junior.nom.br] Página 69 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Função dos pinos: RXD (P3.0) recebe dados TXD (P3.1) transmite dados Frame de bits no modo 0: Sempre 0 na transmissão start 0 I N 1 2 3 4 F O R M A 5 6 Ç Ã O 7 TB8 stop sempre 1 na transmissão Trasmissão: bit 8 é copiado no TB8 (registro SCON) Recepção: bit 8 é copiado em RB8 (registro SCON) O dado recebido é carregado em SBUF se RI=0 e (SM2=0 ou stop bit=1) MODO 3: (assíncrono, 9 bits) Baud-Rate variável Função dos pinos: RXD (P3.0) recebe dados TXD (P3.1) transmite dados Frame de bits no modo 0: start 0 I N 1 2 3 4 F O R M A 5 6 Ç Ã O 7 Sempre 0 na transmissão Trasmissão: bit 8 é copiado no TB8 (registro SCON) Recepção: bit 8 é copiado em RB8 (registro SCON) TB8 stop sempre 1 na transmissão O cálculo do valor a ser carregado no timer 1 é idêntico ao modo 1: f CLOCK N= 192.BR.(1 + SMOD) Uso da serial (Endereço 23h): - habilitar os devidos registros (IE, PCON e SCON) - transmissão: escrever byte no registro SBUF - recepção: habilitar o bit REN (=1) e RI=0 no registro SCON Não esquecer de apagar RI e TI, quando a interrupção for atendida [Prof. Corradi – WWW.corradi.junior.nom.br] Página 70 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II COMUNICAÇÃO ENTRE VÁRIOS 8051 Os modos 2 e 3 permitem interligar vários 8051, sendo um mestre e os outros escravos. Neste modo há: - um start bit - 8 bits de dados - o nono bit que vai para o bit RB8 (na recepção), ou que pode ser escolhido entre 0 ou 1 na transmissão escrevendo-se em TB8. - um stop bit Se SM2 = 1 e RB8 =1, a interrupção da serial será atendida. Algoritmo de comunicação entre os 8051: 1) setar SM2 de todos os escravos 2) Mestre enviando dados: escrever 1 no seu bit TB8 e enviar serialmente o endereço do escravo desejado. (Todos os escravos serão interrompidos, seus RB8 estarão em 1, para verificar se é seu o endereço enviado). 3) O escravo selecionado zerará seu bit SM2 e ficará preparado para receber os dados, os quais terão agora o nono bit RB8 em 0. 4) Os demais escravos permanecerão com SM2 em 1 e, dessa forma, não serão mais interrompidos, pois os dados têm RB8=0. OBS: O mestre envia o endereço desejado com o nono bit em 1 e os dados com o nono bit em 0. Portanto, se o mestre quiser se comunicar com outro escravo basta enviar o novo endereço com o nono bit em 1. Exemplo 2: Comando para habilitar a recepção serial SETB REN - Verificando se a serial recebeu dados (sem usar interrupção): LOOP: JNB RI,$ CLR RI MOV A, SBUF ; enquanto o flag RI não for para 1, não ocorreu ; interrupção, então fica aguardando ; limpa o flag RI para habilitar novas recepções ; transfere para acumulador o dado recebido -Verificando se houve transmissão do dado: MOV SBUF, A LOOP: JNB TI, $ CLR TI ; inicia a transmissão ; espera o término da transmissão (TI = 1) ; habilita novas transmissões [Prof. Corradi – WWW.corradi.junior.nom.br] Página 71 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II ERRO DA BAUD-RATE Dependendo do cristal utilizado haverá erro entre a baud-rate desejada e a baud-rate obtida. Como o transmissor e o receptor devem ser configurados com a mesma baud-rate, este erro pode prejudicar a comunicação. O erro admitido em uma comunicação serial é da ordem de 5%. A tabela abaixo mostra alguns erro obtidos no modo 1 e 3 (baud-rate variável) e usando o timer 1 no modo 2 (auto-reload). BR desejada 1200 2400 9600 19200 1200 2400 9600 19200 BR obtida 1200 2400 9600 19200 1202 2404 8923 20833 Erro 0 0 0 0 0,16 % 0,16% 7 % 8,5 % Cristal 11,059 MHz 12 MHz SMOD 0 0 0 1 0 1 1 1 Carga E8h F4h FDh FDh E6h E6h F9h FDh Cálculo do erro da baud-rate Erro = Np − N x100 Np (%) onde: Np – número da contagem programada N – número de contagem: N= f CLOCK 192.BR.(1 + SMOD) Exemplo: Qual o erro de uma comunicação serial realizada com o 8051 que utiliza uma baud-rate de 9600 bauds, SMOD=1 e com um cristal de 12 MHz. N= f CLOCK 192.BR.(1 + SMOD) = 12 M = 6,51 192.9600(1 + 0) como não há contagem quebrada, temos que arredondar o valor acima Np = 7. Erro = Np − N 7 − 6,51 x100 = = 7% Np 7 MAX232 O componente MAX232 realiza a conversão entre os níveis de tensão TTL (80C51) e a RS232(PC). Portanto este integrado é necessário para realizar a comunicação serial entre o PC e o 80C51. Abaixo é mostrado este integrado, bem como a configuração dos conectores da porta serial: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 72 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Conectores: O microcontrolador se comunica com o PC através de algum software. Pode ser um software de linguagem de programação (Delphi, CBuilder, C,..) ou através de um hiperterminal. Um hiperterminal gratuito pode ser baixado em: http://www.hilgrave.com. ROTINAS COMENTADAS: ; Rotina para enviar dados para o terminal (sem usar interrupção). O programa irá ; enviar os caracteres de 0 até z para o terminal e ficará em loop. ; baud-rate utilizada de 2400 bauds com SMOD=1 [Prof. Corradi – WWW.corradi.junior.nom.br] Página 73 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II $mod51 org 0h ; posiciona o programa no endereço 00h da flash inicio: mov scon,#40h ; serial no modo 1 (8 bits, baud-rate variável) mov a,pcon setb acc.7 mov pcon,a ; pcon possui o bit SMOD, para setar o bit: ; seta o bit sete de pcon ; atualiza o pcon mov tmod,#20h mov th1,#0E6h mov tl1,#0E6h setb tr1 ; habilita timer 1 no modo 2 (auto-reload) ; carregando com 2400 bauds ; carregando com 2400 bauds ; liga o temporizador mov a,#'0' envia: mov sbuf,a jnb ti,$ clr ti inc a cjne a,#'z'+1,envia mov a,#'0' sjmp envia end ; primeiro caractere a ser enviado ; começa a transmissão do caractere ; espera o fim da transmissão ; limpa o flag para novas transmissões ; incrementa o caractere ; se não for o último caractere, volta para transmitir ; se for o último caractere, reinicia o valor do caractere ; volta na rotina para transmitir ; fim do programa ; Rotina para ler um caractere do terminal ; A próxima rotina ficará alterando o valor de um registrador e assim que chegar um ; dado na porta serial, o 8051 verificará se este dado é o caractere ‘A’ se for o dado ; será transmitido para o terminal, se não for o caractere ‘?’ será transmitido ao ; terminal $mod51 org 0h sjmp inicio org 23h ljmp seri inicio: mov ie,#90h mov scon,#50h mov a,pcon setb acc.7 mov pcon,a ; posiciona o programa no endereço 00h da flash ; salta para o inicio do programa ; endereço da interrupção serial ; desvio para tratamento da interrupção serial ; habilita interrupção serial ; serial no modo 1 (8 bits, BR variável) ; REN = 1, habilita a recepção serial ; fazendo SMOD=1 ; seta o bit sete de pcon ; atualiza o pcon [Prof. Corradi – WWW.corradi.junior.nom.br] Página 74 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II mov tmod,#20h mov th1,#0E6h mov tl1,#0E6h setb tr1 ; habilita timer 1 no modo 2 (auto-reload) ; configura com 2400 bauds ; configura com 2400 bauds ; liga o temporizador volta: mov r0,#'S' mov r0,#'U' mov r0,#'C' mov r0,#'0' mov r0,#'4' sjmp volta ; valores aleatórios carregados ... ; em R0 ... ; isso para mostrar que o programa pode... ; ser interrompido a qualquer momento ... ; logo que aparecer um dado na serial ... ; retorna a carregar os valores em R0 seri: mov a,sbuf clr ri cjne a,#'A', erro ; Rotina da serial. Le o que foi recebido ; habilita nova recepção de dados ; se não for o caractere correto desvia para rotina ERRO mov a,r0 mov sbuf,a jnb ti,$ clr ti reti ; dado correto, move valor de R0 para o acumulador ; transmite o caractere de R0 ; espera o término da transmissão ; reseta ti para a próxima transmissão ; retorna da interrupção (dado certo) mov a,#3fh mov sbuf,a jnb ti,$ clr ti reti ; dado incorreto move ‘?’ para o acumulador ; transmite o caractere ‘?’ para o terminal ; espera o término da transmissão ; reseta ti para a próxima transmissão ; retorna da interrupção (dado errado) end ; fim de programa erro: [Prof. Corradi – WWW.corradi.junior.nom.br] Página 75 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 1) Faça uma rotina que escreva uma mensagem no terminal utilizado uma tabela para isso. Baud-rate de 2400 bauds, com SMOD=1. ** Não é preciso utilizar interrupção. ** Configure SCON, TMOD e os valores de TH1 e TL1. ** No final da tabela coloque o valor 0FFh para indicar fim de mensagem. Ex: mensa: db ‘Escreva uma mensagem.....’, 0FFh ** Quando chegar no valor FFh, pode-se terminar o programa, ou ficar escrevendo a mensagem de novo. _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ _________ ________________ ; ______________________________________ [Prof. Corradi – WWW.corradi.junior.nom.br] Página 76 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Exercício 2: Faça um programa que controle a velocidade de um torno (PWM) através de um computador. O programa deve: - esperar uma peça entrar em posição (sensor A – p1.0) - se a peça entrar em posição enviar para o terminal a mensagem: “Entrar com o código de velocidade”. - o operador do terminal deve digitar o código para selecionar a velocidade do PWM dado por: código % nível alto % nível baixo A 20 80 B 40 60 C 50 50 D 60 40 E 80 20 - Caso o operador digite qualquer código diferente, o microcontrolador deve enviar a mensagem: “Código inválido” para o terminal e esperar um código válido - Um sensor na máquina (sensor B – p1.1) indicará o fim da operação de torneamento. - O ciclo deverá se repetir Exercício 3) Faça um programa para controlar um forno de microondas. O aparelho deve ter as teclas de 0 a 9 (para o tempo em segundos), a tecla de ligar (o tempo programado), a tecla + 1 minuto (quando desejar programar tempo superiores a segundos) e a tecla parar/cancelar. O motor e a lâmpada só devem ser ligados se a porta estiver fechada. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 77 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II Bibliografia Gimenez, S. P. Microcontroladores 8051. Prentice Hall, 2002. INTEL CORPORATION. MCS@51 Microcontroller Family User’s Manual. Disponível em: http//WWW.intel.com/support/faq/microcontrollers/51_components.htm. Acessado em: 10 de Janeiro de 2010. __________. 8051 Microcontroller Instruction Set, 1995 Disponível em: http//WWW.intel.com/support/faq/microcontrollers/51_components.htm. Acessado em: 10 de Janeiro de 2010. ________. MCS-51 Aplications Notes Disponível em: http//WWW.intel.com/support/faq/microcontrollers/51_components.htm. Acessado em: 10 de Janeiro de 2010. Marcas Registradas Todos os nomes registrados, marcas registradas ou direitos de uso citados nesta apostila pertencem aos seus respectivos proprietários. Sugestões de Leitura Laboratório de Microcontroladores Família 8051 - Treino de Instruções, Hardware e Software Denys E. C. Nicolosi Microcontrolador Denys Emílio Campion Nicolosi 8051 - Detalhado Microcontrolador 8051 com linguagem C - Prático e Didático - Família AT89S8252 Atmel Denys E. C. Nicolosi e Rodrigo B. Bronzeri Programação Basic para Microcontroladores 8051 - Com Base na IDE BASCOM-8051 - Teoria e Prática Fernando Simplicio de Sousa Todos os livros indicados acima são da Editora Érica. [Prof. Corradi – WWW.corradi.junior.nom.br] Página 78 Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II [Prof. Corradi – WWW.corradi.junior.nom.br] Página 79