Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aprender a programar microcontroladores significa aprender a usar todos sus recursos para luego aplicarlos en el diseo deseado. Es un proceso continuo, sistemtico y que demanda por sobre todo bastante paciencia. En este captulo empezaremos por conocer el hardware interno de los AVR enfocndonos en losmegaAVR de las series ATmegaXX8 y ATmegaXX4, que son actualmente los mejores microcontroladores de 8 bits de Atmel disponibles en encapsulados DIP de 28 y 40 pines respectivamente. Las XX indican los kBytes de memoria FLASH que lleva el megaAVR, por ejemplo, el ATmega168A tiene 16 kBytes de FLASH. Entre los miembros de estas familias podemos citar al ATmega48A, ATmega88P, ATmega168PA, ATmega328P, ATmega164A, ATmega324P, ATmega644PA y ATmega1284P. Como se puede notar, al final de cada nombre todava puede aparecer un sufijo como A, P, V o PA, que identifica una caracterstica adicional del megaAVR como ser de una sub-serie que opera a bajo voltaje (V) o que estn fabricados con tecnologa picoPower (P) para trabajar consumiendo menos energa. En algunas sub-series se han corregido ciertos bugs encontrados en versiones anteriores del AVR. Esto no necesariamente significa que tengan ser mejor, pues todos los microcontroladores de todas las marcas suelen tener pequeos bugs que en la gran mayora de aplicaciones se pasan por alto. Quiz el nico momento en que nos percatemos de la sub-serie especfica de nuestro mega AVR sea cuando lo identifique el software programador, leyendo su cdigo de identificacin. Por lo dems no debera preocuparnos la sub-serie del megaAVR. Los programas son compatibles tanto en cdigo fuente como en cdigo mquina. As que para facilitar la lectura de aqu en adelante nos referiremos a estos megaAVR simplemente como ATmegaXX4 o ATmegaXX8, entendiendo que pueden tener o no el sufijo explicado. Existe mucha compatibilidad entre los microcontroladores de Atmel, por lo que la teora expuesta es aplicable en gran parte a otras series de AVR como los tinyAVR, los megaAVR con USB o incluso a los AVR antiguos como los clsicos ATmega8535, ATmega8515, ATmega16, ATmega32, etc. A decir verdad, los AVR que estudiaremos son como las versiones mejoradas de los "clsicos" megaAVR citados anteriormente.
Tienen una velocidad de ejecucin de hasta 20 MIPS (20 Millones de Instrucciones Por Segundo), que se alcanzar cuando el reloj del sistema (XTAL) sea de 20 MHz. Aunque como en cualquier otro microcontrolador, en la prctica no ser una velocidad sostenida, porque en el programa habr instrucciones que se demoran 2 ms ciclos de instruccin. Sin embargo, siguen siendo bastante rpidos si los comparamos por ejemplo con sus contrapartes de Microchip, los PIC18, los cuales tienen un lmite de 10 o 12 MIPS. Tienen un Timer0 de 8 bits que puede trabajar como Contador o Temporizador o Generador de hasta dos canales de ondas PWM de 8 bits de resolucin. Tienen un Timer1 de 16 bits que opera en modo Contador, Temporizador o como Generador de hasta dos canales de ondas PWM con resolucin configurable de hasta 16 bits. Los ATmega1284 tienen adicionalmente un Timer3 idntico al Timer1. Tienen un Timer2 de 8 bits, parecido al Timer0 pero equipado adicionalmente para operar con un XTAL externo de 32 kHz de modo asncrono. Tienen un Comparador Analgico. Tienen un mdulo TWI (Two Wire Interface) para comunicaciones con el protocolo I2C en modos Maestro y Esclavo. Tienen un mdulo SPI programable. Soporta los modos Maestro y Esclavo. Sirve adems como la interface de programacin serial del megaAVR. Tienen un Conversor ADC de 10 bits, con hasta 8 canales de entrada. Tienen un USART0: Puerto serie Transmisor Receptor Sncrono Asncrono Universal. Los ATmegaXX4 tienen adicionalmente un USART1, con caractersticas idnticas a las delUSART0. Operan con voltajes de alimentacin entre 1.8V y 5.5V. Mientras ms alta sea la frecuencia de operacin del AVR ms alto ser el nivel de alimentacin requerido, por ejemplo, para trabajar a la mxima frecuencia de 20 MHz, Vcc debe tener un valor muy estable entre 4.5V y 5V. Tienen un Oscilador RC interno configurable como oscilador principal del sistema. Tienen 6 modos Sleep, para una mejor administracin del consumo de la energa. Tienen un circuito BOD o detector de bajo voltaje de alimentacin. Tienen un temporizador Watchdog, para vigilar que el programa no quede colgado. Los megaAVR de la serie ATmegaXX8 tienen 3 puertos de E/S (con 23 pines en total) y los megaAVR de la serie ATmegaXX4 tienen 4 puertos de E/S (con 32 pines en total). Oscilador del sistema seleccionable, desde el Oscilador RC interno hasta cristales de cuarzo. Tienen un modo de programacin paralela de alto voltaje HVPP (a 12V) y un modo de programacin serial en bajo voltaje SPI (a 5V). Los ATmegaXX4 pueden adicionalmente ser programados por su interface de depuracin JTAG. Por otro lado, la interface debugWIRE de losATmegaXX8 no ofrece la funcin de programacin con la misma capacidad.
Tienen un sistema de depuracin OCD con interface JTAG en el caso de los ATmegaXX4 y con interface debugWIRE en el caso de los ATmegaXX8. En general, la interface JTAG (compuesta por 4 pines) est disponible en todos los megaAVR de 40 pines o ms y la interface debugWIRE(conformada por una sola lnea) est presente en los megaAVR con menos de 40 pines. Su memoria de programa FLASH tiene una seccin de Boot Loader para albergar un programa cargador del mismo nombre. De los megaAVR estudiados en este curso (entre los ATmegaXX4 yATmegaXX8) el nico que no ofrece esta funcionalidad es el ATmega48. El programa de Boot Loader le permite al microcontrolador auto-programarse sin necesidad de usar un programador externo como el USBasp o AVR ISP MkII. Es as como trabajan los mdulos Arduino, por ejemplo.
Diagrama de bloques simplificado de los megaAVR ATmegaXX4 / ATmegaXX8. Ahora una somera descripcin de lo que representan estos bloques. El CPU es el circuito encargado de leer, decodificar y ejecutar las instrucciones del programa. Dispone de 32 registros de trabajo y un ALU (Unidad Aritmtico Lgica) con el que realiza las operaciones de suma, resta, AND lgica, OR lgica, etc. La Memoria FLASH, de Programa almacena las instrucciones del programa del AVR. Es una memoria permanente pero que se puede reprogramar para cambiar de tarea. La Memoria RAM, de Datos aloja las variables que procesa el CPU. El Contador de Programa es un registro que evoluciona para indicar cul ser la siguiente instruccin que debe ejecutar el CPU. La Pila o Stack es un segmento de la memoria RAM para guardar el valor del Contador de Programa y tambin variables temporales del programa cuando sea necesario. Los perifricos del AVR son elementos que se pueden usar para una determinada tarea; por ejemplo, el Timer0 sirve para temporizaciones. El USART para comunicaciones seriales RS232, etc. Casi todos ellos sern estudiados en un captulo aparte. Los puertos de E/S, PORTA,..., PORTD, son las lneas hacia/desde el exterior donde se pueden conectar los dispositivos a controlar, como diodos LED, transistores, LCDs, etc. Los megaAVR de 40 pines tienen los 4 puertos completos, mientras que a los megaAVR de 28 pines les faltaPORTA y algunos pines en los otros puertos. Hay ms recursos presentes dentro de un AVR que tambin son imprescindibles pero cuyo trabajo queda en segundo plano. Algunos de ellos sern abordados en otro momento.
La Memoria de Programa
Es de tipo FLASH. Aqu es donde se aloja el programa que el CPU ejecutar. Se puede modificar por completo mediante un dispositivo programador por hasta 10 000 veces. Pero tampoco deberamos tanto. No conozco a nadie que haya llegado a ese lmite con un solo microcontrolador. Lo ms probable es que, por ms cuidado que tengas, llegues a frer tu AVR antes de tiempo en algn accidente. Eso es algo muy normal. En los AVR las instrucciones de programa son de 16 de 32 bits. Pero siendo la gran mayora de 16 bits, podemos decir que un AVR de N bytes de memoria FLASH puede almacenar hasta N/2 instrucciones de cdigo ensamblador. Antiguamente pareca sencillo reconocer la cantidad de memoria FLASH que tenan algunos AVR. Por ejemplo, un ATmega32 tiene 32 k-bytes, un ATmega8L tiene 8 kbytes. Los megaAVR de ahora todava conservan esa correspondencia entre el nmero que aparece en su nombre y la cantidad de k-bytes de FLASH, solo que las nuevas series tambin llevan un nmero que puede entrar a confundir un poco. En la siguiente tabla apreciamos los AVR de las series ATmegaXX8, ATmegaXX4, ATmegaXX5 yATmegaXX50. Las XX representan la cantidad de FLASH de megaAVR. Al final de cada nombre aparece el sufijo yy representando a las letras P, V, A o PA. Personalmente, creo que al haber varias series, es ms fcil separar primero los nmeros que representan la capacidad de FLASH porque deben ser nmeros redondos (digitalmente hablando), es decir, deben ser potencias de 2, como 4, 8, 16, 32, 64 128. Por ejemplo, cunta memoria FLASH tendr un ATmega3290P?, 3290 kbytes, 329 kbytes, 32 kbytes o 3 kbytes? Como el nico nmero redondo es 32, la respuesta es 32 kbytes y deducimos que este megaAVR es de la serie 90P. Se llega ms rpido a la respuesta si leemos las opciones empezando por la izquierda.
Tabla AVR
Memoria FLASH Memoria RAM Memoria EEPROM Pines de E/S 4K 8K 16 K 32 K 16 K 32 K 512 1K 1K 2K 1K 2K 256 512 512 1K 512 1K 23 23 23 23 32 32
Tabla AVR
Memoria FLASH Memoria RAM Memoria EEPROM Pines de E/S 64 K 128 K 16 K 32 K 32 K 64 K 64 K 4K 16 K 1K 2K 2K 4K 4K 2K 4K 512 1K 1K 2K 2K 32 32 54/69 54/69 54/69 54/69 54/69
Secciones de Aplicacin y de Boot Loader de la memoria de programa del AVR. La Seccin de Boot Loader siempre se ubica al final de la memoria FLAH pero su tamao vara de acuerdo con el AVR y con la configuracin establecida por los fuses BOOTSZ1 y BOOTSZ0. Por ejemplo, el ATmega644PA puede tener una Seccin de Boot Loader entre 512 palabras y 4096 palabras, segn la siguiente tabla.
Tabla BOOTSZ1
BOOTSZ1 BOOTSZ0 Tamao del Boot Loader Direccin del Boot Loader 1 1 0 0 1 0 1 0 512 palabras 1024 palabras 2048 palabras 1096 palabras 0x7E00 - 0x7FFF 0x7C00 - 0x7FFF 0x7800 - 0x7FFF 0x7000 - 0x7FFF
Los fuses BOOTSZ1 y BOOTSZ0 solo se pueden modificar al grabar el AVR. Su configuracin por defecto siempre establece el tamao mayor elegible de la Seccin de Boot Loader. El hecho de que la Seccin de Boot Loader est diseada para alojar el programa cargador no significa que est limitada a esa tarea. Si no la vamos a usar para su
propsito primigenio, podemos emplearla como si fuera parte de la Seccin de Aplicacin, o sea, como si no existiera la divisin entre estas dos Secciones y por ende no tendr importancia el valor que pongamos en los fuses BOOTSZ1 y BOOTSZ0.
Configuracin de los Fuses de Boot loader en el programa grabador. A propsito, la configuracin de los fuses BOOTSZ1 y BOOTSZ0 en Proteus no tiene ningn efecto porque Proteus an no soporta simulaciones con Boot Loader. As que estn como decorativos.
AVR ATmegaNNN
Algunos Modelos ATmega48A, ATmega48PA, ATmega48P/V, ATmega48/V ATmega88A, ATmega88PA, ATmega88P/V, ATmega88/V ATmega168A, ATmega168PA, ATmega168P/V, ATmega168/V ATmega164A, ATmega164PA ATmega165A, ATmega165PA ATmega169, ATmega169P ATmega328, ATmega328P ATmega324A, ATmega324PA ATmega325A, ATmega325PA ATmega3250A, ATmega3250PA ATmega329P, ATmega3290P ATmega644A, ATmega644PA ATmega645A, ATmega645P ATmega6450A, ATmega6450P ATmega128, ATmega1281 ATmega1284, ATmega1284P
ATmegaNNN
8K
1K
ATmegaNNN
16 K
1K
ATmegaNNN
32 K
2K
ATmegaNNN
64 K
4K
ATmegaNNN
128 K
4K, 8K o 16K
En los modelos listados y en general en todos los megaAVR de las series ms recientes el espacio de la memoria RAM (entendida en su concepto tradicional) empieza en la direccin 0x0100 y termina en 0x02FF, 0x04FF, 0x08FF, 0x10FF, 0x20FF o 0x40FF, segn el modelo. La verdad, no importa mucho saber dnde termina como la cantidad misma. La direccin de inicio s es de consideracin pero cuando se programa en lenguaje ensamblador. Quiz alguien pudiera preguntar por qu la direccin de inicio no es 0x0000, como en otros microcontroladores. Porque las primeras direcciones, desde 0x0000 hasta 0x00FF, estn reservadas para acceder a los Registros de Trabajo y a los Registros de E/S del AVR en modo de memoria. Normalmente los 32 Registros de Trabajo se acceden directamente con instrucciones como LDI o MOV. Pero tambin se les puede acceder direccionndolos como si fueran parte de la memoria RAM, con instrucciones como LD o ST y con las direcciones presentadas. En ocasiones esto facilitar mover bloques de datos entre la RAM y los registros de trabajo aprovechando la potencia de los punteros. Del mismo modo, los Registros de E/S, que tampoco ocupan posiciones reales en la RAM, pueden ser accedidos como si en verdad fueran RAM con las instrucciones como LD y ST, para lo cual emplean las direcciones mostradas en la figura.
Los Registros de E/S y los Registros de E/S extendidos son hermanos, por decirlo de algn modo, y tienen funciones anlogas. Estn separados solo por tener diferente modo de acceso, pero eso se explicar mejor en su seccin respectiva. El direccionamiento y distincin de los espacios de la RAM solo son de preocupacin al trabajar en ensamblador. Al programar en lenguajes de alto nivel los compiladores se encargan de toda la administracin de la RAM, salvo que reciban directivas avanzadas.
El Contador de Programa, PC
El PC es un registro que indica la siguiente instruccin que debe ejecutar el CPU. Si vale 0x0000, ejecutar la primera instruccin de la memoria; si vale 0x0002 ejecutar la tercera instruccin, y as... Al arrancar microcontrolador, elPC vale 0x0000 y se va incrementando automticamente, con lo que el AVR debera ejecutar una a una desde la primera hasta la ltima instruccin del programa. En realidad, en el cdigo habr instrucciones que modifiquen el valor del PCde modo que el programa nunca termine.
SPH
SP15
SP14
SP13
SP12
Registro SPL
SP11
SP10
SP9
SP8
SPL
SP7
SP6
SP5
SP4
SP3
SP2
SP1
SP0
El Puntero de Pila est representado por los registros de E/S SPH y SPL, que concatenados actan como un registro de 16 bits. Como se dijo anteriormente, este registro tiene un comportamiento de auto-incremento y auto-decremento. La nica intervencin por parte del usuario debera ser su inicializacin, esto es, cargarle la ltima direccin de la RAM. Pero esta operacin solo es indispensable al programar en ensamblador. Los compiladores como el C inicializan la Pila automticamente. Sin embargo, incluso en C es importante conocer estos conceptos para entender por ejemplo por qu un programa para un ATmega328P nunca funcionar en un ATmega168P, incluso si el tamao del cdigo es pequeo y le puede caber sobradamente.
Todos los AVR de 8 bits, desde los tinyAVR hasta losXMEGA cuentan con 32 Registros de Trabajonombrados desde R0 hasta R31. Los Registros de Trabajo tienen la funcin de alojar los datos ms inmediatos que el CPU procesa. Acaso sa no era tarea de la RAM?. Bueno, sucede que en todos los microcontroladores inspirados en la arquitectura de los procesadores de Intel (como los AVR, ARM y Freescale entre otros) el acceso a la memoria RAM toma ms ciclos que el acceso a los Registros de Trabajo. En los AVR de 8 bits, por ejemplo, se puede acceder a los Registros de Trabajo en un solo ciclo, puesto que todos estn directamente conectados al CPU, o mejor dicho, son parte del CPU. En cambio, la mayora de las instrucciones ensamblador que acceden a la RAM consumen 2 ciclos de instruccin. No es posible cargar datos en la RAM directamente ni moverlos entre locaciones diferentes de la RAM (a menos que tengan DMA, como los AVR32). Para esas operaciones los Registros de Trabajo actan como intermediarios. Pero quiz la participacin ms notable de Los Registros de Trabajo sea en el ALU (Unidad Aritmtico Lgica) para computar las operaciones aritmticas y lgicas. Por ejemplo imaginemos que deseamos obtener la raz cuadrada de un nmero de punto flotante ubicado en la RAM y almacenar el resultado de nuevo en la RAM. En lenguaje C bastara con escribir una sola sentencia, pero el cdigo mquina generado involucra una tarea ms compleja: al inicio el CPU mueve los 4 bytes del nmero desde la RAM a los Registros de Trabajo, luego viene el trabajo pesado, que implica el procesamiento de varios datos intermedios. En lo posible todos estos datos tambin estarn en los registros de trabajo para aprovechar su velocidad y eficacia. Solo al terminar el cmputo el CPU depositar el resultado en la RAM. Los compiladores de alto nivel tambin suelen emplear los Registros de Trabajo para pasar los argumentos de sus funciones. Creo que con esos ejemplos debe quedar clara la razn de ser de los Registros de Trabajo. En la siguiente figura podemos notar que los Registros de Trabajo se parten por la mitad. La diferencia est en que los primeros 16 registros (R0 a R15) no admiten la instruccin LDI, que sirve para cargar constantes al registro (otro aspecto primordial de la programacin en ensamblador9. Los registros R26a R31 tienen la capacidad adicional de funcionar como punteros de 16 bits cada uno.
Los Registros de Trabajo de los AVR. El par de registros R27-R26 forma el Puntero X, el par R29-R28 forma el Puntero Y, y el par R31-R30forma el Puntero Z. Los punteros pueden apuntar a (contener la direccin de) cualquier locacin del espacio de RAM. Esto junto con las instrucciones adecuadas conforman el direccionamiento indirecto ms potente, muy til por ejemplo para mover grandes bloques de datos.
Terminamos esta seccin explicando las direcciones que figuran en el mapa de los Registros de Trabajo. En principio a los Registros de Trabajo no les debera hacer falta tener direcciones porque estn directamente unidos al CPU. Hay instrucciones adecuadas como LDI y MOV para acceder a ellos. Sin embargo, los AVR les brindan direcciones para adicionalmente poder ser accedidos como si fueran parte de la RAM, es decir, con instrucciones que estn diseadas para la RAM, como LD y ST. De esta manera se hacen ms flexibles las operaciones de transferencias de datos entre los diferentes espacios de memoria. Cuando manipulamos los Registros de Trabajo utilizando sus direcciones podemos decir que los estamos accediendo en modo RAM, pero sin perder de vista que los Registros de Trabajo no pertenecen a la RAM porque no estn implementadas fsicamente all.
Cada registro es de 8 bits y en total se cuentan 224 registros de E/S, aunque ni siquiera la mitad estn implementados fsicamente. Las locaciones que aparecen sin nombre estn RESERVADAS y no nunca deberan ser accedidas. De modo similar, hay registros con algunos bits sin nombre ni funcionalidad que tambin se consideran reservados. Un ejemplo es el registro SMCR, mostrado abajo. No est prohibido acceder a dichos bits pero se recomienda dejarlos en 0 por compatibilidad con futuros AVR. Estas aclaraciones aparecen por doquier en los datasheets. Yo prefiero decirlas ahora para no tener que estar repitindolo a cada rato despus.
Registro SMCR
SMCR
---
---
---
---
SM2
SM1
SM0
SE
Los antiguos microcontroladores AVR solo tenan el espacio de los 64 primeros Registros de E/S. A ellos les alcanzaba ese espacio aunque a veces a duras penas porque todos los registros estaban all apretujados. Los Registros de E/S tenan sus propias instrucciones de acceso, IN y OUT, que de hecho todava se usan. Las instrucciones de ensamblador IN y OUT utilizan el rango de direcciones 0x00 a 0x3F
para acceder a los Registros de E/S. En el esquema mostrado estas direcciones aparecen fuera de los parntesis. Con la aparicin de nuevos perifricos en los AVR, aumentaron los registros de E/S y se sobrepasaba el alcance de las instrucciones IN y OUT. As fue necesario disear los Registros de E/S para que tambin pudieran ser direccionados como si fueran parte de la RAM, o sea, con instrucciones como LDo ST, las cuales tienen mayor cobertura y permiten repotenciar las transferencias de datos. Para este tipo de acceso, llamado en modo RAM, las instrucciones como LD o ST utilizan el rango de direcciones 0x20 a 0xFF, que en los mapas de memoria aparecen dentro de los parntesis. A juzgar por sus direcciones, ya podrs deducir que la nica diferencia entre los Registros de E/S(estndar) y los Registros de E/S Extendidos es que estos ltimos se acceden exclusivamente en modo de memoria con instrucciones como LD y ST, y los primeros todava admiten el uso de las instrucciones clsicas como IN y OUT. El direccionamiento y distincin de los Registros de E/S estndar o extendidos son de especial preocupacin al trabajar en ensamblador. Al programar en lenguajes de alto nivel los compiladores son quienes escogen el modo de acceso y las instrucciones que consideren ms convenientes, salvo que reciban directivas contrarias.
SREG
S
Registro de Microcontrolador
Global Interrupt Enable 1. Habilitar las interrupciones individuales habilitadas. Las interrupciones individuales sern habilitadas en otros registros de control. 0. No se habilita ninguna de las interrupciones sin importar sin importar sus configuraciones individuales. El bit I se limpia por hardware despus de ocurrir una interrupcin, y se setea por la instruccin para habilitar posteriores interrupciones. El bit I tambin se puede setear o limpiar por la aplicacin con las instrucciones
SEI y CLI. T Bit Copy Storage Las instrucciones para copiar bits (Bit LoaD) y BST (Bit STore) usan el bit T como inicio o destino para el bit de la operacin. Con la instruccin BST se puede copiar un bit de un registro de trabajo al bit T y con la instruccin BLD se puede copiar el bit T a un bit de un registro de trabajo. Half Carry Flag El flag H indica un medio acarreo en algunas operaciones aritmticas. El bit H es muy til en aritmtica BCD. Sign Bit, S = N ? V El bit S es siempre un or exclusivo entre los flags N y V. Leer abajo. Twos Complement Overflow Flag El flag V soporta aritmtica de complemento a dos. Negative Flag El flag N indica un resultado negativo en una operacin lgica o aritmtica. Zero Flag El flag Z indica un resultado cero en una operacin lgica o aritmtica. Carry Flag El flag C indica un acarreo en una operacin lgica o aritmtica.
S V N
Z C
El Registro MCUCR
MCUCR = MCU Control Register. MCU a su vez significa Micro Controller Unit. Aunque probablemente de este registro solo vayamos a usar el bit PUD, es bueno conocerlo ahora aprovechando que hace referencia a muchas de las caractersticas del microcontrolador que se estudiaron en este captulo. Ampliaremos la funcionalidad del bit PUD en el captulo de entrada y salida generales y los bits IVSEL junto con IVCE sern mejor expuestos en el captulo de interrupciones.
Registro MCUCR
MCUCR
JTD
BODS
BODSE
PUD
---
---
IVSEL
IVCE
Registro de Microcontrolador
JTD
JTAG Interface Disable 0. La interface JTAG estar habilitada si est programado el fuse JTAGEN. 1. la interface JTAG est deshabilitada. Para evitar deshabilitaciones no intencionadas de la interface JTAG, se debe seguir una secuencia especial para cambiar este bit: el
software de aplicacin debe escribir este bit dos veces el valor deseado dentro de cuatro ciclos de reloj. Este bit no se debe alterar cuando se est usando el sistema OCD (On Chip Debug) BODS BOD Sleep Sirve para deshabilitar el circuito del BOD durante el modo Sleep, si estaba activo. Recuerda que se activa por los fuses BODLEVEL2-0. Para poner 1 en el bit BODS se requiere seguir una secuencia especial que involucra el bit BODSE. Primero se escribe 1 en los bits BODS y BODSE. Luego se debe escribir 1 en el bit BODS y 0 en el bit BODSE dentro de los siguientes cuatro ciclos de reloj. El bit BODS estar activo durante tres ciclos de reloj despus de haberse seteado. Para apagar el circuito BOD para el modo Sleep actual se debe ejecutar la instruccin Sleep mientras el bit BODS est activo. El bit BODS se limpia automticamente despus de tres ciclos de reloj. BOD Sleep Enable El bit BODSE habilita la configuracin del bit de control BODS, como se explic en la descripcin del bit BODS. Pull-up Disable 1. Se deshabilitan las pull-up de todos los pines de los puertos, sin importar el valor de los registros DDRx y PORTx. 0. Las pull-up se habilitaran por los registros DDRx y PORTx. Interrupt Vector Select 0. Los Vectores de Interrupcin se ubican en el inicio de la memoria FLASH. 1. Los Vectores de Interrupcin se mueven al inicio de la Seccin de Boot Loader de la memoria FLASH. Para evitar cambios no intencionados en este bit se debe seguir una secuencia especial: a. Escribir 1 en el bit IVCE. b. Dentro de los cuatro ciclos de reloj siguiente, escribir el valor deseado en el bitIVSEL mientras se escribe un 0 en el bit IVCE. Las interrupciones se deshabilitarn automticamente durante la ejecucin de esta secuencia. Las interrupciones se deshabilitan en el ciclo en que se setea el bit IVCEy permanecen deshabilitadas hasta despus de la instruccin que escribe el bitIVSEL. Si no se escribe el bit IVSEL, las interrupciones permanecen deshabilitadas por cuatro ciclos de reloj. El bit I en el registro de estado SREG no se afecta por la deshabilitacin automtica. Nota: si los Vectores de Interrupcin estn colocados en la Seccin de Boot Loader, y el bit de candado BLB02 est programado, las interrupciones se deshabilitan durante la ejecucin del programa desde la Seccin de Boot Loader. Interrupt Vector Change Enable
BODS E PUD
IVSEL
IVCE
Se debe escribir 1 en el bit IVCE para habilitar el cambio del bit IVSEL. El bit IVCE se limpia por hardware cuatro ciclos despus de que se haya escrito o cuando se escribe el bit IVSEL. Setear el bit IVCE deshabilitar las interrupciones, como se explic en la descripcin del bit IVSEL.
El Registro MCUSR
MCUSR = MCU Status Register. Es el registro de estado del microcontrolador, MCU. MCUSR est conformado por bits de Flag que sirven para identificar la causa del reset del microcontrolador. Para averiguar la fuente de reset el programa debe leer el registro MCUSR tan pronto como sea posible y luego limpiar sus Flags. Observa que a diferencia de los Flags de las Interrupciones, los Flags de MCUSR se limpian escribiendo un cero y no un uno.
Registro MCUSR
MCUSR
---
---
---
JTRF
WDRF
BORF
EXTRF
PORF
Registro de Microcontrolador
JTRF
JTAG Reset Flag Este bit se pone a uno si se produce un reset por un uno lgico en el Registro JTAG Reset seleccionado por la instruccin de JTAG AVR_RESET. Este bit se pone a cero por un Reset POR, o escribiendo un cero lgico en el flag. Watchdog Reset Flag Este bit se pone a uno cuando se produce un Reset por el Watchdog. Este bit se pone a cero por un reset Power-on o escribiendo un cero lgico en el flag. Brown-out Reset Flag Este bit se pone a uno cuando se produce un Reset Brown-out. Este bit se pone a cero por un reset Power-on o escribiendo un cero lgico en el flag. External Reset Flag Este bit se pone a uno cuando se produce un Reset Externo. Este bit se pone a cero por un reset Power-on o escribiendo un cero lgico en el flag. Power-on Reset Flag Este bit se pone a uno cuando se produce un Reset Power-on. Este bit se pone a cero escribiendo un cero lgico en el flag.
WDRF
BORF
EXTR F
PORF
aplicacin puede requerir una configuracin particular y si no se establecen los fuses correctos, el programa puede funcionar mal, suponiendo que funcione. :) A diferencia de los PICmicro, en los AVR los fuses no pueden formar parte del cdigo HEX, as que siempre ser necesario configurarlos directamente en el entorno del programa grabador de AVR. Los fuses s pueden incluirse en los archivos de depuracin como ELF, para simulaciones o depuraciones. Por otra parte, y esto es para bien, hay muy poca variacin en los fuses de los AVR, inclusive de distintas series. Por eso sern de fcil recordacin, en contraste con los fuses de los PICmicro, donde son casi in-memorizables. La comparacin es siempre con los PIC18, por supuesto, porque los PIC16 en general no estn a la altura. Los fuses estn contenidos en los denominados Bytes de Fuses, que son registros (de 8 bits obviamente) implementados en EEPROM (no en la EEPROM de datos de AVR). Por eso un 1 es el valor por defecto cuando un bit no est programado. Los megaAVR ms recientes tienen 3 Bytes de Fuses llamados Byte de Fuses Bajo, Alto y Extendido. El Byte de Fuses Bajo es el mismo en todos ellos. Los otros empiezan a cambiar un poco, en orden ms que en funciones, segn cada modelo en particular. Mientras ms reciente sea la serie, se encontrarn menos divergencias. El conjunto de Bytes de Fuses mostrado a continuacin pertenece a los AVR de la serie ATmegaXX4. En otras series pueden aparecer, desaparecer o cambiar algunos fuses, por ejemplo los AVR de la serieATmegaXX5 tienen adicionalmente el fuse RSTDISBL. En lo sucesivo se describirn las funciones de los fuses ms conocidos, no solo los presentados aqu.
Tabla Byte de Fuses Bajo
Byte de Fuses Bajo Bit CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0 7 6 5 4 3 2 1 0
Descripcin Divide clock by 8 Clock output Select start-up time Select start-up time Select Clock source Select Clock source Select Clock source Select Clock source
Tabla Byte de Fuses Alto
Valor por Defecto 0 (programado) 1 (sin programar) 1 (sin programar) 0 (programado) 0 (programado) 0 (programado) 1 (sin programar) 0 (programado)
Descripcin
Byte de Fuses Bajo Bit OCDEN JTAGEN SPIEN WDTON EESAVE BOOTSZ1 BOOTSZ0 BOOTRST 7 6 5 4 3 2 1 0
Descripcin Enable OCD Enable JTAG Enable Serial Programming Watchdog Timer always on EEPROM memory is preserved Select Boot Size Select Boot Size Select Reset Vector
Tabla Byte de Fuses Extendido
Valor por Defecto 1 (sin programar) 0 (programado) 0 (programado) 1 (sin programar) 1 (sin programar) 0 (programado) 0 (programado) 1 (sin programar)
Descripcin
2 Brown-out Detector trigger level 1 Brown-out Detector trigger level 0 Brown-out Detector trigger level
Pongo en relieve estos detalles porque hay muchos programadores, como el famoso AVRDUDE, donde los fuses se configuran bit a bit al momento de grabar el AVR. Cmo haramos si tuviramos que configurar el uso de un oscilador de XTAL de 16 MHz en un ATmega324P? Primero tendramos que conocer los fuses correspondientes, cierto? En este caso son CKSEL0, CKSEL1, CKSEL2 y CKSEL3. Luego tendramos que descubrir cules son los bits que corresponden a esos fuses
y la combinacin correcta para un XTAL de 16MHz. Lamentablemente la posicin de los bits de fuses suele variar entre los distintos ejemplares de AVR, cosa que complica la labor en entornos donde debemos establecer el cdigo de los fuses en valor hexadecimal. En la siguiente imagen se muestra la grabacin de los fuses desde la lnea de comandos de AVRDUDE.
Grabacin de los fuses desde AVRDUDE. AVRDUDE es muy bueno pero no tiene un entorno grfico. Se le han desarrollado algunas mscaras que facilitan su uso como SinaProg o AVR Burn-O-Mat pero no son del todo convincentes. Tambin existen programadores con software de mejor interface. Los mejores son desde luego los mismos productos de Atmel como el programador STK500 que es comandado desde Atmel Studio 6como se ilustra abajo. All vemos que podemos configurar los fuses de forma individual simplemente marcando las casillas correspondientes. Los cambios hechos se reflejarn en los Bytes de Fuses mostrados en el panel inferior. Tambin es posible modificar los fuses directamente desde all.
Configuracin de los fuses desde Atmel Studio 6. A propsito de la pregunta previa, la siguiente toma nos indica que hay hasta 8 opciones para usar un XTAL mayor de 8MHz. Podras elegir cualquiera, a menos que sepas lo que significan los retardos de reset y de arranque, y ests seguro de que necesitas uno de ellos. Por supuesto que examinaremos todos estos aspectos ms adelante.
sistemas de bajo costo aunque de menor nivel de estabilidad. Es la opcin por defecto. Se establece poniendo los bits CKSEL3-0 = 0010, respectivamente. XTAL Externo de Baja Frecuencia. Para utilizar un XTAL externo de 32.768 kHz con capacitores de estabilizacin opcionales. Es una configuracin diseada para aplicaciones de reloj. En los ATmegaXX8 y ATmegaXX4 se establece poniendo los bits CKSEL30 = 0100 o 0101. En otros megaAVR puede variar. Oscilador RC Interno de 128kHz. Este oscilador es parecido al RC de 8MHz, solo que ofrece menor precisin y no se puede calibrar. En los ATmegaXX8 y ATmegaXX4 se establece con los bits CKSEL3-0 iguales a 0011. En otros megaAVR puede no estar disponible. XTAL Externo de Baja Potencia. Esta configuracin soporta cristales de 0.9 MHz hasta 16 MHz. Estos cristales ahorran energa pero su uso es recomendado solo en ambientes libres de ruido. El XTAL se coloca entre los pines XTAL1 y XTAL2 del AVR y debe usar capacitores externos de entre 12pf y 22pf, similar al circuito con XTAL estndar de alta frecuencia. En los ATmegaXX8 y ATmegaXX4 los valores de los bits CKSEL30 dependern del rango de frecuencia del XTAL, segn la siguiente tabla.
Tabla Rango del XTAL en MHz
Rango del XTAL en MHz CKSEL3-0 0.9 - 3.0 3.0 - 8.0 8.0 - 16.0
XTAL Externo Estndar. Con esta configuracin el XTAL usado estar entre 0.4 MHz y 20 MHz (el mximo admisible). El XTAL se coloca entre los pines XTAL1 y XTAL2 del AVR y debe tener capacitores externos de entre 12pF y 22pF. En los ATmegaXX8 y ATmegaXX4 se establece con los bits CKSEL30 = 0111 o 0110, dependiendo de la frecuencia del cristal usado, segn la siguiente tabla.
Tabla Rango del XTAL en MHz
Rango del XTAL en MHz CKSEL3-0 0.4 - 16 0.4 - 20 0111 o 0110 0111
Observa que con los 4 bits CKSEL3-0 es posible formar hasta 16 combinaciones. Entre las no citadas, algunas estn reservadas y no deberan usarse, y otras corresponden a configuraciones relacionadas con el uso de un Resonador Cermico
en lugar del XTAL externo estndar o de baja potencia. Exclu las combinaciones del resonador cermico para evitar una sobrecarga de nmeros innecesaria. En la mayora de las prcticas de cursomicros.com se usa un XTAL de 8 MHz. Puede ser estndar o de baja potencia. El XTAL de cuarzo brinda el reloj ms preciso y estable, lo que es ideal para aplicaciones que usan los mdulos sncronos como el USART o TWI (I2C). Debemos recordar que un 0 es un bit programado y un 1 es un bit sin programar. En las interfaces grficas de los programadores 0 suele ser una casilla marcada. Por otro lado, en el entorno de Atmel Studio 6 la eleccin es directa. La siguiente imagen nos muestra las opciones de reloj disponibles para el ATmega324P, incluyendo los retardos de reset y de arranque que trataremos a continuacin.
Configuracin de los fuses de reloj ms los retardos de RESET y de Arranque en Atmel Studio 6.
se estabilice el nivel de Vcc antes de que el CPU del AVR empiece a trabajar. Se representa por .
Mecanismo del Retardo de RESET en los AVR. Pero ah no termina. Para asegurarse de que el oscilador del sistema tambin se haya estabilizado, habr un Retardo de Arranque hasta que transcurran 1K o 16K ciclos de reloj CK. Durante ese lapso el AVR tambin se mantiene en estado de reset y luego recin el procesador empezar a ejecutar el programa. El Retardo de Arranque no solo se activa despus de un reset sino tambin despus de que el AVR salga de los estados Power-save o Power-down, que son dos de los seis modos SLEEP que tienen los megaAVR. La configuraciones de los retardos de reset y de arranque varan de acuerdo con la fuente de reloj del sistema. La siguiente tabla muestra solo las opciones admisibles para un XTAL estndar o de baja potencia.
Tabla CKSEL0
CKSEL0 0 0
SUT1 SUT0 10 11
Retardo de reset 14CK 4.1ms + 14CK 65ms + 14CK 14CK 4.1ms + 14CK 65ms + 14CK
Retardo de arranque 1K CK 1K CK
Fuente de Oscilador, Condiciones de alimentacin XTAL baja frecuencia, BOD enabled XTAL baja frecuencia, fast rising power XTAL baja frecuencia, slowly rising power XTAL, BOD enabled XTAL, fast rising power
1 1 1
00 01 10
1K CK 16K CK 16K CK
11
16K CK
En esta tabla XTAL baja frecuencia no se refiere al XTAL de reloj de 32.768 kHz, sino a un XTAL estndar o de baja potencia cuya frecuencia no est cercana a la mxima admisible por el AVR, que para los ATmegaXX8 o ATmegaXX4 es de 20MHz. Esta condicin concuerda con el valor del bitCKSEL0 dado en las tablas de los bits CKSEL3-0 vistas anteriormente. Como se ve algo confuso, vamos a poner un ejemplo de diseo. Supongamos que nuestra aplicacin utilizar un ATmega644P a una frecuencia muy estable de 20 MHz. En primer lugar debemos utilizar un XTAL estndar de 20MHz, para lo cual debemos programar los bits CKSEL3-0 con 0111 (ver las tablas de arriba). Como el bit CKSEL0 en este caso es 1, descartamos las configuraciones de la tabla donde CKSEL0 es 0. As mismo, como 20MHz no es una frecuencia baja, tambin descartamos la configuracin de XTAL baja frecuencia, slowly rising power. Ahora todava tenemos las tres opciones resaltadas en la siguiente tabla.
Tabla CKSEL0
CKSEL0 0 0
SUT1 SUT0 10 11
Retardo de reset 14CK 4.1ms + 14CK 65ms + 14CK 14CK 4.1ms + 14CK 65ms + 14CK
Retardo de arranque 1K CK 1K CK
Fuente de Oscilador, Condiciones de alimentacin XTAL baja frecuencia, BOD enabled XTAL baja frecuencia, fast rising power XTAL baja frecuencia, slowly rising power XTAL, BOD enabled XTAL, fast rising power
1 1 1
00 01 10
1K CK 16K CK 16K CK
11
16K CK
Cul elegir? Vemos que los ciclos de reloj son todos iguales a 16K CK. Entonces nuestra decisin depender del retardo de reset requerido. Si nuestro circuito tiene una alimentacin Vcc que se eleva lentamente (slowly rising power), debemos elegir un retardo de 65ms con SUT1-0 = 11. Pero si en nuestro circuito el nivel de Vcc se eleva rpidamente (fast rising power), podemos optar por el retardo de 4.1ms con SUT1-0 = 10. Por supuesto que tambin en este caso podemos optar por el retardo de 65ms. Por ltimo, explicamos lo que significa XTAL, BOD enabled. BOD es un circuito interno que detecta cuando la tensin de Vcc cae debajo de ciertos niveles. Tambin sirve para que el AVR no est trabajando con una alimentacin defectuosa. As que configurar el retardo de 14 CK (lo mismo que nada) equivale a no utilizar retardo de reset y solo debe utilizarse cuando nuestra aplicacin trabaje
con un circuito BOD externo o interno. El BOD interno del AVR se configura con los bits BODLEVEL2-0.
El valor por defecto del bit CKDIV8 es 0 = programado = reloj dividido entre 8. Si lo dejamos as, nuestro AVR operar 8 veces ms lento. Es ms sencillo desmarcar esa casilla que escribir el cdigo que reconfigura el Prescaler. A propsito, el Wizard de CodeVisionAVR genera ese cdigo automticamente.
BODLEVEL2-0 Voltaje de disparo de BOD (valor tpico) 111 110 BOD Desactivado 1.8
Tabla BODLEVEL2-0
BODLEVEL2-0 Voltaje de disparo de BOD (valor tpico) 101 100 2.7 4.3
Mecanismo del BOD o Reset interno del AVR producido por la cada de tensin en Vcc.
diseo utiliza el pin CLKO para una funcin de E/S, se puede producir un corto circuito que dae el pin o hasta el megaAVR completo.
El fuse SELPPRGEN solo est disponible en los AVR de poca memoria FLASH.
Byte de Bit Bits de Lock BLB12 BLB11 BLB02 BLB01 LB2 LB1 7 6 5 4 3 2 1 0
Descripcin
Valor por defecto 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar)
Boot Lock bit (Bit de candado de Boot Loader) Boot Lock bit (Bit de candado de Boot Loader) Boot Lock bit (Bit de candado de Boot Loader) Boot Lock bit (Bit de candado de Boot Loader) Lock bit (Bit de candado general) Lock Bit (Bit de candado general)
Los Bits de Lock generales LB1 y LB2 establecen tres modos de proteccin de las memorias del AVR, de sus fuses y de los mismos Bits de Lock, como se describen en la tabla de abajo. Para entender esto debemos saber que a diferencia de algunos otros microcontroladores donde la programacin de la memoria FLASH suele ir unida con la programacin de sus fuses, en los AVR es posible programar y leer por separado los diferentes espacios de memoria [no voltiles] que poseen. El modo por defecto es 1. All podremos seguir reprogramando por separado las memorias FLASH y EEPROM del AVR as como los fuses. Sobre los mismos Bits de Lock, todava podremos programarlos para pasar al modo 2 y 3. En el modo 2 las opciones disponibles desde las interfaces de programacin serial y paralela sern: primero, leer las memorias FLASH, EEPROM y los fuses (para propsitos de verificacin seguramente) y segundo, programar los Bits de Lock, siempre y cuando vayamos a establecer el modo 3 o el mismo 2, es decir, no podremos regresar al modo 1 por esta va. La interface JTAG todava nos permitir escribir en la FLASH y EEPROM, aunque es una puerta que debe haber sido abierta previamente programando el fuse JTAGEN, lo cual ser poco probable. Si elegimos el modo 3 nuestro AVR quedar con su programa actual y no podremos volver a programarlo. Con esta opcin tampoco se podr leer el cdigo de programa del AVR por ninguna interface desde ningn dispositivo externo. Este modo se usa para proteger el cdigo del programa. Para quienes conozcan los PIC, es como programar el fuse de proteccin de cdigo. Desde el modo 1 siempre podremos pasar al modo 2 o 3, y desde el modo 2 al modo 3. Pero para regresar un nivel de seguridad atrs la nica forma es aplicando una instruccin chip erase, que borrar las memorias EEPROM y FLASH, y los Bits de Lock regresarn al modo 1. Obviamente, por cuestiones de seguridad los Bits de Lock son los ltimos en borrarse.
Tabla Modo de LB
Tipo de proteccin No se habilita ninguna caracterstica de Candado. Se deshabilitan las posteriores programaciones de las memorias FLASH y EEPROM tanto en modo de programacin Serial y Paralela. Tambin se bloquean los bits de los fuses. Se deshabilitan las posteriores programaciones y verificaciones de las memorias FLASH y EEPROM tanto en modo de programacin Serial, Paralela y JTAG (si se tiene). Tambin se bloquean los bits de los Fuses y los bits de candado de Boot Loader en los modos de programacin Serial y Paralela.
10
00
Para comprender el uso de los 4 bits de candado de Boot Loader debemos conocer primero la funcin de las Secciones de Aplicacin y de Boot Loader, adems de las instrucciones de ensamblador LPM ySPM, que participan activamente en la autoprogramacin del AVR. LPM (Load from Program Memory) sirve para leer un byte de dato de la memoria FLASH. SPM (Store to Program Memory) sirve para escribir un byte de dato en la memoria FLASH. Ambas instrucciones, LPM y SPM, trabajan con el puntero Z para direccionar la memoria FLASH.
Tabla Modo de BLB0
Tipo de proteccin No habr restricciones para SPM o LPM en su acceso a la Seccin de Aplicacin. No se permite el uso de SPM para escribir en la Seccin de Aplicacin. No se permite el uso de SPM para escribir en la Seccin de Aplicacin, ni el uso de LPM para leer la Seccin de Aplicacin desde la Seccin de Boot Loader. Si los Vectores de Interrupcin estn ubicados en la Seccin de Boot Loader, las interrupciones se deshabilitan durante la ejecucin desde la Seccin de Aplicacin. No se permite el uso de LPM para leer la Seccin de Aplicacin desde la Seccin de Boot Loader. Si los Vectores de Interrupcin estn ubicados en la Seccin de Boot Loader, las interrupciones se deshabilitan durante la ejecucin desde la
00
01
Tipo de proteccin
Tipo de proteccin No habr restricciones para SPM o LPM en su acceso a la Seccin de Boot Loader. No se permite el uso de SPM para escribir en la Seccin de Boot Loader. No se permite el uso de SPM para escribir en la Seccin de Boot Loader, ni el uso de LPM para leer la Seccin de Boot Loader desde la Seccin de Aplicacin. Si los Vectores de Interrupcin estn ubicados en la Seccin de Aplicacin, las interrupciones se deshabilitan durante la ejecucin desde la Seccin de Boot Loader. No se permite el uso de LPM para leer la Seccin de Boot Loader desde la Seccin de Aplicacin. Si los Vectores de Interrupcin estn ubicados en la Seccin de Aplicacin, las interrupciones se deshabilitan durante la ejecucin desde la Seccin de Boot Loader.
00
01
El valor predeterminado de todos Bits de Lock es 1 sin programar. En ciertos softwares de programacin significa que las casillas respectivas estn desmarcadas. En otros software comoAVRFLASH se indican las configuraciones por sus modos (1, 2, 3 4). Atmel Studio 6 por su parte ofrece una configuracin basada en la habilitacin o deshabilitacin de las instrucciones SPM y LPM. En cualquier caso, se establecen por defecto el modo de proteccin 1 (sin ninguna proteccin) y deberan quedar as, a menos que estemos seguros de lo que hacemos.
Byte de Bit Bits de Lock BLB12 BLB11 BLB02 BLB01 LB2 LB1 7 6 5 4 3 2 1 0
Descripcin
Valor por defecto 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar) 1 (sin programar)
Boot Lock bit (Bit de candado de Boot Loader) Boot Lock bit (Bit de candado de Boot Loader) Boot Lock bit (Bit de candado de Boot Loader) Boot Lock bit (Bit de candado de Boot Loader) Lock bit (Bit de candado general) Lock Bit (Bit de candado general)
Los Bits de Lock generales LB1 y LB2 establecen tres modos de proteccin de las memorias del AVR, de sus fuses y de los mismos Bits de Lock, como se describen en la tabla de abajo. Para entender esto debemos saber que a diferencia de algunos otros microcontroladores donde la programacin de la memoria FLASH suele ir unida con la programacin de sus fuses, en los AVR es posible programar y leer por separado los diferentes espacios de memoria [no voltiles] que poseen. El modo por defecto es 1. All podremos seguir reprogramando por separado las memorias FLASH y EEPROM del AVR as como los fuses. Sobre los mismos Bits de Lock, todava podremos programarlos para pasar al modo 2 y 3. En el modo 2 las opciones disponibles desde las interfaces de programacin serial y paralela sern: primero, leer las memorias FLASH, EEPROM y los fuses (para propsitos de verificacin seguramente) y segundo, programar los Bits de Lock, siempre y cuando vayamos a establecer el modo 3 o el mismo 2, es decir, no podremos regresar al modo 1 por esta va. La interface JTAG todava nos permitir escribir en la FLASH y EEPROM, aunque es una puerta que debe haber sido abierta previamente programando el fuse JTAGEN, lo cual ser poco probable. Si elegimos el modo 3 nuestro AVR quedar con su programa actual y no podremos volver a programarlo. Con esta opcin tampoco se podr leer el cdigo de programa del AVR por ninguna interface desde ningn dispositivo externo. Este modo se usa para proteger el cdigo del programa. Para quienes conozcan los PIC, es como programar el fuse de proteccin de cdigo. Desde el modo 1 siempre podremos pasar al modo 2 o 3, y desde el modo 2 al modo 3. Pero para regresar un nivel de seguridad atrs la nica forma es aplicando una instruccin chip erase, que borrar las memorias EEPROM y FLASH, y los Bits de Lock regresarn al modo 1. Obviamente, por cuestiones de seguridad los Bits de Lock son los ltimos en borrarse.
Tabla Modo de LB
Tipo de proteccin No se habilita ninguna caracterstica de Candado. Se deshabilitan las posteriores programaciones de las memorias FLASH y EEPROM tanto en modo de programacin Serial y Paralela. Tambin se bloquean los bits de los fuses. Se deshabilitan las posteriores programaciones y verificaciones de las memorias FLASH y EEPROM tanto en modo de programacin Serial, Paralela y JTAG (si se tiene). Tambin se bloquean los bits de los Fuses y los bits de candado de Boot Loader en los modos de programacin Serial y Paralela.
10
00
Para comprender el uso de los 4 bits de candado de Boot Loader debemos conocer primero la funcin de las Secciones de Aplicacin y de Boot Loader, adems de las instrucciones de ensamblador LPM ySPM, que participan activamente en la autoprogramacin del AVR. LPM (Load from Program Memory) sirve para leer un byte de dato de la memoria FLASH. SPM (Store to Program Memory) sirve para escribir un byte de dato en la memoria FLASH. Ambas instrucciones, LPM y SPM, trabajan con el puntero Z para direccionar la memoria FLASH.
Tabla Modo de BLB0
Tipo de proteccin No habr restricciones para SPM o LPM en su acceso a la Seccin de Aplicacin. No se permite el uso de SPM para escribir en la Seccin de Aplicacin. No se permite el uso de SPM para escribir en la Seccin de Aplicacin, ni el uso de LPM para leer la Seccin de Aplicacin desde la Seccin de Boot Loader. Si los Vectores de Interrupcin estn ubicados en la Seccin de Boot Loader, las interrupciones se deshabilitan durante la ejecucin desde la Seccin de Aplicacin. No se permite el uso de LPM para leer la Seccin de Aplicacin desde la Seccin de Boot Loader. Si los Vectores de Interrupcin estn ubicados en la Seccin de Boot Loader, las interrupciones se deshabilitan durante la ejecucin desde la
00
01
Tipo de proteccin
Tipo de proteccin No habr restricciones para SPM o LPM en su acceso a la Seccin de Boot Loader. No se permite el uso de SPM para escribir en la Seccin de Boot Loader. No se permite el uso de SPM para escribir en la Seccin de Boot Loader, ni el uso de LPM para leer la Seccin de Boot Loader desde la Seccin de Aplicacin. Si los Vectores de Interrupcin estn ubicados en la Seccin de Aplicacin, las interrupciones se deshabilitan durante la ejecucin desde la Seccin de Boot Loader. No se permite el uso de LPM para leer la Seccin de Boot Loader desde la Seccin de Aplicacin. Si los Vectores de Interrupcin estn ubicados en la Seccin de Aplicacin, las interrupciones se deshabilitan durante la ejecucin desde la Seccin de Boot Loader.
00
01
El valor predeterminado de todos Bits de Lock es 1 sin programar. En ciertos softwares de programacin significa que las casillas respectivas estn desmarcadas. En otros software comoAVRFLASH se indican las configuraciones por sus modos (1, 2, 3 4). Atmel Studio 6 por su parte ofrece una configuracin basada en la habilitacin o deshabilitacin de las instrucciones SPM y LPM. En cualquier caso, se establecen por defecto el modo de proteccin 1 (sin ninguna proteccin) y deberan quedar as, a menos que estemos seguros de lo que hacemos.