HOME PROJETOS PROGRAMAÇÃO |
Os microcontroladores PIC possuem arquitetura Harvard cujos componentes são os seguintes:
|
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
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.
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.
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).
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:
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.
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:
Registra o "vai um" ou "estouro", no bit "C" ou "Carry bit".
Registra o "vai um" ou "estouro", do nibble LSB no bit "C" ou "Carry bit".
Registra se o resultado de uma operação foi zero ou diferente de zero no bit "Z".
Permite chavear de banco de memória de dados através de seus bits RP0 e RP1.
A figura abaixo mostra todos os flags do registrador STATUS:
FIG 2 - Registrador STATUS
Há tres tipos de memórias:
|
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.
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.
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
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 é 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.
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.
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.
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 |
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 |
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.
H P S P I N Desde 04 de Março de 2010 Atualização: 08 de Oct de 2024 |