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 m icrocontrolador, p.e:
Proteger el código
Habilitar el WatchDog
Habilitar el modo de programación
Habilitar si se va ha trabajar con co n 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 Software’s no piden el valor de Hfuse y Lfuse, en lugar de ello piden directamente 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. Para el caso del ATMEGA48, ATMEGA88 y ATMEGA138
Para el caso del ATMEGA8, ATMEGA8515 y ATMEGA8535 Bit LowFuse HighFuse No
Bit No
LowFuse
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
HighFuse
HFuse=0xDF LFuse=0x62
HFuse=0xD9 LFuse=0xE1
Nótese que algunos bits de cada tabla varían, a continuación 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.
Página 1
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 r equiera. 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 AT90S 8535. 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.
Página 2
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
111
Max VBOT
Units
BOD Disabled
110
1.7
1.8
2.0
101
2.5
2.7
2.9
100
4.1
4.3
4.5
V
011 010
Reserved
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
1
1
1
0
0
1
0
0
Boot Size
128 Words 256 Words 512 Words 1024 Words
Pages
4 8 16 32
Applic. Flash Section
0x0000xF7F 0x0000xEFF 0x0000xDFF 0x0000xBFF
Boot Loader Flash Section
End Applic. Section
Boot Reset Address (Start Boot Loader Section)
0xF80-0xFFF
0xF7F
0xF80
0xF00-0xFFF
0xEFF
0xF00
0xE00-0xFFF
0xDFF
0xE00
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 c aso de que BOOTRST estuviera activado. Con esta tabla finaliza la programación de los bits de Hfuse.
Página 3
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 A TMEGA8535), 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 osc ilador 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
Página 4
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”.
Página 5
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
Página 6