Docsity
Docsity

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

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


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Apostila de 8051, Notas de estudo de Automação

Apostila básica sobre o microcontrolador 8051

Tipologia: Notas de estudo

2010

Compartilhado em 19/05/2010

diego-dos-santos-mutta-10
diego-dos-santos-mutta-10 🇧🇷

4.7

(3)

3 documentos

Pré-visualização parcial do texto

Baixe Apostila de 8051 e outras Notas de estudo em PDF para Automação, somente na Docsity! ESCOLA TÉCNICA ESTADUAL GETÚLIO VARGAS PROFESSOR: MILTON BARREIRO JUNIOR Microcontrolador 8051 – Teoria e Prática São Paulo 2006 ESCOLA TÉCNICA ESTADUAL GETÚLIO VARGAS PROFESSOR: MILTON BARREIRO JUNIOR Microcontrolador 8051 – Teoria e Prática São Paulo 2006 SUMÁRIO 1 – INTRODUÇÃO........................................................................................... 1 2 – ARQUITETURA BÁSICA DE UM MICROCONTROLADOR GENÉRICO.. 2 3 – A FAMÍLIA 8051......................................................................................... 3 3.1 Organização de Memória................................................................ 4 3.2 Memória de Programa..................................................................... 6 3.3 Memória de Dados.......................................................................... 8 3.4 Conjunto de Instruções da Família 8051....................................... 10 3.5 Registrador da palavra de controle (Program Status Word)......... 10 3.6 Modos de Endereçamento............................................................ 11 3.7 Instruções Aritméticas................................................................... 12 3.8 Instruções Lógicas........................................................................ 14 3.9 Transferência de Dados Interna e Externa................................... 15 3.10 Instruções Booleanas.................................................................. 17 3.11 Instruções de Salto..................................................................... 18 3.12 Oscilador Interno......................................................................... 20 1 – Introdução Podemos considerar os microcontroladores, como sendo uma CPU dedicada e incorporada em um só chip, ou seja, todos os periféricos que nos microprocessadores se encontravam em chips independentes, assim como memórias, temporizadores, portas de comunicação serial, dispositivos de entrada/ saída, estão presentes em um único componente. Isso torna o projeto mais compacto, mais dinâmico e com o custo final reduzido, devido aos dispositivos integrados em um só chip. O chip a ser apresentado nessa apostila será o microcontrolador da família 8051, o qual será estudado com mais detalhes nos capítulos a seguir. 2 – Arquitetura básica de um microcontrolador genérico Um microcontrolador genérico é composto pelos seguintes blocos: • Unidade Central de Processamento (CPU); • Memória de Programa (ROM ou EPROM); • Memória de dados (RAM); • Linhas de I/O (PORT’s); • Controle de interrupções; • Gerador de clock; • Temporizadores (Timer’s) e Contadores (counter’s). É representada na figura abaixo constituição clássica de um microcontrolador contendo os blocos citados e suas respectivas interligações. As diferenças básicas entre os diversos tipos de microcontroladores disponíveis no mercado são relacionadas à capacidade e tipos de memórias, na quantidade de port’s disponíveis, velocidade de operação, e alguns recursos específicos como por exemplo, portas seriais, maior número de contadores, opção de baixo consumo, entre outros. Existem também, os componentes chamados derivativos que, como o próprio nome diz, são microcontroladores derivados dos tipos mais comuns (8048 e 8051), ou seja, a célula básica é o microcontrolador e este é acrescido de outros componentes de acordo com as necessidades. 3 – A Família 8051 Quando temos vários microcontroladores utilizando uma mesma célula, chamamos esse conjunto de componentes de família. Desta forma temos várias famílias como, por exemplo, a família do 8048, do 8051, do 8096, entre outras. Vamos tratar aqui da família do 8051, que será utilizado em nossas aplicações. A tabela abaixo descreve os principais componentes dessa família: No me do Chi p Versã o sem ROM V ersão E PROM By tes de RO M By tes de RA M Tim ers 16 Bits Tipo de Circ uito 805 1 8031 8 751 4K 12 8 2 NM OS 80 C51 80C3 1 8 7C51 4K 12 8 2 HM OS 80 CL51 4K 12 8 2 SAC MOS 805 2 8032 8K 25 6 3 NM OS 80 C52 80C3 2 8 7C52 8K 25 6 3 CM OS 83 C528 80C5 28 8 7C528 32 K 51 2 3+1 CM OS 83 C652 80C6 52 8 7C652 8K 25 6 2 CM OS 83 C751 8 7C751 2K 64 1 CM OS 83 C452 80C4 52 8 7C452 8K 25 6 2 CM OS O elemento básico desta família é o chip 8051, cujo diagrama interno serviu como ilustração quando falamos sobre um microcontrolador genérico. Os outros componentes desta família estão descritos nos manuais dos fabricantes. Atualmente, a tendência mundial no uso de componentes de baixo consumo, torna sensível o desenvolvimento de projetos baseados na tecnologia CMOS, facilitando assim a interligação de seus blocos. Todos os componentes que apresentarem um “C” em seu código (80C31, 87C452, etc) pertencem a esta família, a qual representa o que existe de mais avançado em microcontroladores de 8 bits, permitindo a continuidade de sua linha de produção por um longo período. As características desta família são: A memória de programa é do tipo ROM e não podemos escrever dados nela. Podemos ter até 64Kbytes de memória, e normalmente encontramos pelo menos 4K de memória interna no chip em forma de ROM, EPROM ou OTP (One Time Program). Os tipos OTP representam uma opção economicamente atraente, pois são mais baratos comparados aos do modelo EPROM, e podem ser programados pelo usuário. Nas versões ROMLESS, esta memória encontra-se externa ao microcontrolador. O pulso de leitura para a memória externa é o sinal PSEN (Program Store Enable). A memória de dados ocupa um espaço de endereçamento separado da memória de programa. Até 64Kbytes de memória externa podem ser endereçados, e a CPU gera sinais de read e write, necessários durante o acesso à memória externa. 3.2 Memória de Programa A figura abaixo mostra o mapa da parte inferior da memória de programa. Após o reset, a CPU começa a executar as instruções a partir do endereço 0000H. Como pode ser visto na figura, cada interrupção é alocada num endereço fixo da memória de programa. A interrupção direciona o contador de programa da CPU para o seu respectivo endereço, onde se encontra a rotina de interrupção, conforme controle proporcionado pelo vetor de interrupções. Os primeiros 4Kbytes de memória podem estar localizados no chip, ou num chip (ROM ou EPROM) externo. O controle de acesso interno/externo é feito pelo sinal EA (External Access). O sinal de “strobe” para acesso à memória externa é o sinal PSEN, ativo apenas quando da ocorrência de acessos externos (EA ligado a terra), não sendo, portanto utilizado quando se utiliza apenas a área de memória interna. A configuração de hardware necessária para acesso à memória externa é ilustrada a seguir. Note que 16 linhas de I/O (port 0 e port 2) são dedicadas à transição de sinais durante buscas à memória externa. O port 0 opera como um barramento de dados endereço multiplexado, emitindo o byte low do program counter como endereço e aguarda o recebimento do byte de código da memória de programa. Durante o tempo em que o byte low está válido no port 0, o sinal ALE coloca este byte no latch de endereços, enquanto o port 2 emite o byte alto de endereços. O sinal PSEN pulsa, e o código de byte é lido pelo microcontrolador. O endereço de memória de programa sempre é de 16 bits, mesmo quando a quantidade de memória externa é inferior à 64Kbytes. Desta forma, sempre que utilizarmos memória externa, dois port’s (port 0 e port 2) serão sacrificados em função do endereçamento das mesmas. É possível utilizarmos também os portos que foram sacrificados, porém, não é uma operação tão confortável. 3.3 – Memória de dados A figura abaixo mostra o hardware necessário para o acesso à memória RAM externa. O registrador da palavra de controle (PSW) contém vários bits de status que indicam o estado atual da CPU. A tabela a seguir indica a posição dos bits dentro do registrador. CY AC F0 RS1 RS0 OV - P CY – (PSW7): Carry flag, indica “vai um” nas operações aritméticas. AC – (PSW6): Auxiliary carry flag, auxilia nas operações de adição. F0 – (PSW5): Flag de uso geral. RS1 – (PSW4): Seleção do banco de registradores. RS0 – (PSW3): Seleção do banco de registradores. OV – (PSW2): Overflow em operações aritméticas. - – (PSW1): Flag definível pelo usuário. P – (PSW0): Flag de paridade O bit de carry, entre outras funções serve como “vai um” em operações aritméticas, e também como acumulador para um número de operação booleana. Os bits RS0 e RS1 são utilizados para selecionar um entre quatro bancos de registradores, disponíveis nos primeiros 128 bytes de RAM. O bit de paridade indica a quantidade de bits em um no acumulador: se P=1, o acumulador contém um número ímpar de uns; se P=0, o número de uns no acumulador é par. Dois bits do PSW estão disponíveis e podem ser utilizados como flags de uso geral. O PSW encontra-se localizado na área denominada SFR, no endereço D0H. 3.6 – Modos de endereçamento Podemos ter seis modos distintos de endereçamento no 8051. Estes modos são adequados às operações de controle. • Endereçamento direto: Neste modo, o operando é especificado por 8 bits de endereço na instrução. Somente a RAM interna e os SFR’s podem ser acessados diretamente. • Endereçamento indireto: No modo indireto, a instrução especifica um registrador que contém o endereço do operando. Ambas as memórias, interna e externa podem ser acessadas desta forma. O registrador de endereço, para operações de 8 bits, pode ser R0 ou R1, ou ainda o Stack Pointer. Endereços de 16 bits podem ser acessados somente pelo Data Pointer. • Instruções de registrador: Os bancos de registradores contêm os registradores de R0 até R7, que podem ser acessados por certas instruções que levam a especificação do registrador junto com o opcode da instrução. As instruções que acessam os registradores dessa forma são eficientes, pois eliminam o byte de endereço. Quando a instrução é executada, um dos oito registradores do banco selecionado é acessado e a seleção do banco é feita por dois bits (RS0 e RS1) no PSW. • Instruções de registrador específico: Algumas instruções são especificadas para certos registradores, por exemplo, as instruções que operam com acumulador ou Data Pointer não necessitam um byte de endereço para apontá-las, pois o próprio opcode faz isso. • Constantes imediatas: Podemos carregar um registrador com uma constante, diretamente por um simples comando, como por exemplo, mov A, #100, que coloca no acumulador o valor 100 (decimal). • Endereçamento indexado: Somente a memória de programa (ROM) pode ser acessada desta forma e somente pode ser lida. Este modo de endereçamento é destinado à leitura de tabelas. Um registrador de 16 bits (DPTR ou PC) indica o endereço de base da tabela e o acumulador é carregado com o valor da tabela. 3.7 – Instruções aritméticas O conjunto de instruções aritméticas é listado na tabela a seguir. A tabela indica o modo de endereçamento que pode ser utilizado com cada instrução, para acessar o byte operando. Por exemplo, a instrução Add A, <byte>; pode ser escrita como: Add A, 7FH (endereçamento direto) Add A, @R0 (endereçamento indireto) Add A, R7 (endereçamento por registrador) Add A, #127 (constante imediata) Mnemônic o Operação Modo de Endereça mento Temp o de Exec ução ADD A, <byte> A = A + <byte> Dir / Ind / Reg / Imm 1 ADDC A, <byte> A = A + <byte> + C Dir / Ind / Reg / Imm 1 SUBB A, <byte> A = A - <byte> - C Dir / Ind / Reg / Imm 1 INC A A = A + 1 Acumulad or 1 INC <byte> <byte> = <byte> + 1 Dir / Ind / Reg 1 INC DPTR DPTR = DPTR + 1 Data Pointer 2 DEC A A = A - 1 Acumulad or 1 DEC <byte> <byte> = <byte> - 1 Dir / Ind / Reg 1 MUL AB B e A = B x A Acumulad or e B 4 DIV AB A = INT [A/B] B = MOD [A/B] Acumulad or e B 4 DA A Ajuste decimal Acumulad or 1 Os tempos de execução indicados consideram um clock de 12MHz. Todas as instruções aritméticas são executadas num tempo de 1F 06 Ds com exceção da instrução INC DPTR que consome 2F 06 Ds, e as instruções de multiplicação e divisão que são efetuadas em 4F 06 Ds. Perceba que qualquer byte no espaço de memória interno pode ser incrementado ou decrementado sem o uso do acumulador. Inclusive o registrador de 16 bits DPTR pode ser incrementado desta forma. A instrução MUL AB opera com os registradores A e B e põe o resultado (16 bits) nos registradores B (byte high) e A (byte low) concatenados. A instrução DIV AB divide A por B e coloca o quociente (resultado da divisão inteiro em 8 bits) no acumulador e o resto (8 bits) no registrador B. A área de stack reside na própria RAM interna e as instruções de PUSH primeiro incrementam o stack pointer, então copia o byte no stack. As instruções de PUSH e POP usam apenas o endereçamento direto para identificar o byte que está sendo manipulado, enquanto que o stack é acessado por endereçamento indireto através do registrador SP. Isto significa que o stack vai para os 128 bytes altos (se existirem) mas não para a área de SFR. Nos dispositivos onde não está implementado a área alta, os bytes “PUSHed” são perdidos e os bytes “POPed” são indeterminados. As transferências de dados incluem movimentações em 16 bits, que podem ser utilizadas para inicializar o Data Pointer (DPTR), para o uso de tabelas na memória de programa, ou para acesso à memória de dados externa. A instrução XCH A, <byte> resulta na troca dos dados entre o acumulador e o byte endereçado. A instrução XCHD A, @RI é similar, com a diferença que apenas os nibbles baixos estão envolvidos na operação. Esta instrução facilita a manipulação de dados, de forma a economizar instruções nos programas. A memória externa pode ser acessada por endereçamento indireto, utilizando 8 ou 16 bits de endereço. A escolha recai no uso de endereçamento de um byte, através de @Ri, onde Ri pode ser R0 ou R1 do banco de registradores selecionado, ou um endereço de 2 bytes (16 bits) colocado no Data Pointer (DPTR). A desvantagem do uso do endereçamento de 16 bits está no fato de que, se utilizarmos um pequeno espaço de memória, ainda assim o port 2 será inteiramente indisponibilizado para uso. No endereçamento de 8 bits, sacrificamos apenas algumas linhas do port 2. A tabela abaixo indica as instruções de movimentação de dados em memória externa. Todas as instruções são executadas em 2F 06 Ds, com um clock de 12MHz. Largura do Endereço Mnemônic o Operação 8 Bits MOVX A, @Ri Lê RAM Externa (Ri) 8 Bits MOVX @Ri, A Escreve RAM Externa (Ri) 16 Bits MOVX A, @DPTR Lê RAM Externa (DPTR) 16 Bits MOVX @DPTR, A Escreve RAM Externa (DPTR) Em todos os acessos à RAM externa, utilizamos sempre o acumulador como registrador intermediário. Os pulsos de READ ou WRITE são ativos somente durante a execução da instrução MOVX. Normalmente estes sinais estão inativos e se não forem utilizados, podem ser configurados como linhas de I/O extra. Existem ainda duas instruções que estão disponíveis para leitura de tabelas na memória de programa. Estas instruções permitem apenas a leitura de dados na memória de programa (ROM), não permitindo a atualização dos mesmos. O mnemônico é MOVC (mov constant), e pode se apresentar de duas formas: MOVC A, @A + DPTR MOVC A, @A + PC A diferença está no registrador auxiliar utilizado durante a leitura, que pode ser o DPTR ou o PC. A primeira instrução permite o acesso a tabelas de até 256 itens, sendo que o DPTR indica o início da tabela, e o acumulador indica o off-set do endereço desejado. Com a variação (incremento) do acumulador, podemos ler a tabela inteira mantendo o DPTR fixo. A outra instrução, utiliza o acumulador como base de endereçamento e o PC como off-set, de forma que a leitura de tabelas deve ser feita por sub-rotinas como a que se segue: MOV A, valor inicial CALL tabela A rotina “tabela” seria: t abela: MOVC A, @A + PC RET Este tipo de tabela pode conter até 255 itens, lembrando que neste caso, não podemos utilizar o valor “0” da tabela, que variará entre 1 e 255. Um valor colocado no off-set 0 não será lido. 3.10 – Instruções Booleanas A família 8051 contém um processador booleano completo. Um processador booleano consiste num elemento que permite a manipulação direta de um único bit dentro da palavra que pode ser de 8 ou mais bits (byte). A RAM interna contém 128 bits endereçáveis e o espaço SFR contém mais 128. Todos os port’s são bits endereçáveis, e cada um pode ser tratado como um port separado. As instruções que acessam esses bits não são apenas seqüências de desvios condicionais, mas um completo conjunto de instruções como indicado na tabela abaixo: Mnemônic o Operação Temp o de Execu ção ANL C, bit C = C and bit 2 ANL C, /bit C = C and not bit 2 ORL C, bit C = C or bit 2 ORL C, /bit C = C or not bit 2 MOV C, bit C = bit 1 MOV bit, C bit = C 2 CLR C C = 0 1 CLR bit bit = 0 1 SETB C C = 1 1 SETB bit bit =1 1 CPL C C = not C 1 CPL bit bit = not bit 1 JC REL Jump If C = 1 2 JNC REL Jump If C = 0 2 JB bit, REL Jump If bit = 1 2 JNB bit, REL Jump If bit = 0 2 JBC bit, REL Jump If bit = 1 : CLR bit 2 Este tipo de operação de bit não é facilmente obtido em arquiteturas de microprocessador. Todos os bits são acessados diretamente nos endereços 00H até 7FH na área dos 128 bytes inferiores e de 80H até FFH no espaço SFR. Desta forma podemos com as instruções de programa, implementar circuitos lógicos dentro do microcontrolador, evitando o uso de circuitos discretos ou PAL’s. 3.11 – Instruções de Salto Podemos utilizar 3 tipos de instruções de desvio, quando endereçamos um programa no microcontrolador. Estas instruções diferem entre si no formato do Se ao invés de utilizarmos o oscilador interno, utilizamos outro gerador qualquer (para sincronizar com outros circuitos, por exemplo) devemos ter o cuidado de interligar a entrada no pino certo. Este fato é importante, pois este pino muda conforme o tipo de chip utilizado, por exemplo, com chips HMOS (8051) devemos ligar a entrada de clock ao pino XTAL2, enquanto que em circuitos CMOS (80C51), o clock deve ser colocado no pino XTAL1. A figura abaixo indica a correta montagem destas entradas nos diversos componentes. 3.13 – Estrutura de Interrupções A família 8051 atende a cinco entradas de interrupções distintas, duas externas, duas relativas aos dois timers, e uma relativa ao canal serial interno. Cada interrupção pode ser habilitada ou desabilitada individualmente, setando ou resetando um bit no registrador denominado IE (Interrupt Enable) dentro do SFR. Este registrador contém ainda um bit que habilita todas as interrupções, e sua estrutura completa é mostrada abaixo. O bit em 0 desabilita a interrupção e o bit em 1 habilita a interrupção. EA - - ES ET1 EX1 ET0 EX0 EA – (IE.7) Habilita todas as interrupções globais quando em 1; ES – (IE.4) Interrupção do port serial; ET1 – (IE.3) Interrupção do timer 1; EX1 – (IE.2) Interrupção externa 1; ET0 – (IE.1) Interrupção do timer 0; EX0 – (IE.0) Interrupção externa 0. Cada fonte de interrupção pode ser programada quanto à sua prioridade de atendimento, por um outro registrador localizado na área de SFR e denominado IP (Interrupt Priority). A rotina de prioridade de interrupção determina que se uma interrupção de baixo nível estiver sendo executada, esta pode ser interrompida por uma interrupção de alto nível, sendo continuada após o término da mesma. O contrário não é verdadeiro, ou seja, uma interrupção de alto nível não é interrompida por uma interrupção de nível inferior, nem igual ao dela. Se duas interrupções de mesmo nível são recebidas simultaneamente, uma sequência de pool interna determina qual será atendida em primeiro lugar. A figura abaixo ilustra o conteúdo do registrador IP. O Bit em 0 desabilita a interrupção e o bit em 1 habilita a interrupção. - - - PS PT1 PX1 PT0 PX0 PS – (IP.4) Prioridade de interrupção do canal serial; PT1 – (IP.3) Prioridade de interrupção timer 1; PX1 – (IP.2) Prioridade de interrupção externa 1; PT0 – (IP.1) Prioridade de interrupção do timer 0; PX0 – (IP.0) Prioridade de interrupção externa 0. Quando em operação, todos os flags de interrupção estão retidos no sistema de controle de interrupção durante o estado de cada ciclo de máquina. As amostras são “pooladas” durante o ciclo seguinte, e se uma delas se encontrar setada, o sistema de interrupção gera um LCALL para o endereço apropriado na memória de programa, a menos que outra condição bloqueie a interrupção. Esta LCALL gerada por hardware resulta na transferência do conteúdo do registrador PC para o Stack e recarrega o PC com o primeiro endereço da rotina de interrupção. Cada rotina de uma dada interrupção começa num endereço fixo. Somente o PC é transferido automaticamente para o stack, então devemos nos lembrar de salvar os registradores importantes em cada rotina de interrupção. Salvando apenas o PC, torna-se mais simples a aplicação destas rotinas nas funções mais comuns de controle, onde não necessitamos grandes recursos de software, pois precisamos apenas setar um pino, ou recarregar um timer, ou ler um canal serial, por exemplo. A figura a seguir indica como atuam os registradores no controle do hardware de interrupção: 4 – Descrição do Hardware A descrição a seguir mostra as características construtivas do microcontrolador 8051. 4.1 – Registradores de função especial (Special Function Register – SFR) A figura abaixo indica a disposição do registrador de funções especiais (SFR). Na área de SFR, nem todos os endereços estão ocupados, de forma que estes endereços não estão implantados no chip. Estes espaços destinam-se a acessórios que encontramos em outros componentes da família. Vamos descrever os nomes e funções de cada registrador. End ereço F8H F9H FAH FBH FCH FDH FEH F FH Fun ção F0 – (PSW5): Flag de uso geral. RS1 – (PSW4): Seleção do banco de registradores em uso. RS0 – (PSW3): Seleção do banco de registradores em uso. OV – (PSW2): Overflow em operações aritméticas. - – (PSW1): Flag definível pelo usuário. P – (PSW0): Flag de paridade, indica o número de bits em “1” no acumulador. RS0 RS1 Banco Selecionado Endere ço 0 0 Banco 0 00H até 07H 0 1 Banco 1 08H até 0FH 1 0 Banco 2 10H até 17H 1 1 Banco 3 18H até 1FH 4.5 – Stack Pointer (SP) e Data Pointer (DPTR) O Stack Pointer (ponteiro de pilha) é incrementado antes do armazenamento dos dados em uma instrução PUSH ou CALL. Observe que o Stack pode ser alocado em qualquer região da memória RAM, o ponteiro é sempre inicializado no endereço 07H, e o Stack começa no endereço 08H. O Data Pointer consiste em dois registradores de 8 bits (DPH byte alto, e DPL byte baixo), que podem ser manipulados tanto como dois registradores separados de 8 bits como um único de 16 bits. 4.6 – Buffer Serial (SBUF) O Buffer de dados serial (Serial data BUFfer) consiste de dois registradores separados, o buffer de transmissão e o buffer de recepção. Quando um dado é colocado no buffer serial, ele vai diretamente para o buffer de transmissão serial, e quando ele chega ao buffer de recepção, ele é colocado diretamente no SBUF. Existe um registrador que controla todas as operações da interface serial chamado SCON (Serial CONtrol). Seu conteúdo é descrito a seguir. SM0 SM1 SM2 REN TB8 RB8 TI RI SM0 – (SCON.7): Modo de operação da interface serial. SM1 – (SCON.6): Modo de operação da interface serial. SM2 – (SCON.5): Modo de operação da interface serial. REN – (SCON.4): Habilitação de recepção. TB8 – (SCON.3): É o nono bit transmitido (stop bit). RB8 – (SCON.2): É o nono bit recebido. TI – (SCON.1): Flag indicando fim de transmissão. RI – (SCON.0): Flag indicando buffer de recepção cheio. SM0 SM1 Modo Descriç ão Frequência 0 0 0 Shift Register Freq. Oscilador /12 0 1 1 8 bit UART Variável 1 0 2 9 bit UART Freq. Oscilador /64 ou 32 1 1 3 9 bit UART Variável 4.7 – Portos de E/S (P0, P1, P2, P3) Os portos P0, P1, P2 e P3 são latches dos seus respectivos portos físicos. Escrevendo um bit “1” no SFR, o pino de saída do porto respectivo irá para “1” imediatamente. Quando este port for acessado para leitura, o estado do pino externo é armazenado no registrador correspondente. A estrutura dos port’s é ilustrada abaixo. Todos os 4 port’s são bidirecionais e consistem num latch (que é o próprio SFR), num driver de saída e num driver de entrada. Os drivers de saída dos port’s P0 e P2 e o driver de entrada do port P0, são utilizados durante o acesso à memória externa. 4.8 – Registradores de Timer e de Controle Os pares de registradores (TH0, TL0, e TH1, TL1) são registradores de contagem de 16 bits, nos quais programamos os valores de contagem/temporização dos respectivos contadores. Existem outros registradores de funções específicas de controle de alguns módulos do microcontrolador. Vamos descrever cada um desses registradores. O registrador IP (Interrupt Priority), define um dos dois níveis possíveis para cada interrupção, de acordo com a descrição abaixo. - - PT2 PS PT1 PX1 PT0 PX0 1 0 2 9 bit UART Freq. Oscilador /64 ou 32 1 1 3 9 bit UART Variável Existe ainda um registrador para controle genérico das funções de alimentação do microcontrolador. O registrador PCON (Power CONtrol) é bastante utilizado quando optamos pela utilização da tecnologia CHMOS (80C51 por exemplo), para garantir baixo consumo em circuitos alimentados por bateria, ou ainda que permaneçam um grande período em “stand-by”. SMOD - - - GF1 GF0 PD I DL SMOD: Dobra o baud rate quando utilizamos o timer 1. GF1: Flag de uso geral. GF0: Flag de uso geral. PD: Ativa o modo de operação Power Down (só nos CHMOS). IDL: Ativa o modo de operação IDLE (só nos CHMOS). 4.9 – Estrutura e operação dos ports de I/O Os quatro ports presentes no 8051 são bidirecionais, consistindo cada um de um latch (que é o próprio registrador Px no SFR), em um driver de saída e em um buffer de entrada. Para acessar a memória externa, utilizamos os ports P0 e P2, sendo que o port P0 leva os dados e endereços multiplexados, enquanto que o port P2 leva à memória o restante dos endereços. Fica claro que quando utilizamos os microcontroladores sem memória interna (80C31 por exemplo) o port P2 tem seu uso restrito para endereçamento. O port P3 é um port multifuncional, ou seja, seus pinos não são apenas pinos de entrada e saída, mas tem diversas funções específicas, que estão listadas abaixo: P3.0 – RXD – entrada do port serial P3.1 – TXD – saída do port serial P3.2 – INT0 – entrada da interrupção externa 0 P3.3 – INT1 – entrada da interrupção externa 1 P3.4 – T0 – entrada do Timer/counter 0 P3.5 – T1 – entrada do Timer/counter 1 P3.6 – WR – sinal de escrita para memória externa P3.7 – RD – sinal de leitura para memória externa Os portos 1, 2 e 3 são providos de resistores pull-up internos, enquanto que o port 0 apresenta saídas em open drain. Qualquer uma das linhas pode ser usada independentemente como entrada ou saída, uma vez que os ports são endereçáveis por bit (bit addressable). Para utilizarmos os ports como entradas, devemos colocar nível lógico “1” no latch de entrada, para que o pino fique em nível alto pelo resistor de pull-up, mas possa ser colocado em nível baixo pela ação de um sinal externo. No port 0, não existe o resistor de pull-up interno, de forma que torna-se obrigatório o uso de pull-up’s externos. Quando ocorre o endereçamento, a estrutura do port permite que sejam colocados “1’s” ou “0’s” conforme a necessidade. A estrutura dos ports está representada a seguir, ilustrando o funcionamento dos mesmos. Para escrever um dado em um dispositivo através de um dos ports, devemos simplesmente mover o dado para o registrador respectivo no SFR. Devemos lembrar sempre que os valores de corrente fornecidos pelos port’s são da ordem de miliampères, de forma que precisamos de drivers de corrente na maioria dos casos. Os resistores pull-up internos fornecem baixos valores de corrente e na maioria dos projetos determinamos a ativação dos dispositivos de saída em níveis baixos, pois neste caso a corrente pode ser significativamente maior. Os buffers de saída dos ports 1, 2 e 3 fornecem corrente suficiente para 4 cargas TTL cada um, enquanto que o port 0 pode fornecer corrente para até 8 cargas TTL. Algumas instruções de leitura no port, realizam uma leitura no latch (registrador), enquanto outras realizam a leitura diretamente no pino do CI. As instruções que realizam a leitura no latch, lêem este valor, processam, e depois se for necessário rescrevem-no no latch. São chamadas de “read-modify-write”, e estão listadas a seguir: ANL – “E” lógico ORL – “Ou” lógico XRL – “Ou Exclusivo” lógico JBC – Jump se bit =1 e limpa o bit CPL – Complementa o bit INC – Incremento DEC – Decremento DJNZ – Decrementa e salta se não zero MOV, Px,y, C – Move carry bit para o bit y do port x CLR Px,y – Limpa bit y do port x SETB Px,y – Seta bit y do port x A razão pela qual as instruções acima são direcionadas preferencialmente ao latch é evitar uma má interpretação do nível lógico no pino. Um exemplo disso é quando utilizamos transistores na saída dos microcontroladores, e escrevemos nível “1” na base do mesmo. A tensão neste pino pode ser confundida com nível “0” facilmente, enquanto que se a mesma for lida no latch, representará o valor real do sinal no pino. Quando ocorre o overflow de TLx, o flag TLx é setado e o conteúdo de TLx é recarregado com o valor de THx, que deve ser anteriormente carregado por software. O valor de THx permanece inalterado. Modo 3: O modo 3 deve ser utilizado quando necessitamos de um outro contador no 8051. Quando ativamos o modo 3, estabelecemos dois contadores separados, um para o THx e outro para o TLx. O timer procedente de TLx utiliza para seu controle, os bits C/T, Gate, TR0, INTx e TFx, relativos ao timer 0, enquanto que o timer relativo ao registrador THx, utiliza os bits de controle relativos ao timer 1. A figura abaixo ilustra a lógica de atuação deste modo. 4.13 – Interface Serial A interface serial presente no microcontrolador é do tipo full-duplex, pode transmitir e receber dados simultaneamente, com buffer de recepção, ou seja, pode começar a receber um segundo byte antes de ler o primeiro byte do buffer. Os buffers de transmissão e recepção são comandados pelo registrador SBUF no SFR. Escrita no SBUF carrega o buffer de transmissão, enquanto que leituras no SBUF acessam um registrador de recepção separado fisicamente. A interface serial pode operar em 4 modos distintos, e em qualquer dos modos a transmissão é iniciada por qualquer instrução que utilize o SBUF como registrador de destino. A recepção se dá quando chega um dado no SBUF. 4.14 – Modos de Operação Podemos operar com a interface serial interna do microcontrolador, de quatro modos diferentes: Modo 0: Neste modo, os dados manipulados entram pelo pino RXD, enquanto que o pino TXD é utilizado como saída. Temos então a transmissão de 8 bits, sendo que o primeiro bit é o LSB, e a frequência de baud rate é fixa em 1/12 da frequência do oscilador. A transmissão é iniciada por qualquer instrução que utilize o SBUF como registrador de destino. Imediatamente após esta instrução, é colocado um bit “1” na nona posição do shift register e o bloco de controle de transmissão começa a transmissão. Os bits de dados são deslocados para a direita e são colocados zeros nas posições desocupadas, até que se chegue no MSB. Esta condição avisa para o bloco de controle que deve ser efetuado um deslocamento, e em seguida é setada a flag TI. Todo este processo ocorre no tempo de 10 ciclos de máquina. A recepção começa quando a condição REN é igual a “1” e o flag RI é igual a “0”. Os dados recebidos são deslocados e após a chegada do último bit, o flag de recepção RI é setado, indicando que existem dados no buffer de recepção. A figura abaixo ilustra o processo. Modo 1: 4. 15 – Registrador de Controle O controle da interface serial é feito pelo já descrito registrador SCON, com a atuação do registrador PCON, (utilizando o bit SMOD). Por este registrador podemos monitorar o funcionamento da interface serial pelos bits TI, RI, TB8 e RB8, que indicam o estado da interface serial nas operações de transmissão ou recepção. 4.16 – Baud Rates A taxa de transmissão (baud rate), tem seus valores definidos de acordo com o modo de operação estabelecido para o interface serial. No modo 0, o baud rate é fixo e tem seu valor estabelecido como sendo 1/12 da frequência do oscilador. No modo 2, a frequência pode ter dois valores distintos, dependendo do valor do bit SMOD no registrador PCON. Se SMOD for igual a 0, o baud rate é igual a 1/64 da frequência do oscilador, se o SMOD for igual a 1, o baud rate passa a ser 1/32 da frequência do oscilador. Quando utilizamos o timer 1 como gerador de baud rate, o baud rate nos modos 1 e 3 tem seu valor determinado pela taxa de overflow do próprio timer 1, obedecendo a fórmula: Baud rate = [(2Smod)/32] x (timer 1 overflow rate) A interrupção do timer 1 deve ser desabilitada neste caso para evitar sinalização indevida. O timer pode ser configurado para operação como timer ou como contador em qualquer um dos três modos. O modo mais comumente utilizado é o modo de operação como timer de auto-recarga. A fórmula para se obter diretamente a frequência do baud rate é a seguinte: Baud Rate = {[(2Smod)/32] x [Fosc./[12 x (256 - TH1)]]} A tabela abaixo indica os valores mais utilizados a partir de uma dada frequência de cristal, e os valores de recarga dos timers para facilitar a programação. Bau d Rate Fre q. Osc. S MOD Mo do Valor de Recarga 19,2 K 11, 059 MHz 1 2 FDH 9,6K 11, 059 MHz 0 2 FDH 4,8K 11, 059 MHz 0 2 FAH 2,4K 11, 059 MHz 0 2 F4H 1,2K 11, 059 MHz 0 2 E8H 137, 5 11, 968 MHz 0 2 1DH 110 6 MHz 0 2 72H 110 12 MHz 0 1 FEEBH Devemos observar os valores de máxima frequência para cada um dos modos, e respeitá-los, pois o uso de frequências acima destes valores acarretariam perdas de informação na comunicação serial. A tabela abaixo indica estas frequências: Mo do Frequência Máxima 0 1 MHz 1 e 3 62,5 KHz 2 375 KHz 4.17 – Interrupções Os microcontroladores da família 8051 são providos de 5 fontes de interrupção, como mostradas na figura a seguir. As interrupções externa INT0 e INT1 podem ser ativadas por nível lógico ou por transição (borda), dependendo para isto, dos bits IT0 e IT1 no registrador TCON. Os flags que indicam a presença da interrupção nos pinos externos são IE0 e IE1 no mesmo registrador TCON. Quando uma interrupção externa é recebida, o respectivo flag é limpo quando a rotina de serviço é vetorada para o endereço da interrupção, somente se a interrupção for do tipo ativa por transição. Se a interrupção for ativa por nível , o dispositivo externo que solicitou a interrupção se encarrega do seu controle. As interrupções dos timers são geradas quando houver overflow dos mesmos, e são reestabelecidas ao seu estado inativo por hardware quando a interrupção já se encontrar devidamente vetorada. A interrupção da interface serial é gerada por um OU lógico entre os flags de RI e TI, e estes flags não são limpos após o vetoramento da interrupção, devendo ser feito este procedimento por software, após o recebimento ou transmissão do dado. Todos os bits que geram interrupção podem ser habilitados ou não pelo registrador de habilitação de interrupção IE. Os vetores de endereço das interrupções, ou seja, os endereços para qual o PC é direcionado quando ocorre uma interrupção são fixos e seus valores são indicados a seguir: Fon te Endereço IE0 0003H TF0 000BH IE1 0013H TF1 001BH Seri al 0023H 4.18 – Estrutura de prioridades Cada uma das fontes de interrupção pode ser individualmente programada para atender a um dos dois possíveis níveis de interrupção, mediante um bit específico no registrador IP. Colocando um valor 0 no bit correspondente, definimos esta interrupção como de menor prioridade, e vice-versa. Quando temos duas interrupções de mesma prioridade, no mesmo instante, elas serão atendidas pelo pool select que é realizado na seguinte ordem: IE0 – TF0 – IE1 – TF1 – Serial 4.19 – Interrupções externas As fontes externas de interrupção podem ser programadas para serem ativadas por nível ou por borda, desde que os pinos de interrupção externa sejam amostrados uma vez a cada ciclo de máquina, a entrada de interrupção deve manter-se estável por pelo menos 12 períodos do oscilador para que a interrupção seja reconhecida. No 4.23 – Operação passo a passo Este modo de operação é muito útil durante a construção de programas, e desenvolvimento do hardware, para solucionar eventuais problemas surgidos no decorrer destes processos. Podemos entender esta operação, lembrando o funcionamento da já conhecida estrutura das interrupções do microcontrolador. Quando uma interrupção está em progresso, outra interrupção de mesmo nível não pode ser ativada simultaneamente. O fato é que a próxima interrupção só ocorre após a execução de pelo menos uma instrução do programa interrompido, de forma que, colocando a interrupção INT0 (por exemplo) em nível baixo e acrescentando algumas linhas de programa nas rotinas de tratamento da interrupção. As linhas são as seguintes: JNB P3.2,$ ; aguarda até que a interrupção vá para alto JB P3.2,$ ; aguarda até que a interrupção vá para baixo RETI ; volta e executa uma instrução Desta forma, quando a INT0 é ativada em nível baixo, a CPU vai para a rotina de tratamento da interrupção e fica até que o sinal INT0 pulse (de baixo para alto e novamente para baixo). Desta forma ela executa o comando de retorno da interrupção, executa uma instrução e imediatamente retorna a rotina de interrupção, permanecendo nesta até que o sinal INT0 pulse novamente. Esta é uma forma simples de acompanhar a execução das rotinas de um programa passo a passo, mas normalmente vamos executar estas rotinas através de um software de simulação apropriado, onde serão detectadas as principais falhas na programação. 4.24 – Descrição da pinagem A figura abaixo ilustra a pinagem do controlador 8051 nas duas formas de encapsulamento mais comuns: A descrição da pinagem deste componente, no invólucro DIP é dada abaixo: Pino Descrição 1 Port 1, Dado 0 2 Port 1, Dado 1 3 Port 1, Dado 2 4 Port 1, Dado 3 5 Port 1, Dado 4 6 Port 1, Dado 5 7 Port 1, Dado 6 8 Port 1, Dado 7 9 Entrada de Reset 10 Port 3, Dado 0 (RXD da interface serial interna) 11 Port 3, Dado 1 (TXD da interface serial interna) 12 Port 3, Dado 2 (Interrupção externa INT0) 13 Port 3, Dado 3 (Interrupção externa INT1) 14 Port 3, Dado 4 (Entrada do Timer 0) 15 Port 3, Dado 5 (Entrada do Timer 1) 16 Port 3, Dado 6 (Sinal de escrita para memória exemploterna) 17 Port 3, Dado 7 (Sinal de leitura para memória externa) 18 Entrada do cristal do oscilador 19 Entrada do cristal do oscilador 20 Alimentação Terra 21 Port 2, Bit0 (Endereço A8) 22 Port 2, Bit1 (Endereço A9) 23 Port 2, Bit2 (Endereço A10) 24 Port 2, Bit3 (Endereço A11) 25 Port 2, Bit4 (Endereço A12) 26 Port 2, Bit5 (Endereço A13) 27 Port 2, Bit6 (Endereço A14) 28 Port 2, Bit7 (Endereço A15) 29 Sinal PSEN (Program Search Enable) 30 Sinal ALE (Address Latch Enable) *Prog no 8751 31 Sinal EA (External Access) *Tensão de Prog no 8751 32 Port 0, Bit 7 (Dado 7) 33 Port 0, Bit 6 (Dado 6) 34 Port 0, Bit 5 (Dado 5) 35 Port 0, Bit 4 (Dado 4) 36 Port 0, Bit 3 (Dado 3) 37 Port 0, Bit 2 (Dado 2) 38 Port 0, Bit 1 (Dado 1) 39 Port 0, Bit 0 (Dado 0) 40 Alimentação de +5V Além das instruções pertencentes ao microcontrolador em questão, a linguagem assembly possui ainda algumas instruções especiais, pseudo-instruções ou diretivas, que são usadas apenas para a estruturação do programa. Estas instruções especiais, que não são traduzidas para o código de máquina por não pertencerem ao conjunto de instruções do microcontrolador escolhido, possuem apenas funções especiais no programa como: definir símbolos, estabelecer o endereço inicial do programa, reservar área de memória etc, não sendo, portanto, processadas. PSEUDO-INSTRUÇÕES MAIS USADAS ORG (ORIGIN) Formato: Pseudo-instrução operando ORG endereço Função: Usado para o endereço inicial de memória, no qual o programa ou um trecho de programa será armazenado. Exemplo: ORG 0100H Assim o programa objeto será carregado na memória a partir do endereço 0100H DB (DEFINE BYTE) Formato: Pseudo-instrução operando DB byte Função: O byte do operando é carregado diretamente na posição de memória escolhida pelo ORG. Exemplo: ORG 0050H DB 3FH DB 1AH Assim os bytes 3FH e 1AH foram armazenados nas posições de memória 0050H e 0051H respectivamente. 51 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” END Formato: Pseudo-instrução END Função: Indica o final do programa. 5.3 – USO DO COMPILADOR E DO LINKER (PASSO A PASSO) OBS: Comandos digitados na linha de ”prompt do DOS”. 1. Com o “NE” ou “EDIT” escrever um programa em assembly nomeado obrigatoriamente com a extensão “.ASM” (criando assim programa fonte). OBS: No editor de textos deve-se obrigatoriamente reservar as colunas de “1” a “6” para os “labels” ou “tags” que representam os endereços do programa, de entrada de “loops”, chamada de sub-rotinas etc. 2. Com o “X8051” (compilador) obter os arquivos com extensão “.OBJ” (programa objeto) e “.LST” (listagem) da seguinte forma: X8051 [ENTER] Listing Destination (..........): D [ENTER] Generate cross reference [ENTER] Input file name:.........nome do arquivo.ASM [ENTER] Output file name: ...... nome do arquivo [ENTER] 3. Com o “LINK” ligar o arquivo “.OBJ”, gerando um arquivo “.HEX” da seguinte forma: LINK [ENTER] Input file name: ........ .OBJ [ENTER] Enter offset for ....... [ENTER] Input file name: [ENTER] Output file name: [ENTER] Options (..........): H [ENTER] 4. No simulador: Load Avocet .... .HEX Simulation F1 (total) F10 (passo a passo) 52 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 5.4 – Simulador dos Microcontroladores da família 8051 ****** TELA DE ENTRADA DO SIMULADOR: ****** Deve-se selecionar uma opção em função da cpu escolhida para o projeto. ****** TELA DE SIMULAÇÃO: ****** 5.5 – Operação básica do simulador Para uma rápida ambientação com o programa simulador, é apresentada uma seqüência de testes para as principais teclas e/ou comandos: · Visualização geral da tela, visando reconhecer os seus principais campos (coloridos) e funções correspondentes. · Teclas: ESC CTRL C · Comandos: Help à Commands Display Simulation 53 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 0 B INC R3 Soma 1 ao conteúdo de R3 1 12 - - - 0 C INC R4 Soma 1 ao conteúdo de R4 1 12 - - - 0 D INC R5 Soma 1 ao conteúdo de R5 1 12 - - - 0 E INC R6 Soma 1 ao conteúdo de R6 1 12 - - - 0 F INC R7 Soma 1 ao conteúdo de R7 1 12 - - - 1 0 JBC bit, rel Desvia se o bit endereçado estiver setado e depois zera o bit 3 24 - - - 1 1 ACALL End11 Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - 1 2 LCALL End16 Chama sub-rotina em qualquer posição da memória de programa 3 24 - - - 1 3 RRC A Desloca o acumulador à direita através do carry 1 12 ? - - 1 4 DEC A Subtrai 1 do acumulador 1 12 - - - 1 5 DEC Direto Subtrai 1 da posição de memória 2 12 - - - 1 6 DEC @R0 Subtrai 1 da RAM endereçada por R0 1 12 - - - 1 7 DEC @R1 Subtrai 1 da RAM endereçada por R1 1 12 - - - 1 8 DEC R0 Subtrai 1 do conteúdo de R0 1 12 - - - 1 9 DEC R1 Subtrai 1 do conteúdo de R1 1 12 - - - 1 A DEC R2 Subtrai 1 do conteúdo de R2 1 12 - - - 1 B DEC R3 Subtrai 1 do conteúdo de R3 1 12 - - - 1 C DEC R4 Subtrai 1 do conteúdo de R4 1 12 - - - 1 D DEC R5 Subtrai 1 do conteúdo de R5 1 12 - - - 1 E DEC R6 Subtrai 1 do conteúdo de R6 1 12 - - - 1 F DEC R7 Subtrai 1 do conteúdo de R7 1 12 - - - 2 0 JB bit, rel Desvio se o bit endereçado estiver setado 3 24 - - - 2 1 AJMP End11 Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - 2 2 RET Retorne da sub-rotina 1 24 - - - 56 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 2 3 RL A Desloca o acumulador à esquerda 1 12 - - - 2 4 ADD A, #Dado Soma o dado ao acumulador 2 12 ? ? ? 2 5 ADD A, Direto Soma o conteúdo da posição de memória ao acumulador 2 12 ? ? ? 2 6 ADD A, @R0 Soma o conteúdo da RAM endereçada por R0 ao acumulador 1 12 ? ? ? 2 7 ADD A, @R1 Soma o conteúdo da RAM endereçada por R1 ao acumulador 1 12 ? ? ? 2 8 ADD A, R0 Soma o conteúdo de R0 ao acumulador 1 12 ? ? ? 2 9 ADD A, R1 Soma o conteúdo de R1 ao acumulador 1 12 ? ? ? 2 A ADD A, R2 Soma o conteúdo de R2 ao acumulador 1 12 ? ? ? 2 B ADD A, R3 Soma o conteúdo de R3 ao acumulador 1 12 ? ? ? 2 C ADD A, R4 Soma o conteúdo de R4 ao acumulador 1 12 ? ? ? 2 D ADD A, R5 Soma o conteúdo de R5 ao acumulador 1 12 ? ? ? 2 E ADD A, R6 Soma o conteúdo de R6 ao acumulador 1 12 ? ? ? 2 F ADD A, R7 Soma o conteúdo de R7 ao acumulador 1 12 ? ? ? 3 0 JNB bit, rel Desvia se o bit endereçado estiver zerado 3 24 - - - 3 1 ACALL End11 Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - 3 2 RETI Retorne da interrupção 1 24 - - - 3 3 RLC A Desloca o acumulador à esquerda através do carry 1 12 ? - - 3 4 ADDC A, #Dado Soma o dado e o carry ao acumulador 2 12 ? ? ? 3 5 ADDC A, Direto Soma o conteúdo da posição de memória e o carry ao acumulador 2 12 ? ? ? 3 6 ADDC A, @R0 Soma o conteúdo da RAM endereçada por R0 e o carry ao acumulador 1 12 ? ? ? 3 7 ADDC A, @R1 Soma o conteúdo da RAM endereçada por R1 e o carry ao acumulador 1 12 ? ? ? 3 8 ADDC A, R0 Soma o conteúdo de R0 e o carry ao acumulador 1 12 ? ? ? 57 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 3 9 ADDC A, R1 Soma o conteúdo de R1 e o carry ao acumulador 1 12 ? ? ? 3 A ADDC A, R2 Soma o conteúdo de R2 e o carry ao acumulador 1 12 ? ? ? 3 B ADDC A, R3 Soma o conteúdo de R3 e o carry ao acumulador 1 12 ? ? ? 3 C ADDC A, R4 Soma o conteúdo de R4 e o carry ao acumulador 1 12 ? ? ? 3 D ADDC A, R5 Soma o conteúdo de R5 e o carry ao acumulador 1 12 ? ? ? 3 E ADDC A, R6 Soma o conteúdo de R6 e o carry ao acumulador 1 12 ? ? ? 3 F ADDC A, R7 Soma o conteúdo de R7 e o carry ao acumulador 1 12 ? ? ? 4 0 JC rel Desvia se o carry estiver setado 2 24 - - - 4 1 AJMP End11 Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - 4 2 ORL Direto, A “Ou” entre acumulador e memória; resultado na memória 2 12 - - - 4 3 ORL Direto, #Dado “Ou” entre dado e memória 3 24 - - - 4 4 ORL A, #Dado “Ou” entre dado e acumulador 2 12 - - - 4 5 ORL A, Direto “Ou” entre memória e acumulador 2 12 - - - 4 6 ORL A, @R0 “Ou” entre a RAM endereçada por R0 e o acumulador 1 12 - - - 4 7 ORL A, @R1 “Ou” entre a RAM endereçada por R1 e o acumulador 1 12 - - - 4 8 ORL A, R0 “Ou” entre o conteúdo de R0 e o acumulador 1 12 - - - 4 9 ORL A, R1 “Ou” entre o conteúdo de R1 e o acumulador 1 12 - - - 4 A ORL A, R2 “Ou” entre o conteúdo de R2 e o acumulador 1 12 - - - 4 B ORL A, R3 “Ou” entre o conteúdo de R3 e o acumulador 1 12 - - - 4 C ORL A, R4 “Ou” entre o conteúdo de R4 e o acumulador 1 12 - - - 4 D ORL A, R5 “Ou” entre o conteúdo de R5 e o acumulador 1 12 - - - 4 E ORL A, R6 “Ou” entre o conteúdo de R6 e o acumulador 1 12 - - - 4 F ORL A, R7 “Ou” entre o conteúdo de R7 e o acumulador 1 12 - - - 5 0 JNC rel Desvia se o carry estiver zerado 2 24 - - - 5 1 ACALL End11 Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - 58 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” o acumulador com esta memória 8 4 DIV AB Divide A e B; resultado: A inteiro e B resto 1 48 0 ? 0 8 5 MOV Direto1, Direto2 Mova o conteúdo da memória direta2 para a memória direta1 3 24 - - - 8 6 MOV Direto, @R0 Mova RAM endereçada por R0 para memória 2 24 - - - 8 7 MOV Direto, @R1 Mova RAM endereçada por R1 para memória 2 24 - - - 8 8 MOV Direto, R0 Mova registro R0 para memória 2 24 - - - 8 9 MOV Direto, R1 Mova registro R1 para memória 2 24 - - - 8 A MOV Direto, R2 Mova registro R2 para memória 2 24 - - - 8 B MOV Direto, R3 Mova registro R3 para memória 2 24 - - - 8 C MOV Direto, R4 Mova registro R4 para memória 2 24 - - - 8 D MOV Direto, R5 Mova registro R5 para memória 2 24 - - - 8 E MOV Direto, R6 Mova registro R6 para memória 2 24 - - - 8 F MOV Direto, R7 Mova registro R7 para memória 2 24 - - - 9 0 MOV DPTR, #Dado 16 Mova dado de 16 bits para o DPTR 3 24 - - - 9 1 ACALL End11 Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - 9 2 MOV bit, C Mova o carry para o bit endereçado 2 24 - - - 9 3 MOVC A, @A + DPTR Soma A + DPTR obtendo um endereço de 16 bits na memória de programa; carrega o acumulador com esta memória 1 24 - - - 9 4 SUBB A, #Dado Subtrai o dado e o borrow do acumulador 2 12 ? ? ? 9 5 SUBB A, Direto Subtrai o conteúdo da posição de memória e o borrow do acumulador 2 12 ? ? ? 9 6 SUBB A, @R0 Subtrai o conteúdo da RAM endereçada por R0 e o borrow do acumulador 1 12 ? ? ? 9 7 SUBB A, @R1 Subtrai o conteúdo da RAM endereçada por R1 e o borrow do acumulador 1 12 ? ? ? 9 8 SUBB A, R0 Subtrai o conteúdo de R0 e o borrow do acumulador 1 12 ? ? ? 9 9 SUBB A, R1 Subtrai o conteúdo de R1 e o borrow do acumulador 1 12 ? ? ? 9 A SUBB A, R2 Subtrai o conteúdo de R2 e o borrow do acumulador 1 12 ? ? ? 9 B SUBB A, R3 Subtrai o conteúdo de R3 e o borrow do acumulador 1 12 ? ? ? 61 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 9 C SUBB A, R4 Subtrai o conteúdo de R4 e o borrow do acumulador 1 12 ? ? ? 9 D SUBB A, R5 Subtrai o conteúdo de R5 e o borrow do acumulador 1 12 ? ? ? 9 E SUBB A, R6 Subtrai o conteúdo de R6 e o borrow do acumulador 1 12 ? ? ? 9 F SUBB A, R7 Subtrai o conteúdo de R7 e o borrow do acumulador 1 12 ? ? ? A 0 ORL C, /bit “Ou” entre o complemento do bit endereçado e o carry 2 24 ? - - A 1 AJMP End11 Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - A 2 MOV C, bit Mova o bit endereçado para o carry 2 12 ? - - A 3 INC DPTR Soma 1 ao registro DPTR 1 24 - - - A 4 MUL AB Multiplica A e B; resultado: BA 1 48 0 - ? A 5 A 6 MOV @R0, Direto Mova a memória para a RAM endereçada por R0 2 24 - - - A 7 MOV @R1, Direto Mova a memória para a RAM endereçada por R1 2 24 - - - A 8 MOV R0, Direto Mova memória para o registro R0 2 24 - - - A 9 MOV R1, Direto Mova memória para o registro R1 2 24 - - - A A MOV R2, Direto Mova memória para o registro R2 2 24 - - - A B MOV R3, Direto Mova memória para o registro R3 2 24 - - - A C MOV R4, Direto Mova memória para o registro R4 2 24 - - - A D MOV R5, Direto Mova memória para o registro R5 2 24 - - - A E MOV R6, Direto Mova memória para o registro R6 2 24 - - - A F MOV R7, Direto Mova memória para o registro R7 2 24 - - - B 0 ANL C, /bit “E” entre o complemento do bit endereçado e o carry 2 24 ? - - B 1 ACALL End11 Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - B 2 CPL bit Inverte o estado do bit endereçado 2 12 - - - B 3 CPL C Inverte o estado do carry 1 12 ? - - B 4 CJNE A, #Dado rel Compara e desvia se o acumulador for diferente do dado 3 24 ? - - 62 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” B 5 CJNE A, Direto rel Compara e desvia se o acumulador for diferente da memória endereçada 3 24 ? - - B 6 CJNE @R0, #Dado rel Compara e desvia se a RAM endereçada por R0 for diferente do dado 3 24 ? - - B 7 CJNE @R1, #Dado rel Compara e desvia se a RAM endereçada por R1 for diferente do dado 3 24 ? - - B 8 CJNE R0, #Dado rel Compara e desvia se o registro R0 for diferente do dado 3 24 ? - - B 9 CJNE R1, #Dado rel Compara e desvia se o registro R1 for diferente do dado 3 24 ? - - B A CJNE R2, #Dado rel Compara e desvia se o registro R2 for diferente do dado 3 24 ? - - B B CJNE R3, #Dado rel Compara e desvia se o registro R3 for diferente do dado 3 24 ? - - B C CJNE R4, #Dado rel Compara e desvia se o registro R4 for diferente do dado 3 24 ? - - B D CJNE R5, #Dado rel Compara e desvia se o registro R5 for diferente do dado 3 24 ? - - B E CJNE R6, #Dado rel Compara e desvia se o registro R6 for diferente do dado 3 24 ? - - B F CJNE R7, #Dado rel Compara e desvia se o registro R7 for diferente do dado 3 24 ? - - C 0 PUSH Direto Incrementa o SP e então coloca a memória no Stack 2 24 - - - C 1 AJMP End11 Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço) 2 24 - - - C 2 CLR bit Zera o bit endereçado 2 12 - - - C 3 CLR C Zera o carry 1 12 0 - - C 4 SWAP A Troca os nibbles do acumulador. Equivale a 4 RR A ou 4 RL A 1 12 - - - C 5 XCH A, Direto Troca memória com o acumulador 2 12 - - - C 6 XCH A, @R0 Troca a RAM indiretamente endereçada por R0 com o acumulador 1 12 - - - C 7 XCH A, @R1 Troca a RAM indiretamente endereçada por R1 com o acumulador 1 12 - - - 63 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” do OpCode são os bits MSB do endereço) F 2 MOVX @R0, A Mova acumulador para RAM externa indiretamente endereçada por R0 (endereço 8 bits) 1 24 - - - F 3 MOVX @R1, A Mova acumulador para RAM externa indiretamente endereçada por R1 (endereço 8 bits) 1 24 - - - F 4 CPL A Inverte o estado dos bits do acumulador 1 12 - - - F 5 MOV Direto, A Mova acumulador para memória 2 12 - - - F 6 MOV @R0, A Mova o acumulador para a RAM indiretamente endereçada por R0 1 12 - - - F 7 MOV @R1, A Mova o acumulador para a RAM indiretamente endereçada por R1 1 12 - - - F 8 MOV R0, A Mova o acumulador para o registro R0 1 12 - - - F 9 MOV R1, A Mova o acumulador para o registro R1 1 12 - - - F A MOV R2, A Mova o acumulador para o registro R2 1 12 - - - F B MOV R3, A Mova o acumulador para o registro R3 1 12 - - - F C MOV R4, A Mova o acumulador para o registro R4 1 12 - - - F D MOV R5, A Mova o acumulador para o registro R5 1 12 - - - F E MOV R6, A Mova o acumulador para o registro R6 1 12 - - - F F MOV R7, A Mova o acumulador para o registro R7 1 12 - - - 7 – Esquema da CPU mínima para teste e carregamento de programa 66 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 8 – Programa teste do sistema mínimo ;************************************************************** ; PROGRAMA TESTE ;************************************************************** ORG 0000H ;Define endereço de início LJMP INICIO ORG 0050H ;Define endereço de início de execução INICIO: MOV TMOD,#11H ;Configura T0 e T1 no modo 1 MOV TCON,#00H ;Configura TCON MOV A,#11111110B ;Carrega ACC com 11111110 (binário) VOLTA: MOV P0, A ;Carrega ACC nos PORTS MOV P1, A ;P0, P1, P2 e P3 MOV P2, A MOV P3, A RR A ;Rotaciona ACC para direita ACALL DELAY ;Chama rotina de tempo de 1s (PARA CLOCK DE 12MHz) 67 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” LJMP VOLTA ;************************************************************** ; Rotina de Tempo de 1s ;************************************************************** DELAY: MOV R0, #20 ;Carrega valor 20 (decimal) em R0 REP: MOV TH1, #3CH ;Carrega Timer 1 MOV TL1, #0AFH ;Com 3CAF (hexa) para contagem de 50ms SETB TR1 ;Início de contagem JNB TF1, $ ;Testa se houve overflow em Timer 1 CLR TF1 ;Reseta flag de overflow DJNZ R0, REP ;Repete temporização se necessário CLR TR1 ;Desliga contagem RET END 9 – Referências Bibliográficas - Aplicações Práticas do Microcontrolador 8051 (Teoria Geral Detalhada) Vidal Pereira da Silva Junior Editora Érica - Apostila de Microcontroladores Família MCS – 51 (Conceitos, Aplicações e Projetos) Professor Wilson Ruiz Centro Federal de Educação Tecnológica de São Paulo (CEFET – SP) - Apostila CURSO de MICROCONTROLADORES 8051 KIT STATION51 (Apostila Teórica) Professor Elmo Dutra da Silveira Filho Centro Tecnológico de Mecatrônica – SENAI - Apontamentos de aulas - Laboratório de Microcontroladores Família 8051 Denys E. C. Nicolosi Editora Érica - Manuais de Microcontoladores Família 8051 dos fabricantes: INTEL ATMEL - The 8051 Microcontroller – Architecture, Programming and Applications Kenneth J. Ayala Western Carolina University 68 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” ; 65535 – 50000 + 1 = 15536 = 3cb0h = Valor A Ser Carregado Inicialmente No Contador / Temporizador ;************************************************************************************************ ORG 0000H LJMP INICIO ORG 0003H LJMP INT0 ORG 000BH LJMP TIMER0 ORG 0050H INICIO: MOV SP, #0030H ;estabelece o ponteiro da pilha MOV IE, #10000011B ;habilita INT0 e TIMER0 MOV IP, #00000001B ;define prioridade alta p/ INT0 e baixa p/ TIMER0 MOV TCON, #00000000B ;INT0 ativa por nível “0” e TIMER0 desligado MOV TMOD, #00000001B ;função de temporização com controle do TIMER0 feito pelo bit TR0 ;modo 1 de operação CLR P1.1 ;para o elevador CLR P1.0 MOV TH0, #3CH ;valor inicial para a contagem / temporização MOV TL0, #0B0H CLR 00 ;inicializa um bit endereçável para ser a FLAG DO TIMER0 ;************************************************************************************************** ; O sistema (elevador) está sendo iniciado ;************************************************************************************************** JB P0.4, L25 ;verifica se o elevador já estava no 1o andar. ACALL DESCER ;leva o elevador inicialmente para o térreo. L1: JNB P0.4, L1 ;espera chegar no 1o andar ACALL PARAR L25: SETB P1.4 ;acende led indicador de 1o andar CLR P1.5 ;apaga led indidador de 2o andar CLR P1.6 ;apaga led indicador de 3o andar ;************************************************************************************************** ; O elevador está no 1o andar 71 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” ;************************************************************************************************** ANDAR_1: JB P0.1, L2 ;testa chamada para o 2o andar JB P0.2, L3 ;testa chamada para o 3o andar AJMP ANDAR_1 ;volta para esperar uma chamada L2: ACALL SUBIR ;movimenta o elevador para o 2o andar L4: JNB P0.5, L4 ;espera chegar no 2o andar ACALL PARAR SETB P1.5 ;acende o led indicador de 2o andar LJMP ANDAR_2 L3: ACALL SUBIR ;movimenta o elevador para o 3o andar L5: JNB P0.6, L5 ;espera chegar no 3o andar ACALL PARAR SETB P1.6 ;acende o led indicador de 3o andar LJMP ANDAR_3 ;************************************************************************************************ ; O elevador está no 2o andar ;************************************************************************************************ ANDAR_2: JB P0.0, L6 ;testa chamada para o 1o andar JB P0.2, L7 ;testa chamada para o 3o andar AJMP ANDAR_2 ;volta para esperar uma chamada L6: ACALL DESCER ;movimenta o elevador para o 1o andar L8: JNB P0.4, L8 ;espera chegar no 1o andar ACALL PARAR SETB P1.4 ;acende o led indicador de 1o andar LJMP ANDAR_1 L7: ACALL SUBIR ;movimenta o elevador para o 3o andar L9: JNB P0.6, L9 ;espera chegar no 3o andar ACALL PARAR SETB P1.6 ;acende o led indicador de 3o andar LJMP ANDAR_3 ;************************************************************************************************ ; O elevador está no 3o andar ;************************************************************************************************ 72 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” ANDAR_3: JB P0.0, L10 ;testa chamada para o 1o andar JB P0.1, L11 ;testa chamada para o 2o andar AJMP ANDAR_3 ;volta para esperar uma chamada L10: ACALL DESCER ;movimenta o elevador para o 1o andar L12: JNB P0.4, L12 ;espera chegar no 1o andar ACALL PARAR SETB P1.4 ;acende o led indicador de 1o andar LJMP ANDAR_1 L11: ACALL DESCER ;movimenta o elevador para o 2o andar L13: JNB P0.5, L13 ;espera chegar no 2o andar ACALL PARAR SETB P1.5 ;acende o led indicador de 2o andar LJMP ANDAR_2 ;************************************************************************************************ ; sub-rotina: SUBIR ;************************************************************************************************ SUBIR: CLR P1.4 ;apaga todos os led’s CLR P1.5 CLR P1.6 CLR P1.2 ;fecha a porta SETB TR0 ;liga o timer0 L20: JNB 00, L20 ;espera o término da temporização CLR 00 ;reseta a FLAG DO TIMER0 SETB P1.1 ;sobe o elevador CLR P1.0 RET ;************************************************************************************************ ; sub-rotina: DESCER ;************************************************************************************************ DESCER: CLR P1.4 ;apaga todos os led’s CLR P1.5 CLR P1.6 CLR P1.2 ;fecha a porta 73 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” Sua função é gravar o arquivo .hex gerado por qualquer compilador para 8051 no microcontrolador, conforme os passos descritos a seguir: a) Após ter o programa simulado e funcionando deve-se carregar o arquivo .hex o qual foi compilado conforme descrição em capítulo anterior; b) Após compilar o programa, copie o arquivo .hex criado para pasta onde está localizado o programa AEC_ISP.EXE; c) Execute o programa e selecionar a opção (J) Setup para configurá-lo. Configure-o de acordo com a próxima tela. Lembre-se de modificar a opção (9)device onde você deve selecionar o tipo de microcontrolador a ser programado. A etapa de configuração só deve ser feita uma vez. Para as próximas gravações, pode-se pular este passo, desde que o microcontrolador a ser programado seja o mesmo (possua o mesmo código), e ao terminar de configurar, aperte (S) Save setup para salvar as definições; d) Coloque o microcontrolador no soquete, conecte o gravador na porta paralela, e ligue a fonte de alimentação; e) Na tela de opções selecione (A) Load hex file to flash buffer; f) Digite o nome do arquivo que você copiou para a pasta do programa; 76 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” g) Finalmente selecione (E) – Program. O software irá iniciar a gravação e verificação do programa, conforme a tela a seguir. Ao terminar saia do software e desconecte todos os equipamentos; h) Pronto, o circuito já pode ser testado. ANEXO 1 – DISPLAY LCD 01 – INTRODUÇÃO Os módulos LCD são interfaces de saída muito útil em sistemas microprocessados. Estes módulos podem ser gráficos e a caracter. Os módulos LCD gráficos são encontrados com resuluções de 122x32, 128x64, 240x64 e 240x128 dots 77 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” pixel, e geralmente estão disponíveis com 20 pinos para conexão. Os LCD comuns (tipo caracter) são especificados em número de linhas por colunas e são encontrados nas configurações previstas na Tabela 1. Tabela 1 - Módulos LCD disponíveis Os módulos podem ser encontrados com LED backlight (com uma iluminação de fundo) para facilitar as leituras durante a noite. Neste caso, a alimentação deste led faz- se normalmente pelos pinos 15 e 16 para os módulos comuns e 19 e 20 para os módulos gráficos, sendo os pinos 15 e 19 para ligação ao anodo e os pinos 16 e 20 para o catodo. A corrente de alimentação deste led varia de 100 a 200mA, dependendo do modelo. Estes módulos utilizam um controlador próprio, permitindo sua interligação com com outras placas através de seus pinos, onde deve ser alimentado o módulo e interligado o barramento de dados e controle do módulo com a placa do usuário. Naturalmente que além de alimentar e conectar os pinos do módulo com a placa do usuário deverá haver um protocolo de comunicação entre as partes, que envolve o envio de bytes de instruções e bytes de dados pelo sistema do usuário. A Tabela 2 descreve cada pino do módulo ou do display para conexão deste a outras placas: 78 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” Tabela 4 - Endereçamento do módulo LCD para Figura 3 O exemplo apresentado na Figura 3 refere-se à conexão do módulo LCD com comunicação/transmissão de 8 bits, mas podemos conectar o módulo com transmissão a cada 4 bits, conforme é mostrado na Figura 4. Neste caso não utilizamos os pinos 7, 8, 9 e 10. Isto é muito útil quando a CPU do usuário possui poucos pinos de I/O, caso típico da linha de microprocessadores PIC, como por exemplo o Basic Stamp. Agora surge a dúvida, um mesmo módulo pode conectar-se com 8 ou 4 bits? como isto é possível? Ocorre que o módulo LCD quando alimentado necessita de algumas instruções de inicialização que identificará qual a forma de transmissão de dados que será estabelecida entre a CPU e o módulo. Figura 4 - Modulo LCD comunicando-se com 4 bits 03 – PROGRAMAÇÃO / INSTRUÇÕES 81 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” Tabela 5 - Conjunto de instruções do módulo LCD A Tabela 5 apresenta o conjunto de instruções, levando-se em consideração que a comunicação com o módulo seja com barramento de 8 bits (fixado durante a inicialização) . Para o caso desta comunicação ocorrer com apenas 4 bits (nible), os 8 dados ou instruções serão enviados por nible. sendo enviado o nible mais significativo primeiro. Por exemplo para limpar o display, escreve-se o nible 0000 e depois 0001. A Tabela 6 traz um resumo das instruções mais usadas na comunicação com os módulos LCD. 82 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” Tabela 6 - Instruções mais comuns 3.1 – DESCRIÇÃO DETALHADA DAS INSTRUÇÕES 3.1.1 – Limpa Display Esta instrução escreve o caracter ASCII 32 que corresponde ao branco ou barra de espaço em todos os endereços da DDRAM apagando a mensagem que estiver escrita. O cursor retorna ao endereço “zero”, ou seja, à posição mais a esquerda da primeira linha. 3.1.2 – Cursor Home Faz retornar o cursor para a posição mais a esquerda da primeira linha e faz voltar à posição original mensagens previamente deslocadas. O conteúdo da DDRAM permanece inalterado. 3.1.3 – Fixa o modo de operação Esta instrução tem efeito somente durante a leitura ou escrita de dados, portanto, deve ser ativada na inicialização. -Estabelece o sentido de deslocamento do cursor (X=0 p/ esquerda, X=1 p/ direita) -Estabelece se a mensagem deve ou não ser deslocada com a entrada de um novo caracter S=1 SIM, S=0 NÃO. Exemplo: X=1 e S=1 => mensagem desloca p/ direita. 83 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” Faz uma leitura na CGRAM ou na DDRAM, dependendo da instrução anterior (que define o endereço). É importante que precedendo a esta leitura seja executado a instrução de estabelecimento do endereço da CGRAM ou DDRAM, pois caso contrário o dado lido é inválido. 3.2 – TABELAS DE ENDEREÇOS DOS CARCTERES NA DDRAM A seguir resumiremos os endereços da DDRAM (em hexadecimal) dos caracteres da maioria dos módulos LCD disponíveis no mercado. 86 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” OBS: · Para os módulos de 04 linhas estamos considerando que existe um outro pino de habilitação (como o pino 6) para as duas últimas linhas, portando outros endereços de hardware. · Antes de enviar uma instrução para escrita de dados no display, enviar antes uma de endereçamento na DDRAM, com o endereço onde deve ser escrito o caracter, tipo um gotoxy(). 3.3 – TABELAS DE ENDEREÇOS DOS CARCTERES NA CGRAM Os caracteres especiais previamente programado, durante a inicialização, podem ser utilizados a qualquer tempo como se fossem caracteres normais, lembrando que os endereços bases em hexadecimal para gravação dos caracteres especiais, na maioria dos módulos LCD, são respectivamente: 40, 48, 50, 58, 60, 68, 70 e 78. Cada caracter especial ocupa 8 (oito) endreços. 87 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” Tabela 7 - Caracter especial {ç} na CGRAM Isto significa que para utilizarmos o caracter gravado no endereço base 50, durante a inicialização ou reset do sistema, teremos que escrevermos 8 bytes entre os endereços 50 e 57, para construirmos o caracter. Para ilustrar este procedimento, supor que queiramos construir o caracter {ç} no endereço base 50. Neste caso, devemos construir o mapa deste caracter especial como mostrado na Tabela 7 (supondo estar trabalhando com matriz 7x5 e com auto incremento de endereço a cada escrita). Observe que o último endereço sempre será 00, pois esta posição é sempre ocupada pelo cursor. 4 – INICIALIZAÇÃO DOS MÓDULOS LCD Toda vez que alimentamos o módulo LCD deve ser executado o procedimento de inicialização, que consiste no envio de uma seqüência de instruções para configurar o modo de operação para execução de um dado programa de interfaceamento. Em muitos display este procedimento ocorre automaticamente, dentro de condições específicas que envolve temporizações mínimas referente a transição do nível lógico 0 para 1, ao ligarmos a fonte. Em caso de dúvidas, recomendamos o envio destas instruções após o reset do sistema. a) Inicialização para sistemas 8 bits de dados (5 instruções) Entre as duas primeiras instruções recomendamos um delay de 15 mS. As demais instruções podem ser escritas após checar o Busy Flag. b) Inicialização para sistemas 4 bits de dados (5 instruções) Entre as quatro primeiras instruções recomendamos um delay de 15 mS. As demais instruções podem ser escritas após checar o Busy Flag. Estes bits (nible) devem estar conectados aos pinos 11, 12.13 e 14. 88 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 7 – CUIDADOS ESPECIAIS COM MÓDULOS LCD a ) MANUSEIO · Somente retire o módulo de sua embalagem protetora imediatamente antes de sua instalação · Não guarde os módulos em recintos de alta temperatura e alta umidade. A temperatura de armazenamento deverá estar compreendida entre 5 e 30 oC. · O LCD é coberto por uma lâmina plástica polarizada a qual não pode ser riscada. Cuidado em seu manuseio. Para a limpeza da lâmina utilize cotonetes embebido em benzina. Não utilize outros tipos de solventes. · Observe cuidadosamente os procedimentos de controle anti-estático quando manusear os módulos. Eles incorporam circuitos integrados CMOS LSI os quais são sensíveis à descarga eletrostática. Não toque nos terminais do conector, trilhas do circuito impresso e/ou terminais do CI. b) INSTALAÇÃO · Nunca desmonte o módulo 91 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” · Use uma estação de solda aterrada para soldagem de conectores ou terminais. · montador deverá também ser convenientemente aterrado. · Sempre que o projeto o permita, instale o módulo atrás de uma janela protetora de plástico ou vidro. · Somente retire a fita adesiva que protege a lâmina plástica frontal imediatamente antes de seu uso. 8 – OPERAÇÃO · Nunca instale ou desconecte o módulo com sua alimentação ligada. · Sempre opere os módulos respeitando sua gama de temperatura de operação. · Observe cuidadosamente os valores das tensões de alimentação e os níveis dos sinais de controle. · Ajuste a tensão no pino 3 (V0) para obter o contraste mais conveniente para uma dada aplicação. 92 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas” 9 – Software de Teste do LCD ;****************** Programa de Escrita em LCD ******************* ;* * ;* POR: MILTON BARREIRO JUNIOR * ;* DATA: JUNHO DE 2006 * ;************************************************************************ ;******************** Declaração de Variáveis *********************** ;* DEFINIÇÃO DOS I/O'S DE CONEXÃO DO LCD * ;************************************************************************ DISPLAY EQU P2 ;Define port P2 como bits de dados do LCD RS EQU P3.5 ;Define P3.5 como bit RS do LCD RW QUE P3.6 ;Define P3.6 como bit RW do LCD EN EQU P3.7 ;Define P3.7 como bit EN do LCD ORG 0000H LJMP START ORG 0050H START: MOV SP, #40H ;Ajusta Stack Pointer ;************************** Parâmetros do LCD ************************** ;* DEFINE MODO DE OPERAÇÃOO DO LCD * ;**************************************************************************** CLR EN ;Bit EN=0 CLR RS ;Bit RS=0 CLR RW ;Bit RW=0 MOV A, #38H ;Define LCD como matriz 7x5 pixels e 8 bits de dados LCALL CMD ;Escreve comando no LCD MOV A, #0EH ;Liga LCD e ativa cursor LCALL CMD ;Escreve comando no LCD MOV A, #06H ;Cursor deslocando para a direita LCALL CMD ;Escreve comando MOV A, #01H ;Limpa LCD LCALL CMD ;Escreve comando ;******************************** Escreve no LCD ******************************* ;* ROTINA DE ESCRITA DE MENSAGENS NO LCD * ;*********************************************************************************** 93 Microcontrolador 8051 – Teoria e Prática Milton Barreiro Junior – “ETE Getúlio Vargas”
Docsity logo



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