Memórias, barramemtos e processador do PIC16F883 1. Memórias 1.1. RAM estáticas: 1. Banco de registradores: 9 bits de endereço e 8 bits de dados: 256 palavras de dados + 4 registradores do processador + cerca de 40 registradores de entrada e saída. 2. Pilha de chamada de subprogramas: 3 bits de endereço e 8 palavras de 13 bits. 1.2. Memórias Flash: 1. Memória de programa: 12 bits de endereço e 14 bits de dados, 4K palavras disponíveis; 2. Memória de dados: 8 bits de endereço e 8 bits de dados, 256 palavras. 2. Endereçamento 2.1. 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. 2.2. 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. 2.3. Memória de programa A memória de programa geralmente é endereçada pelo apontador de programa ( PC ), 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. 2.4. 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. 3. Processador 3.1. Registradores Nome Endereço W 00 | 80 | 100 | 180 02 | 82 | 102 | 182 IND PCL STATUS FSR PCLATH INTCON 03 | 83 | 103 | 183 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 C 0 Vai um ou não pede emprestado DC Vai um do quarto para o Quinto bit 1 Z 2 Zero PD\ É zerado pela instrução "SLEEP" 3 TO\ É zerado quando ocorre um reset causado pelo Watch dog 4 RP0 5 Bits mais significativos do endereço usado em endereçamento direto RP1 6 IRP Bit mais significativo do endereço usado em endereçamento indireto. 7 04 | 84 | Informa o endereço do registrador referenciado indiretamente 104 | 184 0A | 8A | Valor a ser atribuído aos bits mais significativos do apontador de instrução 10A | 18A Registrador de controle das interrupções Bit Nome Função 0 RBIF Interrupção de alteração do registrador B pendente 1 INTF Interrupção externa ( RB0 ) pendente T0IF Interrupção do “Timer0” pendente 2 0B | 8B | 10B | 18B 3 RBIE Interrupção de alteração do registrador B habilitada 4 INTE Interrupção externa ( RB0 ) habilitada T0IE Interrupção do “Timer0” habilitada 5 6 PEIE Interrupção das demais interfaces habilitada GIE Interruções habilitadas 7 3.2. 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, a 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 durante a execução de instruções de desvio incondicional como durante a execução de intruções de desvio condicional com a condição atendida e também durante a execução de instruções que alterem o valor armazenado no registrador PCL. Sempre que o valor do registrador PCL 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. 3.3. Os formatos das 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: Nome do formato Número de instruções Controle Byte oriented 5 16 ( 31 ) Bit oriented 4 0 1 Desvios 2 1 0 Com literal 7 1 1 13 12 00 11 10 9 Número do bit 8 7 6 5 00.0000.0 Código de operação Dst Código de Número do bit operação Cod Op. Código de operação 4 3 2 1 0 Código de operação Endereço Endereço Alvo do desvio Constante São empregados os seguintes valores literais: Nome do valor literal Tamanho Posição ( bits ) Dst 1 Bit 7 Endereço 7 Bits 0 a 6 Número do bit 3 Bits 7 a 9 Alvo do desvio 11 Bits 0 a 10 Constante 8 Bits 0 a 7 Função Se for zero, indica que o valor produzido deve ser armazenado no registrador W, se for um, indica que esse valor deve ser armazenado em um registrador do banco de registradores Fornece os sete bits menos significativos do valor empregado para selecionar qual dos registradores deve ser empregado Indica qual é o bit que deve ser alterado ou testado Fornece os onze bits menos significativos do valor a ser colocado no apontador de instrução para realizar um desvio Fornece uma constante que será diretamente empregada como operando pela instrução 3.4. Instruções em ordem de código de operação Mnemônico e Ciclos operandos Código Tipo Descrição 00.0000.0XX0.0000 00.0000.0000.1000 00.0000.0000.1001 00.0000.0110.0011 00.0000.0110.0100 C.1 D.1 D.2 C.2 C.3 NOP RETURN RETFIE SLEEP CLRWDT 1 2 2 1 1 Nenhuma operação Retorno de subrotina Retorno de interrupção ( GIE recebe 1 ) Entra no modo "stand by" Zera o tempo do "watch dog" 00.0000.1FFF.FFFF 00.0001.0XXX.XXXX 00.0001.1FFF.FFFF M.1 M.2 M.3 MOVWF F CLRW CLRF F 1 1 1 00.0010.DFFF.FFFF A.1 SUBWF F,D 1 00.0011.DFFF.FFFF 00.0100.DFFF.FFFF 00.0101.DFFF.FFFF 00.0110.DFFF.FFFF 00.0111.DFFF.FFFF 00.1000.DFFF.FFFF 00.1001.DFFF.FFFF 00.1010.DFFF.FFFF A.2 A.3 A.4 A.5 A.6 M.4 A.7 A.8 DECF F,D IORWF F,D ANDWF F,D XORWF F,D ADDWF F,D MOVF F,D COMF F,D INCF F,D 1 1 1 1 1 1 1 1 00.1011.DFFF.FFFF D.3 DECFSZ F,D 1|2 00.1100.DFFF.FFFF 00.1101.DFFF.FFFF 00.1110.DFFF.FFFF A.9 A.10 A.11 RRF F,D RLF F,D SWAPF F,D 1 1 1 00.1111.DFFF.FFFF D.4 INCFSZ F,D 1|2 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 01.00BB.BFFF.FFFF 01.01BB.BFFF.FFFF A.12 A.13 BCF F,B BSF F,B 1 1 01.10BB.BFFF.FFFF D.5 BTFSC F,B 1|2 01.11BB.BFFF.FFFF D.6 BTFSS F,B 1|2 10.0KKK.KKKK.KKKK 10.1KKK.KKKK.KKKK D.7 D.8 CALL K GOTO K 2 2 Chama um subprograma Desvia para o alvo especificado 11.00XX.KKKK.KKKK M.5 MOVLW K 1 11.01XX.KKKK.KKKK D.9 RETLW K 2 11.1000.KKKK.KKKK 11.1001.KKKK.KKKK 11.1010.KKKK.KKKK A.14 A.15 A.16 IORLW K ANDLW K XORLW K 1 1 1 11.110X.KKKK.KKKK A.17 SUBLW K 1 11.111X.KKKK.KKKK A.18 ADDLW K 1 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 Indicadores alterados GIE TO\, PD\ TO\, PD\ Z Z C, DC, Z Z Z Z Z C, DC, Z Z Z Z C C 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 Z Z Z C, DC, Z C, DC, Z Código 00.0001.1FFF.FF FF 00.0001.0XXX.XX XX 00.1000.DFFF.FF FF 11.00XX.KKKK.KK KK 00.0000.1FFF.FF FF Aritméticas Rot 3. Aritméticas e Lógicas com op. imediato Lógicas 2. Aritméticas e Lógicas sem op. imediato Bits Grupo 1. Movimentação de dados 3.5 Tabela de instruções em ordem de tipo e mnemônico 01.00BB.BFFF.FF FF 01.01BB.BFFF.FF FF 00.1110.DFFF.FF FF 00.0111.DFFF.FF FF 00.0011.DFFF.FF FF 00.1010.DFFF.FF FF 00.0010.DFFF.FF FF 00.1101.DFFF.FF FF 00.1100.DFFF.FF FF 00.0101.DFFF.FF FF 00.1001.DFFF.FF FF 00.0100.DFFF.FF FF 00.0110.DFFF.FF FF 11.111X.KKKK.KK KK 11.110X.KKKK.KK KK 11.1001.KKKK.KK KK 11.1000.KKKK.KK KK 11.1010.KKKK.KK KK Tipo Mnemônico e Ciclos operandos Descrição Indicadores alterados M.3 CLRF F 1 Zera um registrador Z M.2 CLRW 1 Zera o W Z M.4 MOVF F,D 1 Move um registrador Z M.5 MOVLW K 1 Move uma constante para o W M.1 MOVWF F 1 Move o W para um registrador A.12 BCF F,B 1 Zera um bit de um registrador A.13 BSF F,B 1 Coloca um em um bit de um registrador A.11 SWAPF F,D 1 Troca os Quartetos de um registrador A.6 ADDWF F,D 1 Soma W a um registrador A.2 DECF F,D 1 Decrementa um registrador Z A.8 INCF F,D 1 Incrementa um registrador Z A.1 SUBWF F,D 1 Soma o complemento a dois de W a um registrador A.10 RLF F,D 1 Rola um registrador para a esquerda C A.9 RRF F,D 1 Rola um registrador para a direita C A.4 ANDWF F,D 1 E de W com um registrador Z A.7 COMF F,D 1 Complementa um registrador Z A.3 IORWF F,D 1 Ou de W com um registrador Z A.5 XORWF F,D 1 Ou exclusivo de W com um registrador Z A.18 ADDLW K 1 Soma uma constante a W C, DC, Z A.17 SUBLW K 1 Soma uma constante ao complemento a dois de W C, DC, Z A.15 ANDLW K 1 E de uma constante com W Z A.14 IORLW K 1 Ou de uma constante com W Z A.16 XORLW K 1 Ou exclusivo de uma constante com W Z C, DC, Z C, DC, Z 4. Desvios incondicionais 10.0KKK.KKKK.KK KK 10.1KKK.KKKK.KK KK 00.0000.0000.10 01 11.01XX.KKKK.KK KK 00.0000.0000.10 00 5. Desvios condicionais 01.10BB.BFFF.FF FF 01.11BB.BFFF.FF FF 00.1011.DFFF.FF FF 00.1111.DFFF.FF FF 6. Controle 00.0000.0110.01 00 00.0000.0XX0.00 00 00.0000.0110.00 11 D.7 CALL K 2 Chama um subprograma D.8 GOTO K 2 Desvia para o alvo especificado D.2 RETFIE 2 Retorno de interrupção ( GIE recebe 1 ) D.9 RETLW K 2 Move uma constante para W e retorna do subprograma D.1 RETURN 2 Retorno de subrotina D.5 BTFSC F,B 1|2 D.6 BTFSS F,B 1|2 D.3 DECFSZ F,D 1|2 D.4 INCFSZ F,D 1|2 C.3 CLRWDT 1 Zera o tempo do "watch dog" C.1 NOP 1 Nenhuma operação C.2 SLEEP 1 Entra no modo "stand by" GIE Se o bit especificado for zero, pula a próxima instrução Se o bit especificado for um, pula a próxima instrução Decrementa um registrador e se o resultado for zero, pula a próxima instrução Incrementa um registrador e se o resultado for zero, pula a próxima instrução TO\, PD\ TO\, PD\