< pines$ s altamente recomendable que al traba*ar con un microcontrolador, se ten#a a la mano el datas&eet correspondiente, que cada paso que se d", se veri!ique la in!ormacin en el documento ( linH del datas&eet)3 &ttp3IIJJJ$atmel$comIima#esIAtmel8<>?/8<8bit8A5R8Microcontroller8A0me#a
.i#ura >
9sicamente, el microcontrolador puede iniciar a !uncionar usando las cone1iones que se muestran3
n las terminales ? <, se conecta la alimentacin di#ital 5cc LD2 del sistema$ 2e acuerdo a las especi!icaciones el"ctricas del dispositivo (-eccin >6, del datas&eet), el volta*e den operacin se encuentra entre /$<5 =$=5$ 4nternamente, el µC tiene un oscilador de /M&+, el cual es utili+ado para establecer la base de tiempo del circuito$ n caso de requerir cambiar la base de tiempo, entre las terminales 6 /; se coloca un oscilador o B0al$ Al &abilitar el oscilador e1terno, e stas terminales son activadas como entradas$ 0area3 4nvesti#ar di!erentes tipos de cristales$ l estado de de!ault del PC7, es como entrada de R-0, con activacin en ba*o$ l ob*etivo de este pin es reiniciar la secuencia de instrucciones$ sta !uncionalidad es indispensable para la pro#ramacin del micro$ Aunque la !uncionalidad de conversin Anal#ica82i#ital no sea utili+ada, las terminales de alimentacin A5cc LD2, pines >; >> respectivamente, son conectados a la alimentacin di#ital$
1.3 Conceptos Básicos a Pinout$ %os pines son las terminales del microcontrolador con los cuales se establece la interaccin e1ternaIinterna$ l pinout o con!i#uracin de pines describe la !uncionalidad de cada uno, sobreentendiendo que tal !uncionalidad no es única, puede ser con!i#urada usndolos los re#istros o !usibles$
# Mapa de Memoria$ 1isten di!erentes tipos de memoria dentro del
cada memoria tiene su uso en particular$ %a memoria .las& se utili+a para #rabar el pro#rama de usuario, la memoria RAM #uarda los datos o variables que se utili+an durante la e*ecucin del pro#rama, la memoria PROM es comúnmente usada para #uardar datos Do 5oltiles, pero re#rabables$ %a asi#nacin de direcciones correspondiente a cada seccin se le conoce como mapa de memoria$
c
µC,
LP4O$ %os Leneral Port 4nputIOutput son terminales que sirven como puertos de entrada o salida di#itales$ Pueden ser usados como bte completo o de manera individual$
d Re#istros de propsito #eneral$ e Re#istros de estatus$ +
9us de datos, bus de direcciones
n las si#uientes secciones se de!inirn con ms detalle estos conceptos, pero su uso no se puede evadir al e1plicar cada de!inicin$
1.4 ro!ramación ensam"lador # len!ua$e C La ar&uitectura de los microcontroladores AVR +ue desarrollada teniendo en mente el len"ua%e C con el +in de compilar un códi"o e+iciente en C para AVR. !ara me%orar esta característica a;n más el desarrollo del compilador de C se inició antes de la ar&uitectura $ el con%unto de instrucciones se )u#ieran terminado. Con+orme el uso de len"ua%es de alto niel se )a incrementado rápidamente en desarrollos de sistemas em#e#idos el crear una ar&uitectura #asada en C parece mu$ adecuada. /in em#ar"o en los AVR se impone i"ualmente el uso de len"ua%e ensam#lador &ue es el len"ua%e de #a%o niel $a
&ue muc)os de los desarrolladores ar"umentan códi"o optimiado $ completo control de re"istros. (n cual&uiera de am#os casos el direccionamiento directo $ reducido del AVR permite una rapide de procesamiento interesante.
Capítulo 2: Ar%uitectura "ásica de un microcontrolador 2.1 &lementos "ásicos en un microcontrolador ' (rs a CPU # Memoria c
Puertos de Propsito #eneral (LP4O)
&ttps3IIblo#$*cole$usI>;/;I;?I/?Iarc&itecture8o!8t&e8avrI
Memorias
La arquitectura AVR hace uso de cuatro diferentes tipos de memorias: Flash La memoria flash, o simplemente flash, es borrable, de almacenamiento no volátil (que no requiere ningún refresca para mantener el almacenamiento de datos) que se utiliza para almacenamiento de programas. Cuando se haya compilado un programa y al cargarlo en el dispositivo, aquí es donde se almacena. Cuando el programa se ejecuta, se ejecuta directamente desde la memoria flash (no se copia en la memoria RAM como la mayoría de los PC harían). SRAM
RAM estática (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 automáticamente por el compilador. La arquitectura AVR no inherentemente o automáticamente restablece la memoria, por lo que, sin explícitos resets hechos por el programa (generalmente automático) los contenidos de la memoria permanece después de los reinicios. (Este hecho en realidad puede ser utilizado por el programa mediante la asignación de las variables en la sección "NoInit").
EEPROM EEPROM (eléctricamente borrable y programable, memoria de sólo lectura) se utiliza para el almacenamiento permanente no volátil. Es un buen sitio para escribir los valores de configuración (como las tasas de baudios, identificadores únicos, etc.), para realizar un seguimiento de los contadores durante un largo plazo, y para mantener datos estáticos que no se necesita con frecuencia. Acceder a la memoria EEPROM requiere instrucciones especiales y es bastante lento en comparación con SRAM, y puede ser arriesgado si el dispositivo se queda sin alimentación (los datos pueden estar dañados). Debido al número 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 Además 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 configuración 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 parámetros de configuración. 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.
LaarquitecturaHarvard
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
memoria de datos. Por el contrario, la arquitectura Harvard, que se utiliza por el AVR, utiliza buses y memorias totalmente independientes para el programa y la memoria de datos. Esto permite un rendimiento superior, así como permitir que los buses de programa y de datos trabajen a diferentes anchuras. Aspectos de la arquitectura Harvard son visibles para el programador de manera que normalmente no se considera al escribir programas para la PC: • Los valores estáticos deben ser copiados de la memoria de programa a la memoria de datos con el fin de ser utilizado por el programa en la mayoría de contextos. Esto afecta a los inicializadores, así como cualquier cadena o estructuras que pueden utilizar en el programa. • Es posible utilizar funciones para minimizar el uso de memoria copiando los valores (especialmente cadenas) de la memoria de programa directamente a los canales IO como la producción en serie, y esto se expone al usuario en forma de declaraciones PROGMEM y * _pvariants de muchas funciones diferentes. • Los punteros no son todos iguales. Hay punteros de memoria de programa, y referencias a la memoria de datos. No se pueden mezclar los dos.
CentralProcessorUnit
Está formada por: a ALU (Arithmetic and Logic Unit).
Es el modulo diseñado para realizar las operaciones aritméticas (suma, multiplicación, etc), así como las lógicas (AND, OR, NOT, etc), Pero también administra los accesos de memoria, las interrupciones, el stack, y el preescalamiento del reloj. # Program Counter (PC). La secuencia de programa en el microcontrolador,
contenida en la Flash, se realiza mediante un barrido automatizado ejecutado por el registro llamado PC o Instruction Pointer. Su valor inicial comienza en la dirección configurada del RESET y avanza instrucción por instrucción sincronizadamente con cada ciclo de reloj (o varios ciclos de reloj), de manera lineal. c
Instruction Register e Instruction Decoder. Una vez direccionada por el PC, la instrucción a ejecutarse pasa al Instruction Register, donde es temporalmente almacenada para comenzar el procesamiento de la instrucción al ser decodificada por el Instruction Decoder (ID). Este circuito combinación se encuentra en algunos micros en forma de registros ROM y su propósito es el traducir (decodificar) el código del comando leído de la memoria flash, a una dirección donde se encuentra el comando de la ALU.
Configuración de Periféricos Si bien cada AVR en general, ofrece un gran número de periféricos, puede que tenga que elegir los que son capaces de utilizar basado en qué pines son compartidos en el dispositivo en cuestión. Por ejemplo, si se necesita un gran número 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 comprensión, 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 más altos pines de recuento (por ejemplo ATmega1280 [100 pines] frente a la atmega1281 [64 pines]); el mismo dispositivo con alfileres más o menos compartida.
Las hojas de datos suelen tener una sección titulada "Funciones puerto alternativo", que hace un muy buen trabajo de describir la totalidad del intercambio de pines en cada dispositivo.
PuertosI/O
AVR es de 8 bits microcontrolador. Todos los puertos son de 8 bits de ancho. Las características de estos puertos son: •
Todos los puertos tienen la funcionalidad de cambiar la dirección de un pin de puerto de manera independientemente de las direcciones de los otros pines.
•
El voltaje de salida de cada pin es lo suficientemente fuerte como para activar otros dispositivos externos.
•
Todos los pines I / O tienen diodos de protección tanto a VCC y tierra y un circuito de resistencia pull-up para evitar corto con señales de entrada en pines configurados de salida.
•
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 según el puerto utilizado, y n puede ser sustituida por el número de bit o pin)
a DDRx (Registro de Dirección de datos). configura dirección de los pines del
puerto. Es decir, si los pines del puerto se utilizarán para la entrada o salida. •
Escribiendo 0 a un bit DDRxn, el correspondiente pin del puerto se configura como entrada.
•
Escribiendo 1 a un bit DDRxn corresponde a que el pin del puerto quede como 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;
# Pinx (Port EN) se utiliza para leer los datos de los pines del puerto. Para esta
acción primero hay que cambiar la dirección 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á configurado como output. En otras palabras, al querer enviar datos de salida por los pines del puerto, hay que escribirlo en el registro PORTx. Sin embargo no se olvide de fijar la dirección de datos como salida.
sistemas de reloj, fuentes de reloj, y osciladores sistemas de reloj
AVR Reloj Distribución Diagrama de bloques. fuentes de reloj suministran la Unidad de Control de reloj AVR a través de un pre-escalador, y luego se distribuyen a los diferentes componentes del sistema de reloj. La arquitectura AVR tiene varias fuentes de reloj diferentes, que pueden ser detenidos de forma independiente: • clkCPU - El reloj principal núcleo AVR utilizado para la mayoría de procesamiento de instrucciones. • clkI / S - La mayoría de los periféricos funcionan desde este reloj, tales como temporizadores, SPI, y la USART. • clkFLASH - Lectura y escritura de la memoria flash se utiliza este reloj, que generalmente se sincroniza con clkCPU. • clkASY - Este reloj puede ser configurado para el reloj en tiempo real del temporizador / contador independiente de todas las demás fuentes de reloj para permitir la sincronización sin obstáculos, si es necesario, incluso en los modos de ahorro de energía. • clkADC - Las conversiones analógico-digital que operan desde este reloj para permitir que los otros relojes que ser detenido durante las conversiones para eliminar el ruido.
fuentes de reloj Una de las decisiones más 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 energía) • oscilador de cristal externo de hasta 20 MHz • señal de reloj externo (típicamente de otro microcontrolador)
A5R #eneracin de relo*$ %os osciladores internos se pueden utili+ar, pero normalmente un oscilador de cristal e1terno est conectado a trav"s de B 0A%/ B0A%>, con un par de condensadores de /
Capítulo 3: Len!ua$e &nsam"lador # con$unto de instrucciones ) (rs l len#ua*e ensamblador es el len#ua*e de pro"ramación utili+ado para escribir pro"ramas in+ormáticos de ba*o nivel e1presa las instrucciones de una !orma ms natural al &ombre a la ve+ que mu cercana al microcontrolador, a que cada una de esas instrucciones se corresponde con otra en cdi#o mquina$ %as caracter'sticas de un len#ua*e ensamblador son las si#uiente3
l len#ua*e ensamblador traba*a con nemnicos, que son #rupos de caracteres al!anum"ricos que simboli+an las rdenes o tareas a reali+ar$ %a traduccin de los nemnicos a cdi#o mquina entendible por el microcontrolador la lleva a cabo un pro#rama ensamblador$ l pro#rama escrito en len#ua*e ensambladoru*'*i se denomina cdi#o !uente (Q$asm)$ l pro#rama ensamblador proporciona a partir de este !ic&ero el correspondiente cdi#o mquina, que suele tener la e1tensin Q$&e1$
1. l len#ua*e ensamblador correspondiente a un mC o mP, es caracter'stico de ese modelo$ Por lo tanto un pro#rama escrito para ese dispositivo no es portable (no puede usarse para otro) o di!'cilmente portable$
2. %os pro#ramas en ensamblador consumen menos recursos$ Ya que el pro#ramador puede optimi+ar cuidadosamente el cdi#o$
3. Al pro#ramar en ensamblador se tiene control preciso en las tareas, re#istros, tiempos de e*ecucin, uso de memoria$
. A pesar de sus venta*as, es un len#ua*e que presenta cierta di!icultad para ser le'do directamente por el &umano$ sta di!icultad tambi"n se presenta al reali+ar !unciones comple*as que se pueden diseñar ms !cilmente en un len#ua*e de alto nivel$
Re#istros de status (-tatus Re#isters 8 -RL)
l microcontrolador opera basado en el -RL otros re#istros internos$ %os ms importantes son los -RL que #uardan in!ormacin de la última instruccin el estatus de activacin de interrupcin$
9it ; / > = 7 ?
Dombre C F Carr bit G F Gero !la# D F De#ative !la# 5 F Over!loJ !la# - F -i#ned !la# E F Eal! carr bit 0 F 9it store bit 4 F Llobal interrupt enable !la#
(%emplo de manipulación de #its: /BR R1' <1==5><1==3
? pone en 1 los #its 5 $ 3 del R1'
CBR R1' @@3
? limpia los #its 1 $ @ en R1'
(%emplo de operaciones aritm,ticas: a /uma A R1' R1*
? R1' R1' > R1*
AC R1' R2
? R1' R1' > R2 > C
AI DL 3
? DL : D9 DL : D9 >3
# Resta /EB R1' R1*
? R1' R1' F R1*
/BC R1' R2
? R1' R1' F R2 F C
/BI GL 5
? GL : G9 GL : G9 F 5
SUBI R16, 30
; R16 = R16 - 30
SBCI R16, 4
; R16 = R16 - 4 - C
c 8ultiplicación (%emplo de multiplicación 'H1@ LI R1' @ LI R1* @ LI R2 ' +orloop: A R1' R2 I6C R1* C!I R1* 1@ BRL7 +orloop
(%emplo: LI R1' @ +orloop:
? cra"ar R1' con el alor de @ ? eti&ueta &ue serirá para )acer un loop
I6C R1'
? incrementar el alor actual de R1'
7E- !7R- R1'
? pasar el alor actual de R1' al puerto R1'
C!I R1' 1@
?comparar el alor actual de R1' con 1@
BRL7 +orloop
?si el resultado de la compración indica &ue R1' es menor #rincar ? a +orloop
(%emplo BlinJ L(:
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
Capítulo 4: eri*+ricos ' (rs
Capítulo ,: Interrupciones ) (rs
Capítulo ': -emporiadores )(rs Capítulo ): Comunicación /erial ' (rs
Capítulo 0: Conersión Analó!ica i!ital (rs