Considerações básicas sobre o PIC16F877A

Considerações básicas sobre o PIC16F877A

(Parte 4 de 5)

A memória de dados EEPROM é uma memória de dados implementada em EEPROM. Os dados gravados neste trecho de memória não são perdidos quando o microcontrolador é desligado. Este é um espaço muito conveniente para se armazenar informações de configuração ou calibração de um sistema.

Uma maneira de informar ao assembler da Microchip que estamos querendo acessar um registro no banco dois é utilizar o endereço = endereço base + 0x80. Mas lembre-se de que de qualquer maneira você deve chavear o banco primeiro, não adianta apenas acessar o endereço com o bit 7 igual a um (0x80 + endereço).

Observe que alguns registros mais importantes são duplicados, isto é, você pode ter acesso a eles independente do banco onde está. Isto facilita o programador e aumenta a rapidez de execução de um programa.

http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 17

A memória de programas é organizada da seguinte maneira:

Observe que a memória de programa é organizada em quatro bancos. As instruções de call e goto operam apenas dentro de um banco. É preciso complementar o conteúdo do contador de programa caso desejemos fazer um goto ou um call para uma página diferente da que estamos. Cada página possui um tamanho de 2Kbytes.

http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 18

Tabela 3.2:Endereço dos registradores

O controle do fluxo de programa s próximos blocos a serem descritos são o stack, o PC , o registrador W, a ALU e os vários temporizadores e circuitos de reset. Estes blocos são os responsáveis pelo gerenciamento do fluxo do programa e pela interpretação das instruções. O

O PC, contador de programa, é onde está armazenado o endereço da instrução que será executada. O contador de programas possui 13 bits de comprimento, o que nos permite operar com programas de até 8192 posições. Após cada instrução o valor do contador do programa é alterado para passar a indicar o endereço da próxima instrução. As instruções de GOTO (ir para), CALL (chamada de subrotina) e os interrupts provocam o desvio do fluxo normal do programa, que geralmente incrementa o contador de um a cada instrução. No caso da instrução CALL e no atendimento de interrupts, o microcontrolador deve manter a informação do endereço de retorno, http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 19 isto é, o endereço da instrução a ser executada depois de completada a subrotina ou atendido o interrupt. Este endereço de retorno é armazenado no STACK. No caso do PIC16F877 é permitido o aninhamento de até oito subrotinas ou interrupts.

Você não tem acesso direto ao STACK. E além disso o microcontrolador não lhe avisa de estouro (overflow ou underflow) do stack. É responsabilidade do programador se assegurar que o stack está válido. Isto pode ser especialmente complicado na caso de rotinas recursivas (que chamam a si mesmas) ou no tratamento de interrupção. Não existem as funções PUSH e POP comuns a outros microcontroladores.

A ALU (unidade lógica e aritmética) é quem interpreta e executa as instruções armazenadas na área de programas. Embora as instruções sejam de 14 bits, os dados são de oito bits. Todas as instruções operam sempre sobre oito bits. A ALU trabalha em estreito relacionamento com o registro W, onde grande parte das operações são realizadas ou tem neste registro o local de armazenamento do resultado da operação. Para aqueles com conhecimento dos microprocessadores 8080 e Z80, o registro W é funcionalmente equivalente ao acumulador destes processadores.

Os demais blocos selecionados são os responsáveis pela sincronização das operações da

CPU, assim como garantem que, logo após a energização ou reset, a máquina assuma um estado bem conhecido. Isto é muito importante para que o programador possa se assegurar das condições que estarão presentes quando o seu programa começar a operar.

Um dos registros de grande importância para o aumento da confiabilidade de um programa que deve operar em ambientes robustos a falhas é o temporizador de watchdog. O funcionamento deste temporizador é o seguinte. Se o programa estiver executando corretamente, ele reinicializa o watchdog dentro de períodos bem determinados. Se por algum motivo qualquer o programa entra em loop ou se desvia do fluxo programado (por exemplo, devido a um transiente na alimentação), o watchdog não será reinicializado, e quando o mesmo atingir o tempo limite , será gerado um interrupt que reinicializará todo o sistema para uma condição segura.

O sistema de interrupts ara um programa tomar contato com algum evento externo, como por exemplo, um interruptor que se fecha ou abre, existem duas maneiras. A primeira é ficar vigiando na porta em que está ligado o interruptor, verificando se ocorreu alguma mudança, e a segunda é utilizando os interrupts. P

A primeira opção é muito simples de ser programada, mas tem uma grande desvantagem. A

CPU gasta muito tempo apenas vigiando a porta de entrada. Além do mais, se uma dada tarefa toma muito tempo para ser executada, a chave pode mudar de estado mais de uma vez, fechando e abrindo outra vez, sem que a CPU perceba.

Para evitar que a CPU perca a informação de alteração do sinal de entrada, pode-se utilizar os interrupts. Programado desta maneira, quando ocorre o sinal na entrada, o programa é desviado para uma posição fixa, no caso do PIC16F877 o desvio ocorre na posição 0x04H . Passa a ser executado então o trecho do programa responsável pelo atendimento da interrupção. Após processado a interrupção o sistema volta a executar o programa que estava sendo executado anteriormente. Desta forma não gastamos tempo vigiando inutilmente a porta e não perdemos o evento que desejamos processar.

http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 20

O PIC16F877 pode processar até quinze tipos diferentes de interrupções. Todas as interrupções provocam o desvio do fluxo do programa para a posição 0x0004h. Para você identificar qual foi a fonte de interrupção consulte o registro INTCON. Um ponto importante sobre os interrupts é que o contexto não é salvo automaticamente. Você precisa realizar esta operação via software. Normalmente os registros que você precisará salvar são os registradores W e de STATUS. Salvar o contexto é importante para que o programa que estava sendo executado quando ocorreu a interrupção possa continuar sua execução como se nada tivesse acontecido. Se você não salvar o contexto, o comportamento do programa certamente será aleatório.

O seguinte trecho de código pode ser utilizado para salvar o contexto em interrupções.

WTEMPEQU 0x0c;variavel para salvar o registro W STEMPEQU 0x0d;variavel para salvar o registro status INT_MOVWFWTEMP;copia o registrador W para o registro TEMP SWAPFSTATUS,W;registrador status Θ colocado em W MOVWFSTEMP;salva status em TEMP1 ; processa aqui o interrupt

FIM SWAPF STEMP,W ;recupera STATUS anterior MOVWF STATUS SWAPFWTEMP,F;inverte nibles de temp SWAPFWTEMP,W; recupera W anterior RETFIE;retorna do interrupt

Os interrupts podem ser desabilitados individualmente ou de uma forma geral. Para desabilitar todos interrupts simultaneamente faça igual a zero o bit GIE (global interrupt enable, no registrador INTCON <7>.

Após o reset todos os interrupts estão desabilitados pelo bit GIE , INTCON<7>. Após receber um interrupt o sistema zera o bit GIE, desabilitando todos os interrupts. Você deve aproveitar esta situação de interrupts desabilitados para efetuar o reconhecimento do interrupt que está sendo atendido. Se não o fizer, o bit correspondente a geração do interrupt continuará ativo, e logo após a instrução RETFIE, (retorno de interrupção), a interrupção será ativada novamente, independente se o fato gerador existe ainda ou não. Isto provocará um loop infinito no seu programa.

Um ponto que torna o PIC16F877 mais flexível no que diz respeito aos interrupts é a possibilidade de programação, via registradores, da situação que o interrupt INT/RB0 será reconhecido. Podemos programar se o interrupt ocorrerá no bordo de subida ou descida do sinal, através do bit INTEDG do registrador OPTION <6>.

As configurações do oscilador á vimos anteriormente que o PIC16F877 pode operar com quatro tipos de osciladores. Estas configurações são necessárias para que o circuito funcione numa grande faixa de freqüências (32Khz a 10MHz), e com diferentes dispositivos osciladores.J

•Osciladores a cristal de baixa potência (LP)

•Osciladores a cristal/ressonadores cerâmicos convencionais (XT) http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 21

•Osciladores a cristal/ressonadores cerâmicos de alta freqüência (HS)

•Osciladores a Resistor/Capacitor (RC)

A escolha do tipo de oscilador adequado depende das necessidade de nossa aplicação.

Assim, se as temporizações do nosso programa não são críticas, como por exemplo em projetos de alarmes, a opção pelo oscilador RC nos dá o menor custo. Se uma baixa freqüência de clock for adequada para o seu programa (entre 32Khz e 200KHz) a melhor opção é a do oscilador LP. Freqüências entre 2MHz a 4Mhz devem corresponder ao oscilador XT e finalmente, altas freqüências de oscilação (8Mhz a 10Mhz) correspondem ao oscilador HS.

Um modo interessante de se usar o PIC é com um oscilador externo. Embora utilize maior número de componentes, esta opção permite um sincronismo entre vários PICS alimentados com o mesmo clock.

A seleção do oscilador é feita na palavra de configuração. Os cristais devem operar no modo paralelo. Se você tentar utilizar um cristal cortado para modo serial, a freqüência resultante pode ser diferente daquela especificada pelo fabricante.

Para os modos LP, XT e HS o circuito básico é sempre o mesmo, com variações nos componentes em função da freqüência de trabalho e uso de cristais ou ressonadores cerâmicos. A tabela 3.4 apresenta os valores recomendados para os componentes em várias situações, e a figura 3.15 mostra o circuito básico externo do oscilador no PIC16F877. Observe que o resistor RS neste circuito normalmente não é necessário, exceto no caso de alguns cristais de corte AT.

Modo freq(tipo) C1 C2

XT 455 kHz(ressonador) 47-100pF 47-100pF

XT2.0

MHz(ressonador) 15-33pF 15-33pF

XT4.0 MHz (ressonador) 15-33pF 15-33pF

HS 8.0MHz(ressonador) 15-33pF 15-33pF

HS10 MHz (ressonador) 15-33pF 15-33pF

LP 32 kHz(cristal) 68-100pF 68-100pF LP 200khz(cristal) 15-33pF 15-33pF XT 100khz(cristal) 100-150pF 100-150pF XT2 MHz (cristal)15-33pF15-33pF XT4 MHz (cristal)15-33pF15-33pF HS4 MHz (cristal)15-33pF15-33pF HS10 MHz (cristal)15-33pF15-33pF

Tabela 3.4 Valores recomendados para o oscilador http://www.solbet.com.br Considerações básicas sobre o PIC16F877A 2

Figura 3.15 Circuito do oscilador do PIC16F877

Para o caso de osciladores RC apresentados na figura 3.16, a freqüência de operação será dependente dos valores de R, C, da fonte de alimentação, da temperatura ambiente e do circuito integrado utilizado. Esta forma de oscilador não é recomendada a não ser para sistemas onde o custo e não a estabilidade da freqüência de oscilação for o mais importante.

Figura 3.16 Circuito para oscilador RC

Os valores do resistor devem estar entre 100 KΩ e 3KΩ e o capacitor deve ter como valor mínimo 20 pF e valor máximo 330pF. .

(Parte 4 de 5)

Comentários