Está en la página 1de 50

Introduccin

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.

Caractersticas Comunes de los megaAVR


Citaremos las caractersticas ms notables de los ATmegaXX8 y ATmegaXX4. Quiz muchas de ellas no las comprendas de plano. Puedes tomar eso como referencia para medir tu avance en el dominio del AVR. Tienen un repertorio de 131 instrucciones. Estn optimizadas para generar un mejor cdigo con los compiladores de alto nivel, en especial el C. Poseen 32 Registros de Trabajo de 8 bits cada uno. Se denominan desde R0 a R31. Esto en realidad es aplicable a todas las familias de los AVR de bits, incluyendo los XMEGA.

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.

Empaques de los megaAVR

Diagrama de pines de los ATmegaXX8 en encapsulado PDIP.

Diagrama de pines de los ATmegaXX4 en encapsulado PDIP.

Diagrama de bloques de los megaAVR


El siguiente diagrama muestra los principales elementos de un AVR y que tarde o temprano los tendrs que memorizar.

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

AVR ATmega48yy ATmega88yy ATmega168yy ATmega328yy ATmega164yy ATmega324yy

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

AVR ATmega644yy ATmega1284yy ATmega165yy ATmega325yy ATmega3250yy ATmega645yy ATmega6450yy

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


Los AVR ofrecen la posibilidad de escribir en su memoria de programa FLASH incluso en tiempo de ejecucin. Esta funcin puede ser aprovechada para almacenar datos procesados por el usuario o para permitir la auto-programacin del AVR. Para facilitar y robustecer el proceso de auto-programacin los AVR dividen su memoria FLASH en dos segmentos lgicos, de Aplicacin y de Boot Loader. La Seccin de Aplicacin est destinada a almacenar el programa que el AVR ejecuta habitualmente, como leer sensores, controlar motores, etc. La Seccin de Boot Loader est diseada para almacenar el cdigo del Boot loader, que es un pequeo programa para cargar el programa del AVR en la Seccin de Aplicacin, as como Windows carga en la RAM de la PC el programa que vamos a utilizar. Un Boot Loader no es precisamente un mini S.O. porque ya hay S.O. para microcontroladores conocidos como RTOS (Real Time Operating System). Adems, a diferencia de un S.O. para PC, un Boot Loader debe ser el programa ms pequeo posible y se debe ubicar al final de la memoria FLASH. No todos los megaAVR tienen Seccin de Boot Loader, como el ATmega48.

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.

Configuracin de los Fuses de Boot Loader en Proteus.

La Memoria de Datos SRAM


Actualmente suena redundante especificar memoriaSRAM (Static RAM) porque casi todas las RAM de los microcontroladores son estticas. Decimos simplemente RAM, a la memoria cuya funcin tradicional es alojar temporalmente los datos que se procesan en el programa. La cantidad de RAM disponible internamente depende del modelo de AVR y, a diferencia de la memoria FLASH, no tiene una directa correspondencia con el nombre del dispositivo. Aun as, podemos observar en la siguiente tabla que en muchos modelos existe una relacin que se repite (los ATmega128nn rompen la relacin, y pueden no ser los nicos). Los megaAVR con 4K de FLASH tienen 512 bytes de RAM, los megaAVR con 8 K y 16 K de FLASH tienen 1 K de RAM, y as, tal como se ve en la tabla.
Tabla AVR

AVR ATmegaNNN

Memoria FLASH Memoria RAM 4K 512

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.

Espacio de la Memoria RAM del megaAVR.

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.

La Pila y el Puntero de Pila


La Pila o STACK es una memoria que almacena temporalmente el valor del PC (Program Counter) cuando el programa llama a una subrutina o cuando salta a un Vector de Interrupcin. Tambin sirve para guardar datos temporalmente cuando los 32 Registros de Trabajo no sean suficientes. Al igual que en una PC, la Pila forma parte de RAM Interna. No es un pedazo de RAM con caractersticas especiales, es una simple rea cuya direccin de inicio la puede establecer el usuario y cuyo tamao es indefinido porque crece y decrece en tiempo de ejecucin. Las que s son especiales son las instrucciones que trabajan con la Pila, como PUSH y POP. Estas instrucciones no necesitan conocer la locacin en la Pila a/de donde guardarn/recuperarn los datos. Aprovechan, en cambio, su acceso de tipo LIFO (Last In First Out), que significa el ltimo dato en entrar ser el primero en Salir. Es por eso que siempre se recurre a la analoga con una pila de platos de donde no podemos tomar un plato que se encuentra en el fondo o en la mitad. Para llegar a l primero tendramos que quitar los platos que estn encima. Pero hasta ah llega la analoga porque a diferencia de las pilas de platos, las pilas en RAM crecen de arriba abajo, es decir, cada dato que se va depositando en la Pila ocupa una direccin inferior a la anterior. Esta direccin la va marcando el Puntero de Pila, el cual se decrementa cada vez que se coloca un dato en la Pila y se incrementa cada vez que se toma un dato de ella. La Pila trabaja de cabeza para evitar que sus datos colisionen (se solapen) con las variables accedidas aleatoriamente, las cuales se van mapeando en la RAM normalmente de abajo arriba.
Registro SPH

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.

Los Registros de Trabajo y los Punteros X, Y y Z

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.

Los Registros de E/S


Anteriormente se dijo que para programar el AVR primero haba que conocer sus recursos. Pues bien, todos ellos se pueden controlar mediante losRegistros de E/S. por ejemplo, si queremos manejar el puerto B, debemos conocer los registros PORTB, DDRB y PINB. Si queremos programar el USART0, debemos conocer los registros UDR0, UCSR0A,UCSR0B, UCSR0C, UBRR0L y UBRR0H. Si queremos En tiempo de ejecucin los registros de E/S (Entrada Salida) lo controlan todo, no solo las operaciones de los mdulos perifricos, como se podra inferir a partir de la denominacin E/S, sino que tambin controlan la performance del mismo CPU. En este caso los registros a conocer seran MCUCR, MCUSRo SMCR. Entenders que no tiene caso seguir mencionando las funciones de otros Registros de E/S. es por eso que cada mdulo se trata por separado estudiando con detenimiento cada registro y cada uno de los bits que lo componen. Espero que los mapas de memoria de los Registros de E/S que presento no te hagan pensar que estn divididos en una suerte de bancos, como en los PICmicro. No, seor, nada de eso. Todos los espacios de memoria en los AVR son lineales. Yo los quise subdividir para una mejor presentacin.

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.

Registros Generales del Microcontrolador


Estos son registros de E/S que no estn relacionados con una parte exclusiva del microcontrolador. Por tanto los volveremos a ver al mencionar en otros captulos, aunque sea para referirnos a uno solo de sus bits.

El Registro de Estado SREG


Todo microprocesador tiene un registro para reflejar el estado de las operaciones lgicas y aritmticas del mdulo ALU. SREG tambin incluye dos bits con funciones dismiles. El registro SREG es bastante utilizado en los programas en ensamblador. Cuando se trabaja con compiladores de alto nivel su presencia solo sera justificable por el uso del bit I.
Registro SREG

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

Los Fuses de los AVR


Los fuses del microcontrolador establecen una caracterstica importante en su operacin, tanto que solo se puede modificar en el momento de programarlo. Por ejemplo, no se podra escoger el tipo de oscilador a usar despus de haber iniciado el programa. Sera como cambiarle los neumticos a un automvil en marcha. Cada

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)

Byte de Fuses Alto Bit

Descripcin

Valor por Defecto

Tabla Byte de Fuses Bajo

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)

Byte de Fuses Extendido Bit BODLEVEL2 BODLEVEL1 BODLEVEL0 7 6 5 4 3

Descripcin

Valor por Defecto 1 1 1 1 1 1 (sin programar) 1 (sin programar) 1 (sin programar)

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.

Configuracin de los fuses de reloj desde Atmel Studio 6.

CKSEL3-0. Seleccin del Reloj


Este fuse se representa por los bits CKSEL3, CKSEL2, CKSEL1 y CKSEL0. Sirve para adaptar el circuito interno del oscilador segn el componente externo o interno que se usar como fuente del reloj del sistema. Reloj Externo. En este caso la fuente de reloj ser una seal de onda cuadrada externa aplicada al pin XTAL1 del AVR. Su frecuencia podr estar en todo el rango posible, desde 0 hasta 20 MHz. Se establece con los bits CKSEL3-0 = 0000, respectivamente. Oscilador RC Interno Calibrado. Con esta opcin no se necesitarn aadir componentes externos. El reloj ser el oscilador RC Interno, el cual tiene una frecuencia cercana a 8MHz, y adicionalmente ofrece al diseador la posibilidad de ajustar por software dicha calibracin hasta en 1%. Es til para

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

1011 o 1010 1101 o 1100 1111 o 1110

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.

SUT1-0. Retardos de Reset y de Arranque


Se representa por los bits SUT1 y SUT0. En realidad se trata de dos temporizadores. El Retardo de Reset funciona con el circuito RC del Watchdog y se encarga de mantener el AVR en estado de reset por 4.1 ms 65 ms despus de un RESET, por ejemplo, despus de conectar la alimentacin Vcc del AVR. Esto servira para que

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

XTAL, slowly rising power

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

XTAL, slowly rising power

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.

CKDIV8. Prescaler del Reloj del Sistema


Los megaAVR recientes, como los tratados en este captulo, tienen un prescaler en el sistema de reloj, que dividir la frecuencia del reloj cualquiera que sea su fuente (XTAL, RC Interno etc.). El Prescaler puede dividir la frecuencia del reloj entre 256, entre 128, entre 64, hasta 1, dependiendo del valor que se cargue en el Registro de E/S CLKPR, el cual se puede modificar en cualquier momento en tiempo de ejecucin. En este momento basta con saber que el bit CKDIV8 configura el registro CLKPR para que el reloj se divida inicialmente entre 8 o entre 1.
Tabla CKDIV8

CKDIV8 Factor del Prescaler del Reloj 0 1 8 1

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 del BOD


Es un reset por baja tensin. Esta caracterstica le permite al AVR auto resetearse cada vez que detecte una cada de tensin en la alimentacin Vcc, por debajo de un nivel establecido por los bitsBODLEVEL2, BODLEVEL1 y BODLEVEL0. En la figura subsiguiente la seal de RESET INTERNO se activa cuando el nivel de Vcc cae por debajo de VBOT-. Luego para que el procesador del AVR vuelva a ejecutar el programa no solo bastar que Vcc supere el valor de VBOT+, sino que transcurra el RETARDO DE RESET. La diferencia entre VBOT+ yVBOT- constituye el mecanismo de histresis. El AVR tiene un filtro pasa-bajas interno para evadir el ruido y evitar un reset ante los micro valles de tensin en Vcc. La cada de tensin tiene que ser mayor a 2us (valor tpico).
Tabla BODLEVEL2-0

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.

Configuracin de los Fuses de BOD desde Atmel studio 6.

WDTON. Habilitacin del Watchdog


El Watchdog o WDT es un temporizador que puede monitorizar el funcionamiento fluido del microcontrolador. El WDT lo estudiaremos al final porque no es imprescindible. Por el momento diremos que se trata de un temporizador que una vez habilitado debemos resetear peridicamente en el programa. Si no lo hacemos, causar un reset en el AVR y el programa se volver a ejecutar desde cero. Cuando el WDT no est habilitado por su fuse WDTON (hardware) todava es posible activarlo por software. Pero una vez activado por su fuse no habr rutina software que lo apague. En la mayora de las prcticas no querremos estar preocupndonos del estado del WDT, as que la mejor decisin ser tenerlo inhabilitarlo, que felizmente es el valor por defecto del bit WDTON, as que ni siquiera tendramos que tocarlo.

CKOUT. Salida de Reloj


Cuando este fuse est programado la seal de reloj del sistema saldr por el pin CLKO de los megaAVR (ver ms abajo). Esta seal incluye el efecto del Prescaler de reloj. Puede servir para sincronizar el microcontrolador con otros dispositivos de la aplicacin, pero se usa muy raramente, as que lo habitual es dejar CKOUT con su valor por defecto 1, o sea sin programar. Si se programa accidentalmente y el

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.

Pines de salida de reloj en los AVR de las series ATmegaXX8 y ATmegaXX4.

EESAVE. Preservar Contenido de la EEPROM


Cada vez que grabamos nuestro AVR con un nuevo programa se ejecutar previamente un borrado completo de la memoria FLASH y de la EEPROM interna. Si queremos que la EEPROM no se borre en este proceso debemos programar este fuse. Su configuracin predeterminada es sin programar, como se muestra abajo.

SPIEN. Habilitacin de Programacin SPI


Este fuse permite habilitar o deshabilitar la programacin SPI. Para entender esto primero debemos saber que los microcontroladores AVR tienen los siguientes modos de programacin (sin contar la programacin por la interface de depuracin): La programacin mediante la interface SPI (Serial Port Interface) en bajo voltaje, esto es, con 0V aplicados al pin RESET. Es la interface ms comn y est presente en casi todos los AVR, incluyendo por supuesto en nuestros estudiados ATmegaXX4 y ATmegaXX8. La programacin mediante la interface Paralela. Aqu el voltaje aplicado al pin RESET debe estar comprendido 11.5 V y 12.5 V. Este modo permite programar algunos fuses, como SPIEN yRSTDISBL, que no son accesibles desde la interface SPI en bajo voltaje. Sin embargo, la interface paralela tiene el inconveniente de requerir cerca de 15 pines del AVR. La programacin mediante la interface SPI en alto voltaje, donde se aplica 12V al pin RESET. Solo se encuentra en los pequeos AVR que no tienen los suficientes pines para soportar la programacin paralela, en algunos tinyAVR para ser ms precisos. Por lo tanto, la programacin en alto voltaje, serial o paralela, siempre estar disponible pero la programacin serial SPI se puede deshabilitar mediante el fuse SPIEN. La modificacin del bit SPIENsolo es posible desde la programacin en alto voltaje. Los AVR vienen con su programacin serial activada de fbrica, as que podemos deshabilitarla en cualquier momento y desde cualquier interface. Sin embargo, dados los peligros que esto supone algunos softwares de programacin nos previenen de su acceso. Este es el caso del programador AVRFLASH de Mikroe, como se aprecia en la siguiente imagen.

BOOTSZ1-0. Tamao de la Seccin de Boot Loader


Este fuse configura el tamao que tendr la Seccin de Boot Loader, estudiada previamente. Por defecto establece el mximo tamao disponible. Pero si no vamos a usar esta caracterstica del megaAVR, no interesan los valores que tengan los bits BOOSZ1 y BOOTSZ0.

BOOTRST. Ubicacin del Vector de Reset


El Vector de Reset es la direccin de la memoria FLASH por donde se empezar a ejecutar el programa. Normalmente es 0x0000 porque el cdigo del programa empieza a mapearse desde la primera direccin. La nica situacin en que esto debe cambiar es cuando se usa un programa de Boot Loader. Cuando el fuse BOOTRST est activado el vector de reset ser la primera direccin de la Seccin de Boot Loader. Como es de esperar, la configuracin por defecto de este fuse es sin programar y no debera modificarse a menos que se sepa bien lo que se hace.

Configuracin de los fuses BOOTSZ1-0 y BOOTRST desde Atmel Studio 6.

RSTDISBL. Deshabilitar Reset Externo


Suele estar disponible en los AVR que cuentan con pocos puertos. Por defecto este fuse no est programado y el pin de RESET cumple su funcin habitual de reiniciar la ejecucin del programa cuando se pone a nivel bajo, adems de permitir al AVR entrar en modo de programacin de bajo voltaje. Pero si programamos el bit RSTDISBL, el pin RESET trabajar como PC6, o sea, como el sptimo pin de E/S del puerto C. Yo no suelo programar este bit porque me gusta resetear el AVR a cada rato para asegurarme de que programa siempre inicia bien. Pero ms all de gustos, debemos insistir en que si el pin RESET pierde su funcin habitual, ya no podremos reprogramar nuestro AVR con bajo voltaje. De llegar a esa fatalidad, deberemos utilizar un programador que trabaje a alto voltaje (12V) para reponer el estado del fuse RSTDISBL.

Pin de RESET multiplexado en los ATmegaXX8.

SELFPRGEN. Habilitar Auto programacin


Este fuse solo est disponible en los megaAVR que no dividen su memoria en secciones de Aplicacin y de Boot Loader, es decir, en los AVR que no soportan el Boot Loader convencional, por ejemplo, el ATmega48P y la mayora de los tinyAVR, es decir, en los AVR con poca memoria FLASH. Con el fuse programado se podr utilizar la instruccin de ensamblador SPM en cualquier parte del programa. En caso contrario SPM no tendr efecto. Por defecto el fuse SELFPRGEN est sin programar. Ya sea que se trabaje en C o en ensamblador, el programador normalmente sabe si va a acceder a la memoria FLASH para escritura. En ese caso se deber activar este fuse. Y si no tienes idea de lo que estoy hablando, casi te puedo asegurar que no interesa el valor que le des a este fuse y hasta te recomendara que lo actives.

El fuse SELPPRGEN solo est disponible en los AVR de poca memoria FLASH.

Lock Bits o Bits de Candado


No por estudiarlos al final del captulo significa que los Bits de Lock sean irrelevantes. Todo lo contrario. Su configuracin es ms importante que la programacin de la memoria FLASH y de los fuses porque implica precisamente el tipo de proteccin que se dar a esos espacios. Los Bits de Lock establecen un nivel de proteccin para el contenido de la memoria FLASH, de los fuses y de los propios Bits de Lock. Por eso el nombre Lock (candado, en ingls). Los Bits de lock estn contenidos en el llamado Byte de Lock. Este es un registro independiente cuya programacin se lleva a cabo al margen de la programacin de los fuses y de las memorias FLASH y EEPROM del AVR. No hay condiciones especiales para ello. Si no estn bloqueados por ellos mismos, se pueden modificar desde cualquier interface de programacin, sin necesidad de un programador especial. Para mayor alivio, diremos que solo puede ser necesario marcarlos en un producto terminado. En el resto de aplicaciones, sobre todo de experimentacin, ni siquiera nos acordaremos de ellos. Todos los megaAVR disponen de los Bits de Lock generales LB1 y LB2 y, obviamente, los Bits de Lock de Boot Loader solo estn presentes en los megaAVR con soporte de Boot Loader.
Tabla Byte de Bits de Lock

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

Modo LB2 de LB LB1 1 11

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

Modo de BLB02 BLB0 BLB01 1 2 11 10

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

Tabla Modo de BLB0

Modo de BLB02 BLB0 BLB01 Seccin de Aplicacin.

Tipo de proteccin

Tabla Modo de BLB1

Modo de BLB12 BLB1 BLB11 1 2 11 10

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.

Configuracin y programacin de los Bits de Lock desde AVRFLASH.

Configuracin y programacin de los Bits de Lock desde Atmel Studio 6.

Lock Bits o Bits de Candado


No por estudiarlos al final del captulo significa que los Bits de Lock sean irrelevantes. Todo lo contrario. Su configuracin es ms importante que la programacin de la memoria FLASH y de los fuses porque implica precisamente el tipo de proteccin que se dar a esos espacios. Los Bits de Lock establecen un nivel de proteccin para el contenido de la memoria FLASH, de los fuses y de los propios Bits de Lock. Por eso el nombre Lock (candado, en ingls). Los Bits de lock estn contenidos en el llamado Byte de Lock. Este es un registro independiente cuya programacin se lleva a cabo al margen de la programacin de los fuses y de las memorias FLASH y EEPROM del AVR. No hay condiciones especiales para ello. Si no estn bloqueados por ellos mismos, se pueden modificar desde cualquier interface de programacin, sin necesidad de un programador especial. Para mayor alivio, diremos que solo puede ser necesario marcarlos en un producto terminado. En el resto de aplicaciones, sobre todo de experimentacin, ni siquiera nos acordaremos de ellos. Todos los megaAVR disponen de los Bits de Lock generales LB1 y LB2 y, obviamente, los Bits de Lock de Boot Loader solo estn presentes en los megaAVR con soporte de Boot Loader.
Tabla Byte de Bits de Lock

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

Modo LB2 de LB LB1 1 11

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

Modo de BLB02 BLB0 BLB01 1 2 11 10

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

Tabla Modo de BLB0

Modo de BLB02 BLB0 BLB01 Seccin de Aplicacin.

Tipo de proteccin

Tabla Modo de BLB1

Modo de BLB12 BLB1 BLB11 1 2 11 10

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.

Configuracin y programacin de los Bits de Lock desde AVRFLASH.

Configuracin y programacin de los Bits de Lock desde Atmel Studio 6.

También podría gustarte