Intel 8051 O Intel 8051 é um microcontrolador de 8 bits que pertence a família MCS-51 da Intel e foi lançado em 1977. É tido como o microcontrolador mais popular do mundo, pois é muito versátil e possui algumas centenas de fabricantes espalhados pelo mundo. É um microcontrolador CISC (Complex Instruction Set Computer), logo oferece um vasto conjunto de instruções, portanto pode ser usado tanto para uma simples tarefas como para tarefas mais complexas.
Características 3 Portas de I/O bidirecionais endereçáveis por bit. 1 Canal serial UART com interrupção e 3 modos de operação. 2 Timers/Contadores de 8/16 bit com 4 modos de operação cada um. 5 Entradas de interrupção com arquitetura nesting. 128+128 bytes de memória RAM interna, sendo apenas 128 bytes de uso geral. 8 Kbytes de memória PROM interna (desabilitáveis). Até 64Kbytes de memória RAM externa (não compartilhada). Até 64Kbytes de memória ROM externa (não compartilhada). Pino de saída de oscilador de meia onda (1/4 do clock). Clock de 1 a 12Mhz. 4 bancos de registradores. Arquitetura CISC.
Organização de Memórias A memória reservada para armazenar o programa a ser executado pela CPU no 8051 pode ocupar até 64 KB. O microcontrolador pode ou não utilizar a ROM interna; *Se utilizar, mapeará os primeiros 4kb do endereço (0000H 0FFFH). *Caso a ROM interna não for utilizada, então toda a memória será externa.
Organização de Memórias
Registradores Em geral, os microcontroladores possuem um maior numero de registradores que os microprocessadores.
Registradores Principais registradores: Registrador A: é um acumulador, responsável pelas principais operações, sobretudo as logicas e aritméticas. Registrador B: é uma registrador de uso geral. Registradores R0 até R7: também são registradores de uso geral. Registradores DH e DL: também são registradores de uso geral, mas podem ser utilizados com um registrador de 16 bits, chamado DPTR. Registrador PC: contem o endereço da próxima instrução a ser executada. Registrador SP: aponta para o topo da pilha. Registrador PSW: seus bits contém todos os flags do 8051, além de 2 bits exclusivos para a seleção do banco de registradores para determinadas operações (ex.: acesso aos registradores).
Registradores Existe um conjunto de registadores especiais,que têm funções específicas dentro do microcontrolador. São eles:
Registradores TH1, TH0, TL1, TL0 (Timer High e Timer Low): são registradores de 8 bits cada que, em conjunto (high e low), formam os registradores de contagem para cada Timer (TIMER0 e TIMER1). TCON (Timer Control Register): controla as atividades dos TIMERS. TMOD (Timer Mode Register): permite a programação dos modos de atuação de cada TIMER PCON (Power Control Register): Altera a forma de funcionamento do microcontrolador com relação ao consumo de potência quando há falta de energia, por exemplo. SCON (Serial Port Control Register): Junto com o SBUF controla todas as atividades do periférico seria. SBUF (Serial Buffer): Registrador que armazena dados recebidos da serial ou que serão transmitidos pela mesma.
Registradores IE (Interrupt Enable): habilita qual fonte de interrupção será utilizada. IP (Interrupt Priority): define a prioridade de cada interrupção. O acesso a memoria interna é composta pelos bancos de registradores, que possibilita o endereçamento à memória pelo nome de cada registrador, além de endereçamento pela posição de memória.
Clock A operação de clock do 8051 pode ser feita de duas maneiras: interna ou externamente. A utilização do clock externo é útil quando o 8051 está ligado a outros componentes que já possuam clock. No caso de utilização de clock interno, uma simples configuração envolvento dois capacitores e um cristal na freqüência desejada farão o trabalho.
Interrupções O 8051 pode ter sua execução interrompida de 5 maneiras: Duas de entradas externas (INT0 e INT1). Duas pelos temporizadores/contadores (Timer 0 e Timer 1). Uma pelo canal de comunicação serial.
Interrupções Os endereços de desvio das interrupções são fixos e dados pela tabela a seguir:
Interrupções O fato de uma interrupção estar ativa não impede que outra seja ativada ao mesmo tempo. Uma interrupção de alta prioridade interrompera uma de baixa prioridade caso ela esteja sendo executada. Apos o termino da tarefa de alta prioridade, ele voltara a executar a de baixa prioridade ou voltara a execução normal do programa. Uma interrupção de nível baixo poderá ser interrompida por outra de nível alto, mas não por outra de nível baixo. Uma interrupção de nível alto não poderá ser interrompida por qualquer outra fonte de interrupção.
Interrupções Se houverem duas interrupções de mesma prioridade o processamento será de acordo com a figura a seguir:
Interrupções Quando o 8051 atende uma interrupção o SP recebe o valor do PC. Os outros registradores não terão seus conteúdos salvos. Caso haja necessidade disso, a rotina de interrupção deverá tratar. O 8051 possui 2 registros de 8 bits cada um, que servem para controle e configuração de interrupções. São eles: IE (Interrupt Enable) que tem por finalidade indicar qual das interrupções será ou não habilitada. IP (Interrupt Priority) nele é estabelecido o nível de prioridade das interrupções.
Timers O 8051 possui dois timer/contadores de 16 bits. Quando esta trabalhando na função de timer, o registrador de contagem é adicionado a todos os ciclos de máquina. Dessa maneira, pode-se chamá-lo de contador de ciclos de máquina. Como um ciclo possui 12 períodos de clock, a contagem é feita 1/12 da frequência do cristal. Quando ele se encontra na função de contador, o registrador é adicionado como resposta a uma mudança de 1 para 0 em seu pino de entrada externa correspondente (T0 ou T1). Essa operação leva 2 ciclos de máquina para ser executada, 24 períodos de clock do oscilador, ou seja, a contagem é feita 1/24 da frequência do oscilador.
Canal Serial A interface serial do 8051 conta com dois registradores de dados, uma deles é usado na transmissão e o outro na recepção. O conjunto de instruções, contudo, referencia ambos pelo nome SBUF. A distinção entre eles é feita de acordo com a natureza da operação, escrita ou leitura. O controle do canal serial é feito pelo registrador SCON e pelo bit SMOD do registrador PCON.
Canal Serial Os bits SM0 e SM1 do registrador SCON selecionam o modo de funcionamento, de acordo com a tabela a seguir:
Canal Serial REN (Reception Enable) habilita a recepção. Quando esta em 1, o primeiro start bit em RxD implica recepção de um dado em SBUF. TI é o bit de requisição de interrupção da transmissão. É setado pelo hardware após a transmissão do oitavo bit de dados quando no modo 0, e no inicio da transmissão do stop bit nos outros modos. RI é o bit de requisição de interrupção na recepção.é setado pelo hardware no momento da recepção do oitavo bit de dados no modo 0, ou durante a recepção de um stop bit nos outros modos. TI e RI devem ser reinicializados pelas rotinas de tratamento das respectivas interrupções de modo a habilitar novas interrupções.
Algoritmos Multiplicação O seguinte algoritmo utiliza a instrução MUL. Como essa apenas multiplica o conteúdo do registrador B como o acumulador A, considerando ambos UNSIGNED, o tratamento de sinais dos operandos faz-se necessário. O resultado de 16 bits é armazenado pela instrução MUL em B e A; sendo o resultado tratado de acordo com os sinais dos operandos logo em seguida e, finalmente, armazenados em R0 e R1.
Algoritmos ; Algoritmo da Multiplicação utilizando instrução MUL ; Rotina que multiplica os valores de R2 e R3, armazenando a resposta em R0+R1 ; Neste caso, multiplicamos -3 (FDhex, ou 253dec) * 7 ; O resultado armazenado em R0+R1 é FFEBhex (-21dec, em complemento de 2)
Algoritmos ; Setando variáveis... MOV R0,#0H ; Resposta MSBits MOV R1,#0H ; Resposta LSBits MOV R2,#253 ; Multiplicador MOV R3,#7 ; Multiplicando MOV R4,#0 ; Informação dos sinais MOV A,R2 MOV R5,A ; Temporário Multiplicador MOV A,R3 MOV R6,A ; Temporário Multiplicando
Algoritmos ; Verificação dos sinais dos operandos MOV A,#80H ; Máscara do MSBit do registrador ANL A,R5 ; Verifica o sinal de R2 (pré-armazenado em R5) CJNE A,#80H,NaoNegativo1 INC R4 MOV A,R5 ; R2 é negativo, portanto retira-se seu sinal DEC A ; DEC e CPL convertem o número de complemento de 2 CPL A ; para notação normal MOV R5,A ; R5 é re-setado com o valor em módulo de R2
Algoritmos NaoNegativo1: ; R2 não é negativo, verificar R3 MOV A,#80H ; Máscara do MSBit do registrador ANL A,R6 ; Verifica o sinal de R3 (pré-armazenado em R6) CJNE A,#80H,Mult INC R4 MOV A,R6 ; R2 é negativo, portanto retira-se seu sinal DEC A ; DEC e CPL convertem o número de complemento de 2 CPL A ; para notação normal MOV R6,A ; R6 é re-setado com o valor em módulo de R3
Algoritmos ; Realizando a multiplicação. A instrução MUL multiplica A * B (endereço 0F0H) Mult: MOV A,R6 ; Setando Multiplicando MOV 0F0H,A MOV A,R5 ; Setando Multiplicador MUL AB ; Multiplicando os operandos (Resultado = MSBits em B, LSBits em A) MOV R1,A ; Alocando os resultados MOV A,0F0H MOV R0,A
Algoritmos ; Tratando os sinais MOV A,R4 CJNE A,#1H,Fim ; Se houver 0 ou 2 operandos negativos, resposta é positiva ; Caso contrário, Fazer o complemento de 2 MOV A,R1 ; Complemento de 2 dos 8 LSBits da resposta CPL A ADD A,#1H; Como há uma adição, se ouver carry ele deverá ser tratado MOV R1,A
Algoritmos MOV A,R0 ; Complemento de 2 dos 8 MSBits da resposta CPL A ADDC A,#0H ; ADDC soma o bit de carry se este estiver ativo. MOV R0,A Fim: ; A resposta encontra-se em R0 (8 MSBits) e R1 (8 LSBits) ; No caso de resposta negativa, está estará em complemento de 2 END
Algoritmos Salvamento de Contexto Quando uma instrução PUSH é chamada, ela incrementa o SP em 1 antes de executar a operação, portanto armazenar SP com um PUSH é, na realidade, armazenar SP+1
Algoritmos PUSH 081h ;SP (o valor correto de SP é SP-1) PUSH 0h ;R0 PUSH 1h ;R1 PUSH 2h ;R2 PUSH 3h ;R3 PUSH 4h ;R4 PUSH 5h ;R5 PUSH 6h ;R6 PUSH 7h ;R7 PUSH 080h ;P0 PUSH 082h ;DPL PUSH 083h ;DPH PUSH 087h ;PCON PUSH 088h ;TCON PUSH 089h ;TMOD PUSH 08ah ;TL0
Algoritmos PUSH 08bh ;TL1 PUSH 08ch ;TH0 PUSH 08dh ;TH1 PUSH 090h ;P1 PUSH 098h ;SCON PUSH 099h ;SBUF PUSH 0a0h ;P2 PUSH 0a8h ;IE PUSH 0b0h ;P3 PUSH 0b8h ;IP PUSH 0d0h ;PSW (nenhum flag é acionado quando se executa PUSH's) PUSH 0e0h ;A PUSH 0f0h ;B END