Nesta aula, aprenderemos sobre importantes configurações dos microcontroladores, que são os fuses.

Na aula anterior, aprendemos a gravar códigos nos microcontroladores AVR e PIC.

Informações básicas

O que são fuses

Os microcontroladores possuem diversos periféricos e recursos internos que podem ser utilizados de diferentes formas. E, para isto, é necessário fazer configurações. Uma forma de configuração são os fuses e outra são os registradores específicos de cada periférico. A primeira será assunto desta aula e a outra será estudada nas aulas de cada periférico.

Então, sendo mais específico, os fuses são bits responsáveis por configurar parâmetros internos do microcontrolador, como o clock, o pino de reset e alguns outros detalhes que veremos adiante. Os fuses são também chamados de “bits de configuração” (configuration bits) em alguns casos.

No caso do AVR, configurar os fuses é mais difícil, pois a configuração só pode ser feita com o AVR no modo de programação (pág 293 do datasheet). Ao contrário do PIC, que permite fazer a configuração dentro do próprio código.

E é importante dizer que é preciso tomar muito cuidado na hora de configurar os fuses, pois, dependendo, você pode fazer o microcontrolador não ser mais programado (entenderemos isso logo logo).

A seguir falarei das configurações mais genéricas que aparecem no AVR e no PIC. Existem algumas outras que falarei no tópico exclusivo para cada microcontrolador. E vou utilizar como base o ATMega328p e o PIC16f628A para falar dos bits de configuração.

As 4 primeiras configurações dizem respeito ao Reset dos microcontroladores.

Pino de Reset (MCLR)

Caso você ainda não tenha percebido, existe um pino nos microcontroladores chamado de Reset (AVR) ou MCLR (PIC). Veja ele na imagem abaixo:

Fonte: Datasheet do ATmega328p

Este pino, assim como o nome sugere, serve para resetar o microcontrolador sendo acionado em nível baixo. Isto é, quando o pino recebe GND (nível baixo), o microcontrolador reinicia seu ciclo de trabalho voltando para a primeira instrução do código gravado em sua memória.

Esta explicação está simplificada, na página 56 do datasheet do ATmega328p você pode ler mais sobre.

E, no contexto de operação normal, o pino Reset deve receber nível alto (3,3V ou 5V) para que o microcontrolador possa funcionar corretamente. É comum disso ser feito por meio de um pull-up.

Além do pull-up, é usual em algumas aplicações ligar um botão entre o Reset e o GND, de forma que o microcontrolador seja resetado ao pressionar o botão. Isso é muito útil num contexto de testes.

De toda forma, existe um fuse que é capaz de habilitar/desabilitar o pino de Reset e ele, por padrão, vem habilitado.

Muito cuidado, pois o Reset é utilizado para programar o AVR. E, se ele for desabilitado, o microcontrolador só poderá ser programado novamente utilizando um gravador de “alta tensão”. Então, por segurança, é melhor não mexer neste fuse.

Power-on Reset

A segunda forma de reiniciar o microcontrolador é por meio de um circuito chamado “Power-on Reset”.

Quando o circuito é energizado, o Power-on Reset mantém o micro resetado até que a tensão de alimentação (Vcc) atinja uma certa estabilidade. Isso serve para prevenir comportamentos indesejados do microcontrolador que ocorreriam caso Vcc não estivesse em seu valor nominal.

Na prática, o circuito aguarda a tensão de alimentação subir acima de um limiar estabelecido para, então, criar um delay (dezenas de milissegundos) e esperar a tensão atingir a estabilidade. A imagem abaixo ilustra seu funcionamento.

Fonte: Adaptado do datasheet do ATmega328p

Enfim, dentre os fuses, existe um que serve para configurar o tempo deste ‘delay’.

Brown-out detection (BOD)

A terceira forma de reiniciar o microcontrolador é por meio de um circuito chamado “Brown-out Detection” (BOD).

Este circuito é bem semelhante ao do “Power-on Reset”. A diferença é que o BOD serve para monitorar quedas no nível de tensão. Isto é, se o microcontrolador estava funcionando normalmente e a tensão de alimentação caiu abaixo de um determinado nível, o circuito de BOD reinicia o micro até que a tensão fique estável novamente.

Veja seu funcionamento abaixo.

Fonte: Adaptado do datasheet do ATmega328p

Vão existir fuses para habilitar/desabilitar o circuito de Brown-out e para configurar os limiares das tensões de detecção (não existe em todos os casos).

Watchdog

Existe ainda uma quarta forma de reiniciar o microcontrolador que é com um circuito chamado “Watchdog”.

O Watchdog é simplesmente um timer (contador) que, quando chega no seu valor de contagem final, reinicia o microcontrolador. E este timer pode ser sempre zerado pela programação para evitar que ele reinicie o sistema.

Pode parecer estranho alguém querer usar o Watchdog, mas ele é útil para evitar que o programa fique congelado (travado) em um determinado trecho. Isso, porque, se o programa travar, o Watchdog não será zerado fazendo com que sua contagem chegue ao fim e, assim, ele reinicia o sistema (destrava).

Vai existir um fuse responsável por habilitar/desabilitar o Watchdog. Mas, dependendo, ainda será preciso fazer alguns passos adicionais para que ele seja de fato habilitado.

Na maioria das aplicações, o Watchdog não é utilizado.

Clock

Finalmente, saindo dos circuitos de reset, existe um circuito muito importante que é o do clock do microcontrolador. No caso, o clock é o elemento responsável pelo sincronismo e pela velocidade de execução das operações internas do micro.

E existem variadas formas de se gerar/obter o clock. Pois ele pode ser gerado por um oscilador interno ou externo, e pode ser de baixa ou de alta frequência e entre outros detalhes.

De toda forma, é importante atentar à esta configuração, porque você pode estar utilizando o microcontrolador sem cristal externo. Com isto, seria necessário configurar os fuses para habilitar o cristal interno.

Fuses do AVR

Conforme foi mencionado, configurar os fuses do AVR é mais chatinho que no PIC, mas ainda assim é um processo tranquilo de ser feito. No caso, ensinarei a fazer isto utilizando o AVRDUDESS, que foi mostrado na última aula.

Antes, falarei sobre os fuses mostrando o ATmega328 como exemplo.

Fuses - Como aparecem na memória

O ATmega328p possui 3 bytes para configuração dos fuses:

  • Fuse Low Byte: Configurações do clock e do delay do Power-on Reset.
  • Fuse High Byte: Configuração do pino de reset, watchdog e entre outros.
  • Extended Fuse Byte: Configuração do BOD.

Nos bits destes bytes ‘1’ significa que o fuse está no estado “não programado” e ‘0’ significa “programado”. É importante ficar atento a este detalhe na hora de fazer a configuração.

Extended Fuse Byte

Este byte possui apenas 3 bits configuráveis. Bits esses que alteram os parâmetros do circuito de Brown-out detection. Veja abaixo:

AVR Extended Fuses byte
Fonte: Datasheet do ATmega328p

E na página 314 do datasheet é possível saber como configurar estes bits. Veja abaixo:

Configuração do BOD
Fonte: Datasheet do ATmega328p

Como é possível visualizar, na configuração padrão (todos em 1), o BOD é desabilitado. Além disto, existem 3 arranjos diferentes possíveis para o BOD.

Fuse High Byte

Não pretendo falar de todos os detalhes deste byte. Mas veja ele abaixo:

AVR High Fuse byte
Fonte: Datasheet do ATmega328p

Alguns bits interessantes:

  • Bit 7 – Fuse para habilitar/desabilitar o pino de Reset.
    • Por padrão (1), o pino fica habilitado. 
    • Se o reset for desabilitado, o pino funciona como um pino de entrada/saída digital.
    • Lembrando: desabilitar o Reset impede o microcontrolador de ser programado pelo modo normal.
  • Bit 5 – Habilita a programação serial (discutido na aula 5).
    • Por padrão (0), a programação fica habilitada. E não recomendo alterar este valor.
  • Bit 4 – Habilita/desabilita o Watchdog.
    • Por padrão (1), o Watchdog fica desabilitado.
  • Bit 3 – Tamanho da memória reservada ao Bootloader.
    • Se você está utilizando o Arduino, não recomendo mexer neste parâmetro, porque pode atrapalhar o Bootloader padrão do Arduino.

Fuse Low Byte

Veja o byte adiante:

AVR Low Fuses byte
Fonte: Datasheet do ATmega328p

Entenda os bits:

  • Bit 7 – Divide o clock utilizado por 8.
    • Por padrão (0), ele é dividido, mas você pode deixá-lo em ‘1’ para aumentar a velocidade de processamento do microcontrolador.
  • Bit 6 – Permite colocar o clock do sistema no pino PORTB0.
    • Por padrão (1), o clock não vai para o pino PORTB0. 
  • Bits 5 e 4 – Define o ‘delay’ do Power-on Reset.
    • Na página 43 do datasheet é possível ver como configurar estes bits:

CK é o período do clock.

Configuração do Power-on Reset
Fonte: Datasheet do ATmega328p
  • Bits 3, 2, 1 e 0 – Selecionam a fonte do clock.
    • O clock tem os seguintes modos de configuração:
Configurações do clock
    • Não pretendo falar em detalhes de cada parte. Para isto, recomendo ler da página 36 à página 44 do datasheet.
    • Entretanto, dois modos úteis são: oscilador interno de ~8MHz (0010) e oscilador externo de cristal (1111) de alta frequência (8 a 16MHz).

Configurando fuses no AVRDUDESS

Definir os fuses corretamente pode ser um processo um pouco confuso, por isso recomendo bastante você utilizar este site para te auxiliar.

De toda forma, o primeiro passo para isso é abrir o AVRDUDESS e configurar o dispositivo e a porta COM. Em seguida, basta ler ou escrever os fuses nas opções que ficam à direita no programa (veja abaixo).

AVRDUDESS Fuses

Não é possível alterar/ler os fuses do Arduino pela conexão USB. Por isso, na imagem acima, após ler os fuses, eles ficaram em 0x0.

Para alterar o Arduino seria preciso utilizar o USBasp ou outro Arduino.

Fuses do PIC

Alterar os fuses do PIC é bem simples e pode ser feito dentro do próprio código. Antes de mostrar isso, pretendo falar um pouco dos fuses mostrando o PIC16f628A como exemplo.

Fuses - Como aparecem na memória

O PIC16f628A possui um registrador de 14 bits dedicado à configuração dos fuses. E ele recebe o nome de “Configuration Word Register”. Veja ele abaixo:

Registrador dos fuses do PIC
Fonte: Datasheet do PIC16f628A

Bits do registrador de fuses

Vou falar de alguns dos bits do registrador mostrado acima, mas você pode ler em detalhes na página 98 do datasheet.

  • Bit LVP – Habilita (1) ou desabilita (0) o modo de programação “Low-voltage” explicado na aula 5.
    • Se for habilitado, o RB4 perde a função de pino de entrada/saída digital.
  • Bit BOREN – Habilita (1) ou desabilita (0) o circuito Brown-out detection.
  • Bit MCLRE – Habilita (1) ou desabilita (0) pino MCLR (reset).
    • Se for desabilitado, o pino RA5 (MCLR) pode funcionar como entrada digital.
  • Bit PWRTE – Habilita (1) ou desabilita (0) o ‘delay’ do circuito de Brown-out detection.
  • Bit WDTE – Habilita (1) ou desabilita (0) o Watchdog.
  • Bits FOSC – Configura o clock do microcontrolador.
    • A página 98 do datasheet mostra as diferentes configurações e as páginas 99 à 101 explicam cada uma: 
    • 111 e 110 – Oscilador RC externo.
    • 101 e 100 – Oscilador interno de 4MHz (padrão) ou 48kHz.
    • 011 – Fonte de clock externa. 
    • 010 – Cristal oscilador externo de alta frequência (8M a 20MHz).
    • 001 – Cristal oscilador externo de média frequência (100k a 4MHz).
    • 000 – Cristal oscilador externo de baixa frequência (32k a 200kHz).

Configurando fuses no MPLABX

Existe uma ferramenta extremamente útil no MPLABX para definir os fuses, que é a janela chamada “Configuration bits”.

Depois que você criar o seu projeto, vá em “Window” -> “Target Memory Views” -> “Configuration Bits”. Veja abaixo:

Acessando janela de bits de configuração

Com isto, aparecerá na parte inferior do programa uma janela com nome “Configuration bits”. Dentro desta janela, é possível escolher facilmente as configurações que você deseja para o microcontrolador. Uma vez que isto for feito, clique no botão “Generate Source Code to Output”.

Janela de bits de configuração

Depois que você clicar no botão, o código da configuração será gerado em uma nova janela. Com isto, basta copiar o código e colar no início do seu programa. Abaixo está indicado um exemplo com as configurações que fiz.

Não se preocupe com os comandos adicionais, pois serão tratados nas aulas seguintes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Programa para piscar um LED

// Bits de configuração
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>

#define _XTAL_FREQ  4000000

void main(void)
{
    // Define pino A2 como saída
    TRISAbits.TRISA2 = 0;
   
    for(;;)
    {
        // Comuta o estado do pino A2
        PORTAbits.RA2 = !PORTAbits.RA2;
        __delay_ms(1000);
    }
   
    return;
}

Por fim, basta gravar o código no PIC que já estará tudo configurado.

Observações finais

Depois desta aula, já sabemos gravar os microcontroladores e configurá-los. Portanto, estamos prontos para finalmente começar a estudar os periféricos dos microcontroladores e a piscar alguns LEDs.

Sendo assim, o assunto da próxima aula será o periférico de GPIO (pinos de entrada e saída).

Controlando pinos digitais (GPIO) – Aula 7 – MC