HOME      PROJETOS      PROGRAMAÇÃO      MÓDULOS     
  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções


ARQUITETURA

Os microcontroladores PIC possuem arquitetura Harvard cujos componentes são os seguintes:

  • Uma memória Flash, não volátil, geralmente chamada de Program Memory, onde o programa é carregado para execução.
  • Uma memória RAM, volátil, geralmente chamada de Data Memory, para armazenar dados variáveis durante a execução do programa.
  • Uma memória EEPROM, não volátil, para gravar dados permanentemente que persistirão mesmo após o circuito ser desligado. Esses dados podem ser produzidos pelo programa ou gravados durante a compilação.
  • Uma CPU para executar o programa carregado na memória Flash e que pode acessar os dados na memória RAM e na EEPROM.

Diferenças entre as arquiteturas Harvard e Von Newmann

Harvard Von Newmann

As memória de programa (Flash) e a memória de dados (RAM) são independentes.

Cada uma é acessada por vias diferentes.

A memória Flash, em tese, não pode ser modificada durante a execução do programa.

Os resultados das operações estarão sempre na memória RAM.

Existe somente uma memória que é compartilhada entre o programa e os dados.



FIG 1 - Harvard X VonNeumann



Interrupções

Uma interrupção é um modo de fazer o programa sair de seu fluxo normal, executar uma função e, ao final dessa função, voltar ao fluxo normal a partir do ponto de onde saiu. São várias as fontes de interrupção.


Clock

Vários microcontroladores possuem opção de trabalharem com clock externo a cristal, de até 20MHz. É possível, também, fazer uso do clock interno, de 4MHz, que barateia o projeto eliminando a necessidade de cristais ou ressonadores e capacitores externos para montar um clock. A família 18F possue quadruplicador de frequência (PLL) podendo atingir até 40MHZ usando-se um cristal de 10MHZ.


Ciclo de Instrução

A maioria das instruções são executadas dentro de um "ciclo de instrução" a menos que um teste resulte verdadeiro ou que o PC (Program Counter) seja modificado pelo resultado de uma operação, casos em que a execução levará 2 ciclos.

Um ciclo de instrução consiste de 4 (quatro) períodos de oscilação. Assim, se o clock usado for de 4MHZ (interno ou cristal), o ciclo de instrução será 4/4.000.000, ou seja, 1us (1 micro segundo). No caso de um teste que resulte verdadeiro ou do PC (Program Counter) ser modificado, esse tempo será de 2us (2 micro segundos).


Conjunto de instruções

Um conjunto de apenas 35 instruções RISC (Reduced Instruction Set Code) tornam esses microcontroladores os mais fáceis de se aprender a programar em assembler. Veja a lista de instruções em portugês:


Unidade Lógica e Aritmética

Os microcontroladores possuem uma ALU (unidade lógica e aritmética) capaz de realizar operações de adição, subtração, deslocamento de bits e operações booleanas. Possuem, também, um registrador de trabalho chamado "W" e um conjunto de outros registradores chamados "file registers" que podem ser comuns entre vários tipos de microcontroladores, isto é, têm o mesmo nome e a mesma função, ou podem ser exclusivos para cada tipo de microcontroladores. As operações realizadas pela ALU quase sempre serã entre o registrador de trabalho "W" e outro registrador qualquer.


Estados

Os microcontroladores são máquinas de estado.
Para registrar o estado atual, o microcontrolador possui um registrador chamado STATUS.
O registrador STATUS registra eventos resultantes de operações que ocorreram durante a execução do programa.
Alguns eventos registrados pelo STATUS são:


A figura abaixo mostra todos os flags do registrador STATUS:


FIG 2 - Registrador STATUS


Memória

Há tres tipos de memórias:

  1. Memória de programa.
  2. Memória de dados
  3. Memória EEPROM

Memória de programa

A memória de programa, dependendo da família, pode ter até 8KBytes e é dividida em páginas de 2K. Essa memória também é conhecida como memória Flash e sua função é reter o código do programa. É dessa memória que a CPU extrairá as instruções que serão executadas.

Memória de dados

A memória de dados, mais conhecida como memória RAM, é está agrupada em bancos que podem ser referenciados com os bits RP0 e RP1 do registrador STATUS (ver figura 4). A memória de dados pode ser dividida em duas partes:

      1 - Registradores de uso geral (definidos pelo programador)

      2 - Registradores para funções especiais (SFR) que controlam o funcionamento do microcontroladores.

Memória EEPROM

A memória EEPROM é uma memória não volátil onde os dados são gravados permanentemente e mesmo após o circuito ser desligado eles não serão apagados. Esses dados podem ser produzidos pelo programa ou gravados durante a compilação.

A figura 3 mostra um exemplo da organização da memória Flash e a figura 4 um exemplo de organização da memória RAM, ambos de um microcontroladores da família 16F.



FIG 3 - Organização da Memória Flash na família 16F







FIG 4 - Organização da Memória RAM na família 16F



Program Counter (PC)

Em todo processador as instruções são extraidas da memória principal sequencialmente, uma após a outra e levadas à unidade de controle da CPU onde são executadas.
O controle da extração das instruçõs da memória principal é feito pelo Program Counter.
O Program Counter ou PC é um registrador que mantem o endereço de memória da instrução que está sendo executada.
Para executar a próxima instrução, o hardware calcula seu endereço somando ao PC o tamanho da instrução corrente mantendo assim o fluxo sequencial de execução.
O fluxo sequencial de execução pode ser modificado pelo programador com o uso das instruções GOTO, CALL, RETURN, RETLW e RETFIE. Essas instruções carregam o PC com o endereço da nova posição de memória onde o fluxo deve continuar.
Pode-se, também, realizar um desvio manual carregando o PC com o valor desejado, usando-se a instrução MOVWF PCL.
Quando o microcontrolador é ligado ou sofre um reset, o PC é zerado e o programa iniciará no posição zero da memória.


Stack

Stack é um tipo especial de memória usada para armazenar endereços de retorno de subrotinas e interrupções e não pode ser acessado pelo programador. O Stack é usado pelas instruções CALL, RETURN, RETFIE e RETLW

Na familia 16F o stack tem 8 níveis e na família 18F tem 32 níveis. Isso requer atenção do programador porque limita o número de chamadas aninhadas de subrotinas.


Reset Vector

O reset vector é a localização de memória para onde o microcontroladores desvia quando é ligado ou quando sofre um reset. Essa memória tem 4 bytes, um dos quais deve ter uma instrução de desvio para o início real do programa.



Interrupt Vector

O interrupt vector é a localização de memória para onde o microcontroladores desvia quando quando sofre uma interrupção interna ou externa. Essa localização de memória tem apenas 1 byte que:

      1 - quando não se trabalha com interrupções deve conter a instrução RETFIE.

      2 - quando se trabalha com interrupções, deve conter a instrução GOTO que desvia para a rotina de interrupção.






CONJUNTO DE INSTRUÇÕES DA FAMÍLIA PIC16F

OPERAÇÕES ORIENTADAS A BYTE

 MNEMÔNICO,
OPERANDOS 
 DESCRIÇÃO   CICLOS   CÓDIGO DE OPERAÃO 14-BITS   STATUS AFETADO   NOTAS 
 MSB       LSB 
 ADDWF   f,d   Soma W com f   1   00   0111   dfff   ffff   C, DC, Z   1, 2 
 ANDWF   f,d   "E" entre W e f   1   00   0101   dfff   ffff   Z   1, 2 
 CLRF   f   Zera f   1   00   0001   1fff   ffff   Z   2 
 CLRW      Zera W   1   00   0001   0xxx   xxxx   Z    
 COMF   f,d   Carrega o complemento de f   1   00   1001   dfff   ffff   Z   1, 2 
 DECF   f,d   Decrementa f   1   00   0011   dfff   ffff   Z   1, 2 
 DECFSZ   f,d   Decrementa f e salta a próxima instrução se f=0   1(2)   00   1011   dfff   ffff      1, 2, 3 
 INCF   f,d   Incrementa f   1   00   1010   dfff   ffff   Z   1, 2 
 INCFSZ   f,d   Incrementa f e salta a pŕoxima instrução se f=0   1(2)   00   1111   dfff   ffff      1, 2, 3 
 IORWF   f,d   "OU" inclusivo entre W e f   1   00   0100   dfff   ffff   Z   1, 2 
 MOVF   f,d   Carrega W com o valor de f   1   00   1000   dfff   ffff   Z   1, 2 
 MOVWF   f   Carrega f com o valor de W   1   00   0000   1fff   ffff       
 NOP      Nenhuma operação   1   00   0000   0xx0   0000       
 RLF   f,d   Rotaciona f à esquerda para o Carry   1   00   1101   dfff   ffff   C   1, 2 
 RRF   f,d   Rotaciona f à direita para o Carry   1   00   1100   dfff   ffff   C   1, 2 
 SUBWF   f,d   Subtrai W de f   1   00   0010   dfff   ffff   C, DC, Z   1, 2 
 SWAPF   f,d   Inverte nibble MSB com LSB de f   1   00   1110   dfff   ffff      1, 2 
 XORWF   f,d   "OU" exclusivo entre W e f   1   00   0110   dfff   ffff   Z   1, 2 



OPERAÇÕES ORIENTADAS A BITS

 MNEMÔNICO,
OPERANDOS 
 DESCRIÇÃO   CICLOS   CÓDIGO DE OPERAÃO 14-BITS   STATUS AFETADO   NOTAS 
 MSB       LSB 
 BCF   f,b   Desliga bit b de f   1   01   00bb   bfff   ffff      1, 2 
 BSF   f,b   Liga bit b de f   1   01   01bb   bfff   ffff      1, 2 
 BTFSC   f,b   Testa bit b de f, salta instrução seguinte se b=0   1(2)   01   10bb   bfff   ffff      3 
 BTFSS   f,b   Testa bit b de f, salta instrução seguinte se b=1   1(2)   01   11bb   bfff   ffff      3 



OPERAÇÕES COM LITERAIS E DE CONTROLE

 MNEMÔNICO,
OPERANDOS 
 DESCRIÇÃO   CICLOS   CÓDIGO DE OPERAÃO 14-BITS   STATUS AFETADO   NOTAS 
 MSB       LSB 
 ADDLW   k   Soma literal k em W   1   11   111x   kkkk   kkkk   C, DC, Z    
 ANDLW   k   "E" entre a literal k e W   1   11   1001   kkkk   kkkk   Z    
 CALL   k   Chama subrotina k   2   10   0kkk   kkkk   kkkk       
 CLRWDT      Limpa o Watch Dog   1   00   0000   0110   0100   TO, PD    
 GOTO   k   Desvia para o endereço k   2   10   1kkk   kkkk   kkkk       
 IORLW   k   "OU" inclusivo entre literal k e W   1   11   1000   kkkk   kkkk   Z    
 MOVLW   k   Carrega W com a literal k   1   11   00xx   kkkk   kkkk       
 RETFIE      Retorna de uma interrupção   2   00   0000   0000   1001       
 RETLW   k   Retorna W com uma literal   2   11   01xx   kkkk   kkkk       
 RETURN      Retorna de uma subrotina   2   00   0000   0000   1000       
 SLEEP      Habilita o modo Sleep   1   00   0000   0110   0011   TO, PD    
 SUBLW   k   Subtrai W do valor da literal k   1   11   110x   kkkk   kkkk   C, DC, Z    
 XORLW   k   "OU" exclusivo entre W e a literal k   1   11   1010   kkkk   kkkk   Z    

NOTAS
1 -
Quando um registrador de I/O sofrer uma alteração em função dele mesmo como MOVF PORTB, 1 , o valor usado será aquele presente nos seus próprios pinos. Por exemplo, se o latch de dados for 1 para um pino configurado como entrada e um dispositivo externo leva esse pino a zero, os dados devolvidos serão zeros.
2 - Se a instrução for executada em TMR0 (e, quando aplicável, d = 1), o prescaler será zerado se a TIMER0.
3 - Se o PC (Contador do Programa) for modificado ou um teste condicional resultar verdadeiro, a instrução vai usar dois ciclos. O segundo ciclo é executado como NOP.








  1. INTRODUÇÃO
  2. RECURSOS
  3. ARQUITETURA
  4. ENDEREÇAMENTO
  5. INTERRUPÇÕES
  6. NÍVEIS DE INTERRUPÇÕES NA FAMÍLIA 18F
  7. RESETS DO MICROCONTROLADOR
  8. MODO SLEEP
  9. WATCHDOG TIMER
  10. O STACK
  11. A LINGUAGEM ASSEMBLER
  12. MPLAB - Criando Projetos
  13. LIBRARIES - Usando Bibliotecas de Funções

H P S P I N

Desde 04 de Março de 2010

Atualização: 30 de Novembro de 2020