1. Memórias do tipo RAM estáticas: 1. Banco de registradores: 9 bits de endereço e 8 bits de dados: 128 palavras de dados + 4 registradores do processador + 36 registradores de entrada e saída + 4 registradores de entrada e saída que são disponíveis apenas no PIC176F871; 2. Pilha de chamada de subprogramas: 3 bits de endereço que são sempre invisíveis e 8 palavras de 13 bits. 2. Memórias Flash: 1. Memória de programa: 11 bits de endereço e 14 bits de dados, 2K palavras disponíveis; 2. Memória de dados: 6 bits de endereço e 8 bits de dados, 64 palavras. 3. Endereçamento do banco de registradores: Os endereços de nove bits empregados para selecionar um dos registradores podem ser fornecidos de forma direta ou indireta. Na forma direta, os sete bits menos significativos do endereço são fornecidos diretamente na instrução e os dois bits mais significativos vem dos bits denominados RP0 e RP1 do registrador de indicadores. Dessa forma, o espaço de endereçamento fica dividido em quatro partes. Cada uma dessas quatro partes ( denominadas bancos de registradores ) corresponde a 128 endereços e é selecionada por uma das combinações dos valores de RP0 e RP1. Ou seja, os valores dos bits RP0 e RP1 definem qual dos bancos pode ser endereçado de forma direta. Na forma indireta, que é empregada sempre que for realizado um acesso ao pseudo registrador cujo endereço é 00, 80, 100 ou 180, os oito bis menos significativos são fornecidos pelo registrador denominado FSR e o bit mais significativo do endereço vem do bit denominado IRP do registrador de indicadores. Dessa forma, quando essa forma de endereçamento é empregada, o espaço de endereçamento fica dividido em duas metades, cada uma com 256 endereços e o valor do bit IRP define qual dessas metades está correntemente sendo usada. Como apenas seis registradores de entrada e saída só podem ser endereçados empregando endereços maiores que FF e esses registradores normalmente não são endereçados empregando endereçamento indireto, geralmente o bit IRP é fica sempre com valor 0. 4. Endereçamento da pilha A pilha só é empregada durante a execução de chamadas de rotina ( quando o valor do apontador de programa é empilhado ) e retornos de rotina ( quando o valor armazenado no topo da pilha é copiado para o apontador de programa ). Ela é endereçada por um apontador de pilha ( de três bits ) que não é visível. 5. Endereçamento da memória de programa A memória de programa geralmente é endereçada pelo apontador de programa, que é um registrador de 13 bits. Porém também é possível realizar escritas e leituras nessa memória. Nesse caso, essa memória é tratada como se fosse um dispositivo de entrada e saída e os endereços e também os dados a serem escritos ou que foram lidos dessa memória são colocados em pares de registradores de interface específicos. Durante á realização dessas operações de leitura ou escrita nessa memória o processador fica parado ( executando "nops" ) porque não pode ler o código da próxima instrução a ser executada. 1 6. Endereçamento da memória de dados. A memória de dados é tratada como se fosse um dispositivo de entrada e saída e os seus endereços e também os dados a serem escritos ou que foram lidos dessa memória são colocados em registradores de interface específicos. 7. Registradores do processador Nome W IND PCL STATUS FSR PCLATH Endereço 00 | 80 | 100 | 180 02 | 82 | 102 | 182 03 | 83 | 103 | 183 04 | 84 | 104 | 184 0A | 8A | 10A | 18A Função Registrador de trabalho ( acumulador ) Pseudo registrador usado para referenciar o registrador cujo endereço é igual ao valor armazenado no registrador FSR 8 bits menos significativos do apontador de instrução Registrador de Indicadores Bit Nome Função 0 C Vai um ou não pede emprestado 1 DC Vai um do quarto para o Quinto bit 2 Z Zero 3 PD\ É zerado pela instrução "SLEEP" 4 TO\ É zerado quando ocorre um reset causado pelo Watch dog 5 RP0 Bits mais significativos do endereço usado em 6 RP1 endereçamento direto Bit mais significativo do endereço usado em endereçamento 7 IRP indireto. Informa o endereço do registrador referenciado indiretamente Bits mais significativos do apontador de instrução 8. Ciclo de execução das instruções: Cada instrução é normalmente executada em quatro ciclos de relógio. Durante a execução de cada instrução é realizada simultaneamente a busca do código da próxima instrução a ser executada. Por causa dessa simultaneidade, sempre que o apontador de programa é modificado durante a execução de uma instrução, essa instrução empregará dois ciclos de instrução ( oito ciclos de relógio ) para ser executada. Isso é necessário porque o código de instrução buscado durante a execução da instrução foi aquele que está armazenado na posição da memória de programa cujo endereço corresponde ao valor que o apontador de programa tinha antes de ser modificado pela instrução. Durante o ciclo de instrução adicional, o processador executa um "nop" e busca o código da instrução armazenada na posição de memória endereçada pelo novo valor do apontador de instrução. Essa duplicação do tempo da execução ocorre tanto no caso de instruções de desvio quanto no caso das instruções que alterem o valor do registrador PCL. No caso das instruções de desvio condicional, a duplicação do tempo de execução da instrução só ocorre se o desvio for efetivamente realizado. Sempre que o valor do registrador IPL for alterado por uma instrução o apontador de programa receberá um valor formado pela concatenação dos cinco bits menos significativos do valor armazenado no registrador PCLATH com os oito bits que foram enviados para o registrador PCL. 2 9. O conjunto de instruções As palavras de instrução são formadas por 14 bits que contém o código da instrução e valores literais que desempenham o papel de operandos imediatos. São empregados cinco formatos de instrução: Número do bit Nome do formato 13 12 11 10 9 8 7 6 5 4 3 2 1 Controle 0 Código de operação Byte 0 Código de operação Dest Endereço oriented Bit Código de 0 1 Número do bit Endereço oriented operação Cod. Desvios 1 0 Alvo do desvio Op. Com literal 1 1 Código de operação Constante 0 São empregados os seguintes valores literais: Nome do valor Tamanho Função literal ( bits ) Se for zero, indica que o valor produzido deve ser armazenado no registrador W, se for um, indica que esse valor deve ser armazenado Dest. 1 em um registrador do banco de registradores Fornece os sete bits mais significativos do valor empregado para Endereço 7 selecionar qual dos registradores deve ser empregado Número do bit 3 Indica qual é o bit que deve ser alterado ou testado Fornece os onze bits menos significativos do valor a ser colocado no Alvo do desvio 11 apontador de instrução para realizar um desvio Fornece uma constante que será diretamente empregada como Constante 8 operando pela instrução 3 10. Instruções em ordem de código de operação 00.0000.1FFF.FFFF 00.0001.0XXX.XXXX 00.0001.1FFF.FFFF Mnemônico e operandos NOP RETURN RETFIE SLEEP CLRWDT MOVWF F CLRW CLRF F 00.0010.DFFF.FFFF SUBWF F,D 1 00.0011.DFFF.FFFF 00.0100.DFFF.FFFF 00.0101.DFFF.FFFF DECF F,D IORWF F,D ANDWF F,D 1 1 1 00.0110.DFFF.FFFF XORWF F,D 1 00.0111.DFFF.FFFF 00.1000.DFFF.FFFF 00.1001.DFFF.FFFF 00.1010.DFFF.FFFF ADDWF F,D MOVF F,D COMF F,D INCF F,D 1 1 1 1 00.1011.DFFF.FFFF DECFSZ F,D 1|2 00.1100.DFFF.FFFF 00.1101.DFFF.FFFF 00.1110.DFFF.FFFF RRF F,D RLF F,D SWAPF F,D 1 1 1 00.1111.DFFF.FFFF INCFSZ F,D 1|2 01.00BB.BFFF.FFFF BCF F,B 1 01.01BB.BFFF.FFFF BSF F,B 1 01.10BB.BFFF.FFFF BTFSC F,B 1|2 01.11BB.BFFF.FFFF BTFSS F,B 1|2 Código 00.0000.0XX0.0000 00.0000.0000.1000 00.0000.0000.1001 00.0000.0110.0011 00.0000.0110.0100 10.0KKK.KKKK.KKKK 10.1KKK.KKKK.KKKK Ciclos Descrição 1 2 2 1 1 1 1 1 Nenhuma operação Retorno de subrotina Retorno de interrupção Entra no modo "stand by" Zera o tempo do "watch dog" Move o W para um registrador Zera o W Zera um registrador Soma o complemento a dois de W a um registrador Decrementa um registrador Ou de W com um registrador E de W com um registrador Ou exclusivo de W com um registrador Soma W a um registrador Move um registrador Complementa um registrador Incrementa um registrador Decrementa um registrador e se o resultado for zero, pula a próxima instrução Rola um registrador para a direita Rola um registrador para a esquerda Troca os Quartetos de um registrador Incrementa um registrador e se o resultado for zero, pula a próxima instrução Zera um bit de um registrador Coloca um em um bit de um registrador Se o bit especificado for zero, pula a próxima instrução Se o bit especificado for um, pula a próxima instrução Chama um subprograma Desvia para o alvo especificado Move uma constante para o W Move uma constante para W e retorna do subprograma Ou de uma constante com W E de uma constante com W Ou exclusivo de uma constante com W Soma uma constante ao complemento a dois de W Soma uma constante a W CALL K GOTO K 11.00XX.KKKK.KKKK MOVLW K 2 2 1 11.01XX.KKKK.KKKK RETLW K 1 11.1000.KKKK.KKKK 11.1001.KKKK.KKKK IORLW K ANDLW K 1 1 11.1010.KKKK.KKKK XORLW K 1 11.110X.KKKK.KKKK SUBLW K 1 11.111X.KKKK.KKKK ADDLW K 1 4 Indicadores alterados TO\, PD\ TO\, PD\ Z Z C, DC, Z Z Z Z Z C, DC, Z Z Z Z C C Z Z Z C, DC, Z C, DC, Z