Captulo 1: Introduccin
1.1 Concepto de microcontrolador
Un microcontrolador (MCU o C, abreviatura de unidad de microcontrolador) es un pequeo
ordenador ( SoC,
Figura 1
Los microcontroladores siguen una secuencia de instrucciones guardada en la memoria. A este conjunto de
instrucciones se le llama programa. Tpicamente el tamao de los programas debe ser menor que el tamao de
la memoria disponible en el chip, ya que sera costoso proporcionar memoria externa expandible. Dependiendo
de la marca y tipo de microcontrolador, el fabricante define los comandos, estableciendo un lenguaje
ensamblador de bajo nivel y un compilador para lenguajes de alto nivel.
Existe una gran variedad de modelos de microcontroladores: Freescale, Intel, Atmel, Renesas, Toshiba, Analog
Devices, Texas Instruments, entre muchos otros.
NOMBRE DE LA SERIE
TinyAVR
MegaAVR
XmegaAVR
PINES
6-32
28-100
44-100
MEMORIA FLASH
0.5 8K
4 256 K
16 384 KB
CARCTERISTICAS ESPECIALES
Dimensiones pequeas
Perifricos extendidos
DMA, Sistema de Eventos incluido
de almacenamiento y de seal fsicamente separadas para las instrucciones y para los datos). El AVR fue
diseado desde un comienzo para la ejecucin eficiente de cdigo C compilado. Como este lenguaje utiliza
profusamente punteros para el manejo de variables en memoria, los tres ltimos pares de registros internos del
procesador son usados como punteros de 16 bit al espacio de memoria externa, bajo los nombres X, Y y Z. Esto
es un compromiso que se hace en arquitecturas de ocho bit desde los tiempos de Intel 8008, ya que su tamao
de palabra nativo de 8 bit (256 localidades accedidas) es pobre para direccionar.
Especficamente, el microcontrolador usado en curso es el ATmega328p, en encapsulado tipo DIP (Dual In-Line
Package) de 28 pines. Es altamente recomendable que al trabajar con un microcontrolador, se tenga a la mano
el datasheet correspondiente, y que cada paso que se d, se verifique la informacin en el documento (link del
datasheet): http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA168A-168PA-328-328P_datasheet_Complete.pdf
Figura 2
Bsicamente, el microcontrolador puede iniciar a funcionar usando las conexiones que se muestran:
En las terminales 7 y 8, se conecta la alimentacin digital Vcc y GND del sistema. De acuerdo a las
especificaciones elctricas del dispositivo (Seccin 29, del datasheet), el voltaje den operacin se encuentra
entre 1.8V y 5.5V.
Internamente, el C tiene un oscilador de 1Mhz, el cual es utilizado para establecer la base de tiempo del circuito.
En caso de requerir cambiar la base de tiempo, entre las terminales 9 y 10 se coloca un oscilador o XTal. Al
habilitar el oscilador externo, estas terminales son activadas como entradas.
Tarea: Investigar diferentes tipos de cristales.
El estado de default del PC6, es como entrada de RESET, con activacin en bajo. El objetivo de este pin es
reiniciar la secuencia de instrucciones. Esta funcionalidad es indispensable para la programacin del micro.
Aunque la funcionalidad de conversin Analgica-Digital no sea utilizada, las terminales de alimentacin AVcc y
GND, pines 20 y 22 respectivamente, son conectados a la alimentacin digital.
b) Mapa de Memoria. Existen diferentes tipos de memoria dentro del C, cada memoria tiene su uso en
particular. La memoria Flash se utiliza para grabar el programa de usuario, la memoria RAM guarda los
datos o variables que se utilizan durante la ejecucin del programa, la memoria EEPROM es
comnmente usada para guardar datos No Voltiles, pero regrabables. La asignacin de direcciones
correspondiente a cada seccin se le conoce como mapa de memoria.
c) GPIO. Los General Port Input/Output son terminales que sirven como puertos de entrada o salida
digitales. Pueden ser usados como byte completo o de manera individual.
En las siguientes secciones se definirn con ms detalle estos conceptos, pero su uso no se puede
evadir al explicar cada definicin.
que muchos de los desarrolladores argumentan cdigo optimizado y completo control de registros.
En cualquiera de ambos casos, el direccionamiento directo y reducido del AVR, permite una
rapidez de procesamiento interesante.
Memorias
RAM esttica (SRAM) se utiliza para el estado transitorio del programa (como son
las variables), as como el stack del programa y cualquier direccionamiento
realizado por el programa. Cuando se inicia el programa, todas las variables
globales se inicializan en la SRAM por una rutina especial generada
automticamente por el compilador. La arquitectura AVR no inherentemente o
automticamente restablece la memoria, por lo que, sin explcitos resets hechos por
el programa (generalmente automtico) los contenidos de la memoria permanece
despus de los reinicios. (Este hecho en realidad puede ser utilizado por el
programa mediante la asignacin de las variables en la seccin "NoInit").
EEPROM
EEPROM (elctricamente borrable y programable, memoria de slo lectura) se
utiliza para el almacenamiento permanente no voltil. Es un buen sitio para escribir
los valores de configuracin (como las tasas de baudios, identificadores nicos,
etc.), para realizar un seguimiento de los contadores durante un largo plazo, y para
mantener datos estticos que no se necesita con frecuencia. Acceder a la memoria
EEPROM requiere instrucciones especiales y es bastante lento en comparacin con
SRAM, y puede ser arriesgado si el dispositivo se queda sin alimentacin (los datos
pueden estar daados). Debido al nmero limitado de operaciones de escritura que
puede manejar EEPROM (aproximadamente 100.000) antes de la falla, se debe
tener cuidado de no escribir innecesariamente.
Fusibles
Adems de la Flash, SRAM y EEPROM, AVR tienen unos pocos bytes
(normalmente 3) de memoria de fusibles. Esta memoria se utiliza para almacenar
los bytes "fusibles", que son los valores de configuracin de tiempo de arranque se
utilizan para inicializar el propio microcontrolador. En sistemas que tienen 3 bytes,
como el ATmega644, se les llama "baja", "alto" y "extendida" (o "l", "h", y "e"), y cada
uno de ellos almacenar bits individuales o valores de los bits de los parmetros de
configuracin. Por ejemplo, se utilizan fusibles para establecer la fuente de entrada
de reloj (CKSEL [0..3]), si el reloj se divide por 8 (CKDIV8), si el temporizador de
vigilancia, SPI, JTAG y debe estar habilitado (WDTON, SPIEN , JTAGEN
respectivamente), y muchas otras cosas importantes.
La arquitectura Harvard
Las PCs modernas se basan en la arquitectura von Neumann (un solo bus para
direccionamiento y datos), que utiliza una CPU y una sola memoria (generalmente
DRAM) unida por un solo bus, que se utiliza para la memoria de programa y
Configuracin de Perifricos
Si bien cada AVR en general, ofrece un gran nmero de perifricos, puede que tenga
que elegir los que son capaces de utilizar basado en qu pines son compartidos en
el dispositivo en cuestin. Por ejemplo, si se necesita un gran nmero de pines
GPIO, es posible que no pueda utilizar un oscilador externo, puede que tenga que
elegir entre usar temporizadores para la hora normal interna frente PWM, etc.
Las hojas de datos son esenciales para la comprensin, que inmoviliza la cuota que
funciona. En general, los dispositivos cantidad de pines superiores comparten
menos pines entre funciones, y de hecho Atmel ofrece varios dispositivos en
versiones de bajos y ms altos pines de recuento (por ejemplo ATmega1280 [100
pines] frente a la atmega1281 [64 pines]); el mismo dispositivo con alfileres ms o
menos compartida.
Las hojas de datos suelen tener una seccin titulada "Funciones puerto alternativo",
que hace un muy buen trabajo de describir la totalidad del intercambio de pines en
cada dispositivo.
Puertos I/O
AVR es de 8 bits microcontrolador. Todos los puertos son de 8 bits de ancho. Las
caractersticas de estos puertos son:
Cada puerto tiene 3 registros asociados con ella cada uno con 8 bits. Cada
bit en los citados registros configurar pines del puerto en particular. Bit0 de
estos registros se asocia con Pin0 del puerto, Bit1 de estos registros se
asocia con Pin1 del puerto, e igual para otros bits.
Estos tres registros son los siguientes (x puede ser sustituida por B, C, D segn el
puerto utilizado, y n puede ser sustituida por el nmero de bit o pin)
puerto. Es decir, si los pines del puerto se utilizarn para la entrada o salida.
ejemplo:
Para que todos los pines del puerto B como pines de entrada:
DDRB = 0b0000000;
Para que todos los pines del puerto B como pines de salida:
DDRB = 0b11111111;
Para hacer que la parte baja del puerto B como salida y la parte alta
como entrada:
DDRB = 0b00001111;
b) Pinx (Port EN) se utiliza para leer los datos de los pines del puerto. Para esta
accin primero hay que cambiar la direccin de los datos del puerto de
entrada. Esto se hace mediante el establecimiento de los bits en DDRx a
cero. Si el puerto se encuentra como salida y se realiza la lectura, entonces
la lectura de registro Pinx contendr los datos que se han enviado de salida
en los pines del puerto.
Ejemplo:
Para leer los datos desde el puerto B.
DDRB = 0x00; // Establecer un puerto como entrada
x = PINB; // Leer el contenido de un puerto
c) PORTx se utiliza para pasar los datos de salida: cuando el puerto est
fuentes de reloj
Una de las decisiones ms importantes cuando se configura un microcontrolador es
su fuente de reloj clkCPU. Por lo general, los microcontroladores AVR ofrecen varias
fuentes de reloj:
8MHz interna del oscilador (pre-reducido por 1/8 a 1 MHz por defecto)
128kHz interna del oscilador (con fines de ahorro de energa)
oscilador de cristal externo de hasta 20 MHz
seal de reloj externo (tpicamente de otro microcontrolador)
AVR generacin de reloj. Los osciladores internos se pueden utilizar, pero normalmente un oscilador de cristal
externo est conectado a travs de XTAL1 y XTAL2, con un par de condensadores de 18pF a tierra.
preescaladores
Todas las entradas de reloj se introducen en un pre-escalador que puede escalar el reloj en cualquier lugar de 1
(sin escala) a 256 (256 ciclos del oscilador para un ciclo del reloj). Normalmente, el pre-escalador se establece
en tiempo de ejecucin, segn sea necesario, para reducir la velocidad de reloj, con el consiguiente ahorro de
energa mediante la ejecucin de menos. Hay una manera especial se establece el pre-escalador: un fusible
llamada CKDIV8 puede, si se establece, de pre-escala automticamente el reloj por 1/8 en el arranque. Esto se
utiliza para la configuracin predeterminada de pre-escala el reloj interno de 8 MHz a 1 MHz.
Osciladores y la eleccin de las frecuencias
Si usted elige utilizar un oscilador externo, hay que elegir la frecuencia. No es inmediatamente obvio cul sera
la mejor frecuencia. En realidad, la mejor frecuencia suele ser impulsada por la aplicacin: los requisitos de
rendimiento, la interoperabilidad con otros sistemas y requisitos de las comunicaciones. Hay algunas frecuencias
que estn en uso generalizado:
1 MHz - La frecuencia de a bordo preescalado, que no es muy rpido, pero ahorra una gran cantidad de
energa.
El lenguaje ensamblador trabaja con nemnicos, que son grupos de caracteres alfanumricos que simbolizan las
rdenes o tareas a realizar. La traduccin de los nemnicos a cdigo mquina entendible por el microcontrolador
la lleva a cabo un programa ensamblador. El programa escrito en lenguaje ensambladorujji se denomina cdigo
fuente (*.asm). El programa ensamblador proporciona a partir de este fichero el correspondiente cdigo
mquina, que suele tener la extensin *.hex.
2. Los programas en ensamblador consumen menos recursos. Ya que el programador puede optimizar
cuidadosamente el cdigo.
3.
Al programar en ensamblador se tiene control preciso en las tareas, registros, tiempos de ejecucin,
uso de memoria.
4. A pesar de sus ventajas, es un lenguaje que presenta cierta dificultad para ser ledo directamente por
el humano. Esta dificultad tambin se presenta al realizar funciones complejas que se pueden disear
ms fcilmente en un lenguaje de alto nivel.
El microcontrolador opera basado en el SREG y otros registros internos. Los ms importantes son los SREG que
guardan informacin de la ltima instruccin y el estatus de activacin de interrupcin.
Bit
0
1
2
3
4
5
6
7
Nombre
C Carry bit
Z Zero flag
N Negative flag
V Overflow flag
S Signed flag
H Half carry bit
T Bit store bit
I Global interrupt enable flag
ADC R16, R2
; R16= R16 + R2 + C
ADIW YL, 3
; YL : YH = YL : YH +3
b) Resta
SUB R16, R17
SBC R16, R2
; R16= R16 - R2 - C
SBIW ZL, 5
; ZL : ZH = ZL : ZH - 5
SUBI R16, 30
; R16 = R16 - 30
SBCI R16, 4
; R16 = R16 - 4 - C
c) Multiplicacin
Ejemplo de multiplicacin 6*10
LDI R16, 0
LDI R17, 0
LDI R2, 6
for_loop:
ADD R16, R2
INC R17
CPI R17, 10
BRLO for_loop
Ejemplo:
LDI R16, 0
for_loop:
INC R16
CPI R16, 10
BRLO for_loop
LABEL MAIN:
LDI R16, 0xFF
OUT DDRB, R16 ;PORTB IS OUTPUT
BACK:
COM R16 ;COMPLEMENT THE VALUE IN R16
OUT PORTB, R16 ;PUSH THE VALUE IN R16 TO PORTB
LDI R17, 100
LOOP3: LDI R18, 255
LOOP2: LDI R19, 255
LOOP1: DEC R19
BRNE LOOP1 ;KEEP DECREASING R19
DEC R18 BRNE
LOOP2 ;FOR EVERY DECREASE OF R18 REDO THE PREVIOUS LOOP
DEC R17
BRNE LOOP3 ;FOR EVERY DECREASE OF R17 REPEAT PREVIOUS LOOP
RJMP BACK ;KEEP DOING THIS INFINITELY