Tutorial de Configuración de Fusibles Para AVR

6
Página 1 Tutorial de configuración de Fusibles para AVR. A lo que llama ATMEL como fusibles o fuses son aquellas localidades a las que se puede acceder para determinar ciertas características del microcontrolador, p.e: Proteger el código Habilitar el WatchDog Habilitar el modo de programación Habilitar si se va ha trabajar con cristal externo, oscilador, etc. Antes de comenzar es preciso especificar los dos fusibles que existen Hfuse y Lfuse (High Fuse y Low Fuse). Los cuales encontramos en las hojas de datos de cada dispositivo. En la sección “Memory Programmin”, hay dos tablas que especifican los bits de Hfuse y Lfuse, que pueden variar entre un dispositivo y otro. Algunos Software’s no piden el valor de Hfuse y Lfuse, en lugar de ello piden directamente el valor de cada bit por lo que se muestran aquí los valores. Nota: Un CERO indica que el bit esta habilitado, un UNO indica que el bit esta deshabilitado (lógica inversa), para las casillas el CERO es y el UNO es . Y las tablas mostradas tienen los valores de fábrica de cada dispositivo. Los bits destacados en amarillo no es recomendable alterarlos y mas adelante se explica porque. Nótese que algunos bits de cada tabla varían, a continuación se explican todos los bits en general para las dos tablas. Las tablas para otro componente de la familia AVR se encuentran en sus hojas de datos. Para el caso del ATMEGA48, ATMEGA88 y ATMEGA138 Para el caso del ATMEGA8, ATMEGA8515 y ATMEGA8535 Bit No LowFuse HighFuse Bit No LowFuse HighFuse 7 CHKDIV8 RSTDISBL 7 BODLEVEL RSTDISBL/S85xxC 6 CKOUT DWEN 6 BODEN WDTON 5 SUT1 SPIEN 5 SUT1 SPIEN 4 SUT0 WDTON 4 SUT0 CKOPT 3 CKSEL3 EESAVE 3 CKSEL3 EESAVE 2 CKSEL2 BODLEVEL2 2 CKSEL2 BOOTSZ1 1 CKSEL1 BODLEVEL1 1 CKSEL1 BOOTSZ0 0 CKSEL0 BODLEVEL0 0 CKSEL0 BOOTRST HFuse=0xDF LFuse=0x62 HFuse=0xD9 LFuse=0xE1

description

Descripción de configuración de fuses en AVR

Transcript of Tutorial de Configuración de Fusibles Para AVR

Page 1: Tutorial de Configuración de Fusibles Para AVR

Página 1

Tutorial de configuración de Fusibles para AVR.

A lo que llama ATMEL como fusibles o fuses son aquellas localidades a las que se puede acceder

para determinar ciertas características del microcontrolador, p.e:

Proteger el código

Habilitar el WatchDog

Habilitar el modo de programación

Habilitar si se va ha trabajar con cristal externo, oscilador, etc.

Antes de comenzar es preciso especificar los dos fusibles que existen Hfuse y Lfuse (High Fuse y

Low Fuse). Los cuales encontramos en las hojas de datos de cada dispositivo. En la sección

“Memory Programmin”, hay dos tablas que especifican los bits de Hfuse y Lfuse, que pueden

variar entre un dispositivo y otro.

Algunos Software’s no piden el valor de Hfuse y Lfuse, en lugar de ello piden directamente el valor

de cada bit por lo que se muestran aquí los valores.

Nota: Un CERO indica que el bit esta habilitado, un UNO indica que el bit esta deshabilitado (lógica

inversa), para las casillas el CERO es y el UNO es . Y las tablas mostradas tienen los valores de

fábrica de cada dispositivo.

Los bits destacados en amarillo no es recomendable alterarlos y mas adelante se explica porque.

Nótese que algunos bits de cada tabla varían, a continuación se explican todos los bits en general

para las dos tablas. Las tablas para otro componente de la familia AVR se encuentran en sus hojas

de datos.

Para el caso del ATMEGA48, ATMEGA88 y ATMEGA138

Para el caso del ATMEGA8, ATMEGA8515 y ATMEGA8535

Bit No

LowFuse HighFuse Bit No

LowFuse HighFuse

7 CHKDIV8 RSTDISBL 7 BODLEVEL RSTDISBL/S85xxC

6 CKOUT DWEN 6 BODEN WDTON

5 SUT1 SPIEN 5 SUT1 SPIEN

4 SUT0 WDTON 4 SUT0 CKOPT

3 CKSEL3 EESAVE 3 CKSEL3 EESAVE

2 CKSEL2 BODLEVEL2 2 CKSEL2 BOOTSZ1

1 CKSEL1 BODLEVEL1 1 CKSEL1 BOOTSZ0

0 CKSEL0 BODLEVEL0 0 CKSEL0 BOOTRST

HFuse=0xDF LFuse=0x62

HFuse=0xD9 LFuse=0xE1

Page 2: Tutorial de Configuración de Fusibles Para AVR

Página 2

Programar los bits de Hfuse.

El valor de los bits RSTDISBL=1 (Deshabilitado de RESET) y DWEN=1 (Debug WIRE Enable),

especificado de fábrica, si se alteran estos valores poniendo un 0, ya no se va a poder comunicar

con el microcontrolador ya que requiere un modo de programación llamado de alto voltaje.

El pin 1, para el caso del ATMEGA8, ATMEGA48, ATMEGA88 y ATMEGA138, es pin de RESET, pero

también es el PC6, el cual casi nunca se utiliza como entrada o salida, su función normalmente es

la de RESET, si queremos utilizar este pin como parte del puerto C, entonces hay que habilitar el

RSTDISBL, con un 0 (recordemos que el cero habilita el bit), esto implica que el microcontrolador

ya no podrá ser reprogramado ya que deshabilitado el RESET es imposible comunicarse con el.

El microcontrolador utiliza las terminales SPI (MOSI, MISO y SCK), para programarlo, por lo cual el

bit SPIEN=0, esto significa que esta habilitado en este modo.

WDTON (watch dog o perro guardián), es un timer de vigilancia el cual al llegar a su cuenta

máxima provoca un RESET. Entonces en el programa se ponen ciertas instrucciones de refresco las

cuales reinicializan al timer para evitar que llegue a su cuenta máxima. Este sistema se utiliza

donde existe el ruido eléctrico o algún elemento que pueda ciclar al microcontrolador. El valor por

defecto de fabrica para WDTON=1, para mantenerlo deshabilitado, si cambiamos este valor

asignando un 0 y no ponemos las instrucciones de refresco el microcontrolador se estará ejecutara

un RESET constantemente.

Así que el valor de WDTON=1 amenos que la aplicación lo requiera.

El bit CKOPT=1 (Opciones del Oscilador), el valor de este bit depende de los bits CKSEL3, CKSEL2,

CKSEL1 y CKSEL0, que se encuentran en Lfuse.

El bit S85XXC (solo para el caso ATMEGA8515 y ATMEGA8535), habilita un modo de

compatibilidad con sus predecesores el AT90S8515 y el AT90S8535.

Para todas las programaciones de Hfuse debe quedar así: RSTDISBL=1, DWEN=1, SPIEN=0,

WDTON=1 (tal como se muestran los valores resaltados en amarillo), al menos en la parte alta de

Hfuse.

Al programar al microcontrolador se hace un borrado de la memoria FLASH y de la memoria

EEPROM ya que al reprogramar al microcontrolador ya no nos interesa lo que hay en ninguna de

las dos memorias, pero si queremos conservar los datos de la EEPROM entonces se debe poner el

bit EESAVE=0, el valor de fabrica en EESAVE=1.

BODLEVEL2=1, BODLEVEL1=1 y BODLEVEL0=1, (solo para el ATMEGA48, ATMEGA88 y

ATMEGA138), estos bits son para generar un RESET por bajo voltaje. Esto es muy importante

porque si el voltaje de suministro del microcontrolador baja considerablemente se pueden alterar

las localidades de la memoria EEPROM y puede provocar que se ejecute instrucciones erróneas de

código.

Page 3: Tutorial de Configuración de Fusibles Para AVR

Página 3

Siempre es importante modificar el BODLEVEL al voltaje que mas convenga y sobretodo cuando

se este utilizando la EEPROM interna.

En la siguiente tabla se muestran los valores para modificar los bits de BODLEVEL.

BODLEVEL 2:0 Fuses Min VBOT Typ VBOT Max VBOT Units

111 BOD Disabled

110 1.7 1.8 2.0

V 101 2.5 2.7 2.9

100 4.1 4.3 4.5

011

Reserved 010

001

000

De la tabla anterior vemos que si estamos trabajando con 5V, nos conviene poner los valores de

los bits así: BODLEVEL2=1, BODLEVEL1=0, BODLEVEL0=0. Esto significa que habrá un RESET cuando

el voltaje caiga por debajo de los 4.3V.

Los bits BOOTSZ1=0 y BOOTSZ0=0 (solo para el ATMEGA8, ATMEGA8515 y ATMEGA8535),

seleccionan el tamaño del BOOTLOADER, de la siguiente tabla.

BOOT SZ1

BOOT SZ0

Boot Size

Pages Applic. Flash

Section

Boot Loader Flash

Section

End Applic. Section

Boot Reset Address (Start Boot Loader

Section)

1 1 128

Words 4

0x000-0xF7F

0xF80-0xFFF 0xF7F 0xF80

1 0 256

Words 8

0x000-0xEFF

0xF00-0xFFF 0xEFF 0xF00

0 1 512

Words 16

0x000-0xDFF

0xE00-0xFFF 0xDFF 0xE00

0 0 1024

Words 32

0x000-0xBFF

0xC00-0xFFF 0xBFF 0xC00

Los valores de fábrica para estos bits son los que determinan el Boot Size más grande, en la última

columna se muestra la dirección del RESET en caso de que BOOTRST estuviera activado.

Con esta tabla finaliza la programación de los bits de Hfuse.

Page 4: Tutorial de Configuración de Fusibles Para AVR

Página 4

Programar los bits de Lfuse.

El bit CHKDIV8=0, y el CKOUT=1, (solo para el ATMEGA48, ATMEGA88, y ATMEGA138), determinan

el comportamiento del oscilador interno, CHKDIV8 habilita el divisor interno de la señal de Reloj. El

oscilador interno RC esta calculado a 8MHZ, pero el bit CHKDIV8 esta activado por lo tanto la

frecuencia de trabajo es de 1MHZ, es posible deshabilitar este bit para aumentar la velocidad de

trabajo (evitando la división entre 8).

CKOUT=1, (esta deshabilitado), este bit permite sacar la señal de Reloj a través del pin B0, esto

para sincronizarse con otro microcontrolador.

BODLEVEL=1 y BODEN=1 (solo para el ATMEGA8, ATMEGA8515 y ATMEGA8535), como ya se había

mencionado antes BODLEVEL determina un RESET por bajo voltaje, si BODLEVEL=1, el voltaje al

que ocurre el RESET es de 2.7V, si BODLEVEL=0, este voltaje es de 4v. BOEN habilita a BODLEVEL,

el valor de fábrica es 1, desactivado.

Finalmente los bits STU1, STU0, CKSEL3, CKSEL2, CKSEL1 y CKSEL0 son los que determinan el

oscilador, que puede ser Oscilador Externo, Cristal Oscilador, Oscilador Interno, etc. A demás

sirven para asegurar un encendido correcto. Suponiendo que la fuente de alimentación de 5V es

lenta en la respuesta de 0 a 5V en el encendido, necesitamos prepara al microcontrolador con un

“Slow rising power”, si la fuente es rápida en el cambio de 0 a 5V en el encendido, entonces es

necesario un “Fast rising power”.

Fuentes de Reloj. Normalmente con la familia de microcontroladores AVR, solo se utiliza el

oscilador interno o un cristal oscilador. La conexión del cristal oscilador es la siguiente.

En la siguiente tabla se muestran las opciones de fuente de reloj disponibles y la configuración de

CKSEL.

Device Clocking Option CKSEL3..0

External Crystal/Ceramic Resonator 1111 – 1010

External Low-frequency Crystal 1001

External RC Oscillator 1000 – 0101

Calibrated Internal RC Oscillator 0100 – 0001

External Clock 0000

Page 5: Tutorial de Configuración de Fusibles Para AVR

Página 5

De la tabla anterior se obtiene que para utilizar un cristal oscilador el valor de CKSEL3:0 debe ser

de 1111 – 1010, el más apropiado lo encontramos en otra tabla.

CKOPT CKSEL3:1 Frecuency Range

(MHz) Recommended Range for Capacitors C1 and C2 for Use with Crystals (pF)

1 101 0.4 – 0.9 -

1 110 0.9 – 3.0 12 – 22

1 111 3.0 – 8.0 12 – 22

0 101,110,111 1.0 – 16.0 12 – 22

El último valor de la tabla es el que muestra en rango mas amplio de frecuencia para trabajar con

cristal oscilador, además nos da el valor de CKOPT de Hfuse. Ahora este dato nos ofrece tres

posibles valores para CKSEL3:1. Solo falta el valor de CKSEL0, STU1 y STU0, estos valores están en

la siguiente tabla.

CKSEL0 STU1:0 Start-up Time from Power-down and

Power-save

Additional Delay from Reset

(VCC = 5.0V) Recommended Usage

0 00 258 CK 4.1 ms Ceramic resonator, fast rising power

0 01 258 CK 65 ms Ceramic resonator, slowly rising power

0 10 1K CK - Ceramic resonator, BOD enabled

0 11 1K CK 4.1 ms Ceramic resonator, fast rising power

1 00 1K Ck 65 ms Ceramic resonator, slowly rising power

1 01 16K CK - Crystal Oscillator, BOD enabled

1 10 16K CK 4.1 ms Crystal Oscillator, fast rising power

1 11 16K CK 65 ms Crystal Oscillator, slowly rising power

Finalmente los tres últimos valores de la tabla nos indican el valor de CKSEL0 y STU1:0,

dependiendo si tenemos el BOD habilitado o si queremos un “Fast Rising Power” o “Slow Rising

Power”.

Page 6: Tutorial de Configuración de Fusibles Para AVR

Página 6

Ejemplo: Supongamos que tenemos una aplicación en donde se utilizara un ATMEGA8535, con un

cristal externo de 16MHZ, con una fuente que tarda en alcanzar los 5V, y no nos interesa lo que

este almacenado en la memoria EEPROM.

HFuse S8535C WDTON SPIEN CKOPT EESAVE BOOTSZ1 BOOTSZ0 BOOTRST

C9 1 1 0 0 1 0 0 1

LFuse BODLEVEL BODEN SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0

FD 1 1 1 1 1 1 0 1

Ejemplo: Supongamos que tenemos una aplicación en donde se utilizara un ATMEGA48, con un

cristal externo de 16MHZ sin división interna, queremos activar el RESET por bajo voltaje, no nos

interesa lo que este almacenado en la memoria EEPROM y no necesitamos sacar la señal de reloj

para sincronizar con otro dispositivo.

HFuse RSTDISBL DWEN SPIEN WDTON EESAVE BODLEVEL2 BODLEVEL1 BODLEVEL0

C9 1 1 0 1 1 1 0 0

LFuse CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0

DD 1 1 0 1 1 1 0 1