Sistemas Embarcados - Registros
Os registros são usados na CPU para armazenar informações temporariamente, que podem ser dados a serem processados ou um endereço apontando para os dados a serem buscados. Em 8051, existe um tipo de dados de 8 bits, do MSB (bit mais significativo) D7 ao LSB (bit menos significativo) D0. Com o tipo de dados de 8 bits, qualquer tipo de dados maior que 8 bits deve ser dividido em blocos de 8 bits antes de ser processado.
Os registros mais usados do 8051 são A (acumulador), B, R0-R7, DPTR (ponteiro de dados) e PC (contador de programa). Todos esses registros são de 8 bits, exceto DPTR e PC.
Registros de armazenamento em 8051
Discutiremos os seguintes tipos de registros de armazenamento aqui -
- Accumulator
- Registro R
- Registro B
- Ponteiro de dados (DPTR)
- Contador de programa (PC)
- Stack Pointer (SP)
Acumulador
O acumulador, registro A, é usado para todas as operações aritméticas e lógicas. Se o acumulador não estiver presente, todos os resultados de cada cálculo (adição, multiplicação, deslocamento, etc.) devem ser armazenados na memória principal. O acesso à memória principal é mais lento do que o acesso a um registrador como o acumulador porque a tecnologia usada para a grande memória principal é mais lenta (porém mais barata) do que a usada para um registrador.
Os registros "R"
Os registros "R" são um conjunto de oito registros, a saber, R0, R1 a R7. Esses registros funcionam como registros auxiliares ou de armazenamento temporário em muitas operações. Considere um exemplo da soma de 10 e 20. Armazene uma variável 10 em um acumulador e outra variável 20 em, digamos, o registrador R4. Para processar a operação de adição, execute o seguinte comando -
ADD A,R4
Depois de executar esta instrução, o acumulador conterá o valor 30. Assim, os registros "R" são auxiliares ou helper registers. O acumulador sozinho não seria muito útil se não fosse por esses registradores "R". Os registros "R" são destinados ao armazenamento temporário de valores.
Vejamos outro exemplo. Vamos somar os valores em R1 e R2 e então subtrair os valores de R3 e R4 do resultado.
MOV A,R3 ;Move the value of R3 into the accumulator
ADD A,R4 ;Add the value of R4
MOV R5,A ;Store the resulting value temporarily in R5
MOV A,R1 ;Move the value of R1 into the accumulator
ADD A,R2 ;Add the value of R2
SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
Como você pode ver, usamos R5 para reter temporariamente a soma de R3 e R4. Obviamente, esta não é a forma mais eficiente de calcular (R1 + R2) - (R3 + R4), mas ilustra o uso dos registradores "R" como uma forma de armazenar valores temporariamente.
O Registro "B"
O registrador "B" é muito semelhante ao acumulador no sentido de que pode conter um valor de 8 bits (1 byte). O registro "B" é usado apenas por duas instruções 8051:MUL AB e DIV AB. Para multiplicar ou dividir A por outro número de forma rápida e fácil, você pode armazenar o outro número em "B" e usar essas duas instruções. Além de usar instruções MUL e DIV, o registrador "B" é freqüentemente usado como mais um registrador de armazenamento temporário, bem como um nono registrador R.
O Ponteiro de Dados
O Data Pointer (DPTR) é o único registro de 16 bits (2 bytes) acessível ao usuário do 8051. O Acumulador, os registradores R0 – R7 e o registrador B são registradores de valor de 1 byte. DPTR destina-se a apontar para dados. É usado pelo 8051 para acessar a memória externa usando o endereço indicado pelo DPTR. DPTR é o único registrador de 16 bits disponível e é freqüentemente usado para armazenar valores de 2 bytes.
O contador do programa
O contador de programa (PC) é um endereço de 2 bytes que informa ao 8051 onde a próxima instrução a ser executada pode ser encontrada na memória. O PC inicia em 0000h quando o 8051 é inicializado e é incrementado toda vez que uma instrução é executada. O PC nem sempre é incrementado em 1. Algumas instruções podem exigir 2 ou 3 bytes; nesses casos, o PC será incrementado em 2 ou 3.
Branch, jumpe interruptas operações carregam o contador de programa com um endereço diferente do próximo local sequencial. Ativar uma reinicialização de inicialização fará com que todos os valores no registro sejam perdidos. Isso significa que o valor do PC é 0 na reinicialização, forçando a CPU a buscar o primeiro opcode da localização da ROM 0000. Isso significa que devemos colocar o primeiro byte do upcode na localização da ROM 0000 porque é onde a CPU espera encontrar o primeira instrução.
O Stack Pointer (SP)
O Stack Pointer, como todos os registradores, exceto DPTR e PC, pode conter um valor de 8 bits (1 byte). O ponteiro da pilha informa a localização de onde o próximo valor deve ser removido da pilha. Quando um valor é colocado na pilha, o valor de SP é incrementado e, em seguida, o valor é armazenado no local de memória resultante. Quando um valor é retirado da pilha, o valor é retornado do local da memória indicado por SP e, em seguida, o valor de SP é diminuído.
Essa ordem de operação é importante. O SP será inicializado às 07h quando o 8051 for inicializado. Se um valor for colocado na pilha ao mesmo tempo, o valor será armazenado no endereço de RAM interno 08h porque o 8051 irá primeiro incrementar o valor de SP (de 07h a 08h) e então armazenará o valor empurrado naquela memória endereço (08h). SP é modificado diretamente pelo 8051 por seis instruções: PUSH, POP, ACALL, LCALL, RET e RETI.
Espaço ROM em 8051
Alguns membros da família do 8051 têm apenas 4 K bytes de ROM on-chip (por exemplo, 8751, AT8951); alguns têm ROM de 8K, como AT89C52, e há alguns membros da família com 32K bytes e 64K bytes de ROM no chip, como o Dallas Semiconductor. O ponto a ser lembrado é que nenhum membro da família 8051 pode acessar mais de 64 K bytes de opcode, pois o contador de programa em 8051 é um registrador de 16 bits (endereço 0000 a FFFF).
A primeira localização da ROM do programa dentro do 8051 tem o endereço 0000H, enquanto a última localização pode ser diferente dependendo do tamanho da ROM no chip. Entre os membros da família 8051, AT8951 tem $ k bytes de ROM no chip com um endereço de memória de 0000 (primeira localização) a 0FFFH (última localização).
8051 Bits de bandeira e registro PSW
O registro da palavra de status do programa (PSW) é um registro de 8 bits, também conhecido como flag register. Tem 8 bits de largura, mas apenas 6 bits é usado. Os dois bits não utilizados sãouser-defined flags. Quatro das bandeiras são chamadasconditional flags, o que significa que eles indicam uma condição que resulta após a execução de uma instrução. Estes quatro sãoCY (Levar), AC (transporte auxiliar), P (paridade), e OV(transbordar). Os bits RS0 e RS1 são usados para alterar os registros do banco. A figura a seguir mostra o registro da palavra de status do programa.
O registro PSW contém os bits de status que refletem o status atual da CPU.
CY | CA | F0 | RS1 | RS0 | OV | - | P |
---|
CY | PSW.7 | Carregar bandeira |
AC | PSW.6 | Bandeira de transporte auxiliar |
F0 | PSW.5 | Sinalizador 0 disponível para o usuário para fins gerais. |
RS1 | PSW.4 | Registro de banco seletor bit 1 |
RS0 | PSW.3 | Registro de banco seletor bit 0 |
OV | PSW.2 | Sinalizador de estouro |
- | PSW.1 | FLAG definível pelo usuário |
P | PSW.0 | Paridade FLAG. Energizado / limpo pelo hardware durante o ciclo de instrução para indicar o número par / ímpar de 1 bit no acumulador. |
Podemos selecionar o bit do banco de registro correspondente usando os bits RS0 e RS1.
RS1 | RS2 | Banco de registro | Endereço |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag- Este sinalizador de transporte é definido (1) sempre que houver um transporte do bit D7. Ele é afetado após uma operação de adição ou subtração de 8 bits. Também pode ser redefinido para 1 ou 0 diretamente por uma instrução como "SETB C" e "CLR C", onde "SETB" significa transporte de bit definido e "CLR" significa transporte livre.
AC, auxiliary carry flag- Se houver um transporte de D3 e D4 durante uma operação ADD ou SUB, o bit AC é definido; caso contrário, é limpo. É usado para a instrução realizar aritmética decimal codificada binária.
P, the parity flag- O sinalizador de paridade representa o número de 1s apenas no registro do acumulador. Se o registrador A contém um número ímpar de 1's, então P = 1; e para o número par de 1s, P = 0.
OV, the overflow flag- Este sinalizador é definido sempre que o resultado de uma operação de número com sinal é muito grande, fazendo com que o bit de ordem superior transborde para o bit de sinal. É usado apenas para detectar erros em operações aritméticas assinadas.
Exemplo
Mostra o status dos sinalizadores CY, AC e P após a adição de 9CH e 64H na instrução a seguir.
MOV A, # 9CH
ADICIONE A, # 64H
Solution: 9C 10011100
+64 01100100
100 00000000
CY = 1 since there is a carry beyond D7 bit
AC = 0 since there is a carry from D3 to D4
P = 0 because the accumulator has even number of 1's