Apostila de Programaç˜ao em 8051
Transcrição
Apostila de Programaç˜ao em 8051
1 Faculdade de Ciência e Tecnologia Engenharia de Elétrica Disciplina: Microprocessadores e Microcontroladores Professor: Vitor Leão Filardi Apostila de Programação em 8051 2 Sumário 1 Primeira Unidade 1.1 Explicação Intuitiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Princı́pios Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Conceitos Básicos da Computação . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Blocos Básicos de microcomputadores . . . . . . . . . . . . . . . . . . . . . 1.3 Arquitetura do Microprocessador/Microcontrolador . . . . . . . . . . . . . . . . . . 1.4 A CPU Internamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5 O Microcontrolador 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.1 Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.2 Circuito de Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.3 O Gerador de Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.4 Interrupção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.5 Registro de Controle das Interrupções . . . . . . . . . . . . . . . . . . . . . 1.5.6 Tempo para Atendimento das Interrupções . . . . . . . . . . . . . . . . . . 1.5.7 Ajuste das Interrupções Externas para serem Ativas em Nı́vel ou Transição 1.5.8 Hardware para expandir as possibilidade de Interrupção Externa . . . . . . 1.5.9 Exercı́cios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.5.10 Conjunto de Instruções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Segunda Unidade 2.1 Ciclos de Máquina . . . . . . . . . . . . . . . . . . . . . . . 2.2 Portas de I/O . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Princı́pio de Funcionamento e Utilização . . . . . . . 2.2.2 Caracterı́sticas Gerais e de Tempo dos Ports . . . . 2.2.3 Uso das Portas de I/O para a Expansão da Memória 2.2.4 Seleção de Programa Externo ou Interno . . . . . . . 2.2.5 Uso dos Pinos da Porta 3 como funções Alternativas 2.2.6 Capacidade de Corrente nos Pinos de I/O . . . . . . 2.3 Modos de Endereçamento das Instruções . . . . . . . . . . . 2.3.1 Endereçamento por Registrador . . . . . . . . . . . . 2.3.2 Endereçamento Direto . . . . . . . . . . . . . . . . . 2.3.3 Endereçamento Indireto . . . . . . . . . . . . . . . . 2.3.4 Endereçamento Imediato . . . . . . . . . . . . . . . 2.3.5 Endereçamento Relativo . . . . . . . . . . . . . . . . 2.3.6 Endereçamento Absoluto . . . . . . . . . . . . . . . 2.3.7 Endereçamento Longo . . . . . . . . . . . . . . . . . 2.3.8 Endereçamento Indexado . . . . . . . . . . . . . . . 2.4 Temporizadores e Contadores . . . . . . . . . . . . . . . . . 2.4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . 2.4.2 Registros Envolvidos . . . . . . . . . . . . . . . . . . 2.4.3 Modos de operação . . . . . . . . . . . . . . . . . . . 2.4.4 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de Dados e Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 8 9 12 13 14 15 21 24 25 29 32 32 33 34 36 . . . . . . . . . . . . . . . . . . . . . . 41 41 42 42 45 46 47 47 48 48 48 48 49 50 50 51 51 51 52 52 52 55 58 4 3 Terceira Unidade 3.1 Comunicação Serial . . . . . . . . . . . . . . . . 3.1.1 Introdução . . . . . . . . . . . . . . . . 3.1.2 Registros Envolvidos . . . . . . . . . . . 3.1.3 Modos de Operação . . . . . . . . . . . 3.1.4 Cuidados com a Porta Serial . . . . . . 3.1.5 Comunicação entre vários 8051 . . . . . 3.1.6 Comunicação serial entre o 8051 e o PC 3.1.7 Exercı́cios . . . . . . . . . . . . . . . . . 3.2 Programação em Assembly . . . . . . . . . . . 3.2.1 Introdução teórica . . . . . . . . . . . . 3.2.2 Estratégias de elaboração de programas 3.2.3 Fluxogramas . . . . . . . . . . . . . . . SUMÁRIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 65 65 65 67 70 72 73 74 76 76 77 78 Referências Bibliográficas GIMENEZ, S. P. Microcontroladores 8051. [S.l.]: Editora Pearson Education do Brasil, 2002. NICOLOSI, D. E. C. Microcontrolador 8051 Detalhado. [S.l.]: Editora Érica, 2000. SILVA, V. P. da. Aplicações Práticas do Microcontrolador 8051. [S.l.]: Editora Érica, 1998. 5 Capı́tulo 1 Primeira Unidade O que é Microcontrolador 1.1 Explicação Intuitiva Vamos fazer de conta que somos meros aprendizes de cozinheiros, o chefe de cozinha teve que sair e chega um pedido de uma torta de chocolate do gerente da casa. O primeiro passo que nos vamos dar é em direção ao livro de receitas onde deverá ter impresso a rotina de como fazer uma ”Torta de Chocolate” Tudo bem até aqui. E agora como vamos acessar a receita da torta? De que se compõe uma receita? Pois bem, vamos procurar a página que contém o tı́tulo ”Torta de Chocolate”, encontra-se então a receita que é equivalente a um ”software” de construção da torta, que está gravada em um página ”ABC” do livro de receitas. Notemos que, na página, apenas lemos; não escrevemos nada lá, ou seja, em trocado de miúdo será a nossa futura ”ROM” - Read Only Memory - e página o nosso endereço, pois toda vez quisermos tal informação basta acessar tal endereço e obtê-lá. Poderı́amos ainda necessitar de uma cobertura para a torta caso fossemos mostrar serviço para o chefe da casa, vejamos que no livro de receita exista em uma outra página a rotina ”Cobertura para Tortas” e que esta por sua vez estava seperada por servir para mais de um tipo de torta, e poderı́amos partir para a sua execução e depois retornar a torta, o que é chamado também como subrotina de um programa. Agora se fossemos complicar um pouco mais a nossa receita e fossemos fazer uma receita e meia da torta? Precisarı́amos de uma folha de rascunho (a memória ”RAM”) para ajustarmos a receita,uma vez que na receita da torta não devo anotar nada nela. Esta memória temporária, será utilizada para cálculos, e depois podemos nos desfazer do seu conteúdo, ou seja, jogar no lixo. Vejamos como ficaria esta estrutura intuitiva na figura abaixo. Quais são as diferenças sutis e importantes entre o microprocessador e o cozinheiro e suas anotações? Bem, é que o microprocessador, por ser uma máquina limitada, não atende ao rico vocabulário do ser humano cozinheiro que, além de rico, é sofisticado, impreciso e de múltipla interpretação, que só uma máquina inteligente como o homem entede ( vejamos o exemplo: para o homem as seguintes palavras são equivalentes: fazer = realizar = trabalhar. Para o microprocessador, o vocabulário é bem reduzido e especı́fico; não existem adjetivos, sinônimos, etec...). Então vimos que o microprocessador entende apenas algumas instruções básicas e se nos quisermos que ele faça alguma coisa precisamos estudar e compreender precisamente a sua linguagem e limitar- Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Folha de Rascunho Leio Escrevo C o z i n h e i r o Ingredientes + Utensilios Livro de Receitas HARDWARE SOFTWARE READ WRITE Perifericos: Teclado,mouse Etc.... (Linguagem Complexa) So Leio RAM (Dados) M i c r o p r o c. ROM (Programa de Linguagem Especifica So Leio HARDWARE SOFTWARE Figura 1.1: Analogia da estrutura Intuitiva se a ela para fazer a máquina trabalhar. Este é o ASSEMBLER do microprocessador, que é o seu conjunto de instruções. 1.2 1.2.1 Princı́pios Básicos Conceitos Básicos da Computação Antes de iniciarmos o estudo de microcomputadores, vamos nos familiarizar com os termos técnicos e saber o seu significado individualmente. 1.Bit: abreviação de dı́gito binário (binary digit), que corresponde ao valor zero lógico(0) ou ao valor um lógico(1). Podemos fazer uma analogia ao sistema numérico como sendo uma unidade de um valor qualquer. 2.Byte: representação numérica composta de 8 bits. Pode representar números de 00h(=0 10 ) a FFh(=25510 ). Essa representação é vastamente utilizada na representação das instruções que o microcontrolador é capaz de executar. Novamente fazendo analogia, teremos o similaridade como as dezenas, centenas etc..., lembrando que em eletrônica digital corresponde como sendo uma palavra. 3.Registradores: conjunto de flip-flop, geralmente do tipo D que são interligados em paralelo entre si. Eles são responsáveis pelo armazenamento de uma informação que pode ter 8, 16, 32, 64 ou 128 bits, dependendo de quantos flip-flops do tipo D estão interligados entre si. Os registradores apresentam caracterı́sticas voláteis e , quando eles são desenergizados, perdem suas informações. Página 8 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi 4.Microcomputador: equipamento compacto cujo objetivo principal é simular eletronicamente o sistema chamado ser humano. Suas principais vantagens são: grande velocidade do processamento das informações e alta confiabilidade nas atividades executadas. Ele é composto por três blocos básicos: Unidade Central e de Processamento, Unidade de Memória e Unidade de entrada e saı́da de informações. 5.Instrução: define uma única ação (tarefa) que o microcomputador pode executar por vez. As ações das instruções podem corresponder a operações de leitura e escrita nos conteúdos dos registradores ou nas posições de memórias, a operação lógica e aritméticas, etc. 6.Equipamento Inteligente: equipamento com microprocessador ou com microcontrolador. Também chamada de eletrônica embarcada 7.Programa ou software: definido por um conjunto de instruções arranjadas de maneira organizada por um programador, com o objetivo de informar ao microcomputador o que ele deve executar, ou seja, o programa informa ao microcomputador quais as tarefas que devem ser executadas ao longo do tempo. Existem várias classificações de programas: os programas de sistema operacional( linux, DOS, windows e etc.), os utilitários( Anti-virus,scandisk e etc.) e os aplicativos (WORD, EXCEL, Kile e etc.) 8.Firmware: programa (software) que está exclusivamente armazenado em uma memória nãovolátil(ROM/PROM/EPROM/E2PROM) de um equipamento inteligente. No mı́nimo o firmware tem a finalidade principal de programar a forma de operação do hardware (número de portas de entrada e saı́da, forma de comunicação serial, forma de operação dos timers/contadores etc.) e de definir suas condições iniciais de operação. 9.Hardware: são as partes eletrônicas que compõem um microcomputador, como a mother board (placa mãe que contém pelo menos o microprocessador ou o microcontrolador de um microcomputador), a placa de vı́deo de um microcomputador etc. 10.Microprocessador ou Unidade Central de Processamento(CPU):mais conhecido como CPU. Fazendo analogia com o sistema ser humano, o microprocessador, ou CPU, de um microcomputador corresponde ao cérebro de um ser humana. Fisicamente é um dispositivo semicondutor (circuito integrado,CI) constituı́do por milhões de transistores que implementam uma variedade de circuitos (registradores, máquinas seqüenciais, circuitos lógicos e etc.). Ele é responsável pela busca de um programa na memória e por sua execução. 11.Microcontrolador: dispositivo semicondutor em forma de CI, que integra todas as partes básicas de um microcomputador - microprocessador(CPU), memórias não-voláteis (ROM /PROM /EPROM /E2PROM), memórias voláteis(RAM, SRAM, DRAM, Flash RAM), portas de entrada e saı́das (portas de comunicação paralela e/ou serial, conversores analógicos/digitais,conversores digitais/analógicos etc.). Ele é conhecido como ummicrocomputador implementado em um único CI. 1.2.2 Blocos Básicos de microcomputadores Qualquer computador, seja ele microcomputadores, computadores de médio porte ou ainda computadores de grande porte, são constituı́dos por três blocos básicos: a unidade central de processamento (CPU), a unidade de memória (na qual são armazenados os programas e as informações) e a unidade de entrada e saı́da (dispositivos que fazem a comunicação com o mundo externo). Página 9 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi CPU A CPU é responsável pela inteligência da máquina, ou seja, é ela que tem a capacidade de tomar decisões (ações) no sistema microcomputadorizado, por meio da execução de um programa. É ela que executa o programa armazenado na memória do microcomputador, que foi projetado por um programador. Ao executar um programa, ela é responsável pela obtenção das informações a serem analisadas por meio de dispositivos de entrada (teclado, canal de comunicação serial etc.), pelo processamento (interpretação, manipulação, ordenação, modificação, cálculos lógicos ou matemáticos etc.) das informações e pela resposta (ação) do sistema microcomputadorizado a uma determinada situação de controle para a qual ele foi projetado a fim de controlar, por meio de um dispositivo de saı́da (escrita na memória de vı́deo, transmissão de dados para outro microcomputador, acionamento de um relé, acionamento de um bip,etc.). Assim, por exemplo, um microcomputador projetado para funcionar como um caixa eletrônico de banco deve fazer as seguintes operações: leitura das informações contidas no cartão magnético (obtenção de informações), decodificação da senha digitada no teclado pelo usuário, busca de saldo bancário nos bancos de dados do banco (processamento), disponibilização do saldo bancário no monitor de vı́deo e a impressão em papel do referido saldo bancário (resposta do sistema por meio da ação de gerar informações no monitor de vı́deo e também pela impressão em papel das informações organizadas solicitadas pelo usuário). De maneira simplificada, pode-se dizer que a unidade de processamento central (microprocessador) apresenta duas funções básicas: a)Leitura (busca) e interpretação do programa alocado na memória, instrução por instrução: como o programa fica alocado na memória do microcomputador, e não dentro do microprocessador/CPU, em primeiro lugar, o microprocessador precisa buscar as instruções, uma por uma, na memória. Isso é feito por meio da operação de leitura de um byte na memória que corresponde a uma determinada instrução e depois é realizada a interpretação da instrução lida (decodificação), pois o microprocessador tem uma determinada quantidade de instruções que ele é capaz de executar. Dessa maneira, ele precisa verificar qual dessas instruções deve ser executada. Assim, ao finalizar essa etapa, o microprocessador/CPU sabe o que deve fazer. O próximo passo é a execução da instrução. b)Execução do programa, instrução por instrução: a palavra execução de uma instrução pode significar a transferência de dados dos registradores internos do microprocessador/CPU para a memória ou para os dispositivos de entrada e saı́da, e vice-versa. Pode também significar a execução de operações lógicas e aritméticas etc. Esse processo de buscar, interpretar e executar instrução por instrução é uma atividade contı́nua do microprocessador e, dessa forma, um programa é processado por inteiro. A unidade de processamento central (microprocessador) é constituı́da por três partes principais: a unidade lógica e aritmética, os registradores internos e o bloco de temporização e controle. a)Unidade Lógica e Aritmética (ULA): muitas vezes, também é chamada de ALU (Arithmetic Logic Unit). Ela é responsável, principalmente, pela execução das instruções correspondentes às operações aritméticas e lógicas. Além disso, uma caracterı́stica muitı́ssimo importante que deve ser destacada, referente à ULA, é que, ao executar uma instrução de uma operação aritmética ou lógica, ela também define a condição numérica do resultado por meio de alguns bits sinalizadores, chamados de flags de sinalização, tornando-os iguais a um (setando-os) ou tornando-os iguais a zero (resetando-os), e pela utilização de outras instruções que são ca- pazes de testar esses flags de sinalização. Isso faz com que o sistema microcomputadorizado possa gerenciar uma determinada situação de projeto ou desempenhar uma determinada tarefa bem-definida. b)Registradores internos: são compostos por m registradores de n bits interligados em paralelo entre si. Os valores m e n dependem das caracterı́sticas de cada microprocessador/microcontrolador Página 10 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi (p. ex.: 32 registrado- res de 8 bits etc.). Como são formados por flip-flops, é possı́vel realizar operações de leitura e escrita de informações. Quando a CPU é ”desenergizada”por apresentar caracterı́sticas voláteis, essas informações são perdidas. Geralmente, eles são capazes de armazenar: •um byte se forem constituı́dos por registradores de 8 bits; •um duplo byte ou address ou word, se forem constituı́dos por registradores de 16 bits; •um duplo address ou duplo word, se forem constituı́dos por registradores de 32 bits etc. Um microcomputador é chamado de microcomputador de 8 bits se ele for capaz de processar informações de oito em oito bits por vez (operações de movimentação de informações e operações aritméticas e lógicas). Analogamente, para os microcomputadores de 16 e 32 bits, quanto maior for a quantidade de bits processados em paralelo por vez, maior será sua capacidade de processamento. A unidade utilizada para medir a capacidade de processamento é o Mips (milhões de informações por segundo). c)Bloco de temporização e controle: responsável pelo controle do fluxo de informações do microprocessador para as unidades de memória e para as unidades de entrada e saı́da. É esse bloco que define os sinais de controle de temporização para o sincronismo do fluxo de informações no sistema microcomputadorizado (p. ex.: liberação de informações da ULA para os registradores, memória e unidades de entrada e saı́da etc.) por meio da definição dos sinais de leitura (read), de escrita (write), de inicialização do sistema (reset), de liberação dos barramentos de dados e endereços, entre outros. Unidades de Memórias As unidades de memórias são divididas em duas partes: memória de armazenamento de programa e memória de armazenamento de informações (dados, bytes, bits etc.). a)Memória de armazenamento de programa: todo microcomputador deve ter uma área de memória na qual será armazenado o programa que definirá as tarefas que o microcomputador / CPU deve executar. Esse programa define a função de um microcomputador e também diz ao microcomputador, instrução por instrução, o que ele deve fazer ao longo do tempo. Esse programa deve ser implementado por um programador técnico, conhecedor do hardware do sistema microcomputadorizado e das instruções do microprocessador. O microcomputador não funcionará se não existir um programa armazenado em sua memória de programa. Assim, uma vez energizado o microcomputador, esse programa será buscado e executado pelo microprocessador. Esse programa define a caracterı́stica funcional do microcomputador (p. ex.: operar como um forno de microondas, como uma máquina de lavar roupas ou como uma injeção eletrônica de automóvel etc.). Esse programa não pode ser perdido na ausência de energia elétrica, pois isso acarretaria a perda da funcionalidade desse microcomputador, para a qual foi projetado. Assim, o tipo de memória em que esse programa deve ser armazenado é a memória não-volátil. b)Memória de armazenamento de informações: todo microcomputador deve ter uma área de armazenamento de informações. Essa memória deve permitir a escrita e a leitura de informações. Para entender melhor, considere um microcomputador controlando uma determinada atividade. Caso existam informações definidas pelo mundo externo por meio de chaves, sensores, teclados etc., elas devem ser lidas e armazenadas na memória, para depois serem lidas novamente e analisadas (tratadas) pelo microprocessador por meio de um programa. Como exemplo, considere o acionamento das teclas do teclado de um microcomputador, ou seja, uma vez acionada uma tecla, a CPU deverá ler a informação que foi gerada pelo hardware associado a essa tecla e executar o armaz namento dessa informação na memória. Depois, deverá fazer a leitura dessa informação, a fim de analisá-la (interpretá- la), para verificar qual tecla foi acionada. Além disso, a informação deverá ser mostrada no monitor de vı́deo. Repare que foram necessárias, nesse exemplo, várias operações Página 11 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi de leitura e escrita na memória, para a realização dessa tarefa. Assim, é preciso utilizar uma memória que tenha a caracterı́stica de realizar leitura e escrita de informações. Portanto, deve-se utilizar memórias RAM (Random Access Memory). Lembre-se de que essas memórias apresentam a caracterı́stica de se- rem voláteis. Portanto, sempre que o microcomputador for desenergizado, as informações contidas nesse tipo de dispositivo serão perdidas. Unidade de Entrada e Saı́da Unidade de entrada e saı́da (E/S): também chamada pela abreviação de I/O (Input/Output), é responsável pelo interfaceamento das informações entre o microcomputador e o mundo externo. Geralmente são circuitos integrados (CIs) capazes de ler e armazenar as informações vindas do mundo externo, por exemplo, informações originárias do teclado, do canal de comunicação serial de um microcomputador etc.; e que também podem definir informações do microcomputador para o mundo externo, por exemplo, o acionamento de bips, alto-falantes, leds indicadores, displays, interfaces de comunicação seriais e paralelas etc. 1.3 Arquitetura do Microprocessador/Microcontrolador Como vimos até aqui o microprocessador é um elemento eletrônico, desenvolvido para executar tarefas especı́ficas, que dependem de uma linguagem própria para cada famı́lia de microprocessadores/microcontroladores. Quando falo em famı́lias estou me referindo ao tipo de linguagem que o meu microprocessador/microcontrolador será capaz de interpretar, isto quer dizer que a linguagem a qual irei utilizar no programa está diretamente relacionada ao modelo do meu microprocessador/microcontrolador. Podemos ter no mesmo circuito diversos tipos de famı́lias diferentes que trabalham entre si sem problemas, desde de que se respeite o programa individual de cada um, por exemplo: o nosso celular não conecta no computador, um palm idem, são todos eles pertencentes a diversas famı́lias, mas que interagem entre si. Assim, ao programarmos a ROM com os códigos compatı́veis com a linguagem ou famı́lia pertencentes ao microprocessador, ele será capaz de executar as tarefas por esse código designadas. Cabe ao projetista entender perfeitamente o conjunto de instruções da máquina (o tão famoso ASSEMBLER) e a sua estrutura fisica, e de interfaces, também conhecida como hardware. Vejamos como os três blocos visto até aqui se comunicam entre si para dar funcionalidade ao microprocessador. As vias de comunicação entre os blocos básicos são chamadas de barramentos ou do inglês bus. Cada barramento é constituı́do por um número de vias (trilhas de cobre), nas quais fluem informações em paralelo. São três os barramentos existentes: o barramento de endereços, de temporização e controle e o de dados. 1.Barramento de endereços: A CPU utiliza esse barramento para definir os endereços das posições de memória de programa em que ela irá buscar as instruções a serem executadas e também para definir os endereços de memória de dados ou dos dispositivos de entrada e saida para a troca de informações. Esse barramento é unidirecional. 2.Barramento de temporização e controle: A CPU utiliza esse barramento para definir os sinais de temporização e controle para gerenciar o tempo e a direção do fluxo de informações nas operações de leitura e escrita nos dispositivos (unidades de memória ou unidades de entrada e saida). Esse barramento é unidirecional. 3.Barramento de dados: A CPU utiliza esse barramento para receber as informações vindas da memória ou dos dispositivos de entrada e saida ou então definir as informações para a memória ou para os dispositivos de entrada e saı́da. Esse barramento é bidirecional. Vale ressaltar que Página 12 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi nem todos os microprocessadores/microcontroladores não trocam informações diretamente com os dispositivos de entrada e saida. 4.Oscilador: É o elemento que gera o ”marcapasso”da CPU, que permite que o microprocessador realize as suas tarefas internas e externas de maneira sincronizada e com velocidade predeterminada. 5.Reset: É o elemento que faz a CPU iniciar suas rotinas internas e realizar também a primeira leitura de instrução no endereço 0000h. 6.Interrupções: São pinos de acesso externo que permitem interromper o microprocessador, que então interrompe suas tarefas atuais e atende aquelas planejadas pela interrupção solicitada. Oscilador Mem´oria Microprocessador E/S ou Reset Nao−Volatil (ROM) Unidade Cental de Processamento ou I/O Volatil (RAM) Interupcao BUS Dados BUS de Temp. Controle Bus Endereco Figura 1.2: Arquitetura básica de um microprocessador Como o computador só interpreta códigos binários, não existe a necessidade que nós programadores converse no mesmo nı́vel, podemos utilizar os outros tipos de codificação Octal, Hexadecimal, Decimal e por Nomes Simbólicos, que representam uma instrução, como por exemplo: ”add”= ”Soma”= Código Hexa 24 ou 00100100 em binário (no exemplo, add=add A,#valor), para o microprocessador 8051. A CPU só entende dı́gitos binários, mas nós a memorizarmos por ”add”, que é mais fácil de se lembrar. Assim através de um software (interpretador) irá transformar este ”add”em 00100100, quando gravamos a ROM. 1.4 A CPU Internamente Veremos algumas de suas funcionalidades mais importantes a)Registradores: São equivalentes a uma RAM, só que interna à CPU. Servem para armazenamento temporário de informações de utilidade interna e externa à CPU. Existem registradores com função definida: por exemplo, aquele que é imagem ou espelho de uma porta de ”I/O”. O sinal na porta de I/O pode ser lido diretamente no registrador equivalente; por exemplo, a porta P̈O”tem um registrador imagem de ”PO”, cujo conteúdo é o reflexo do que há na entrada fı́sica dessa porta. Existem registradores de Função Geral, que podem ser acessados pelas instruções do Mp (microprocessador) e ainda podem ser conhecidos por nomes (registradores R0, R1 etc.) ou sem nomes (registradores 20h, 21h, etc.). Página 13 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi b)Contador de Programa (Program Counter ou PC): É o indicador de endereço de memória externa. Ele serve para endereçar a próxima instrução a ser lida pelo Mp, a fim de que ela ”saiba”onde estava e para onde deve ir (ler nova instrução no próximo endereço). c)Registradores de Instrução (Instruction Register ou IR): É o local para onde se dirige o código da instrução que foi retirada da ROM por meio do endereço dado pelo PC no ciclo de busca (fetch) da instrução da memória. O IR é necessário para que, depois da busca, um decodificador possa decodificar, ”abrir”a instrução e enviá-la à unidade de processamento (ALU-Aritmetic Logic Unit), a fim de que, neste local, ela seja ”executada”. d)Unidade de Decodificação (Decode Unit): É o local em que a instrução é decodificada, e também são gerados os controles que, junto com a Unidade de Controle, permitem executar a instrução na ALU. e)Unidade Lógica e Aritmética (ALU-Arithmetic Logic Unit): É o local em que são realizadas as operações de: lógica, aritmética e decisão/comparação. É o ”cérebro”da máquina. f)Acumulador (Accumulator): É um registrador principal e muito ”popular”, pois várias instruções se referem a ele para operar. g)Unidade de Controle (Control Unit): É o local em que se processa o controle do fluxo das informações a fim de realizar a instrução recebida. Exemplo de Funcionamento: Suponha que o Mp foi ler uma instrução na ROM. Os seguintes passos serão dados: 1.O endereço de PC é posto na via de endereço (que é o endereço desta próxima instrução a ser lida). 2.O sinal de controle da ROM, é ativado (pois vamos ler a ROM e não a RAM). 3.A instrução é lida da ROM, no endereço dado pelo PC (no caso, o endereço ”n”), e é lida pela via de dados. Estes três itens correspondem ao ciclo de busca ou fetch. 4.A instrução é carregada e armazenada no IR (Registrador de Instruções). 5.O PC é incrementado para ler a próxima instrução (apontará para ”n+1”). 6.Inicia-se outro ciclo, o de execução interna da instrução, auxiliado pela Unidade de Controle e pelos registradores, decodificado pela Unidade de Decodificação e executado pela ALU. 1.5 O Microcontrolador 8051 O 8051 é um microcontrolador rápido com clock tı́pico de 12 MHz sendo que existem versões de até 30 MHz, fornecidas por diversos fabricantes, e suas caracterı́sticas de hardware e software permitem usá-lo como um poderoso controlador, sobretudo em sistemas para lógica seqüencial e combinatória. Entre as suas caracterı́sticas de hardware, podemos destacar: 1)2 Kbytes de memória de programa (Flash) 2)128 Bytes de memória RAM 3)Duas portas de I/O de 8 bits 4)Comparador de tensão on-chip 5)Controlador de interrupção de 6 entradas com estrutura Nesting* 6)Canal serial UART Full-Duplex programável Página 14 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi 7)Dois contadores/temporizadores de 16 bits 8)Modos Power-Down e Power-Idle [*] ”Nesting”é o nome que se dá ao processo pelo qual uma interrupção pode interromper outra que já estiver sendo atendida, desde que tenha maior prioridade. Entre as caracterı́sticas de software podemos destacar a capacidade de executar complexas operações aritméticas e lógicas (multiplicação, divisão, permuta, e deslocamento de bits,. . . ), trabalhar com bancos de registradores nominais e inclusive trabalhar com 128 bits individualmente endereçáveis na RAM. Há um tempo não muito distante, para realizar um projeto utilizando microcontroladores com todas estas funcionalidades, era necessário agrupar diversas pastilhas com as funções descritas anteriormente. Isto tornava protótipo fisicamente maior, aumentaria o consumo de energia, diminuindo a autonomia das baterias e inviabilizando a sua portabilidade que hoje são fundamentais para os sistemas embarcados. Para compreendermos melhor o 8051 torna-se necessário conhecer a estrutura interna do microcontrolador e estudarmos cada uma delas detalhadamente. Para isso nos dividiremos da seguinte forma: 1)Memória 2)Circuito de Reset 3)Gerador de Clock 4)Controlador de Interrupção 5)Conjunto de Instruções Com esta divisão ficará mais claro definirmos todas as instruções realizadas pelo 8051 e, o funcionamento dos demais componentes associados ao microcontrolador. 1.5.1 Memória Vejamos, o diagrama de blocos do 89C2051 na figura 1.3. Neste diagrama de blocos, temos uma noção geral dos elementos internos ao 8051 e de suas ligações com o mundo externo. A memória de programa do 8051 é do tipo Flash ROM (E2PROM), podendo sofrer um ciclo de escrita/apagamento de 1000 vezes. Este tipo de memória de programa torna as tarefas de teste e depuração dos programas bastante agradáveis, pois a antiga etapa de apagar a memória em luz ultravioleta não se faz mais necessária. O segmento de programa da memória se inicia no endereço 0000h e pode ocupar todos os 2048 bytes da memória, a ATMEL oferece também outros modelos de microcontroladores com uma ROM interna maior para que possamos utilizar programas maiores. A memória RAM se divide conforme a figura 1.4 Os registradores de funções especiais incluem locações referentes às portas de I/O, ponteiros do sistema, registros de interrupção, registros da porta serial, dos temporizadores e registros aritméticos. A CPU trata os registros de funções especiais da mesma forma que trata a RAM, podendo ali efetuar alterações e, o mais importante, endereçar algumas dessas posições como bit. Esta facilidade de endereçar bits é muito interessante, pois facilita a vida do programador. Vamos supor que temos de zerar o quinto bit de uma certa posição de memória. O método tradicional consiste em fazer uma operação AND entre o conteúdo da memória especificada e o numero binário 11011111, Página 15 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Figura 1.3: Organização Interna do 8051 pois 1 AND X resulta X, logo não alteramos os bits 7, 6, 4, 3, 2, 1 e 0. Mas temos que 0 AND X resulta 0, e desta forma zeramos o quinto bit. Quando o sistema trabalha com bits, basta dar uma instrução do tipo ”zere o bit 5 na posição N”e teremos efetuado a operação, sem nos preocuparmos com os demais bits. A parte baixa da memória RAM interna (daqui a diante chamaremos apenas de RAM) está dividida em porções distintas, que incluem 4 bancos de registradores de 8 bytes cada, uma porção de 16 bytes cujos bits são individualmente endereçáveis pela CPU e o restante da memória, que somente pode ser endereçado byte a byte. Os bancos de registradores são simples posições de memória RAM que permitem seu endereçamento pelo nome dado a cada registro, além de seu endereçamento pela posição de memória. Página 16 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Figura 1.4: Organização da RAM Interna do 8051 A vantagem dos bancos de registradores está em seu uso pelo sistema, como ı́ndice para endereçamento e pela facilidade de lembrança de seu nome, além de serem amplamente utilizados por compiladores de linguagem de alto nı́vel. Por exemplo, é mais fácil lembrar que um certo dado está no registro R2 do que lembrar que o mesmo está na posição 02 de memória (Supondo Banco 0). Página 17 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi A seleção de um certo banco de registradores se dá pelo valor dos bits RS1 e RS0 conforme a tabela a seguir: Posição de Memória 1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 Nome do Registrador R7 R6 R5 R4 R3 R2 R1 R0 R7 R6 R5 R4 R3 R2 R1 R0 R7 R6 R5 R4 R3 R2 R1 R0 R7 R6 R5 R4 R3 R2 R1 R0 Bit RS1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Bit RS0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 BANCO 3 2 1 0 Tabela 1.1: Tabela de registradores do banco de memória Conforme visto anteriormente, temos 16 bytes na RAM cujos bits são individualmente endereçáveis pela CPU, conforme podemos ver pela tabela abaixo, dispostos da seguinte forma. Página 18 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi 7F 77 6F 67 5F 57 4F 47 3F 37 2F 27 1F 17 0F 07 Endereços 7E 7D 76 75 6E 6D 66 65 5E 5D 56 55 4E 4D 46 45 3E 3D 36 35 2E 2D 26 25 1E 1D 16 15 0E 0D 06 05 Individuais dos 7C 7B 7A 74 73 72 6C 6B 6A 64 63 62 5C 5B 5A 54 53 52 4C 4B 4A 44 43 42 3C 3B 3A 34 33 32 2C 2B 2A 24 23 22 1C 1B 1A 14 13 12 0C 0B 0A 04 03 02 bits 79 71 69 61 59 51 49 41 39 31 29 21 19 11 09 01 78 70 68 60 58 50 48 40 38 30 28 20 18 10 08 00 Endereços dos bytes 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 Tabela 1.2: Endereços de Memória endereçavel por byte e bit Temos também alguns registros de funções especiais que têm seus bits endereçáveis, sendo que alguns deles têm, inclusive, um nome mnemônico, para maior facilidade de desenvolvimento de software em compiladores. Antes de estudarmos o mapa de memória dos registros de funções especiais, vamos estudar cada um deles em separado para melhor compreensão do funcionamento interno do 89C2051. Em seguida ao nome de cada registro, temos seu endereço em hexadecimal na RAM: P1 (90) - Porta P1 P3 (B0) - Porta P3 São posições da RAM que contêm os dados das portas de I/O do micro, caso as mesmas sejam usadas como tal. Uma escrita num desses registros altera automaticamente o conteúdo presente na saı́da do chip, e uma leitura dos mesmos coloca o estado presente nos pinos (ou nos latchs de saı́da, conforme veremos adiante) dentro da posição desejada. Essa operação é possı́vel devido aos buffers e latchs de cada porta, que só são ativos na leitura ou escrita das mesmas. Página 19 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi SP (81) - Stack Pointer É um registrador de 8 bits que contém o endereço de topo de uma ”pilha”realizada com os registradores, em que se acumulam endereços de retorno, quando se trabalha com sub-rotinas e interrupções. Você pode EMPURRAR (PUSH) dados para a pilha (STACK) ou TIRAR (POP) dados da pilha (STACK). A instrução PUSH incrementa o SP ”antes”de escrever os dados e a instrução POP lê o dado da pilha e ”depois decrementa”o SP. A pilha é formada inicialmente dentro da RAM interna quando se tem o RESET da máquina, e neste caso o SP é carregado com valor 07h. Isto é, qualquer dado a ser armazenado na pilha causará primeiro o incremento do SP, isto é, irá para 08h, e depois será gravado o dado na pilha nesta posição 08h. Isto é, ela estará ocupando a posição 08h da RAM que é o registrador R0 do banco 1! Se você quiser utilizar esse banco e os outros seguintes, é melhor, logo de ı́nicio, carregar o SP com outro valor de ponteiro, a partir do qual ele irá formar a pilha. TH1 (8D) - Timer High 1 TL1 (8B) - Timer Low 1 TH0 (8C) - Timer High 0 TL0 (8A) - Timer Low 0 São os registros de dados dos temporizadores/contadores (1 e 0 respectivamente). Contem os valores contados, no caso de usarmos as funções desse importante periférico do 89C2051. TCON (88) - Timer Control Register TMOD (89) - Timer Mode Register Registradores de controle e de modo de operação dos temporizadores/contadores. É nestes registros que efetuamos a programação de como queremos que esses periféricos trabalhem. Vale lembrar que o 89C2051 possui dois temporizadores/contadores internos. PCON (87) - Power Control Este registro permite-nos adaptar o chip para situações em que não há processamento, mas não desejamos perder o conteúdo das memórias internas do chip, como pode ocorrer numa falha da alimentação, assim podemos controlar o consumo de energia do sistema. SCON (98) - Serial Port Control Register SBUF (99) - Serial Buffer No SCON, colocamos os bits que nos permitirão trabalhar com a porta de comunicação serial conforme desejamos, e o SBUF é o registro no qual a porta armazenará o dado recebido, ou escrevemos o dado a ser transmitido. IE (A8) - Interrupt Priority IP (B8) - Interrupt Enable Estes registros permitem-nos escolher qual ou quais interrupções serão habilitadas (ou desabilitadas) e qual a prioridade (maior ou menor) de cada uma. Página 20 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi PSW (D0) - Program Status Word O Program Status Word contém bits que indicam quais as ocorrências da ALU na ultima operação lógica e aritmética, alem de indicar qual banco de registradores foi acessado pela ultima vez. Equivale aos Flags dos microprocessadores de 8bits. ACC (E0) - Accumulator B (F0) Equivalem ao acumulador e ao registro B dos microprocessadores de 8 bits. O interessante aqui é que, inclusive os registros da CPU são acessı́veis como simples posições de memória. DPH (83) - Data Pointer High DPL (82) - Data Pointer Low Estes dois registros de 8 bits podem ser referenciados como um registro de 16 bits, chamado DPTR -Data Pointer. Este registro é usado quando desejamos fazer endereçamento indireto para a leitura de constantes armazenadas na memória de programa, para ler ou escrever variáveis na memória externa de dados e para desvio para memória de programa de até 64 Kbytes. Não são todos os registros de funções especiais que tem seus bits individualmente endereçáveis. Temos na tabela abaixo, os registros e seus bits com seus respectivos endereços. Assim como nos registros endereçáveis (que são bytes), alguns destes bits também tem um nome mnemônico. Este componente possui um poderoso conjunto de instruções que permite usar diversos modos de endereçamento, admitindo desvios e leitura/escrita em toda a memória. No momento oportuno, veremos como é acessada uma posição de memória, e também como a CPU faz para acessar fisicamente essas posições. 1.5.2 Circuito de Reset Agora, estudaremos como se processa a operação de RESET no 89C2051. É através desta função que o chip se prepara para trabalhar, seja ao ligarmos a alimentação do sistema, ou forçosamente. Embora o RESET não seja propriamente uma interrupção, muitas vezes é assim chamado devido à semelhança de suas ações, já que o RESET interrompe o processamento e reinicializa o sistema. O RESET no 89C2051 é ativo quando o pino 1 (RST/VPP) permanecer em nı́vel alto por dois ou mais ciclos de maquina. Neste caso, a CPU executa o que chamamos de reset interno, que consiste em preencher seus registros internos com os valores predeterminados, a saber: a)O PC, o acumulador, o registro B, os flags, o DPTR e todos os registros dos temporizadores/contadores são ZERADOS. b)No SP é colocado o valor 07h. c)As portas P1 e P3 terão o valor FFh Página 21 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi E7 F7 97 B7 E6 F6 96 B6 Endereços Individuais dos bits E5 E4 E3 E2 F5 F4 F3 F2 95 94 93 92 B5 B4 B3 B2 EA ES ET1 1 AB EX1 AF AC PX1 BC PT1 1 BB PS AA BA E1 F1 91 B1 E0 F0 90 B0 Registradores ACC B P1 P3 ET0 0 A9 EX0 0 A8 IE PT0 0 B9 PX0 0 B8 IP P D0 PSW CY D7 AC D6 FD D5 RS1 D4 RS0 D3 OV D2 SM1 9F SM2 9E SM3 9D REN 9C TB8 9B RB8 9A T1 99 R1 98 SCON TF1 8F TR1 8E TF0 8D TR0 8C IE1 8B IT1 8A IE0 89 IT0 88 TCON Tabela 1.3: Mnemônicos de cada bit d)O SBUF estará com conteúdo indeterminado e o registro de controle da porta serial SCON será zerado. e)O registro PCON terá apenas seu bit mais significativo zerado. f)Os registros de controle de interrupção (IE e IP) terão ambos o valor binário XXX00000, onde X = irrelevante (pode ser 0 ou 1). A RAM interna não é afetada pelo reset forçado, sendo que ao ligar (power-up), o seu valor é aleatório, mas pode ser lido por software. Geralmente, ao ligarmos o sistema, desejamos que o mesmo execute uma seqüência de funções de inicialização, dividida em dois blocos, inicialização do sistema básico, que sempre ocorre no RESET, e a inicialização do sistema montado, que prepara o equipamento para a operação para o qual foi projetado, por exemplo, ajustando os contadores, as portas entre outros. Embora estas funções sejam executadas pelo software que começa a rodar após o RESET, no endereço 0000h da memória de programa, costumamos chamá-lo de rotina de inicialização. O 89C2051 pode ser automaticamente resetado ao ligar a fonte, pela colocação de um resistor de 8,2 kΩ entre seu pino seu pino de RESET e o terra, e pela colocação de um capacitor (preferencialmente de tântalo) de 10 µF entre o pino e o +Vcc, o que garante que este pino estará em nı́vel alto por mais de 2 ciclos de maquina após a ligação da alimentação, pois o capacitor comporta-se como um curto-circuito, provocando uma circulação de corrente pelo resistor, que terá uma tensão inicial da ordem de +Vcc. Após algum tempo, o capacitor ”estará carregado”e não circulará mais corrente na resistência, e desta forma a diferença de potencial sobre a mesma será nula, garantindo que o pino RST/VPP esteja Página 22 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Figura 1.5: Mapa de Registradores e Valores de Reset do 8051 no nı́vel 0. Na eventualidade de necessitarmos provocar o reset (reset forçado), basta então colocarmos uma chave de contato momentâneo NA (push-botton NA) em paralelo com o capacitor, e ao pressiona-la e soltá-la teremos provocado uma nova operação de reset. Na entrada, o chip possui um Schmidt Trigger para garantir rejeição a ruı́do, sendo que a saı́da do mesmo é amostrada a cada ciclo de maquina pelo hardware, para ver a ocorrência de reset. Durante o reset, o nı́vel lógico dos pinos é indeterminado, indo a nı́vel lógico 1 ?após? a execução da rotina interna de reset, de tal forma que devemos prever esta situação no projeto do hardware, para evitar acionamento indesejável de qualquer periférico externo. Página 23 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Figura 1.6: Circuito de reset 1.5.3 O Gerador de Clock Temos duas possibilidades para excitar o sistema: clock externo ou clock interno. O uso do clock externo ajuda a economizar componentes quando do uso do sistema junto de outros que já possuam um sinal TTL que possa ser aproveitado, como por exemplo, para trabalho junto a contadores e outros equipamentos seqüenciais rápidos. Sua implementação é simples, bastando desconectar o pino 4 (XTAL2) (deixar em aberto), e injetar o sinal externo no pino 5 (XTAL1), que desta forma irá diretamente para o sistema de controle e temporização do chip (conforme a figura 1.7). Figura 1.7: Clock Externo para o 8051 Se utilizarmos o clock gerado pelo oscilador interno, deveremos intercalar aos pinos XTAL1 e XTAL2 um cristal ou um filtro cerâmico (o cristal e o mais indicado) na freqüência desejada, e dois capacitores de realimentação conforme a figura 1.8 Os valores recomendados dos capacitores são os seguintes: 40 pF +/- 10 pF para filtro ressonante de cerâmica. 30 pF +/- 10 pF para cristal oscilador. Em qualquer caso, a freqüência de oscilação mı́nima é de 3.5 MHz, é a máxima pode ser de 24 MHz conforme o modelo utilizado. Existem atualmente versões de outros fabricantes que trabalham com freqüência de 30 MHz e superiores, sendo que o seu custo também é relativamente superior. Página 24 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Figura 1.8: Oscilador Interno Quanto ao layout do circuito deve-se destacar o fato de que as ligações devem ser mantidas as mais curtas possı́veis, para evitar capacitâncias parasitas que venham a interferir no funcionamento do circuito, assim como uma boa malha de terra deve ser providenciada em toda a placa. Figura 1.9: Layout Recomendado para o Oscilador Interno 1.5.4 Interrupção A interrupção é, provavelmente, uma das mais importantes ferramentas nos sistemas de controle microprocessados, pois é o processo pelo qual a execução de um programa é interrompida (ou não), de acordo com as necessidades de eventos externos ou internos. Temos dessa forma, que existem três fontes de interrupção: a interrupção por Software (instrução), a pedida por periférico externo e a interrupção pedida por periférico interno (timer/counter, porta serial, etc. . .). A interrupção é um sinal, gerado de uma das três formas acima descritas, que pede para a CPU parar o processamento corrente e efetuar outro, referente à interrupção solicitada, desde que a mesma esteja habilitada e possa ser aceita. A vantagem da interrupção está na simplificação do Hardware, pois não precisamos fazer com que nosso sistema fique monitorando o funcionamento de certos dispositivos periféricos. Por exemplo, nos computadores didáticos simples, e mesmo em alguns sistemas industriais, o teclado é um periférico que é lido constantemente pelo monitor do sistema, para verificar se alguma tecla foi ou não apertada. Página 25 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Já nos computadores da linha IBM-PC, isso não ocorre, pois o teclado é um periférico inteligente, que possui um microcontrolador interno que, caso uma tecla seja pressionada, pede uma interrupção ao microprocessador para poder enviar o código da tecla pressionada para o mesmo. Muitas vezes as entradas de interrupção são as principais entradas do sistema. Para o perfeito entendimento das interrupções, devemos antes relembrar os seguintes conceitos: a)Mascaramento É a possibilidade de impedirmos, geralmente por Software, que uma certa interrupção seja atendida. Existem sistemas que possuem interrupções não-mascaráveis, ou seja, jamais podem ser desabilitadas por Software. b)Prioridades No caso do sistema poder atender mais de uma interrupção, devemos ter uma tabela de seqüência de prioridades, para que o microprocessador saiba como agir, no caso de duas ou mais interrupções chegarem simultaneamente. c)Interrupção Vetorada e Não Vetorada As interrupções vetoradas são aquelas que possuem o vetor de interrupção (endereço de inı́cio da interrupção) fixo, e não pode ser mudado pelo usuário. É o caso do 8051, onde cada vetor de interrupção já está definido pelo fabricante. As interrupções não vetoradas são aquelas nas quais os endereços de desvios do programa são escolhidos pelo programador, como é o caso do COP 68705.U3 da Motorola, por exemplo. d)Tipo de Ativação das Interrupções Existem três maneiras pelas quais um sistema pode reconhecer um sinal lógico: •Pelo nı́vel (alto ou baixo). •Pela borda de subida ou de descida. •Pela soma de borda (subida ou descida) e um nı́vel correspondente. Estudo das Interupções no 8051 0 8051 pode ser interrompido de 5 maneiras: 1)Pela interrupção externa INTO\; 2)Pela interrupção externa INT1\; 3)Pelo timer/counter interno TIMER0; 4)Pelo timer/counter interno TIMER1; 5)Pelo canal de comunicação serial. O canal serial e as interrupções externas usam alguns pinos da porta três, conforme a seguir: 1.Porta 3, pino 0 = Receptor de dados seriais (RX); Página 26 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi 2.Porta 3, pino 1 = Transmissor de dados seriais (TX); 3.Porta 3, pino 2 = Entrada da interrupção externa INTO\;. 4.Porta 3, pino 3 = Entrada da interrupção externa INT1\. OBSERVAÇÃO: Dessa forma, se usarmos algumas dessas interrupções, devemos tratar a porta três como porta de I/O apenas bit endereçável. No 8051, cada interrupção pode ser individualmente habilitada ou não, e podemos também desabilitar todas de uma só vez. As interrupções podem ter apenas dois nı́veis de prioridade, e dessa forma, se duas ou mais ocorrerem ao mesmo tempo (algo ”praticamente”impossı́vel), a de maior prioridade será atendida primeiro. Caso uma interrupção de prioridade 0 (menor) esteja em andamento, uma interrupção de prioridade 1 (maior) interromperá aquela e será atendida. Ao seu fim, a CPU retorna ao atendimento da interrupção de nı́vel 0 que foi interrompida. Este Microcontrolador possui ainda um processo de prioridade interno, para o caso de duas interrupções de mesma prioridade estarem aguardando atendimento. Neste caso, esta é a ordem de atendimento das interrupções (IP): 1)Interrupção Externa 0 −→ Maior prioridade Timer 0 2)Interrupção Externa 1 Timer 1 Se a interrupção que chegar for de nı́vel igual ou menor da que já está sendo atendida, ficará aguardando o fim desta para ser servida. Quando atende uma interrupção, 0 8051 salva no Stack o valor do PC, ”mas não salva o acumulador e o registro Program Status Word (PSW)”. Os mesmos devem ser salvos e devolvidos pela rotina de interrupção, se assim for necessário, assim como qualquer outro registro importante. Endereços de Desvio Neste Microcontrolador, cada interrupção é desviada para um certo endereço fixo, no qual começa a nossa rotina de interrupção. São os seguintes os endereços de desvio: 1.INT0\ −→ 03h 2.Timer/Counter 0 −→ 0Bh 3.INT1\ −→ 13h 4.Timer/Counter 1 −→ 1Bh Como vimos, o Reset inicia em 00h, e desta forma, por exemplo, se usarmos todas as interrupções teremos que usar os três Bytes disponı́veis para o reset, num desvio incondicional para outra parte da memória, onde realmente teria inı́cio o programa. Página 27 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi As interrupções INT0\, Timer/counter 0, INT1\ e Timer/counter 1 possuem apenas 8 Bytes disponı́veis antes de sobrepor se com a próxima, e desta forma, provavelmente, deveremos efetuar um desvio para outra parte da memória, sendo a única exceção a interrupção do canal serial, que por ser a última não se sobrepõe a nenhuma outra. Temos na figura 1.10, um mapa parcial da memória de programa com destaque para os endereços de desvio de cada interrupção. 00h 01h 02h 03h 04h 05h 06h .. . 0Ah 0Bh 0Ch 0Dh .. . 11h 12h 13h 14h .. . 1Ah 1Bh 1Ch 1Dh .. . 22h 23h 24h 25h ←− Inicio ←− End. de INT0\ Diferença de 8 bits ←− ↓ End. do Timer/Counter 0 ←− End. de INT1\ ←− End. do Timer/Counter 1 ←− End. do Canal Serial Figura 1.10: Mapa parcial da memória de programa do 8051 com destaque ao inı́cio das interupções Página 28 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi 1.5.5 Registro de Controle das Interrupções O 8051 possui dois registro de 8 bits cada um, na sua memória RAM mais alta (Registros de Funções especiais-SFR) que servem para habilitação ou não das interrupções, e indica para a CPU a prioridade de cada uma delas. Sempre que uma interrupção é requisitada, um certo bit de controle dessa interrupção será setado e assim permancerá até que essa interrupção seja atendida. Exceção é a esta regra é a interrupção serial, que deve ter seu bit de controle resetado pelo Software. O primeiro de todos estes registros é o IE que tem por função indicar qual das interrupções está ou não habilitada.Vejamos a figura 1.11 Bit 7 EA X X ES ... ET1 EXT1 ET0 Bit 0 EX0 Figura 1.11: Resgistro IE EA - Enable All: Localizado no bit número 7, significa habilitar todos. Quando o em nı́vel 0, desabilita todas as interrupções de forma geral, independente de qualquer outro controle. Se em nı́vel 1, permite-nos escolher qual interrupção em particular será habilitada, em função dos bits de controle individuais a seguir. ES: Enable Serial: Localiza-se no bit 4, significa habilitar a serial, quando em nı́vel lógico 1, libera a interrupção pedida pelo canal serial. ET1 - Enable Timer 1: Localiza-se no bit 3, significa habilitar a interrupção do timer 1 e quando em nı́vel lógico 1, libera a interrupção pedida pelo Timer/Counter 1. EX1 - Enable External 1: Localiza-se no bit 2, significa habilitar a interrupção externa (INT1\ e quando em nı́vel lógico 1, libera a interrupção pedida pelo dispositivo externo ligado a INT1\. ET0 - Enable Timer 0: Localiza-se no bit 1, significa habilitar a interrupção do timer 0 e quando em nı́vel lógico 1, libera a interrupção pedida pelo Timer/Counter 0. EX1 - Enable External 0: Localiza-se no bit 0, significa habilitar a interrupção externa (INT0\ e quando em nı́vel lógico 1, libera a interrupção pedida pelo dispositivo externo ligado a INT0\. Prioridade Natural das interrupções 1.INT0\ 2.TIMER/COUNTER0 3.INT1\ 4.TIMER/COUNTER1 5.Serial Veremos agora o registro IP, nele fixaremos qual o nı́vel de prioridade de nossas interrupções. Vejamos o formato deste registro. PS: Priority Serial: Localiza-se no bit 4, significa prioridade serial, quando em nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo canal serial, se a mesma estiver habilidade. Quando Página 29 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Bit 7 X X X PS ... PT1 PX1 PT0 Bit 0 PX0 Figura 1.12: Resgistro IP em nı́vel 0, indica prioridade baixa. PT1 - Priority Timer 1: Localiza-se no bit 3, significa prioridade do timer 1 e quando em nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo Timer/Counter 1, se a mesma estiver habilidade. Quando em nı́vel 0, indica prioridade baixa. PX1 - Priority External 1: Localiza-se no bit 2, significa habilitar a interrupção externa (INT1\ e quando em nı́vel lógico 1, indica prioridade alta à interrupção externa 1, se a mesma estiver habilidade. Quando em nı́vel 0, indica prioridade baixa. PT0 - Priority Timer 0: Localiza-se no bit 1, significa prioridade do timer 0 e quando em nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo Timer/Counter 0, se a mesma estiver habilidade. Quando em nı́vel 0, indica prioridade baixa. PX1 - Priority External 0: Localiza-se no bit 0, significa habilitar a interrupção externa (INT0\ e quando em nı́vel lógico 1, indica prioridade alta à interrupção externa 0, se a mesma estiver habilidade. Quando em nı́vel 0, indica prioridade baixa. Página 30 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Veremos como é o registrador PSW (Program Status Word) Lembrando que neste registrador representa o status da última operação realizada no acumulador, vejamos a seguinte figura 1.13 Bit 7 PSW.7 CY Bit 6 PSW.6 AC Bit 5 PSW.5 F0 Bit 4 PSW.4 RS1 Bit 3 PSW.3 RS0 Bit 2 PSW.2 OV Bit 1 PSW.1 - Bit 0 PSW.0 P Figura 1.13: Resgistros bit a bit do PSW CY - Carry É um indicador de ”vai um”em operações aritméticas: vai para 1 quando uma soma com A ”estoura”na sua capacidade (isto é, o sétimo bit ou ACC.7 vai um para uma próxima casa que não existe; seria um nono bit, que é um ”estouro”da conta). Vai para ”1”se existir um empréstimo do 7 bit no caso de uma subtração com o acumulador. Por exemplo: Se ACC=FFh e após isto aparece a instrução: acc A,#01h: A soma de FFh com 01h fará com que o resultado de A seja 00h e ”vai 1”para o carry, isto é,”CY”é setado no registrador PSW. O carry ”CY”também é utilizado como se fosse o ”acumulador para um só bit”. Existem várias instruções booleanas que usam o ”C”, isto é, o carry, como operando, em que se posiciona o resultado das operações. Por exemplo: anl C,ACC.0: Executa um AND booleano entre o carry e o bit ACC.0. O resultado da operação fica em ”C”(ele é equivalente ao acumulador para operação com bytes), isto é, o resultado volta para ele mesmo. AC - Auxiliary Carry É um indicador de ”vai um”entre os quatro primeiros bit do acumulador, isto é, é o ”vai um”de um ”nible”para outro ”nible”do acumulador. Isto é muito útil em aritmética BCD em que os nibbles que correspodem a 4 bits são representados por um número codificado em binário, mas que representa um decimal de 0 a 9. Flag 0 É um bit registrador de uso geral, não tem nenhuma função especial e não indica nada.(literalmente ”sobrou”dentro do PSW, sem função) RS1 e RS0 São dois bits que fazem mudar o banco de registradores a que se referem os nomes R0 a R7, utilizados nas instruções que trabalham com esses registradores (por ex.: mov A,R0 = move para o ”A”o conteúdo de ”R0”; mas qual R0? Os bits RS0 e RS1 é que dizem a qual R0 de qual banco está se referindo).Vejamos na tabela 1.4 RS1 0 0 1 1 RS0 0 1 0 1 BANCO Banco 0 Banco 1 Banco 2 Banco 3 Tabela 1.4: Seleção do banco de registradores pelos bit do PSW Quando se dá o reset da máquina, ele aponta para o banco 0, isto é, as instruções que se referirem a R0,R1,. . .R7 estão se referindo ao ”Rn”do banco O. Podemos utilizar a mudança de bancos e usar os mesmos apelidos de R0 a R7 para o outro banco, ou usar o endereço absoluto de cada registrador. Em geral, deixa-se que o microcontrolador aponte para o banco 0 direto e os outros registradores utilizam os endereços absolutos deles, só para não ter i trabalho de mudar toda hora de banco. Isto depende do gosto do programador.Quando se ”reseta”a máquina, os bits RS1 e RS0 ficam em 00h, isto é, estão se referindo ao banco 0. Página 31 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi OV É um bit que vai para 1 quando, após um adição ou subtração, acontece um ”estouro”da conta. Resultados maiores que +127 ou menores que -128 ”setarão”o bit ”OV”. Paor exemplo: 0F +7F 8E ⇒ ⇒ e ”OV” +15 +127 +142 Note que 8E é -116, que não é a resposta desejada +142, por isto OV é setado. PSW.1 Não é um bit disponı́vel ao usuário. P - Parity Bit que é ”setado”em ”1”quando a paridade do conteúdo do acumulador é par. Por exemplo, seja A, contendo os seguintes dados: Observação: Paridade é o resultado par ou ı́mpar do somatório binário do acumulador. A= N de ”1s” 1001 = Ímpar 1110 −→ P=1 A= N de ”1s” 1001 = Ímpar 1111 −→ P=0 É útil quando se trabalha com o canal serial, pois ele muitas vezes necessita desta informação. Outra maneira de saber se P é ”1”ou ”0”, é pensar que a soma dos bits ”1”do acumulador mais o ”P”tem sempre que ser par. 1.5.6 Tempo para Atendimento das Interrupções Um certo tempo decorrerá entre o reconhecimento da interrupção, alterações nos registros internos e efetivo desvio para o endereço. O melhor caso ocorre quando uma interrupção chega pouco antes dos últimos 14 perı́odos de clock, que correspondam ao final da instrução; a próxima instrução não seja multiplicação ou divisão; e temois mais 24 perı́odos de clock para a chamada da sub-rotina. Estes tempos incorrem em atraso de 38 perı́odos de clock ou 3.2 µs para um clock de 12 MHz. O pior caso ocorre se a interrupção chegar após os 14 últimos perı́odos da instrução em vigor, e se a próxima instrução for multiplicação ou divisão, que consomem 48 perı́odos de clock, que resulta num atraso de 86 perı́odos, ou 7.2 µs para clock de 12 MHz. 1.5.7 Ajuste das Interrupções Externas para serem Ativas em Nı́vel ou Transição Podemos ajustar as interrupções externas para serem detectadas por transição de 1 para 0, ou pelo nı́vel 0. Os bits de controle das interrupções externas estão no registro TCON (Controle do Timer), e os que nos interessam são os quadro bits menos significativos. Bit 7 ... IE1 IT1 IE0 Bit 0 IT0 Figura 1.14: Resgistro TCON com os bits relevantes às interrupções IT0 - Interrupção Externa 0 (INT0\) : Localizado no bit 0 do TCON, indica qual o processo para a chamada da interrupção INT0\ será aceita na transição de 1 para 0 do nı́vel pino, devendo permanecer em 0 por pelo menos 12 perı́odos de clock. Se em nı́vel 0, INT0\ será aceita apenas pelo nı́vel 0 presente no pino. Página 32 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi IE0 - Habilitação da Interrupção Externa 0 (INT0\): Bit para o hardware de controle da interrupção INT0\, localiza-se no bit 1. Este bit é setado pelo Hardware interno quando for detectada uma transição de 1 para 0 no pino INT0\. Tem por função sinalizar internamente o pedido da interrupção. É resetado logo que a interrupção seja atendida. IT1 - Interrupção Externa 1 (INT1\) : Localizado no bit 2 do TCON, indica qual o processo para a chamada da interrupção INT1\ será aceita na transição de 1 para 0 do nı́vel pino, devendo permanecer em 0 por pelo menos 12 perı́odos de clock. Se em nı́vel 0, INT1\ será aceita apenas pelo nı́vel 0 presente no pino. IE1 - Habilitação da Interrupção Externa 1 (INT1\): Bit para o hardware de controle da interrupção INT1\, localiza-se no bit 3. Este bit é setado pelo Hardware interno quando for detectada uma transição de 1 para 0 no pino INT1\. Tem por função sinalizar internamente o pedido da interrupção. É resetado logo que a interrupção seja atendida. Como vimos, se a interrupção for ativa pela transição, é a esta que a CPU deverá detectar para atender à interrupção, por isso temos que esperar um perı́odo de 12 ciclos de clock, porque na amostragem anterior, a CPU detectou nı́vel 1 e agora devemos esperar que a mesma detecte o nı́vel 0. Já na detecção por nı́vel, a entrada deverá estar em nı́vel 0, apenas durante a amostragem que ocorre ao fim de cada instrução executada. O interessante é que neste caso, o pino pode permanecer em nı́vel 0 durante a execução da rotina de interrupção, mas deve estar em nı́vel 1 ao fim desta, senão o sistema atenderá novamente à interrupção, visto que na amostragem da última instrução da rotina, encontrará este pino em nı́vel adequado para a interrupção, o que não ocorre no caso anterior, pois lá a CPU deve sentir a TRANSIÇÃO do nı́vel 1 para o O. 1.5.8 Hardware para expandir as possibilidade de Interrupção Externa Na figura 1.15, temos uma porta AND de 8 entradas na qual todas as NOVAS 8 entradas de interrupção estarão ligadas. Estas 8 entradas também estão ligadas a um lacth, por exemplo o 74LS374. A saı́da desta porta será ligada diretamente ao pino de interrupção externa INT0\, por exemplo, e também a um inversor, e daı́ ao ”gate”do lacth, e as saı́das do lacth estão ligadas à porta P1. Caso ocorra uma transição de 1 para 0 na porta AND, teremos sua saı́da indo para o nı́vel 0 também, ocasionando o pedido de interrupção e ”travando”o estado dos pinos I1 a I8 no lacth.cc No momento do atendimento da interrupção, o valor a ser lido na porta P1 conterá o estado dos bits que geraram a interrupção, e uma rotina verificará qual bit está em 0. Este bit é responsável pelo pedido de interrupção, e basta ao Software encarregar-se de executar a rotina apropriada. Página 33 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi +Vcc I8 7430 INT0\ I1 8051 D0 D1 D2 D3 D4 D5 D6 D7 Q0 Q1 74LS374 Q2 Q3 Q4 Q5 Q6 Q7 P1.0 P1.7 Figura 1.15: Detalhe do Hardware para expandir o número de interrupções. 1.5.9 Exercı́cios Resolvidos Questão 1 No microcontrolador da famı́lia 8051, programar as palavras IE (Interrupt Enable), IP (Interrupt Priority) e TCON (Timer Control) de modo a: a)INT1\ seja habilitado na máxima prioridade. b)Timer/Counter1 seja habilitado em segunda prioridade. c)INT0\ seja habilitado na terceira prioridade. d)Serial e Timer/Counter0 não habilitadas. Passo a):Interrupções liberadas pela palavra IE INT0,INT1 e Timer1 liberados Bit EA - Enable All ligado Timer0 e Serial desativadas EA 1 0 0 ES 0 ET1 1 EX1 1 ET0 0 EX0 1 Assim carrega-se o valor 8Dh para a palavra IE através do seguinte comando: MOV IE,8Dh Pbsso b):Prioridade programadas pela palavra IP INT1 e Timer1: alta prioridade INT0: baixa prioridade Página 34 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi - - - PS X PT1 1 PX1 1 PT0 X PX0 0 Questão 2 Obter a outra representação do endereço do bit 5Dh? (Ver tabela 1.2) Solução: •Transformar o endereço do bit de hexadecimal para decimal 5 ∗ 16 1 + 13 ∗ 160 = 9310 •Dividir o valor do endereço em decimal (93 10 ) por 8 → 93/8, obtendo o quociente q=11 10 e o resto r=510 •Transformar o quociente (q) e o resto (r) em hexadecimal: q=11 10 =Bh e r=510 =5h. •Aplicar a fórmula: 5Dh = [20h+Bh]h.5=2Bh.5, ou seja, o endereço do bit 5 é igual a 2Bh.5. Para transformar o endereço de um bit da representação 2Xh.Y para ZWh(2Xh.Y−→ZWh),basta seguir o procedimento: •Obter o quociente e o resto. O quociente (q) é obtido subtraindo 2Xh de 20h e transformando-o em decimal, e o resto é obtido através do número após o ponto (.) de tal representação. Multiplicando o quociente em decimal por 8 e somando com o resto em decimal, obtém-se o endereço em decimal. O valor do endereço em decimal deve ser transformado para hexadecimal. Questão 3 Obter a outra representação do endereço do bit 2Ah.3? (Ver tabela 1.2) •Obter o quociente (q) e o resto (r): q= 2Ah - 20h = Ah e r=3h. •Transformar q e r de hexadecimal para decimal: q=Ah = 1010 e r 3h = 310 •Multiplicar o quociente por 8 e somar o resultado com o resto em decimal: 10*8+3=83 10 •Transformar o endereço de decimal para hexadecimal: 83 10 = 5 ∗ 161 + 3 ∗ 160 =53h Questão 4 Defina o tipo de endereçamento de cada uma das instruções dadas a seguir: a)ADDC A,20h Resposta: Endereçamento direto. b)MOV @R0,55h Resposta: Endereçamento combinado (misto), formado pelos endereçamentos direto e indireto ou indexados por registrador. c)MOV R7,6Ah Resposta: Endereçamento indireto, pois R7 (Rn) é um registrador indexado (mnemônico). Questão 6 Crie um programa que faça a operação OR-Exclusivo entre o conteúdo do acumulador (A) e a constante 33h. O resultado deve ser armazenado no conteúdo do registrador R5 do segundo banco de registradores. Resposta: XRL A,#33h (A)←−(A)or-ex #33h MOV PSW,#08h (PSW)←−#08h=#00001000 =⇒ (RS1)=0 e (RS0)=1=⇒ define o segundo banco de registradores (B1). MOV R5,A Armazena, no conteúdo do registrador R5 do segundo banco de registradores, o conteúdo do acumulador A. Página 35 Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi 1.5.10 Conjunto de Instruções Instruções Aritméticas Mnemônico ADD A,Rn Opcode Função SUBB A,#DADO INC A INC Rn Soma o conteúdo de Rn ao acumulador Soma o conteúdo da posição de memória ao acumulador Soma o conteúdo da RAM endereçada por Ri ao acumulador Soma o dado ao acumulador Soma o conteúdo de Rn e o carry ao acumulador Soma o conteúdo da posição de memória e o carry o acumulador Soma o conteúdo da RAM endereçada por Ri e o carry ao acumulador Soma o dado e o carry ao acumulador Subtrai o conteúdo de Rn e o Borrow do acumulador Subtrai o conteúdo da posição de memória e o Borrow do acumulador Subtrai o conteúdo da RAM endereçada por Ri e o Borrow do acumulador Subtrai o dado e o Borrow do acumulador Soma 1 ao acumulador Soma 1 ao conteúdo de Rn INC DIRETO INC @Ri Soma 1 á posição de memória Soma 1 á RAM endereçada por Ri DEC A DEC Rn Subtrai 1 do acumulador Subtrai 1 do conteúdo de Rn DEC DIRETO DEC @Ri Subtrai 1 da posição de memória Subtrai 1 da RAM endereçada por Ri Soma 1 ao registrador DPTR Multiplica A e B resultado: BA Divide A e B resultado: A inteiro B resto Ajuste decimal do acumulador ADD A,Direto ADD A,@Ri ADD A,DADO ADDC A,Rn ADDC A,DIRETO ADDC A,@Ri ADDC A,#DADO SUBB A,Rn SUBB A,DIRETO SUBB A,@Ri INC DPTR MUL AB DIC AB DA A Bytes Clocks Flags Afetados B 1 12 CY ? H 2 12 ? ? ? 0010/011iB 1 12 ? ? ? 24 0011/1 abc 35 H B 2 1 12 12 ? ? ? ? ? ? H 2 12 ? ? ? 0011/011iB 1 12 ? ? ? 34 H 2 12 ? ? ? 1001/1 abc 95 B 1 12 ? ? ? H 2 12 ? ? ? 1001/011iB 1 12 ? ? ? 94 H 2 12 ? ? ? 04 H 0000/1 B abc 05 H 0000/011 B i 14 H 0001/1 B abc 15 H 0001/011 B i A3 H A4 H 84 H 1 1 12 12 - - - 2 1 12 12 - - - 1 1 12 12 - - - 2 1 12 12 - - - 1 1 1 24 48 48 0 0 ? ? 0 1 12 ? ? - 0010/1 abc 25 D4 Página 36 H AC ? OV ? Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Operações Lógicas Mnemônico Opcode Função ANL A,Rn ”e”entre registro e acumulador ANL A,DIRETO ANL A,@Ri ”e”entre memória e acumulador ”e”entre RAM indireta e acumulador ”e”entre dado e acumulador ”e”entre acumulador e memória. Resultado na memória ”e”entre dado e memória ANL A,#DADO ANL DIRETO,A ANL DIRETO,#DADO ORL A,Rn ORL A,DIRETO ORL A,@Ri ORL A,#DADO ORL DIRETO,A ORL DIRETO,#DADO XRL A,Rn XRL A,Direto XRL A,@Ri XRL A,#DADO XRL DIRETO,A XRL DIRETO,#DADO CRL A CPL A RL A RL C RR A RRC A SWAP A ”ou”entre registro e acumulador ”ou”entre memória e acumulador ”ou”entre RAM indireta e acumulador ”ou”entre DADO e acumulador ”ou”entre acumulador e memória. Resultado na memória ”ou”entre DADO e memória ”ou exclusivo”entre registro e acumulador ”ou exclusivo”entre memória e acumulador ”ou exclusivo”? entre RAM indireta e acumulador ”ou exclusivo”entre dado e acumulador ”ou exclusivo”entre acumulador e memória. Resultado na memória ”ou exclusivo”entre dado e memória Faz A = 0 Inverte o estado dos bits do acumulador Desloca o acumulador à esquerda Desloca o acumulador à esquerda através do carry Desloca acumulador à direita Desloca acumulador à direta através do carry Troca os nibbles do acumulador. Equivale a 4 RR A ou 4 RL A Bytes Clocks Flags Afetados 0101/1 B abc 55 H 0101/011iB 1 12 CY - 2 1 12 12 - - - 54 52 H H 2 2 12 12 - - - 53 H 3 12 - - - 0100/1 B abc 45 H 0100/011iB 1 12 - - - 2 1 12 12 - - - 44 42 H H 2 2 12 12 - - - 43 H 3 12 - - - 0110/1 abc 65 B 1 12 - - - H 2 12 - - - 0110/011iB 1 12 - - - 64 H 2 12 - - - 62 H 2 12 - - - 63 H 3 12 - - - E4 F4 H H 1 1 12 12 - - - 23 33 H H 1 1 12 12 ? - - 03 13 H H 1 1 12 12 ? - - C4 H 1 12 - - - Página 37 AC - OV - Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Operações de Transferência de Dados Mnemônico Opcode Função MOV A,Rn Move o registro para o acumulador MOV A,Direto MOV A,@Ri MOV A,#DADO MOV Rn,A Move memória para o acumulador Move RAM endereçada por Ri ao acumulador Move o dado para o acumulador Move o acumulador para o registro MOV Rn,Direto Move memória para o registro MOV Rn,#DADO MOV Direto,A MOV Direto,Rn Move o dado para o registro MOV Direto1,Direto2 MOV Direto,@Ri MOV Direto,#DADO MOV @Ri,A MOV @Ri,Direto Move acumulador para a memória Move o registro para a memória Mova o conteúdo da memória Direta2 para Direta1 Move RAM endereçada por Ri para a memória Move o dado para a memória Move o acumulador para a RAM endereçada por Ri Move a memória para a RAM endereçada por Ri Move o dado para a RAM indireta MOV @Ri,#DADO MOV Move dado de 16 bits para o DPTR DPTR,#DADO16 MOVC A, @A + Soma A + DPTR obtendo um enDPTR dereço de 16 bits na memória de programa. Carrega acumulador com esta memória MOVC A, Idem ao anterior, mas soma A + PC @A+PC MOVX A,@Ri Move RAM externa (End. 8 bits) para o acumulador MOVX A, Move RAM externa (End. 16 bits) @DPTR para o acumulador MOVX @Ri, A Move o acumulador para a RAM externa (End. 8 bits) MOVX @DPTR, Move o acumulador para a RAM exA terna (End. 16 bits) 1110/1 B abc E5 H 1110/0111B Bytes Clocks Flags Afetados CY AC OV 1 12 - - - 2 1 12 12 - - - H B 2 1 12 12 - - - B 2 24 - - - B 2 12 - - - H B 2 2 12 24 - - - H 3 24 - - - 1000/011iB 2 24 - - - 75 H 3 24 - - - 1111/011iB 1 12 - - - 1010/011iB 2 24 - - - 0111/011iB 2 12 - - - 90 H 3 24 - - - 93 H 1 24 - - - 83 H 1 24 - - - 1110/001iB 1 24 - - - E0 H 1 24 - - - 1111/001iB 1 24 - - - F0 1 24 - - - 74 1111/1 abc 1010/1 abc 0111/1 abc F5 1000/1 abc 85 OBS: Continua na próxima página . . . Página 38 H Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Mnemônico PUSH Direto POP Direto XCH A,Rn XCH A,Direto XCH A,@Ri XCHD A,@Ri Opcode Função Incrementa o SP e então coloca a memória no stack Retira dado do stack e coloca na memória, depois decrementa SP Troca entre si o conteúdo do acumulador e do registro Troca memória com acumulador Troca RAM indireta com acumulador Troca nibble menos significativo do acumulador e da RAM indireta entre si Bytes Clocks Flags Afetados C0 H 2 24 CY - AC - OV - D0 H 2 24 - - - 1100/1 B abc C5 H 1100/011iB 1 12 - - - 2 1 12 12 - - - 1101/011iB 1 12 - - - Opcode Bytes Clocks Instruções para Variáveis Booleanas Mnemônico CLR C CLR bit SETB C SETB bit CPL C CPL bit ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit MOV C,bit MOV bit,C JC rel JNC rel JB bit,rel JNB bit,rel JBC bit,rel Função Zera o Carry Zera o bit endereçado Seta o carry Seta o bit endereçado Inverte o estado do carry Inverte o estado do bit endereçado ”e”entre o bit endereçado e o carry ”e”entre o complemento do bit endereçado e o carry ”ou”entre o bit endereçado e carry ”ou”entre o complemento do bit endereçado e o carry Move o bit endereçado para o carry Move o carry para o bit endereçado Desvia se o carry estiver setado Desvia se o carry estiver zerado Desvia se o bit endereçado estiver setado Desvia se o bit endereçado estiver zerado Desvia se o bit endereçado estiver setado e depois zera o bit Flags Afetados C3 C2 D3 D2 B3 B2 82 B0 H H H H H H H H 1 2 1 2 1 2 2 2 12 12 12 12 12 12 24 24 CY 0 1 ? ? ? 72 A0 H H 2 2 24 24 ? ? - - A2 92 40 50 20 H H H H H 2 2 2 2 3 12 24 24 24 24 ? - - - 30 H 3 24 - - - 10 H 3 24 - - - Página 39 AC - OV - Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi Instruções de Desvio Mnemônico ACALL END11 LCALL END16 RET RETI AJMP END11 LJMP END16 SJMP rel JMP @A + DPTR JZ rel JNZ rel CJNE A,Direto, rel CJNE A,#Dado,rel CJNE Rn,#Dado,rel CJNE @Ri,#Dado, rel DJNZ Rn, rel DJNZ Direto, rel NOP Opcode Função Chama sub-rotina numa faixa de 2kbytes da atual posição Chama sub-rotina em qualquer posição da memória de programa Retorne da sub-rotina Retorne da interrupção Desvia para outro endereço numa faixa de 2kbytes da atual posição Desvia para qualquer posição da memória de programa Desvio curto relativo Desvia para o endereço obtido da soma do acumulador e do DPTR Desvia se o acumulador for zero Desvia se o acumulador não for zero Compara e desvia se o acumulador for diferente da memória endereçada Compara e desvia se o acumulador for diferente do dado Compara e desvia se o registro for diferente do dado Compara e desvia se a RAM indireta for diferente do dado Decrementa o registro e desvia se for diferente de zero Decrementa a memória e desvia se for diferente de zero Nenhuma Operação Bytes Clocks Flags Afetados - - 2 24 CY - AC - OV - 12 H 3 24 - - - 22 32 - H H - 1 1 2 24 24 24 - - - 02 H 3 24 - - - 80 73 H H 2 1 24 24 - - - 60 70 B5 H H H 2 2 3 24 24 24 ? - - B4 H 3 24 ? - - 1011/1 B abc 1011/011iB 3 24 ? - - 3 24 ? - - 1101/1 abc D5 B 2 24 - - - H 3 24 - - - 00 H 1 12 - - - Página 40 Capı́tulo 2 Segunda Unidade Dispositivos do 8051 2.1 Ciclos de Máquina Como vimos na unidade passada o clock é o relógio interno do microprocessador para a execução sequencial de qualquer atividade interna ou externa à máquina, ou seja, é o elemento que gera e controla os ciclos de trabalho da máquina. Cada ciclo de oscilação chamaremos de ”P”de pulso. A cada dois pulsos ”P”caracteriza-se um estado ”S”. Uma sequência de seis estados, S1 a S6, corresponde a um ciclo de máquina. Todas as atividades internas e externas do microprocessador são comandadas por esses pulsos e seus seis estados. Um ciclo de máquina se constitui de seis estados (S1 a S6) que, por sua vez, correspondem a doze pulsos P do ”clock”. 1 Ciclo de Maquina Estados S1 P1 S2 P2 1 Estado P1 S3 P2 P1 S4 P2 P1 S5 P2 P1 S6 P2 2 Pulsos P1 P2 X Figura 2.1: Ilustração de um ciclo de máquina do MSC8051 Por exemplo, o instante marcado como ”X”na figura é o ”S6P1”. Assim podemos ter um linguagem comum de definição de instantes de um ciclo de máquina. Cada pulso P1 depende da frequência do clock. Por exemplo, se o circuito oscilador for a cristal de 12MHz, teremos um ciclo de máquina = 12 x (Perı́odo de Clock) = 12 x (1/12*10 6 )= 1µs. Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi 2.2 Portas de I/O Temos no 8051 quatro grupos de saı́das denominados de PORTS, são eles P0,P1,P2 3 P3, comforme a versãoo do 8051 utilizado. No 8051 (ROM Interna) temos todos os quatro ports disponı́veis; no 8031 (EPROM Externa) só temos os ports P1 e P3 disponı́veis como ”I/O”. Cada port tem oito linhas que podem ser programadas como entrada ou como saı́da, ou trabalhar com os periféricos internos. 2.2.1 Princı́pio de Funcionamento e Utilização O uso das linha de I/O é simples e necessita apenas de que escrevamos o valor desejado (na caso de utilização como saı́da), ou efetuarmos a leitura (no caso de entrada). Se o dado presente numa porta configurada como entrada variar, a variação não será sentida pelo sistema, até que efetuemos uma nova leitura dessa entrada. Isto ocorre porque cada linha é, na realidade, um Buffer tri-state de um bit. Já no caso da escrita, temos associado a esta linha um flip-flop D (latch) de um bit. Na figura 2.2, temos um esquema simplificado de um bit de I/O, que nos ajudará a compreender o funcionamento da porta. Os circuitos reais são ligeramente diferentes para cada uma das portas, e mais complexos do que o apresentado aqui, mas para fins ditáticos e de entendimento este diagrama básico é suficiente. LE LATCH VIA DE DADOS INTERNA ESCREVE D CLK Q + Q PINO LE PINO Figura 2.2: Diagrama em blocos simplificado de um pino de I/O Quando escrevemos um bit na porta, o mesmo vai pela via interna até a entrada D do flip-flop, e então um pulso de clock em CLK coloca este bit em Q, que através da eletrônica associada leva este nı́vel ao pino externo. Já no caso da leitura, algumas instruções lêem o pino enquanto outras lêem o estado do latch, em Q. As instruções que lêem o latch são aquelas que costumam ler, modificar e reescrever o bit, a saber : INC, DEC, CPL, JBC, DJNZ, ANL, ORL, XRL, MOV Px.n,C, CLR Px.n e ainda SETB Px.n, conforme vimos na unidade anterior. As demais instruções de acesso aos ports lêem o estado presente nos pinos. E dai, qual a diferença então? Vamos supor que temos a base de um transistor NPN sendo acionada pelo pino de I/O. Quando escrevemos 1 neste pino o transistor entrará em condução, e se a CPU ler o estado deste pino para eventual confirmação, lerá a tensão na base do transistor e interpretará como nı́vel ZERO, então neste Página 42 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi caso deve ser lido o valor de latch, que estará corretamente indicando nı́vel UM. Um exemplo simples de conexão das linhas seria um sistema que em função de um certo bit, por exemplo o bit 5 da porta 3 (escrito como P3.5), fará com que os leds colocados nos 8 pinos da porta 1 sejam acesos sequencialmente, conforme o estado daquele bit. Na figura 2.3, temos um diagrama simples para este exemplo, e a seguir o Software simbólico para esta função. Página 43 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi + + + P1.0 P1.1 8051 P1.7 + P3.5 Figura 2.3: Exemplo simples de utilização SOFTWARE SIMBÓLICO Inicio: Faz acumulador = 00000001 binário Lebit: Se P3.5 = 0 então roda acumulador à esquerda (coloca o bit D0 em D1, e assim por diante, até colocar o bit D7 em D0). move acumulador para a porta 1 perde um tempo volta para ”lebit” Senão (só pode ser P3.5 =1) roda acumulador à direita (coloca o bit D7 em D6, e assim por diante, até colocar o bit D0 em D7). move acumulador para a porta 1 perde um tempo volta para ”lebit” Página 44 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Port P0 O P0 é uma estrutura de port bidirecional. Um certo pino ”i”do port Po é tomado como ilustração. O barramento interno do MC é utilizado para ler/escrever no latch interno, ou ler o pino fı́sico ”P0.i”em questão. Quando se utiliza uma instrução que ”escreve”um valor no Port P0.i, o dado se apresenta na entrada D do flip-flop. Um pulso de ”escreve”(o ”CLK”do flip-flop) é imposto no fli-flop, que transfere esse dados às saı́das ”Q”e ”Q”do latch. O sinal de ”controle”atua para permitir que esse dado saia fisicamente no pino P0.i. Este sinal de controle simboliza o gerenciamento que esse port tem para apresentar o dado fisicamente à saı́da. Existem instruções que lêem o conteúdo armazenado no latch. Existem instruções que lêem o estado diretamente do pino. Em geral, as instruções que ”lêem o latch”são do tipo ”READ-MODIFY-WRITE”, isto é, lê o conteúdo do latch, modifica conforme a instrução imposta e escreve de novo no latch. São as instruções INC, DEC, CPL, JBC, DJNZ, ANL, ORL e XRL. Quando P0 é usado como port, é como se ele fosse ”dreno aberto”, isto é, devemos utilizar resistores de ”Pull-Up”nesses pinos para podermos excitar devidamente o ambiente externo ao MC. Quando ele é usado apenas para controle de memória externa, esses resistores não são necessários, e neste caso o port P0 é visto como um port ”Tri-State”. O port P0 é multiplexado entre ”dados”e ”endereços”quando gerencia memória externa e, então, utiliza o pino ALE para captar o endereço em um latch externo ao MC. Port P1 Para finalizar este item, basta dizer que as possibilidades de uso destas linha de I/O são praticamente ilimitadas, ficando a cargo do projestista desenvolver novas aplicações para tal. Os ports 1,2 e 3 possuem pull-ups internos e são chamadas de quase bidirecionais. Esta caracterı́sticas faz com que seus pinos tenham sempre um estado definido, ou seja, 0 ou 1, de forma que mesmo quando as usamos como entrada, podemos medir seu nı́vel como se fosse de saı́da. Os ports P1 e P3 podem ser configurados, pino a pino (bit a bit), ou totalmente (byte) como entrada ou saı́da. Não se pode esquecer que o port P3 é utı́lizado como meio de comunicação externa entre os periféricos ”Timers”e ”Serial”e então os pı́nos só estarão disponı́veis para I/0, dependendo de utilizar ou não os periféricos desse Mc. O port 0 não possui estas caracterı́sticas, e quando configurada como entrada, terá seu nı́vel flutuando na ausência de nı́vel fixo no pino. Entretanto, para todos os efeitos de uso, podemos considerar as portas como simples portas de I/O bidirecionais como veremos a seguir. 2.2.2 Caracterı́sticas Gerais e de Tempo dos Ports Instruções que Alteram diretamente o Conteúdo dos Ports É necessário ter cuidado com as instruções do tipo ”Read-Modify-Wrı̀te”citadas neste item, quando são manipuladas diretamente com os ports. Por exemplo, a operação: orl P1,#11111110b ; vai executar a leitura do Port P1 pelo ”latch”, vai operar a instrução ”OR”com o dado e devolver o resultado em P1. Se a intenção é só realizar uma ”máscara”para ler o bit ”P1.0”, esta instrução está sendo mal aplicada, pois ela, além de realizar a máscara, pos valor ”1”em todos os outros bits do port P1, alterando seus valores originais! Página 45 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Assim, se queremos só uma ”máscara”, devemos operar ”fora de P1”, isto é: mov A,Pi ;lê P1 e carrega em A orl A,11111110b ;faz a ”máscara”sem alterar P1 Esta e outras instruções abaixo listadas correm este ”perigo”de utilização e precisamos saber exatamente o que queremos antes de aplicá-las direto aos ports: Instrução e Forma Básica INC DEC CPL JBC DJNZ ANL ORL XRL Funçâo Exemplo INC P1 DEC P3 CPL P1 JBC P1.0,#XX DJNZ P1,#XX ANL PO,A ORL PO,A XRL P1,#XX Tabela 2.1: Instruções que afetam diretamente os ports quando aplicadas junto a eles. Condições de Tempo Envolvendo os Ports Cada pino do port é amostrado perto da ”descida”do pulso ”ALE”no instante de leitura de instrução, entre o perı́odo S5 do ciclo de máquina. É possı́vel que, se o pino, neste instante, estiver em transição, o Mc possa ler dado errado. Quando se ”escreve”um dado no latch do pino do port, ele já aparece efetivamente na saı́da do latch durante o perı́odo S6P2 do último ciclo de máquina necessário para finalização da referida instrução. Assim, só aparecerá fisicamente no pino, no instante S1P1 do próximo ciclo de máquina. Observe que só se pode ler com confiabilidade um dado no pino do port que fique presente por tempo acima de 1 valor de ”S”(com clock de 12 MHz teremos → perı́odo S ¿ 1 µs ou genericamente, perı́odo maior que 1 ciclo de máquina). 2.2.3 Uso das Portas de I/O para a Expansão da Memória de Dados e Programa As portas 0 e 2 possuem como função alternativa, endereçar memória extema, para que possamos expandir a capacidade de dados e de programas no 8051. Neste caso, a porta 2 fornece a parte alta do endereço (A8-A15) e a porta 0 fornece, multiplexada no tempo, a parte baixa de endereço (AO-A7) e a via de dados (DO-D7). 0 pino 30 fornece o sinal ALE, que habilitará o latch de endereços a segurar a parte baixa do mesmo, para que os dados possam transitar peia porta 0. Os outros sinais de controle são o PSEN\, o RD\ e o WR\. 0 sinal PSEN\ habilita a saı́da da memória de programa (permite a (eitura na Eprom externa) de forma que é ativo quando a CPU deseja ler programa da memória externa. Neste instante, os sinaı́s RD\ e WR\ estão em nı́vel 1. Os sinais RD\ e WR\ somente são ativos caso a CPU execute instruções de leitura e escrita na memória de dados externa (lembre-se de que as instruções para memória externa são diferentes das instrúções para memória interna). Temos então, que para leitura o pino RD\ irá a nı́vel 0, mantendo o pino WR\ = 1, e vice-versa para escrita. LEMBRETE: OS SINAIS RD\ E WR\ S ÃO GERADOS ATRAVÉS DE PINOS DA PORTA 3 CONFORME VEREMOS NO ITEM 2.2.5 Página 46 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi 2.2.4 Seleção de Programa Externo ou Interno O pino 31 tem a função EA\ (extemal address) e quando em nı́vel 1 diz à CPU para procuraros primeiros 4 KBytes de programa intemamente, e o que exceder esta memória será procurado extemamente. Quando em nı́vel 0, informa à CPU que deve procurar todos os passos de programa externamente, ignorando a memória interna. OBSERVAÇÃO: Não confundir este pino com o bit EA, presente no registro IE. Esta é a opção utilizada quando se usa o 8031, que é um 8051 mas que não tem a ROM interna, ou quando não se deseja arcar com as despesas de encomendar grande quantidade de peças do 8051 gravadas em fábrica. DEVE FICAR CLARO QUE QUANDO SE UTILIZA MEM ÓRIA EXTERNA DE PROGRAMAS, EM QUALQUER OPÇÃO NÃO PODEREMOS MAIS UTILIZAR OS PINOS DAS PORTAS 0 E 2 COMO I/0. Na figura 2.4, temos um esquema de Hardware onde colocamos 8 KBytes de programa e 8 KBytes de dados externos, sendo que neste caso, temos toda a memória de programa externa, utilizando 0 8031. RD\ 1 0 1 0 WR\ 1 1 0 0 Função Espera Lendo na RAM Escrevendo na RAM Não ocorre Tabela 2.2: Tabela de Acesso à RAM. Figura 2.4: Seleção Externa 2.2.5 Uso dos Pinos da Porta 3 como funções Alternativas A porta 3, conformejá foi visto, pode ter seus pinos usados de forma independente como pinos de funções especiais. Por exemplo, para a expansão de memória de dados vista acima, são dois pinos da porta 3 que fomecem os sinais RD\ e WR\ para controle. Quando usamos os temporizadores internos como contadores de eventos, são outros dois pinos desta porta que servem como entrada para o sinal de contagem. Se nosso projeto necessitar de interrupção extema, será através de dois pinos desta porta que as mesmas serão sinalizadas à CPU. E finalmente, nos dois pinos restantes, temos os que permitem a implementação do canal serial. A maneira pela qual utilizamos ou não uma função especial da porta 3, será vista no momento em que a estudarmos o canal serial. Com relação aos pinos RD\ e WR\ são os únicos com os quais não precisamos nos preocupar, pois seu controle é efetuado pela CPU, e fica claro que se desejamos utilizar memória de dados externa, não utilizaremos estes pinos como I/0. CASO QUALQUER UMA DAS FUNÇÕES ESPECIAIS ESTEJA SENDO UTILIZADA, NÃO PODEREMOS MAIS ACESSAR A PORTA 3 COMO PORTA DE I/0 PARA BYTE, APENAS COMO BIT ENDEREÇÁVEL. Página 47 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi 2.2.6 Capacidade de Corrente nos Pinos de I/O A porta 0, devido às suas caracterı́sticas de construção de dreno aberto (open-drain), pode fomecer ou absorver 2 cargas TTL, e as portas 1, 2 e 3 podem absorver ou suprir uma carga TTL. 2.3 Modos de Endereçamento das Instruções As instruções operam com dados que podem ser endereçados de várias formas, motivo pelo qual devemos saber muito bem os modos de endereçamento que o microprocessador aceita. No caso da famı́lia 8051/52, etc, dispõe-se dos seguintes modos: 1.Registrador 2.Direto 3.Indireto 4.Imediato 5.Relativo 6.Absoluto 7.Longo 8.Indexado 2.3.1 Endereçamento por Registrador As instruções do 8051, quando se referem a registradores internos do microcontrolador, apresentamse como oito registradores com nomes R0, R1, R2, R3, R4, R5, R6 e R7. 0 nome genérico destes registradores é Rn. Por exemplo: add A,RO: Soma o conteúdo de ”A”com o conteúdo de ”RO”e o resultado fica em ”A”. Não se esqueça que, neste caso, precisamos saber antes para qual banco está apontado o microcontrolador (nos bits PSW.4 e PSW.3). As instruções que trabalham com registradores, acusam-no com o nome genérico ◦ Rn”, em que ”n◦ é o registrador especı́fico (n = 0 a 7). Este tipo de instrução é codificado em apenas 1 byte. OP CODE RN 1 BYTE 2.3.2 Endereçamento Direto As instruções do 8051, que usam endereçamento direto, referem-se aos registradores internos da RAM do microprocessador pelo seu ”mnemônico”(apelido) ou seu endereço absoluto. Por exemplo: a) mov A,P3: Move para ”A◦ o conteúdo do registrador ”P3”, que é o mesmo que o port fı́sico P3. b) mov A,30h: Move para ”A”o conteúdo do registrador. interno de endereço 30h. Este tipo de instrução é codificado em 2 bytes. Página 48 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi OP CODE END. DIRETO 2 BYTE 2.3.3 Endereçamento Indireto As instruções do 8051, que usam endereçamento indireto, fazem uso de um registrador, que só pode ser o RO ou R1, para se referir a outra posição de memória RAM. Por isto que é indireto: o registrador RO ou R1 aponta para um endereço, isto é, ele contém o endereço de outra posição de memória. Utiliza-se o sı́mbolo ” ◦ para indicar que a operação é de endereço indireto. O nome genérico desse registrador indireto é Ri (i = 0 ou 1). Por exemplo: Supondo que temos na posição ”30h”da RAM interna o valor ”05”em hexa e queremos nos referir à posição 30h indiretamente pelo registrador ”R1 ”, podemos fazer (vide figura 2.5) RAM INT CONTEUDO Posicao de Memoria 05 30h MOV A,@R1 A=05 CONTEUDO R1 30 01h 00h Figura 2.5: Ilustração da operação de endereçamento indireto •mov 30h,#05h: Carrego a posı́ção da RAM interna de endereço ”30h”, com o valor ”05”(conteúdo=05). •mov R1,#30h: Carrego o registrador ”R1”com o valor ”30”(conteúdo=30h). •mov A,@Rl: Carrego ou movo para ”A”o conteúdo da memória apontada por R1,que é 30h, isto é, ele sabe que é endereço indireto. Logo, ele sabe que o valor ”30h”dentro de R1 é um endereço e não um conteúdo. Assim, ele vai na posição de memória com endereço ”30h”, pega Página 49 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi o conteúdo de ”30h”, que é ”05”, e carrega em A.Logo, A = 05 e não A = 30; entendeu? Olhando a ilustração da figura 2.5 deste item para melhor compreensão e leia este texto de novo. Este tipo de instrução é codificado em 1 byte. OP CODE Ri 1 BYTE 2.3.4 Endereçamento Imediato As instruções do 8051, quando se referem a endereçamento imediato, significam que o código da instrução já é codificado junto com uma constante, chamado ”dado imediato”. Operandos do tipo imediato são precedidos do sinal ”#”. Por exemplo: •mov A,#25: Move para A o valor 25 em decimal. •mov A,#25h: Move para A o valor 25 em hexadecimal. •mov A,#00100101b: Move para A o valor 25h em binário. •mov DPTR,#1FFFh: Move para o DPTR, o endereço ”1FFF”em hexadecimal. As instruçôes deste tipo são de 2 bytes, ou de 3 bytes quando se usa o DPTR. OP CODE VALOR IMEDIATO 1 BYTE 1 OU 2 BYTES A única exceção é a ı̀nstrução [mov DPTR,#data(16)], que é de 3 bytes, pois o endereço dela é de 2 bytes (16 bits). 2.3.5 Endereçamento Relativo As instruções do 8051, com endereçamento relativo, são utilizadas com instruções que permitem realizar um ”pulo”direto no passo cadenciado de um programa. Este endereço relativo (chamado ”offset”) é um dado de 8 bı̀ts com sı̀nal, ı̀sto é, realiza um salto relatı̀vo ao endereço que está no Program Counter, PC, de -128 a +127 posı̀ções. Este endereço relativo é lı̀gado à instrução por um outro byte. Antes de achar o endereço fı̀nal de salto, o PC é incrementado ao endereço da próxima instrução e este é o endereço ao qual se soma o endereço relativo: vide ilustração seguinte, pois a explicação verbal é muito difı́cil de absorver. Vejamos o exemplo: Página 50 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi CODIGO NA ROM 0100 0101 0102 0103 0104 0105 0106 0107 0108 ROM SJMP DESVIO= Salto pequeno para ¨ DESVIO¨ Exemplo 1: 80 DESVIO = 8003h 80 03 Endereco de DESVIO=03 Codigo do comando xx PC (Apos o inicio da instrucao SJMP 03=8003h) PC+3 OBS: Em geral, não fazemos estas contas, pois o compilador, quando usamos ”labels”(nomes) como desvio, calcula tudo isto sozinho automaticamente. As instruções deste tipo são de 2 bytes OP CODE 2.3.6 PONTO RELATIVO Endereçamento Absoluto Instruções do 8051, que se utilizam de endereço absoluto, são as ACALL e AJMP. São instruções de 2 bytes que permitem desvio de até 2 Kbytes relativo, em apenas 2 bytes (endereço total da faixa teria que ser em 3 bytes; não é?). 2.3.7 Endereçamento Longo As instruções no 8051, que usam endereçamento do tipo longo, são LCALL e LJMP. Permitem endereçamento de 16 bits que mapeia todo o espaço disponı́vel de endereços (64 Kbytes). A única desvantagem destas instruções é que elas consomem 3 bytes de programa, o que só será um problema quando o processo exigir tempo de execução muito pequeno (em que 1 µs a mais ou a menos é vital, por exemplo). Tem o problema, também, de ser um endereço absoluto que não muda; logo, se você necessita executar esse programa em outra parte do espaço de memória, deve repensar neste endereço absoluto, ou se utilizar sempre de ”labels”na criação do programa, para que, na compilação, o compilador acerte os endereços absolutos para você. Este tipo de instrução consome 3 bytes: 2.3.8 Endereçamento Indexado As instruções do 8051, que usam endereçamento do tipo indexado, são JMP ou MOVC em uma de suas formas. São instruções cujo endereço de destino depende não só do endereço inserido na instrução, mas também do conteúdo de ”A”naquele instante. É melhor explicá-los com um exemplo: jmp @A+DPTR: Salta para a posição dada pelo DPTR + conteúdo de ”A”, isto é, o ”A”pode ser um contador de passos e o DPTR um ponteiro de faixas. Supondo que: ”DPTRH = meses do ano e ”An = dias do mês. Logo, o DPTR aponta para a ucabeça”da tabela de cada mês, e em ”A”eu insiro 0 ”ı́ndice”do dia do mês desejado. Assim, se vario ”An, já estou alterando o dia daquele mês fixo, sem alterar mais o DPTR. Página 51 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi 2.4 2.4.1 Temporizadores e Contadores Introdução O 8051 tem dois registros contadores de 16 bits, denominados TIMER 0 e TIMER 1, dedicados às funções de contagem e temporização (counter/timer-contador/temporizador). Há uma importante distinção entre os conceitos de contador e temporizador. Quando opera como temporizador, o registro é incrementado a cada ciclo de máquina (usa como base o cristal da CPU). O sinal de contagem aparece com 1/12 da freqüência do clock. Quando opera como contador, o registro é incrementado de acordo com o sinal que se coloca nas entradas T1 e T0, ou seja, o contador opera a cada transição de 1 para 0 (borda de descida ↓) na entrada T0 ou T1. Deve-se ter um cuidado quando em operações em modo contador: já se sabe que as entradas são amostradas durante S5P2 de cada ciclo de máquina (figura 2.1). Quando em um ciclo de máquina a entrada é detectada em 1 e depois em 0, no próximo ciclo o contador é incrementado. O incremento acontece em S3P1 do ciclo seguinte ao que foi detectada a transição. Para garantir que o nı́vel correto tenha sido amostrado, é necessário que o sinal de entrada (o sinal que vai acionar os contadores) permaneça pelo menos um ciclo de máquina em nı́vel alto e pelo menos outro ciclo de máquina em nı́vel baixo, quer dizer, a máxima freqüência que responderá o contador é de 1/24 da freqüência de clock. O sinal de entrada pode ter qualquer ”duty cycle”, desde que se respeite a restrição antes mencionada. 2.4.2 Registros Envolvidos Dois registros SFR são utilizados para controlar as funções e operações do temporizador/contador: em TMOD especifica-se o modo de operação e em TCON controla-se a operação. A figura 2.6 ilustra o registro TMOD e a figura 2.7 ilustra o registro TCON. Página 52 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Figura 2.6: Descrição do Registro TMOD GATE → especifica como será feito o controle: se GATE = 1 → conta somente se TR1=1 e INT1=high, (idem para TR0 e INT0) se GATE = 0 → conta somente se TR1=1 (controle somente por software) (GATE especifica se INT1 será usado para controlar o funcionamento do contador/temporizador ⇒ pode ser usado para medir a largura de pulsos externos ligados a INT0 ou INT1) C/*T → seleciona modo contador ou temporizador: se C/*T = 1 modo contador (conta usando a entrada T1) se C/*T = 0 modo temporizador (conta a cada ciclo de máquina) M1 0 0 1 1 M0 0 1 0 1 → → → → → → → seleciona o modo de operação: THi é temporizador/contador de 8 bits e TLi é um pre-scaler de 5 bits, THi e TLi formam um temporizador/contador de 16 bits, contador/temporizador de 8 bits com auto-recarga (TLi conta e THi valor para recarga), TL0 contador/temporizador de 8 bits (usando TR0, *INT0 e TF0) TH0 contador/temporizador de 8 bits (usando TR1, *INT1 e TF1) TH1 e TL1 parado (mas pode operar em outros modos) Página 53 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Figura 2.7: Descrição do Registro TCON TF1 → TR1 → TF0 → TR0 → IE1 → IT1 → E0 → IT0 → flag de transbordamento (overflow) do contador/temporizador 1. Ativado por hardware quando há transbordamento no timer 1. É apagado por hardware quando o processamento é desviado para a rotina de interrupção. bit de partida/parada (run/stop) do contador/temporizador 1. flag de transbordamento (overflow) do contador/temporizador 0. Ativado por hardware quando há transbordamento no timer 0. É apagado por hardware quando o processamento é desviado para a rotina de interrupção. bit de partida/parada (run/stop) do contador/temporizador 0. flag da interrupção externa 1. Ativada por hardware quando é detectada uma interrupção. Apagado por hardware (somente se for modo borda) quando a interrupção é processada, ou seja, quando se desvia para a rotina de interrupção. indica se a interrupção externa 1 opera por borda ou por nı́vel: 1 → borda de descida (↓), 0 → nı́vel baixo. flag da interrupção externa 0. Ativada por hardware quando é detectada uma interrupção. Apagado por hardware (somente se for modo borda) quando a interrupção é processada, ou seja, quando se desvia para a rotina de interrupção. indica se a interrupção externa 0 opera por borda ou por nı́vel: 1 → borda de descida (↓), 0 → nı́vel baixo. Página 54 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi 2.4.3 Modos de operação Os dois contadores/temporizadores (timer1 e timer0) podem trabalhar em 4 modos de operação que são selecionados empregando os bits M1 e M0 do registro TMOD. Os modos 0, 1 e 2 são iguais para os 2 contadores/temporizadores mas o modo 3 é diferente. Modo 0 Este modo é idêntico para os dois contadores/temporizadores. Neste modo tem-se um contador de 8 bits com um divisor (pre-scaler) de 5 bits. Resulta então em um contador/temporizador de 13 bits, compatı́vel com o que havia no MCS-48. Os 13 bits são formados pelos 8 bits do registro THi e pelos 5 bits menos significativos do registro TLi. Os outros 3 bits do TLi são indeterminados. O transbordamento (overflow) é gerador quando a contagem faz a transição de 1FFFH para 0000; neste instante ativa-se o bit de overflow (TF1 ou TF0). A figura 2.8 apresenta um diagrama em blocos do contador/temporizador 1 operando em modo 0. A mesma figura é válida para o contador/temporizador 0. O controle da contagem é simples: •se GATE = 0, TR1 controla o contador/temporizador (controle por software) •se GATE = 1, TR1 e INT1 controlam o contador/temporizador (permite também um controle externo por hardware) Figura 2.8: Diagrama de Blocos para o TIMER 1 em MODO 0 Página 55 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Modo 1 Este modo de operação é o mais simples e por isto é muito utilizado. É idêntico ao modo 0, mas os contadores são de 16 bits. A figura 2.9 ilustra o diagrama em blocos para este modo, que é idêntico para os dois timers. Figura 2.9: Diagrama de Blocos para o TIMER 1 em MODO 1 Modo 2 Neste modo tem-se um contador/temporizador de 8 bits (TLi) com registro de recarga (THi) para quando ocorre o transbordamento. Neste modo os dois contadores/temporizadores operam de forma idêntica. O transbordamento (overflow) não somente ativa TFi como também recarrega TLi com o valor guardado em THi (este permanece inalterado). O valor de recarga deve ser fornecido por software. Figura 2.10: Diagrama de Blocos para o TIMER 1 em MODO 2 Página 56 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Modo 3 Este é o único modo onde os contadores/temporizadores têm um comportamento diferente. Neste modo, o contador/temporizador 1 simplesmente suspende a contagem (é como se estivesse com TR1=0), enquanto o contador/temporizador 0 se divide em dois contadores de 8 bits: •TH0 → contador/temporizador de 8 bits usando C/*T, GATE, TR0, *INT0 e TF0, •TL0 → contador/temporizador de 8 bits usando TR1 e TF1 (ou seja, provoca a interrupção do timer 1). É como se existem 2 contadores/temporizadores de 8 bits (TH0 e TL0) e outro de 16 bits (timer 1). O timer 1, entretanto, pode ser usado para operar em qualquer outro modo (0, 1 ou 2) e usa-se o modo 3 para detê-lo. Não há problemas porque os modos são independentes. Também se pode usar o timer 1 (em modo 2) para gerar o ”baud rate”da porta serial. Figura 2.11: Diagrama de Blocos para o TIMER 1 em MODO 3 Página 57 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi 2.4.4 Exercı́cios LED 10HZ Acender os leds vermelho, amarelo e verde a uma freqüência de 10 Hz. Para solucionar esse exercı́cio é necessário gerar um retardo equivalente ao perı́odo de 10 Hz. A figura 2.12 ilustra o cálculo do valor do contador para gerar esse retardo. Figura 2.12: Cálculo de N para determinar uma frequência Se F=10 Hz e CLOCK=3,575611 Hz, então N=29797. Como este é um contador que conta para cima, temos que subtrair este valor de 65536. Com isto, N=65536-29797=35739 ou 8B9BH. Na realidade, a freqüência gerada não será exatamente 10 Hz mas de um valor muito próximo: F = 3,575611 / 12*29797 = 9,99 Hz Será utilizado o timer 0 no modo 1; a cada interrupção a rotina acende um novo led e recarrega o timer. TMOD GATE 0 IE EA 1 C/*T M1 M0 0 0 0 - - ES ET1 0 0 0 0 GATE C/*T M1 0 0 0 EX1 ET0 EX0 0 1 0 ;LED_10HZ.ASM; DEFSEG PROG, CLASS=CODE, START=0 SEG PROG ; DEZ_HZ ; EQU 35739 ORG AJMP RESET INIC ORG AJMP TIMER0 TIM0 ORG 50H ; ; INIC MOV MOV MOV MOV MOV MOV CLR SETB SJMP TL0,#LOW DEZ_HZ TH0,#HIGH DEZ_HZ TMOD,#1 ;TIMER 0 EM MODO 1 IE,#82H P1 ,#0 ;APAGAR TODOS OS LEDS A,#01001001B C TR0 $ ; TIM0 ORG MOV MOV RLC MOV RETI END 100H TL0,#LOW DEZ_HZ ;REINICALIZAR TH0,#HIGH DEZ_HZ ;O CONTADOR A P1,A Página 58 M0 1 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi Notar que na rotina de interrupção está a recarga dos temporizadores que é feita com a instrução ”MOV direto,#data”mas que consome 2 ciclos de máquina, ou seja, que há um retardo que se acumula. Para evitar ou corrigir isso, pode-se adicionar ao contador o retardo da instrução; é mais preciso usar ”MOV TL0,# LOW (DEZ HZ+2)”. Quando existem várias interrupções, não se sabe com certeza quando uma interrupção do temporizador pode ser aceita; isso implica um erro maior que se acumula. Há uma solução simples porque depois do transbordamento o temporizador segue contando e esta contagem é exatamente o tempo que atrasou o serviço da interrupção; basta usar esse valor na recarga. As instruções a seguir ilustram a idéia. MOV ADD MOV MOV A,#LOW (DEZ_HZ+2) A,TL0 ;1 ciclo TL0,A ;1 ciclo TH0,#HIGH (DEZ_HZ+2) Página 59 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi LED 1HZ Acender os leds vermelho, amarelo e verde a uma freqüência de 1 Hz. A solução é idêntica ao exercı́cio anterior, mas vai surgir uma dificuldade ao calcular os valores de recarga: CLOCK=3575611 Hz e F=1 Hz N=3575611 / 12*1 = 297968 Como se pode ver, o valor de recarga é muito grande (297 968 > 65 536) e impede a utilização do temporizador. Uma boa saı́da é utilizar o esquema do exercı́cio anterior (com 10 Hz) e adicionar, por software, um divisor por 10. ;LED_1HZ.ASM ; DEFSEG PROG, CLASS=CODE, START=0 SEG PROG ; DEZ_HZ DIVISOR ; EQU EQU 32203 10 ORG AJMP RESET INIC ORG AJMP TIMER0 TIM0 ORG MOV MOV MOV MOV MOV MOV MOV CLR SETB SJMP 50H TL0,#LOW DEZ_HZ TH0,#HIGH DEZ_HZ R7,#DIVISOR ;PREPARAR DIVISAO POR 10 TMOD,#1 ;TIMER 0 EM MODO 1 IE,#82H P1,#0 ;APAGAR TODOS OS LEDS A,#01001001B C TR0 $ ORG MOV MOV DJNZ MOV RLC MOV RETI END 100H TL0,#LOW DEZ_HZ ;REINICALIZAR TH0,#HIGH DEZ_HZ ;O CONTADOR R7,FIM ;DIVIDIR POR 10 R7,#DIVISOR A P1,A ; ; INIC ; TIM0 FIM Página 60 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi ONDA1 Gerar através de P1.7 uma onda com o seguinte formato: Figura 2.13: Sinal a ser gerado na P1.7 Usando N = (t*CLOCK)/12, calcula-se o valor de recarga para o temporizador. Serão programados dois retardos alternadamente de forma a gerar o sinal pedido. Para t=1 ms → N=298 → 65536-298=65238 Para t=40 µs → N=12 → 65536-12 =65524 ;ONDA1.ASM DEFSEG PROG, CLASS=CODE, START=0 SEG PROG ; SAIDA EQU P1.7 R_1MS EQU 65238 ;RETARDO DE 1 MILISEG R_40MICRO EQU 65524 ;RETARDO DE 40 MICROSEG ; ORG RESET AJMP INICIO ; ORG TIMER0 AJMP TIM0 ; ORG 50H INICIO MOV TL0,#LOW R_1MS MOV TH0,#HIGH R_1MS MOV TMOD,#1 ;TIMER 0 EM MODO 1 MOV IE,#82H ;EA=1 E ET0=1 CLR SAIDA SETB TR0 ;PARTIDA DO TIMER 0 SJMP $ ;LOOP INFINITO ; TIM0 JB SAIDA,LB1 ;2 CICLOS MOV TH0,#LOW (R_40MICRO+4) ;2 CICLOS MOV TL0,#HIGH (R_40MICRO+4) ;2 CICLOS SETB SAIDA ;1 CICLO RETI ;2 CICLOS LB1 MOV TH0,#LOW (R_1MS+4) MOV TL0,#HIGH (R_1MS+4) CLR SAIDA RETI END Notar que a rotina que atualiza o temporizador para gerar o retardo de 40 µs consome 9 ciclos de máquina, quer dizer, consome 30,2 µs. Pode parecer que se o tempo de 40 µs fosse mudado para 25 µs não haveria solução. Página 61 Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi ONDA2 Gerar através de P1.7 uma onda com o seguinte formato: Figura 2.14: Sinal a ser gerado na P1.7 Usando N = (t*CLOCK)/12, calcula-se o valor de recarga para o temporizador. O segredo será trabalhar com o temporizador em modo 2 (os dois valores de recarga são menores que 256) e a rotina de interrupção apenas muda o valor da recarga (que está em TH0). Para t=600 µseg → N=179 → 256-179=77 Para t=25 µseg → N=7 → 256-7 =249 ;ONDA2.ASM DEFSEG PROG, CLASS=CODE, START=0 SEG PROG ; SAIDA R_600MICRO R_25MICRO ; EQU EQU EQU P1.7 77 249 ORG AJMP RESET INICIO ORG AJMP TIMER0 TIM0 ;RETARDO DE 600 MICROSEG ;RETARDO DE 25 MICROSEG ; ; INICIO ; TIM0 ; LB1 ORG MOV MOV MOV MOV CLR SETB SJMP 50H TL0,#R_600MICRO TH0,#R_25MICRO TMOD,#2 IE,#82H SAIDA TR0 $ JB MOV SETB RETI SAIDA,LB1 TH0,#R_25MICRO SAIDA MOV CLR RETI END TH0,#R_600MICRO SAIDA Página 62 ;PRIMEIRA CONTAGEM ;CONTAGEM SEGUINTE ;TIMER 0 EM MODO 2 ;EA=1 E ET0=1 ;PARTIDA DO TIMER 0 ;LOOP INFINITO ;2 ;2 ;1 ;2 CICLOS CICLOS CICLOS CICLOS Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi LEDS1 Acender os leds vermelho, amarelo e verde em seqüência, mudando a cada 10 pulsos em T1. Será usado o contador/temporizador 1 como contador e programado para operar em modo 2, com um valor de recarga igual a 246 (256-10). O acumulador e carry serão usados para acender os leds na seqüência correta. TMOD IE EA 1 GATE 0 0 0 C/*T 1 ES 0 M1 1 ET1 1 M0 0 EX1 0 GATE 0 ET0 0 C/*T 0 M1 0 M0 1 EX0 0 ;LEDS1.ASM DEFSEG PROG, CLASS=CODE, START=0 SEG PROG ; CONTA_10 ; EQU 246 ORG RESET AJMP INICIO ; ORG TIMER1 AJMP TIM1 ; INICIO: ORG 50H MOV A,#01001001B CLR C MOV P1,A MOV TL1,#CONTA_10 MOV TH1,#CONTA_10 MOV TMOD,#60H MOV IE,#88H SETB TR1 SJMP $ ;CARREGAR CONTADOR ;VALOR DE RECARGA ;CONTADOR 1, MODO 2 ;EA=1, ET1=1 ;LIGAR CONTADOR ;LOOP INFINITO ; TIM1: RLC A MOV P1,A RETI END A chave SW3 aciona diretamente a entrada T1, mas há bouncing e por isso serão notadas mudanças nos leds antes de 10 acionamentos. Para esse caso especı́fico o bouncing deverá ser eliminado por hardware. Página 63 Capı́tulo 3 Terceira Unidade Porta Serial 3.1 3.1.1 Comunicação Serial Introdução A porta serial existente na famı́lia MCS-51 é ”full duplex”, quer dizer, pode transmitir e receber dados simultaneamente. Tem um buffer que permite receber um segundo byte antes que o byte previamente recebido tenha sido retirado (lido) do registro de recepção. Mas, se o primeiro byte não tiver sido lido no tempo em que o segundo byte se completa, um dos dois será perdido. 3.1.2 Registros Envolvidos A porta serial possui um registrador chamado SBUF, o mesmo que se usa para enviar ou receber dados pela porta serial. Na realidade, o nome SBUF se refere a dois registros, um somente para leitura por onde se recebem os dados que chegam pela porta serial e outro somente para escrita por onde se transmitem dados pela porta serial. O modo de operação da porta serial é controlado pelo registro SCON, que é ilustrado na figura 3.1. A figura 3.2 apresenta um resumo dos modos de operação. Figura 3.1: Descrição do Registro SCON SM0 0 0 1 1 SM1 0 1 0 1 MODO 0 1 2 3 DESCRIÇÃO registro de deslocamento UART de 8 bits UART de 9 bits UART de 9 bits FREQÜÊNCIA clock/12 variável clock/12 ou clock/64 variável SM2 → comunicação multiprocessador (habilitada com SM2=1): •SM2=1 e em modo 1 ==¿ interrupção (RI=1) com o bit de parada (stop bit) igual a 1. •SM2=1 e em modo 2 ou 3 ==¿ interrupção (RI=1) se for recebido RB8=1. REN → habilita a recepção serial (Reception Enable) 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 término de transmissão pela porta serial: •MODO 0 → ativado no final do oitavo bit •DEMAIS → ativado no começo do bit de parada RI → flag de interrupção por recepção pela porta serial: •MODO 0 → ativado no final do oitavo bit. •DEMAIS → ativado na metade do bit de parada. Observação: Os flags TI e RI não são apagados por hardware e por isso a rotina de interrupção deve fazê-lo, ou seja, estes flags devem ser zerados por software. O registro PCON também toma parte na geração do baud rate da porta serial. Este registro é ilustrado na figura 3.2. Figura 3.2: Descrição do Registro PCON Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi 3.1.3 Modos de Operação Existem quatro modos de operação da porta serial, cada um com uma finalidade. Será apresentado um resumo de cada modo: Modo 0 (sı́ncrono, 8 bits) Neste modo os dados entram e saem pelo pino RXD. O pino TXD fornece o clock para o deslocamento (shift). São transmitidos e recebidos dados de 8 bits (LSB primeiro). O baud rate é de 1/12 da freqüência do clock (igual a 1 ciclo de máquina). Figura 3.3: Esquema da Porta Serial em MODO 0 Este modo pode ser utilizado para expandir as portas de I/O do microcontrolador, utilizando o esquema a seguir: Figura 3.4: Expansão das Portas de I/O Página 67 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi Modo 1 (assı́ncrono, 8 bits) No Modo 1 são operados 10 bits com um baud rate programável. Recebe-se pelo pino RXD e transmite-se pelo pino TXD. A tabela 3.1 ilustra o frame de bits serial. O bit de partida (START) é sempre zero e o bit de parada (STOP) é sempre um na transmissão. Na recepção o bit de parada é colocado no bit RB8. START Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 STOP Tabela 3.1: Frame de bits gerado pela porta serial em MODO 1 Neste modo o baud rate é gerado pelo contador/temporizador 1. A cada 16 (SMOD=1) ou 32 (SMOD=0) transbordamentos (overflows) é enviado um pulso para o circuito serial. A figura 3.5 ilustra o esquema do gerador do baud rate e também apresenta algumas fórmulas para o cálculo do valor a ser programado no contador/temporizador. Figura 3.5: Esquema para a geração do Baud Rate (BR) em MODO 1 Usando o contador/temporizador 1 programa-se qualquer baud rate. Na grande maioria dos casos tem-se o baud rate e é buscado o valor N a ser programado no contador/temporizador 1 (o mais cômodo é usar o modo 2 - auto recarga). Um problema que sempre existe é o erro gerado pela aproximação do valor a ser programado no contador/temporizador. Isto provoca a geração de baud rates ligeiramente diferentes. Exemplo: Usando um cristal de 3,575611 MHz, qual é o valor a ser programado no timer 1 para operar a 9600 bauds (usar SMOD=0)? N = 3575611 / (384*9600) = 0,9699 (aproximadamente 1) Usando timer 1 no modo 2 tem-se: 256 - 1 = 255 (TH1=TL1=255). Observação: a transferência do dado recebido para o registro SBUF (e RB8, que guarda o stop bit) e a ativação do flag RI somente acontecerá se: RI = 0 e (SM2= 0 ou o bit de parada =1). Página 68 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi Modo 2 (assı́ncrono, 9 bits, baud rate fixo) Este modo opera com 11 bits e o baud rate pode ser de 1/32 ou 1/64 do clock. O bit TB8/RB8 serve para transmitir a paridade ou gerar um segundo bit de parada (TB8=1). O frame de bits usado neste modo é ilustrado na tabela 3.2. START Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 TB8 STOP Tabela 3.2: Frame de bits gerado pela porta serial em MODO 2 O único controle que se tem sobre o baud rate é através do uso do bit SMOD. Se SMOD=0, trabalha-se com BR=clock/32 e se SMOD=1, trabalha-se com BR=clock/64. A figura 3.6 ilustra o esquema para geração do baud rate no modo 2. Figura 3.6: Esquema para a geração do Baud Rate (BR) em MODO 2 Na transmissão o bit 8 é copiado do bit TB8. Na recepção o bit 8 é copiado para o bit RB8. Os bits TB8 e RB8 estão no registro SCON. O dado recebido somente é carregado no SBUF (e RB8) se: RI=0 e (SM2=0 ou bit 9 (stop bit) = 1). Página 69 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi Modo 3 (assı́ncrono, 9bits, baud rate variável) É idêntico ao modo 2, exceto que a geração do baud rate é idêntico ao modo1. A tabela 3.3 e figura 3.7 ilustra o frame de bits e a geração do baud rate. START Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 TB8 STOP Tabela 3.3: Frame de bits gerado pela porta serial em MODO 3 Figura 3.7: Esquema para a geração do Baud Rate (BR) em MODO 3 3.1.4 Cuidados com a Porta Serial Nos quatro modos a transmissão se inicia quando é escrito um byte em SBUF. A recepção é habilitada quando REN=1 (no MODO 0 exige-se também RI=0). Não se esqueça de que somente existe uma única interrupção dedicada à porta serial, portanto ela é gerada por duas condições: a)Término da transmissão de um byte → flag TI b)Término da recepção de um byte → flag RI Deve-se testar os flags RI e TI para determinar se a interrupção foi por transmissão ou por recepção. Os flags RI e TI devem ser apagados por software. Um outro cuidado muito importante é com a geração do baud rate. Muitas vezes não se consegue a comunicação serial devido à imprecisão do baud rate. Portanto o problema a seguir é proposto: Programar o contador/temporizador 1 para gerar 9600 bauds para a porta serial operando em modo 3, sendo que o cristal é de 4 MHz. Solução: N = 4000000/(384*9600) = 1,085 (SMOD=0). Na solução calculou-se que N=1,085 mas somente podem ser programados números interos; assim, caso se aproxime para 1, o baud rate gerado será de BR=4000000/384=10416,7. Será que irá funcionar bem com esse baud rate ? Para responder esta pergunta é necessário compreender o que acontece com a transmissão serial. Esta transmissão é assı́ncrona, quer dizer, pode iniciar em qualquer instante; o inicio é caracterizado pela presença de um bit de partida (START). Uma vez iniciada, deve-se garantir a duração de cada bit. Para cada byte é transmitido um bit de partida, os bits de dados e um ou dois bits de parada. O que se deve buscar é garantir que não haja um erro muito grande neste frame de bits. A figura 3.8 ilustra o caso da porta serial operando em modo 3. Página 70 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi Figura 3.8: Erros provocados pela diferença no baud rate A fase mais critica é a recepção do último bit porque poderá apresentar uma defasagem muito grande (rotuladas de E1 e E2 na figura). Não se pode especificar um valor limite para esses erros pois diversos fatores, particulares para cada caso, precisam ser levados em consideração. Como um valor prático e que funciona na grande maioria dos casos arbitra-se que o valor do erro, para o último bit, deve ser menor que 40% da duração de um bit (usando BR exato). | 11 40 1 11 − |≤ ∗ BRp BR 100 BR A equação pode ser simplificada para: | 11 11 1 − |≤ BRp BR 27, 5 ∗ BR Como pode ser verificado, com um cristal de 4Mhz não se conseguirá transmitir a 9600 pois o baud rate será muito grande. | 11 1 11 − |≤ 10416, 7 9600 27, 5 ∗ 9600 8,167 µs≤3,788µs→falso Página 71 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi 3.1.5 Comunicação entre vários 8051 Figura 3.9: Comunicação entre vários 8051 Os modos 2 e 3 permitem interligar vários 8051, sendo um mestre e vários escravos. Nestes modos temos: *1 start bit; *8 bits de dados; *um nono bit que vai para o bit RB8 ( na recepção) ou pode ser escolhido 0 ou 1 na transmissão escrevendo-se em TB8; *1 stop bit Note que se SM2 = 1 e RB8 = 1, a interrupção da serial será atendida. O algoritmo de comunicação consiste em: 1)No inı́cio, todos os escravos estão com SM2 = 1 2)Quando o mestre quiser enviar dados para algum escravo, ele escreverá 1 em seu bit TB8 e então enviará serialmente o endereço do escravo desejado, e como teremos todos os bits RB8 em 1, todos escravos serão interrompidos para verificar se é seu o endereço enviado. 3)O escravo selecionado zerará o seu bit SM2 e estará 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. 5)Em resumo, o mestre envia endereços com o nono bit em 1 e os dados com o nono bit em 0, portanto, se o mestre desejar se comunicar com outro escravo basta enviar o novo endereço com o nono bit em 1. Página 72 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi 3.1.6 Comunicação serial entre o 8051 e o PC Devido à diferença de tensão entre os nı́veis TTL e os usados no padrão RS-232C (PC), é necessário usar circuitos conversores para interfacear o microcontrolador com a porta serial do PC. A conversão pode ser feita através de circuitos transistorizados discretos (veja as figuras 11.10,11.11 e 11.12 e leia a seção 11.4) ou através de circuitos integrados como o 1488 (conversor de TTL para RS-232C) e o 1489 (conversor de RS-232C para TTL). A seguir estão os esquemas dos dois integrados e o esquema básico de interligação entre o 8051 e a serial do PC. Figura 3.10: Esquema de ligação entre o computador(PC) e o 8051 Página 73 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi 3.1.7 Exercı́cios TX SER Usando um loop infinito, transmitir pela porta serial todos os caracteres ASCII de ”0”a ”Z”. Usar 9600 bauds, 8 bits de dados, 1 bit de partida e 2 bits de parada. Para este caso o modo 3 é o mais adequado e TB8=1 será usado para gerar um bit de parada. A transmissão será feita por interrupção, quer dizer, a cada byte transmitido haverá uma interrupção. O contador/temporizador 1 será programado para modo 2 (auto-recarga). SCON TMOD SM0 1 GATE 0 IE EA 1 SM1 1 SM2 0 C/*T 0 M1 1 - - ES 1 REN 0 M0 0 ET1 0 TB8 1 RB8 0 GATE 0 EX1 0 TI 0 C/*T 0 ET0 0 EX0 0 Cálculo do divisor formado pelo contador/temporizador 1: N = 3575611/(384*9600) = 0,9699 ∼ = 1. (TH1 = TL1 = 256 - 1 = 255). ;TX_SER.ASM DEFSEG PROG, CLASS=CODE, START=0 SEG PROG ; BR_9600 ; EQU 255 ORG AJMP RESET INIC ORG AJMP SINT SERIAL ORG MOV MOV MOV SETB MOV MOV MOV SETB SJMP 50H TMOD,#20H TH1,#BR_9600 TL1,#BR_9600 TR1 SCON,#0C8H IE,#90H A,#"0" TI $ ORG 100H CLR MOV INC CJNE MOV TI SBUF,A A A,#"Z"+1,SER1 A,#"0" ; ; INIC: ;TIMER 1 EM MODO 2 ;PROGRAMAR BAUD RATE ;INICIAR TIMER 1 ;MODO 3 COM TB8=1 ;HAB INTERRUP SERIAL ;PRIMERO ASCII ;TX PRIMEIRO ASCII ;LOOP INFINITO ; SERIAL: ; SER1: ; RETARDO: ; AQUI: ACALL RETI RETARDO MOV R7,#0 DJNZ RET R7,AQUI ;APAGAR FLAG ;TRANSMITIR ;FOI O ULTIMO ? ;REINICIALIZAR ;ATRASAR TRANSMISSAO ; END Página 74 M1 0 RI 0 M0 0 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi RX SER O circuito deverá responder aos seguintes comandos que chegam pela porta serial: 1 → acender todos os leds R → acender led vermelho A → acender led amarelo V → acender led verde 0 → apagar todos os leds r → apagar led vermelho a → apagar led amarelo v → apagar led verde Estes comandos vão chegar pela porta serial usando o formato: 1 bit de partida, 8 bits de dados, 2 bits de parada, com um baud rate de 9600. ;RX_SER.ASM DEFSEG PROG, CLASS=CODE, START=0SEG PROG ; BR_9600 EQU 255 LED_VERMELHO EQU P1.0 LED_AMAR EQU P1.1 LED_VERDE EQU P1.2 CHEGOU EQU 32.0 ; ORG RESET AJMP INIC ; ORG SINT AJMP SERIAL ; ORG 50H INIC: MOV TMOD,#20H MOV TH1,#BR_9600 MOV TL1,#BR_9600 SETB TR1 MOV SCON,#0D0H MOV IE,#90H CLR CHEGOU ; ESPERA: JNB CHEGOU,ESPERA CLR CHEGOU ; CJNE A,#"0",LB1 CLR LED_VERMELHO CLR LED_AMAR CLR LED_VERDE SJMP ESPERA ; LB1: CJNE A,#"1",LB2 SETB LED_VERMELHO SETB LED_AMAR SETB LED_VERDE SJMP ESPERA ; LB2: CJNE A,#"R",LB3 SETB LED_VERMELHO SJMP ESPERA ; LB3: CJNE A,#"r",LB4 CLR LED_VERMELHO SJMP ESPERA ; LB4: CJNE A,#"A",LB5 SETB LED_AMAR SJMP ESPERA Página 75 ;TIMER 1 EM MODO 2 ;PROGRAMAR BAUD RATE ;INICIAR TIMER 1 ;MODO 3 COM REN=1 ;HAB INTERRUP SERIAL ;APAGAR FLAG ;AGUARDAR UM COMANDO ;CHEGOU 0 ;CHEGOU 1 ;CHEGOU R ;CHEGOU r ;CHEGOU A Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi ; LB5: CJNE CLR SJMP A,#"a",LB6 LED_AMAR ESPERA ;CHEGOU a CJNE SETB SJMP A,#"V",LB7 LED_VERDE ESPERA ;CHEGOU V CLR SJMP LED_AMAR ESPERA ;CHEGOU v CLR MOV SETB RETI RI A,SBUF CHEGOU ;APAGAR FLAG DE INTERRUP ;COLOCAR DADO NO Acc ; LB6: : LB7: ; SERIAL: END 3.2 3.2.1 Programação em Assembly Introdução teórica Este parte da apostila é de fundamental importância para quem deseja adquirir conhecimentos básicos em programação (software). Aqui, é ensinado passo a passo o procedimento da elaboração de programas simples e com loops; utilizando a linguagem Assembly aplicada aos microcontroladores da famı́lia MCS-Sl da Intel. Uma vez que nós aprendemos e praticamos as técnicas de programação ensinadas, poderemos aplicar tal metodologia de implementação de programas a qualquer outra linguagem de programação, seja ela de baixo, médio ou alto nı́vel. Existem muitas linguagens de programação que podem ser utilizadas na programação de sistemas inteligentes, utilizando mierocontroladores, além do Assembly (nı́vel baixo), tais como as linguagens estruturadas de programação C (nı́vel médio), BASIC e PL/M (nı́vel alto). A escolha de uma delas na elaboração de um projeto de software é muito importante é envolve o conhecimento técnico especializado. A caracterı́stica de uma linguagem de nı́vel baixo, como o Assembly, é a de apresentar o mesmo conjunto de instruções que aquele definido pelo fabricante da famı́lia de microprocessadores ou microcontroladores, com a qual se deseja desenvolver os projetos de programa. Isso permite um total controle sobre os registradores intemos do dispositivo e as posições de memória e, conseqüentemente, são gerados programas muito mais compactos em relação às outras linguagens. Assim, sempre que existirem limitações de memória (pouca memória) e limitações de velocidade de processamento (máxima velocidade de processamento), recomenda-se a utilização da linguagem de programação de nı́vel baixo, ou seja, o Assembly. Portanto, pelas próprias caracterı́sticas dos microcontroladores, é muito comum a utilização do Assembly na elaboração de projetos de equipamentos inteligentes. Em contrapartida, a única desvantagem da linguagem Assembly em relação às outras linguagens é sua caracterı́stica de ser rica em detalhes, solicitando dos programadores um conhecimento bastante grande sobre o dispositivo a ser programado. A caracterı́stica de uma linguagem de nı́vel médio, como o C, é a de apresentar os aspectos de uma linguagem de nı́vel baixo (manipulação bit a bit ou byte a byte dos registradores internos e das posições de memória), como também as caracterı́sticas de uma linguageni de nı́vel alto, que definimos a seguir. Atualmente, essa é uma das linguagens de programação mais utilizadas em projetos de equipamentos inteligentes. Página 76 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi A caracterı́stica de uma linguagem de nı́vel alto é a de ser muito mais próxima da linguagem do ser humano. Trata-se de uma linguagem descritiva, cujas instruções são palavras escritas em inglês e que estão muito longe das instruções em Assembly. Cada instrução de uma linguagem de nı́vel alto é representada por muitas instruções de uma linguagem de nı́vel baixo. Programar utilizando uma linguagem de nı́vel alto é muito mais fácil que programar com uma linguagem de nı́vel baixo ou médio. Mas quando se utiliza uma linguagem de programação de nı́vel alto, são gerados programas maiores e com menor velocidade de processamento. Outra desvantagem da linguagem de nı́vel alto, que muitas vezes é interpretada como vantagem, é a de não exigir do programador o conhecimento completo e detalhado do dispositivo que se deseja programar. Um programa em código de máquina (código-objeto) é composto por bytes que representam as instruções do dispositivo. É a linguagem que o microcontrolador sabe e pode executar. Assim, sempre que for desenvolvido um programa em uma determinada linguagem de programação, é necessário fazer a compilação desse programa para transformá-lo em linguagem de máquina. O programa em linguagem de máquina deve ser simulado por meio de um simulador (AVSIM5l, Pinnacle etc.) ou gravado em uma memória para verificar seu funcionamento por meio da utilização do próprio hardware do produto. A seguir inicia-se o estudo das técnicas de programação em Assembly para a famı́lia de microcontroladores MCS-51 da Intel. 3.2.2 Estratégias de elaboração de programas É muito importante para um programador, antes de implementar um programa, seguir uma determinada metodologia. A seguir, é descrita uma metodologia de elaboração de programas que é independente da linguagem de programação. Pré-requisitos do técnico que desenvolverá o projeto a)Conhecer a estrutura interna (hardware) do dispositivo com que se deseja desenvolver o projeto; b)Conhecer o conjunto de instruções do dispositivo. Viabilidade do projeto a)Obter e entender claramente as especificações do cliente (desejos do cliente, caracterı́sticas do produto e do sistema, modo de funcionamento etc.); b)Elaborar diferentes estratégias de soluções para o projeto. Isso pode ser feito utilizando-se diagramas de fluxo de dados (DFD), diagramas de blocos, desenhos etc.; c)Elaborar a viabilidade do projeto com relação ao hardware e ao software para verificar a possibilidade de sua implementação junto ao cliente. Algumas perguntas são utilizadas para garantir a viabilidade do projeto: Quais são as necessidades de hardware? Qual será o custo final do produto (o cliente pagará por esse valor)? Qual será a quantidade de equipamentos a ser fabricada (a fábrica comporta essa quantidade)? Como serão feitas as entregas do produto? Existem fornecedores de componentes no Brasil? Quais componentes devem ser importados? Existem concorrentes? etc.; d)Escolher a melhor solução junto com o cliente, ou seja, aquela que utilizará o menor número de componentes e a que apresenta maior velocidade de processamento. Isso afeta diretamente o custo final do hardware e traz uma maior flexibilidade funcional do produto. Página 77 Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi Implementação do projeto a)Elaborar o fluxograma do programa em Assembly: os fluxogramas devem ser implementados desde o nı́vel de ’macrodetalhamento’ até o nı́vel de ’microdetalhamento’. Um fluxograma representando o nı́vel de ’macrodetalhamento’ deve conter as idéias e os objetivos dentro dos blocos representativos. Um fluxograma representando o nı́vel de ’microdetalhamento’ deve utilizar as representações simbólicas dos mnemônicos das instruções dentro dos blocos representativos. Exemplo: dentro de um bloco do fluxograma, representar (A) ← (B): significa a instrução MOV A,B; b)A partir do fluxograma, gerar o programa-fonte na linguagem de programação escolhida (arquivo em código ASCII que contém as instruções que compõem o programa); c)Compilar o programa-fonte para gerar o arquivo binário que corresponde ao programa em códigos de máquina; d)Fazer a linkagem dos arquivos binários para agrupar de maneira organizada, os diferentes blocos de programa que compõem o programa final; e)Efetuar a simulação do programa para verificar seu funcionamento e corrigir os possı́veis erros de lógica. Nessa fase, não é necessário 0 hardware do produto; f)Realizar a gravação da EPROM, inserção no hardware do produto e teste fı́sico de sua funcionalidade; g)Efetuar a emulação do programa (é necessário um sistema emulador) para corrigir erros de lógica ou eventuais falhas de algum componente, utilizando o próprio hardware do produto; h)Fazer testes rápidos de bancada para verificar o funcionamento do produto final; i)Realizar testes de longa duração (confiabilidade), em condições de estresse’, para a homologação do produto. 3.2.3 Fluxogramas Essa ferramenta de programação é fundamental para a implementação de qualquer rotina de um programa de microcomputador. É por meio dessa ferramenta que se pode observar como foi implementada a estratégia de solução de uma necessidade de programação elaborada por um programador. O fluxograma representa como o fluxo de informações será processado pelo microprocessador. Página 78