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


RESETS DO MICROCONTROLADOR


Às vezes desejamos, por algum motivo, reinicializar o microcontrolador, seja para restabelecer alguma condição inicial ou seja porque a CPU parou de funcionar por um motivo desconhecido.

Todo microcontrolador pode ser reinicializado de duas maneiras: desligando e religando a fonte de alimentação ou então usando as funções de reset do mesmo.

Os microcontrolador PIC possuem algumas funções de reset prevendo certas situações. São elas:



MLCR

Esta é uma função de reset externo fornecida pelo pino MCLR. Durante a operação normal, esse pino deve ser mantido em nível alto (+5V), conectado ao VDD através de um resistor de, por exemplo, 10K. Para efetuar o reset, deve-se aterrar esse pino manualmente, isto é, levá-lo ao nível 0V, por exemplo, através de uma chave táctil. Esse procedimento fará com que a CPU comece a executar as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa. O reset no pino MCLR limpa alguns registradores de controle do microcontrolador mas mantem intactos todos os dados da memória de dados (RAM). A figura abaixo mostra como montar um circuito de reset no pino MCLR:


Power On Reset (POR)

Esse reset só acontece quando o circuito é ligado. É usado para aguardar a tensão de alimentação subir a um ponto confiável antes da CPU começar a executar as instruções. Após um Power On Reset, alguns registradores de controle serão inicializado mas os dados da memória de dados (RAM) podem conter valores inesperados. O Power On Reset fará com que a CPU comece a executar as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa.


Brown-Out Reset (BOR)

O Brown-Out Reset é usado para reiniciar a CPU automaticamente quando a tensão de alimentação cai abaixo do nível seguro de operação do circuito. O Brown-Out Reset deve ser habilitado nos bits de configurações do microcontrolador. Por exemplo, num chip 16F628A, o Brown-Out é habilitado com o parâmetro __CONFIG _BOREN_ON e desabilitado com __CONFIG _BOREN_OFF. Se o Brown-Out estiver habilitado e a tensão cair abaixo do nível adequado haverá um reset que fará com que a CPU comece a executar as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa. Após o reset, alguns registradores de controle do microcontrolador serão reinicializados mas o conteudo da memória de dados (RAM) será imprevisível. Em alguns microcontrolador os níveis de tensão seguros para a operação são fixos mas, em outros, podem ser selecionados.


Watchdog Timer Reset (WDT)

O que fazer com aquele programa que trava, não se sabe em que rotina, tornando necessário ligar e desligar o circuito para que ele volte a funcionar? O WTD serve justamente para reiniciar a CPU de tempos em tempos para certificar que o programa não parou de funcionar por algum motivo. Seu funcionamento depende de um timer interno que, ao estourar a contagem, provoca o reset do microcontrolador. Esse tempo varia de acordo com condições de temperatura e a tensão de alimentação mas fica, em média, em torno dos 18ms (milisegundos) no PIC16F628A. O WDT deve ser habilitado ou desabilitado através dos bits de configuração. No caso de um chip 16F628A, podemos habilitá-lo com __CONFIG _WDT_ON e desabilitá-lo com __CONFIG _WDT_OFF. O reset pelo WDT mantem os dados da memória de dados (RAM) intactos mas alguns registradores de controle são reinicializados. Após o reset do WDT, a CPU começa a executar as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa.

Saiba mais sobre o Watchdog Timer em na sessão WatchDog Timer.


Estouro do Stack

A arquitetura dos microcontroladores reserva uma área de memória chamada stack cujo objetivo é armazenar os endereços de retorno para as instruções RETURN e RETLW poderem voltar logo após a instrução CALL que provocou o desvio para uma subrotina.

O stack também é responsável por armazenar o endereço de retorno de uma interrupção que será usado para a instrução RETFIE retornar ao ponto onde o programa estava antes da interrupção.

O tamanho da memória reservada para o stack pode variar de um microcontrolador para outro. Na família de microcontroladores 16F, por exemplo, o stack possui apenas 8 níveis. Isso limita em 8 o número de chamadas CALL aninhadas, isto é, se no programa principal fizermos um CALL para uma subrotina S1 que faz um CALL para uma subrotina S2 que faz um CALL para uma subrotina S3 e assim sucessivamente, quando fizermos um CALL para uma subrotina S9 haverá um estouro do stack, causando a perda o endereço de retorno S1 e nunca mais será possível retornar ao ponto original. Isso causa um erro onde o programa pode travar ou continuar executando erraticamente tornando muito difícil detetar a falha.

Quando programamos em linguagem C, o gerenciamento do stack é feito internamente pelo compilador porém muito cuidado deve ser tomado quando programamos em linguagem Assembly pois, neste caso, o programador é responsável por manter o stack sob controle.


Sleep Mode

Quando se alimenta um circuito com baterias queremos economizá-las o máximo possível. O modo Sleep permite que a CPU consuma uma corrente muito baixa, da ordem de uns 4uA (microamperes) quando esse modo é requisitado. Esse modo deve ser usado quando não hover processamento durante muito tempo, isto é, quando o programa estiver esperando uma interrupção acontecer para poder prosseguir. Verifique no datasheet quais são as características do chip usado para saber como usar o modo Sleep. Como regra geral, antes de entrar em Sleep, deve-se desativar todos os comparadores e as portas de I/O do chip. O ideal é configurar todos os I/O como entrada. Para entrar no modo Sleep, é usada a instrução SLEEP. Somente interrupções podem "acordar" o microcontrolador. Quando uma interrupção acontece, o microcontrolador sofre um reset e começa a executar as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa.



  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