1. UNIVERSIDAD AUTÓNOMA METROPOLITANA
UNIDAD IZTAPALAPA
DIVISIÓN DE CIENCIAS BÁSICAS E INGENIERÍA
PROYECTO TERMINAL DE INGENIERÍA ELECTRÓNICA
Evaluación de Microcontroladores
Propuesta de Diseño de la tarjeta experimental UAMI-AVR
ALUMNOS
CHÁVEZ CALDERÓN ARMANDO
PAREDES GARCÍA HORACIO
LICENCIATURA EN INGENIERÍA ELECTRÓNICA
ESPECIALIDAD COMUNICACIONES
ASESOR DEL PROYECTO
M. EN C. SUARÉZ FERNANDEZ AGUSTÍN
PROFESOR INVESTIGADOR DEL ÁREA DE INGENIERÍA BIOMÉDICA
MÉXICO D.F., JUNIO DE 2006.
2. Proyecto terminal de ingeniería electrónica
DEDICATORIA
A Dios
Por que sin Él nada sería posible.
A mis padres
Por su comprensión y apoyo financiero.
A Fanny
Por su ejemplo y apoyo.
A mis compañeros, amigos y maestros
Por sus enseñanzas, esfuerzos y comprensión.
Ing. Armando Chávez Calderón
A mi familia
Por su paciencia, cariño y consejos
A mis amigos
Por las fiestas no convividas con ellos
A todos ellos gracias
Ing. Horacio Paredes García
Diseño de la tarjeta experimental UAMI-AVR
3. Proyecto terminal de ingeniería electrónica
TABLA DE CONTENIDO
Pag.
Dedicatoria......................................................................................................................... 1
ABSTRACT......................................................................................................................... 4
Objetivo............................................................................................................................... 4
Justificación....................................................................................................................... 4
Capitulo 1
INTRODUCCIÓN A LOS MICROCONTROLADORES
1.1 Introducción 5
1.2 Arquitectura básica 6
1.3 Bloques internos del microcontrolador 8
1.4 Recursos especiales 11
1.5 El mercado de los microcontroladores 12
1.6 Herramientas para el desarrollo de aplicaciones 13
1.7 Desarrollo del software 14
Capitulo 2
ELECCIÓN DEL MICROCONTROLADOR
2.1 ¿Qué microcontrolador emplear? 16
2.2 Costos 16
2.3 Aplicación 16
2.3.1 Procesamiento de datos 16
2.3.2 Entrada / Salida 17
2.3.3 Consumo 17
2.3.4 Memoria 17
2.3.5 Ancho de palabra 17
2.3.6 Diseño 18
2.4 La familia de los PIC vs. La familia de los AVR cómo elección 18
Capitulo 3
COMPARATIVOS DE AMBOS MICROCONTROLADORES
3.1 Comparativos (Características Relevantes) 19
3.2 Conclusiones de la evaluación 21
3.3 Comentarios finales 24
Diseño de la tarjeta experimental UAMI-AVR
4. Proyecto terminal de ingeniería electrónica
Capitulo 4
DISEÑO DE LA TARJETA UAMI-AVR
4.1 Sección Fuente de Alimentación 26
4.2 Sección Comunicación Serial 27
4.3 Sección de Control 30
4.3.1 Algoritmo de programación serial 32
4.3.2 Características de la programación serial 35
4.4 Sección Selección de microcontrolador A y B 35
4.5 Sección Programador 40
4.6 Sección Banco de leds 40
Capitulo 5
ENTORNO DE PROGRAMACIÓN
5.1 ¿Cómo programar? 43
5.1.1 Hardware 43
5.1.2 Software (AVR Studio 4® y AVR Prog®) 43
Apéndice A
Tarjeta UAMI-AVR v1.0 57
Microcontroladores soportados 57
Características 57
Apéndice B
Guía rápida del ensamblador AVR® 58
Apéndice C
Características eléctricas de la tarjeta UAMI-AVR 65
Apéndice D
Programa de aplicación de la tarjeta UAMI-AVR 66
Referencias 81
Diseño de la tarjeta experimental UAMI-AVR
5. Proyecto terminal de ingeniería electrónica
Abstrac
En el contenido de este reporte damos una descripción general de lo que es un
microcontrolador, su arquitectura, sus aplicaciones y la justificación de su uso actualmente
en aplicaciones, que van desde académicas, así como en aplicaciones especificas y
profesionales en el ámbito de los sistemas digitales.
Posteriormente se evaluaron algunos microcontroladores comerciales de las marcas ATMEL®
y MICROCHIP®, partiendo de su disponibilidad comercial en México, costo; y de sus
recursos técnicos como lo son sus periféricos integrados: EEPROM, RAM, FLASH, su
herramienta de desarrollo, conjunto de instrucciones, control de periféricos, interrupciones
disponibles y modos de baja potencia.
Al finalizar dicha evaluación se opto por elegir los microcontroladores AVR de la marca
ATMEL®, debido a su modernidad, recursos técnicos y disponibilidad comercial.
Con ello partimos con base en algunas aplicaciones típicas, al diseño de la tarjeta
experimental UAMI-AVR, que en su inicio se basó en dos microcontroladores AVR®, el
AT90S2313 y el ATMEGA16; ya dentro del proceso de diseño se decidió que, para que ésta
tuviese mayor versatilidad soportará la grabación de cinco microcontroladores más, dando
soporte así a los siguientes modelos: ATMEGA32, ATMEGA8535, AT90S1200, AT90S8535 y
ATtiny2313.
Objetivo
Diseño de la tarjeta UAMI-AVR para los cursos de Sistemas Digitales de la UAM-Iztapalapa.
Justificación
Actualmente, se utilizan como base experimental de los cursos de Sistemas Digitales
diferentes microprocesadores o microcontroladores. En el caso particular, del
microprocesador 80C188EB, tarjeta UAMI-188EB, las memorias adicionales que se
requieren, debido a su baja capacidad, están al final de su ciclo comercial. Los
microcontroladores, en la gran mayoría de los casos, tienen integradas las memorias
necesarias y tienen la posibilidad de estar disponibles como muestras comerciales sin costo.
Además de tener una mayor cantidad de periféricos que permiten darle a los cursos
diferentes enfoques, ya que en estos convergen dos áreas del departamento de eléctrica que
son Ingeniería Electrónica con sus dos especialidades Comunicaciones y Computación, e
Ingeniería Biomédica con la especialidad de instrumentación.
Diseño de la tarjeta experimental UAMI-AVR
6. Proyecto terminal de ingeniería electrónica
1
Introducción a los microcontroladores
1.1 Introducción
Primero hay que entender ciertas diferencias que existen entre un microprocesador y un
microcontrolador, básicamente la diferencia es la siguiente: un microprocesador es una CPU
(Unidad Central de Proceso) en un solo integrado, mientras que un microcontrolador es un
sistema basado en una CPU en un solo integrado orientado en general a aplicaciones de
control y adquisición de señales.
Los microcontroladores tienen su uso en sistemas de control, aplicaciones industriales,
electrodomésticos, biomédicas, comunicaciones, meteorológicas, etc.
La gran mayoría de los microcontroladores son fáciles de usar y por ello su uso a proliferado
en muchas áreas, además aportan una gran flexibilidad que conlleva a una potente gama de
posibilidades para los diseñadores. Fig. 1
Fig. 1 aplicaciones típicas de un microcontrolador
Diseño de la tarjeta experimental UAMI-AVR
7. Proyecto terminal de ingeniería electrónica
Su gran versatilidad y flexibilidad se dejan ver en las múltiples aplicaciones que posibilitan
las potencialidades de un microcontrolador, como lo pueden ser sus interfaces con motores,
pantallas LCD, matriz, etc., comunicación con PC’s, leer y digitalizar valores de sensores
externos, conectarse en una red de microcontroladores, etc., con la ventaja de que esto
puede hacerse con muy pocos componentes externos. Por ello al usar un microcontrolador
en algún diseño, el resultado final será compacto, de costo bajo y fácil de depurar.
La estructura típica de un microcontrolador dispone de los siguientes elementos, fig. 2.
Fig. 2 arquitectura general de un microcontrolador
1.2 Arquitectura básica
Aunque inicialmente todos los microcontroladores adoptaron la arquitectura clásica de Von
Neumann, en el momento presente se impone la arquitectura Harvard. La arquitectura de
Von Neumann se caracteriza por disponer de una sola memoria principal donde se
almacenan datos e instrucciones de forma indistinta. A dicha memoria se accede a través de
un sistema de bus único (direcciones, datos y control).
Diseño de la tarjeta experimental UAMI-AVR
8. Proyecto terminal de ingeniería electrónica
La arquitectura Harvard dispone de dos memorias independientes una, que contiene sólo
instrucciones y otra, sólo datos. Ambas disponen de sus respectivos sistemas de bus de
acceso y es posible realizar operaciones de acceso (lectura o escritura) simultáneamente en
ambas memorias. Figura 3.
Fig. 3 La arquitectura Harvard dispone de dos memorias independientes para datos y para
instrucciones, permitiendo accesos simultáneos.
RISC
La industria de los microcontroladores está decantándose hacia la filosofía RISC
(Computadoras de Juego de Instrucciones Reducido). En estos el repertorio de instrucciones
de máquina es muy reducido y las instrucciones son simples y, generalmente, se ejecutan
en un ciclo. La sencillez y rapidez de las instrucciones permiten optimizar el hardware y el
software del procesador.
SISC
En los microcontroladores destinados a aplicaciones muy concretas, el juego de
instrucciones, además de ser reducido, es “específico”, o sea, las instrucciones se adaptan a
las necesidades de la aplicación prevista. Esta filosofía se ha bautizado con el nombre de
SISC (Computadoras de Juego de Instrucciones Específico).
Diseño de la tarjeta experimental UAMI-AVR
9. Proyecto terminal de ingeniería electrónica
1.3 Bloques internos del microcontrolador
CPU
Es la unidad de de procesamiento central. Esta toma las instrucciones almacenadas en la
memoria de programa, decodifica estas instrucciones y las ejecuta. La CPU está compuesta
por registros, la Unidad Lógico Aritmética (ALU), el decodificador de instrucciones y la
circuitería de control.
Memoria de programa
La memoria de programa almacena las instrucciones que forman el programa. La memoria
de programa en los microcontroladores es usualmente no volátil, puede ser EEPROM y/o
FLASH.
RAM
La RAM es la memoria de datos del microcontrolador. Esta es usada por el CPU para
almacenar variables así como la pila y el “heap”. La pila es un área de memoria que se
utiliza para almacenar direcciones de retorno y variables que se le pasan a las funciones del
programa, el “heap” es un área de memoria que se utiliza para asignación dinámica de
memoria.
Reloj oscilador
El microprocesador ejecuta el programa fuera de la memoria de programa a determinada
velocidad, esta velocidad es determinada por la frecuencia del reloj oscilador, este podría ser
un oscilador interno o un oscilador con un elemento de tiempo externo, como un oscilador
de cuarzo (cristal) usado comúnmente. Tan pronto como se enciende el microcontrolador la
operación del oscilador debe iniciarse.
Reset y circuito detector
El circuito de reinicio (reset) en el microcontrolador asegura que al inicio todos los
componentes y circuitos de control tengan un estado inicial predefinido y todos los registros
sean iniciados adecuadamente.
Diseño de la tarjeta experimental UAMI-AVR
10. Proyecto terminal de ingeniería electrónica
Puertos de comunicación
Estos son componentes muy usados en los microcontroladores, pues se necesitan para
comunicarse con dispositivos externos, estos operan a diferentes velocidades (según se
requiera). Los puertos de comunicación toman bytes del microcontrolador y los envían
afuera un bit a la vez hacia uno de los pines de salida, de forma similar aceptan datos un bit
a la vez hasta formar un byte y presentárselo al CPU. Este tipo de puertos de comunicación,
los cuales reciben y transmiten datos bit por bit se le denomina puerto serie, existen puertos
síncronos y asíncronos, los primeros necesitan de una señal de reloj que acompañe a los
datos y que lleve la información sobre la temporización, mientras que en los segundos la
información de temporización es tomada de los datos. Generalmente este puerto es
integrado en un chip dentro del microcontrolador llamado UART (Recepción Transmisión
Asíncrona Universal) o USART (Recepción Transmisión Asíncrona Síncrona Universal).
Puertos de entrada / salida digitales
Estos puertos de E / S se usan para intercambiar datos digitales con el exterior. Comparados
con el puerto serial, los datos en un puerto de E / S digital se envían en bytes.
Puertos entrada / salida analógicos
Las entradas analógicas son procesadas usando un Convertidor Analógico Digital (ADC). Los
microcontroladores pueden poseer un ADC y un comparador analógico, estos, bajo la
supervisión del software, son usados para la adquisición de datos analógicos, principalmente
de sensores externos. Las salidas analógicas se logran usando un Convertidor Digital
Analógico (DAC), generalmente externo, pero la mayoría de los microcontroladores están
equipados con un modulador de ancho de pulso (PWM), que puede ser usado para obtener
salidas analógicas de voltaje con un filtro RC, estás salidas pueden usarse para controlar
motores, pantallas, generar sonido, etc.
Temporizador
Este es usado por el microcontrolador para eventos de tiempo, por ejemplo puede haber un
dato que necesite ser visualizado en una pantalla en ciertos instantes. El temporizador
también puede ser usado para contar eventos internos o externos, en este caso se le llama
contador o cronómetro.
Diseño de la tarjeta experimental UAMI-AVR
11. Proyecto terminal de ingeniería electrónica
Temporizador “Watchdog” (WDT)
Un WDT (“perro guardián”)1
es un temporizador especial con una función específica. Este es
usualmente usado para prevenir caídas de software. Trabaja de la siguiente manera: el WDT
es básicamente un contador donde la frecuencia de su entrada de reloj se elige, de acuerdo
a ciertos puntos del programa donde el diseñador debe poner una instrucción para reponer
(resetear) este contador, así si el contador se desborda se reinicia (resetea) el
microcontrolador, i.e., un desbordamiento del WDT implica que el programa se quedo
esperando en algún punto.
Haciendo una analogía con una PC, cuando esta se bloquea por una falla en el software u
otra causa, se pulsa el botón del reset (reinicio) y se reinicializa el sistema. Pero un
microcontrolador funciona sin el control de un supervisor y de forma continua las 24 horas
del día. El WDT a grandes rasgos consiste en un temporizador que, cuando se desborda y
pasa por 0, provoca un reset (reinicio) automáticamente en el sistema.
Para esto se debe diseñar el programa de trabajo que controla la tarea de forma que
refresque o inicialice al WDT antes de que provoque el reinicio (reset). Si falla el programa o
se bloquea, no se refrescará al WDT y, al completar su temporización, se dice comúnmente
que “ladrará y ladrará” hasta provocar el reset.
RTC (Reloj de Tiempo Real)
Este es un reloj de tiempo real, es un temporizador especial con la tarea de mantener el
tiempo del día, mes, hora. Este puede ser usado como alarma para ciertos eventos.
Sistemas embebidos
El microcontrolador es en definitiva un circuito integrado que incluye componentes de un
sistema basado en una CPU. Debido a su reducido tamaño es posible montar el
microcontrolador en el propio dispositivo al que gobierna. En este caso el microcontrolador
recibe el nombre de microcontrolador empotrado (embedded controller).
La frase “divide y vencerás” se hace presente también en la arquitectura de los
microcontroladores, de forma tal que aunque los datos se procesan en el bloque de la CPU,
cada uno de los periféricos es autónomo.
1
Traducción coloquial para watchdog, por separado (watch: reloj, dog: perrro)
Diseño de la tarjeta experimental UAMI-AVR
12. Proyecto terminal de ingeniería electrónica
Así por ejemplo para transmitir un dato por el puerto serial, la CPU no tiene que estar
atendiendo la transmisión del dato en cada instante de tiempo (polling), esta simplemente le
da el byte al módulo por el que lo quiere transmitir y este modulo se encarga de transmitir y
producir la señal de reloj; de esta forma la CPU puede estar realizando otras tareas mientras
el dato se transmite.
De la misma manera cada uno de los módulos integrados requiere de un mínimo de la CPU.
Reduciendo las tareas que debe realizar la CPU, obtenemos un poderoso microcontrolador,
manejando los eventos sin la necesidad de que el tiempo de procesamiento sea gastado en
este manejo. Esto es importante principalmente por que el mayor uso de los
microcontroladores es en procesos de control automático, los cuales en su mayoría son
rápidos, de esta forma sería lamentable que la CPU estuviera gastando tiempo en transmitir
un dato a la PC, en contar tiempo o realizar una conversión analógica digital, si el dato
puede ser tratado de manera automática para cada uno de los eventos antes mencionados.
1.4 Recursos especiales
Cada fabricante oferta numerosas versiones de una arquitectura básica de microcontrolador.
En algunas amplía las capacidades de las memorias, en otras incorpora nuevos recursos, en
otras reduce las prestaciones al mínimo para aplicaciones muy simples, etc. La labor del
diseñador es encontrar el modelo mínimo que satisfaga todos los requerimientos de su
aplicación. De esta forma, minimizará el costo, el hardware y el software.
UART
Adaptador de comunicación serie asíncrona.
USART
Adaptador de comunicación serie síncrona y asíncrona.
MUX (Multiplexor) y CAD (Convertidor Analógico Digital)
Permite la adquisición de señales externas conjuntamente con un multiplexor.
Puerto paralelo Esclavo
Para poder conectarse con los buses de otros microprocesadores.
Diseño de la tarjeta experimental UAMI-AVR
13. Proyecto terminal de ingeniería electrónica
Bus I2
C
Es una interfaz serie de dos hilos (TWI:Two Wire serial Interface) y protocolo desarrollado
por Philips. Es un bus robusto y con una comunicación muy eficiente, puede direccionar
hasta 128 dispositivos arbitrariamente en el mismo bus con la posibilidad de manejar
múltiples “masters” en el bus.
CAN (Controller Area Network)
Permite la adaptación con redes de conexionado multiplexado desarrollado conjuntamente
por Bosch e Intel para el cableado de dispositivos en automóviles.
LIN (Local Interconnect Network)
Protocolo LIN (Interconexión de Red Local) sin necesidad de componentes externos. Es un
protocolo de comunicación serial que soporta eficientemente nodos de control mecatronicos
en redes distribuidas. Es ideal en el uso de aplicaciones automotivas. Consiste en un nodo
maestro y múltiples nodos esclavo.
1.5 El mercado de los microcontroladores
Aunque en el mercado de la microelectrónica la mayor atención la acaparan los desarrollos
de los microprocesadores, lo cierto es que se venden cientos de microcontroladores por cada
uno de los otros.
Existe una gran diversidad de microcontroladores. Quizá la clasificación más importante sea
entre microcontroladores de 4, 8, 16 ó 32 bits. Aunque las prestaciones de los
microcontroladores de 16 y 32 bits son superiores a los de 4 y 8 bits, la realidad es que los
microcontroladores de 8 bits dominan el mercado y los de 4 bits se resisten a desaparecer.
La razón de esta tendencia es que los microcontroladores de 4 y 8 bits son apropiados para
la gran mayoría de las aplicaciones, lo que hace absurdo emplear microcontroladores más
potentes y consecuentemente más caros. Uno de los sectores más extensos del mercado del
microcontrolador es el mercado automovilístico. De hecho, algunas de las familias de
microcontroladores actuales se desarrollaron pensando exclusivamente en este sector,
siendo modificadas posteriormente para adaptarse a sistemas más genéricos. El mercado del
automóvil es además uno de los más exigentes: los componentes electrónicos deben operar
Diseño de la tarjeta experimental UAMI-AVR
14. Proyecto terminal de ingeniería electrónica
bajo condiciones extremas de vibraciones, choques, ruido, etc. y seguir siendo fiables. El
fallo de cualquier componente en un automóvil puede ser el origen de un accidente.
En cuanto a las técnicas de fabricación, cabe decir que prácticamente la totalidad de los
microcontroladores actuales se fabrican con tecnología CMOS 4 (Semiconductor de Oxido
Metálico Complementario)2
. Esta tecnología supera a las técnicas anteriores por su bajo
consumo y alta inmunidad al ruido.
La distribución de las ventas según su aplicación es la siguiente:
• Una tercera parte se absorbe en las aplicaciones relacionadas con las computadoras y
sus periféricos.
• La cuarta parte se utiliza en las aplicaciones de consumo (electrodomésticos, juegos,
TV, vídeo, etc.)
• Aproximadamente el 16% de las ventas mundiales se destinó al área de las
comunicaciones.
• Otro 16% aprox. fue empleado en aplicaciones industriales.
• El resto de los microcontroladores vendidos en el mundo, aproximadamente un 10%
fueron adquiridos por las industrias automovilísticas.
También los modernos microcontroladores de 32 bits van afianzando sus posiciones en el
mercado, siendo las áreas de más interés el procesamiento de imágenes, las
comunicaciones, las aplicaciones militares, los procesos industriales y el control de los
dispositivos de almacenamiento masivo de datos.
1.6 Herramientas para el desarrollo de aplicaciones.
Uno de los factores que más importancia tiene a la hora de seleccionar un microcontrolador
entre todos los demás es el soporte tanto de software como de hardware de que dispone. Un
buen conjunto de herramientas de desarrollo puede ser decisivo en la elección, ya que
pueden suponer una ayuda inestimable en el desarrollo del proyecto.
Las principales herramientas de ayuda al desarrollo de sistemas basados en
microcontroladores se describen a continuación.
2
Complementary Metal Oxide Semiconductor
Diseño de la tarjeta experimental UAMI-AVR
15. Proyecto terminal de ingeniería electrónica
1.7 Desarrollo del software
Ensamblador
La programación en lenguaje ensamblador puede resultar un tanto ardua para el
principiante, pero permite desarrollar programas muy eficientes, ya que otorga al
programador el dominio absoluto del sistema. Los fabricantes suelen proporcionar el
programa ensamblador de forma gratuita y en cualquier caso siempre se puede encontrar
una versión gratuita para los microcontroladores más populares.
Compilador
La programación en un lenguaje de alto nivel (como el C) permite disminuir el tiempo de
desarrollo de un producto. No obstante, si no se programa con cuidado, el código resultante
puede ser mucho más ineficiente que el programado en ensamblador. Las versiones más
potentes suelen ser muy caras, aunque para los microcontroladores más populares pueden
encontrarse versiones demo limitadas e incluso compiladores gratuitos.
Depuración
Debido a que los microcontroladores van a controlar dispositivos físicos, los desarrolladores
necesitan herramientas que les permitan emular el comportamiento del microcontrolador,
depurar el software y así garantizar su buen funcionamiento cuando es conectado
físicamente al resto de circuitos.
Simulador
Son capaces de ejecutar en una PC programas realizados para el microcontrolador. Los
simuladores permiten tener un control absoluto sobre la ejecución de un programa, siendo
ideales para la depuración de los mismos. Su gran inconveniente es que es difícil simular la
entrada y salida de datos del microcontrolador. Tampoco cuentan con los posibles ruidos en
las entradas, pero, al menos, permiten el paso físico de la implementación de un modo más
seguro y menos costoso.
Tarjetas de evaluación.
Se trata de pequeños sistemas con un microcontrolador ya montado y que suelen conectarse
a una PC desde el que se cargan los programas que se ejecutan en el microcontrolador. Las
tarjetas suelen incluir visualizadores LCD, teclados, LEDs, fácil acceso a los pines de E/S,
Diseño de la tarjeta experimental UAMI-AVR
16. Proyecto terminal de ingeniería electrónica
etc. El sistema operativo de la tarjeta recibe el nombre de programa monitor. El programa
monitor de algunas tarjetas de evaluación, aparte de permitir cargar programas y datos en
la memoria del microcontrolador, puede permitir en cualquier momento realizar ejecución
paso a paso, monitorear el estado del microcontrolador o modificar los valores almacenados
en los registros o en la memoria.
Emuladores en circuito
Se trata de un instrumento que se coloca entre la PC anfitrión y el zócalo de la tarjeta de
circuito impreso donde se alojará el microcontrolador definitivo. El programa es ejecutado
desde la PC, pero para la tarjeta de aplicación es como si lo hiciese el mismo
microcontrolador que luego irá en el zócalo. Presenta en pantalla toda la información tal y
como luego sucederá cuando se coloque la cápsula.
Diseño de la tarjeta experimental UAMI-AVR
17. Proyecto terminal de ingeniería electrónica
2
Elección del microcontrolador
2.1 ¿Qué microcontrolador emplear?
A la hora de escoger el microcontrolador a emplear en un diseño concreto hay que tener en
cuenta multitud de factores, como la documentación y herramientas de desarrollo
disponibles y su precio, la cantidad de fabricantes que lo producen y por supuesto las
características del microcontrolador (tipo de memoria de programa, número de
temporizadores, cantidad de registros de propósito general, interrupciones, etc.)
2.2 Costos
Como es lógico, los fabricantes de microcontroladores compiten duramente para vender sus
productos. Es aquí donde dependiendo de la aplicación el diseñador deberá seleccionar el
demás bajo costo sin sacrificar la eficiencia de la aplicación.
Pongamos un ejemplo, para el fabricante que usa el microcontrolador en su producto una
diferencia de precio en el microcontrolador de algunos pesos es importante (el consumidor
deberá pagar además el costo del empaquetado, el de los otros componentes, el diseño del
hardware y el desarrollo del software). Si el fabricante desea reducir costos debe tener en
cuenta las herramientas de apoyo con que va a contar: emuladores, simuladores,
ensambladores, compiladores, etc. Es habitual que muchos de ellos siempre se decanten por
microcontroladores pertenecientes a una única familia.
2.3 Aplicación
Antes de seleccionar un microcontrolador es imprescindible analizar los requisitos de la
aplicación, a continuación se citan algunos ejemplos.
2.3.1 Procesamiento de datos
Puede ser necesario que el microcontrolador realice cálculos críticos en un tiempo limitado.
En ese caso debemos asegurarnos de seleccionar un dispositivo suficientemente rápido para
ello. Por otro lado, habrá que tener en cuenta la precisión de los datos a manejar: si no es
Diseño de la tarjeta experimental UAMI-AVR
18. Proyecto terminal de ingeniería electrónica
suficiente con un microcontrolador de 8 bits, puede ser necesario acudir a
microcontroladores de 16 ó 32 bits, o incluso a hardware de punto flotante.
2.3.2 Entrada Salida
Para determinar las necesidades de Entrada/Salida del sistema es conveniente dibujar un
diagrama de bloques del mismo, de tal forma que sea sencillo identificar la cantidad y tipo
de señales a controlar. Una vez realizado este análisis puede ser necesario añadir periféricos
(hardware externo) o cambiar a otro microcontrolador más adecuado a ese sistema.
2.3.3 Consumo
Algunos productos que incorporan microcontroladores están alimentados con baterías y su
funcionamiento puede ser tan vital como activar una alarma antirrobo. Lo más conveniente
en un caso como éste puede ser que el microcontrolador esté en estado de bajo consumo
(sleep) pero que despierte ante la activación de una señal (una interrupción) y ejecute el
programa adecuado para procesarla.
2.3.4 Memoria
Para detectar las necesidades de memoria de nuestra aplicación debemos separarla en
memoria volátil (SRAM), memoria no volátil (EPROM, etc.) y memoria no volátil modificable
(EEPROM y FLASH). Este último tipo de memoria puede ser útil para incluir información
específica de la aplicación como un número de serie o parámetros de calibración.
En cuanto a la cantidad de memoria necesaria puede ser imprescindible realizar una versión
preliminar, aunque sea en pseudo-código, de la aplicación y a partir de ella hacer una
estimación de cuánta memoria volátil y no volátil es necesaria y si es conveniente disponer
de memoria no volátil modificable.
2.3.5 Ancho de palabra
El criterio de diseño debe ser seleccionar el microcontrolador de menor ancho de palabra
que satisfaga los requerimientos de la aplicación. Usar un microcontrolador de 4 bits
supondrá una reducción en los costos importante, mientras que uno de 8 bits puede ser el
más adecuado si el ancho de los datos es de un byte. Los microcontroladores de 16 y 32
Diseño de la tarjeta experimental UAMI-AVR
19. Proyecto terminal de ingeniería electrónica
bits, debido a su elevado costo, deben reservarse para aplicaciones que requieran sus altas
prestaciones (Entrada/Salida potente o espacio de direccionamiento muy elevado).
2.3.6 Diseño
La selección de un microcontrolador concreto condicionará el diseño. Debe tenerse en cuenta
que quizá usar un microcontrolador barato encarezca el resto de componentes del diseño.
Es preciso resaltar en este punto que existen innumerables familias de microcontroladores,
cada una de las cuales posee un gran número de variantes. Pero nuestro diseño se centrará
únicamente en la familia de microcontroladores AVR® de ATMEL®.
2.4 La familia de los PIC vs. la familia de los AVR como elección
¿Qué es lo que ocurría con los PIC hasta hace algunos años?, ¿Por qué están en boca de
todos?
Se ha buscado en multitud de bibliografía y realmente nadie da una respuesta concreta,
pero una aproximación puede ser esta:
Los PIC hasta hace unos cuantos años tenían una gran ventaja, no había prácticamente
competencia en el mercado, por lo que a vista de los diseñadores estos representaban una
solución poderosa, el precio, la facilidad de uso, la información, las herramientas de apoyo,
etc. Quizás un poco de todo eso es lo que produce esa imagen de sencillez y utilidad. Sin
embargo hoy en día existen bastantes familias de microcontroladores de distintos
fabricantes como los AVR® que por el momento representan una muy buena opción en
cuanto a flexibilidad, precio, herramientas de desarrollo, información, modernidad, etc.
Diseño de la tarjeta experimental UAMI-AVR
20. Proyecto terminal de ingeniería electrónica
3
Comparativos de ambos microcontroladores
3.1 Comparativos
Características relevantes
PIC®
Arquitectura PIC®
La arquitectura sigue el modelo Harvard.
En esta arquitectura, la CPU se conecta de
forma independiente y con un bus distinto
entre la memoria de instrucciones y la de
datos.
Segmentación
Se aplica la técnica de segmentación
(“pipe line”) en la ejecución de las
instrucciones. La mayoría de las
instrucciones se ejecutan en un ciclo de
instrucción (un ciclo de instrucción
equivale a cuatro ciclos de reloj).
Formato de las instrucciones.
Las instrucciones de los PIC® de la gama
baja tienen una longitud de 12 bits. Las de
la gama media tienen 14 bits y las de alta
16 bits. Esta característica es ventajosa en
la optimización de la memoria de
instrucciones y facilita la construcción de
ensambladores y compiladores.
AVR®
Arquitectura AVR®
El AVR® es un microcontrolador RISC con
una arquitectura Harvard, por lo que
también tiene una memoria de programa
separada de la memoria de datos y en
general mucho mayor que su competidor.
Segmentación
Al igual que su oponente también maneja
la segmentación “pipe line” sin embargo
en el AVR® la mayoría de las instrucciones
se llevan a cabo en un único ciclo de reloj.
AVR® son entonces más veloces en la
ejecución de la gran mayoría de
instrucciones.
Formato de las instrucciones.
La mayoría de las instrucciones son de 2
bytes de longitud y ocupan una localidad
de la memoria de programa. Al igual que
su competidor esta característica ayuda en
la optimización de la memoria de
instrucciones y facilita la construcción de
ensambladores y compiladores.
Diseño de la tarjeta experimental UAMI-AVR
21. Proyecto terminal de ingeniería electrónica
Juego de instrucciones
Procesador RISC (Juego de Instrucciones
Reducido). Los de gama baja 33
instrucciones, los de media 35 y hasta 60
los de gama alta.
Todas las instrucciones son ortogonales
Cualquier instrucción puede manejar
cualquier elemento de la arquitectura
como fuente o como destino.
Banco de registros
Los de gama baja solo poseen 8 registros
de 8 bits, los de media y alta hasta 15
registros de 8 bits.
Herramientas de desarrollo
La empresa Microchip® y otras que
utilizan los PIC® ponen a disposición de
los usuarios numerosas herramientas para
desarrollar hardware y software. Son muy
abundantes los programadores, los
simuladores software, los emuladores en
tiempo real, Ensambladores, Compiladores
C, Intérpretes y Compiladores BASIC, etc.
Juego de instrucciones
Al ser RISC también posee un Juego de
Instrucciones Reducido. Aquí la cantidad
de instrucciones para AT90S (básico) es
de 89, 118 para ATtiny (medio) y hasta
200 para ATMEGA (Alto).
Todas las instrucciones son ortogonales
Su conjunto ortogonal de instrucciones
también puede controlar cualquier modulo
de la arquitectura automatizándolo.
Banco de registros
El núcleo exhibe 32 registros iguales de 8
bits, y cualquiera de ellos puede contener
direcciones o datos.
Una ventaja más pues es bien sabido que
es más eficiente trabajar con memoria
interna dentro del núcleo, que con
externa.
Herramientas de desarrollo
Atmel® también ha puesto a disposición
notables herramientas de desarrollo,
gratuitas, modernas, la única desventaja
es el mercado para sus tarjetas
programadoras, pero para esto existe una
solución: el modo de programación SPI
(Programación Serial In Circuit), que
permite tener acceso a la EEPROM y
FLASH, mediante el puerto serial de
cualquier PC. También se puede compilar
en C, en Linux, con bascomAVR, etc.
Diseño de la tarjeta experimental UAMI-AVR
27. Proyecto terminal de ingeniería electrónica
4
Diseño de la tarjeta UAMI-AVR
4.1 Sección Fuente de Alimentación
El diseño se decidió hacer de manera modular, en la figura 4 se muestra a detalle el diseño
de la fuente de alimentación, ya que el consumo no es mayor a 100mA el regulador
seleccionado es un L7805CV con entrada típica de 6 a 15VDC y salida de 5VDC / 1A. La
alimentación es por medio de un plug 1mm con conexión a fuente externa de 9 a 15VDC, sin
importar polaridad, ya que para evitar daño a la tarjeta se coloco un puente de diodos. El
SW1 es usado para encender o apagar la tarjeta en su totalidad. Además cuenta con un led
de color verde que indica el encendido principal y un capacitor para evitar un poco algunos
pulsos de ruido.
Nota: ES NECESARIO HACER USO DE UN DISIPADOR DE CALOR PARA EL C.I. L7805CV y un
SUPRESOR DE TRANSITIVOS colocado antes del puente de diodos para evitar el retorno de
corriente desde el puerto serial.
Diseño de la tarjeta experimental UAMI-AVR
29. Proyecto terminal de ingeniería electrónica
Figura 5. Sección Comunicación Serial.
La salida de datos de los puertos seriales es en los niveles de voltaje TTL que, por sus
niveles de voltaje, prácticamente no se pueden transmitir sin error, más allá de unos 30 Cm.
Por lo tanto, es necesaria una conversión para tener la potencia adecuada que proporcione
inmunidad al ruido. La forma más común de conversión de los datos es a la norma RS-232C
que es una convención de niveles de voltaje mayores a los de TTL. Los niveles de voltaje
para todas las señales RS-232C, son:
• Para un nivel lógico alto, o marca, entre –3 V. y –15 V., con carga, sin carga –25 V.
• Para un nivel lógico bajo, o espacio, el voltaje es entre +3V. y +15 V. con carga, sin
carga +25 V.
Por ello es necesario utilizar un CI MAX-232 driver/transceiver que conseguirá adaptar
dichos niveles. Y un conector DB9 con la siguiente configuración según la norma RS-232, ver
figura 6 y tabla 7.
Diseño de la tarjeta experimental UAMI-AVR
30. Proyecto terminal de ingeniería electrónica
Fig. 6. Conectores DB9.
Número de
pin
Señal
1 DCD (Data Carrier Detect)
2 RX Recepción de Datos
3 TX Transmisión de Datos
4 DTR (Data Terminal Ready)
5 GND Tierra
6 DSR (Data Sheet Ready)
7 RTS (Request To Send)
8 CTS (Clear To Send)
9 RI (Ring 30Indicador)
Tabla 7. Convención RS-232
Para conectar la PC a un microcontrolador por el puerto serie se utilizan las señales Tx,
Rx y GND. La PC utiliza la norma RS-232, por lo que los niveles de tensión de los pines
están comprendidos entre +15 y -15 voltios. Los microcontroladores normalmente trabajan
con niveles TTL (0-5v). Es necesario por tanto intercalar un circuito que adapte los niveles
Fig. 7.
Fig. 7. Circuitos de conversión de TTL a RS 232 y viceversa.
Diseño de la tarjeta experimental UAMI-AVR
31. Proyecto terminal de ingeniería electrónica
Como ya se mencionó y como se observa en la figura 5 el CI MAX232 se usa para este fin.
Este chip permite adaptar los niveles RS232 y TTL, permitiendo conectar una PC con un
microcontrolador. Sólo es necesario este chip y sus capacitores electrolíticos externos como
lo marca la aplicación típica del chip.
Entonces esto implicará realizar en laboratorio un cable con conectores DB9 hembra-hembra
de no más de 1m. La figura 8 muestra la conexión que se realizara en el laboratorio, la cual
tiene la ventaja de ser simple de realizar.
Fig. 8. Conexionado del cable serial.
4.3 Sección de control
Así entonces las etiquetas TxDA y RxDA por referirse a los puertos PD del micro AT90S2313
son conectadas a los pines 2 y 3 respectivamente como es mostrado en la figura 9, sección
de control de la tarjeta UAMI-AVR. El pin PD1(TxD) es configurado en software para que
habilite la salida de datos de la UART (DDRD1) y PD0(RxD) es configurado para que reciba
datos hacia la UART (PORTD0) y forzado a “1” para que se habiliten las resistencias internas
de pull-up.
La figura 10 muestra el esquemático del puerto PD0(RxD). Mientras que en la figura 11 se
muestra el esquemático del puerto PD1(TxD).
Los cristales recomendados por la aplicación típica de ATMEL® pueden ser de 8MHz o 4MHz,
como se observa en la figura 9.
Diseño de la tarjeta experimental UAMI-AVR
32. Proyecto terminal de ingeniería electrónica
Figura 9. Sección Control.
El reset de este microcontrolador siempre debe estar en “1” nivel alto.
Los pines XTAL1 y XTAL2 se pueden aprovechar para ser usados en el microcontrolador a
grabar ya que el oscilador debe ser el mismo para que exista sincronía.
Mediante software se realizan las rutinas necesarias para realizar la grabación, verificación y
borrado de los “fuses” en la Flash o en la EEPROM según sea necesario.
Los arreglos en la memoria de datos o de programa son programados usando el bus serial
SPI, mientras el RESET este en nivel bajo. Esta interfase serial consta de los pines 19, 18 y
17; SCK (reloj serial) para sincronía, MISO (salida de datos serial a memoria) y MOSI
(entrada de datos serial a memoria), respectivamente. Entonces después de poner el RESET
en bajo se pueden habilitar las instrucciones necesarias para borrar o programar el
microcontrolador.
Diseño de la tarjeta experimental UAMI-AVR
33. Proyecto terminal de ingeniería electrónica
La figura 10 muestra el esquemático de las conexiones necesarias para el modo de
programación y verificación serial.
Figura 10. Esquemático del modo de programación / verificación serial.
Para la EEPROM, existe un ciclo de auto-borrado que se proporciona dentro de los tiempos
cronometrados para escribir la instrucción, por lo que no es necesario ejecutar primero la
instrucción “chip erase”. Al usar dicha instrucción pone todos los arreglos de memoria con
series de FF’s.
El reloj externo proporciona la sincronía para el SCK (serial clock), de la siguiente manera:
Bajo: > 2 XTAL1 ciclo de reloj
Alto: > 2 XTAL1 ciclos de reloj
4.3.1 El algoritmo de programación serial sería el siguiente:
Cuando se escriben los datos seriales en el microcontrolador, estos se sincronizan con el
flanco de subida del reloj serial SCK.
Cuando se leen datos seriales del microcontrolador, estos se sincronizan con el flanco de
bajada del reloj serial SCK.
Ver figura 11 y tabla 8 para más detalle.
Figura 11. Diagrama de tiempos de la programación serial.
Diseño de la tarjeta experimental UAMI-AVR
34. Proyecto terminal de ingeniería electrónica
Tabla 8. Características de la programación serial, Tp = -40ºC a 85ºC Vcc = 2.7 a 6.0V
Para programar y verificar la secuencia recomendada es:
Ver Tabla 9.
1- Aplicar alimentación al microcontrolador Vcc pin 20, GND pin 10; mientras el RESET
y SCK están en “0”.
2- Esperar al menos 20ms para permitir el envío de la instrucción de habilitación del
modo de programación serial al pin 17 (MOSI) que consta de 4bytes.
3- Cuando en la sincronización llegue el segundo byte éste hará un eco ($53) de retorno
que dará la pauta para que el tercer byte se comience a enviar y así sucesivamente
hasta el cuarto byte; si el eco es correcto o no los cuatro bytes de la instrucción de
habilitación del modo serial deben transmitirse. (Es de notar que si las instrucciones
de habilitación están fuera de sincronización, estás no trabajarán).
4- Si los bytes no hicieron eco entonces le dan un pulso positivo a SCK y se reinicia el
envío para una nueva señal de habilitación. Si los ecos se repiten en 32 ocasiones
entonces se descarta y se envía mensaje de que no hay ningún dispositivo funcional
conectado.
5- Si se envía una señal de borrado “chip erase” (lo que debe hacerse para borrar la
FLASH) esperar el tWD_ERASE después de la instrucción de borrado, mientras se le
da al RESET un pulso positivo y se vulva al paso numero 2. Ver la tabla 10 para los
valores de tWD_ERASE.
6- Los arreglos de la FLASH o la EEPROM son programados byte por byte mientras se
proporciona la dirección y los datos junto con la instrucción de escritura WRITE.
Como ya se había mencionado con anterioridad las localidades de memoria de la
Diseño de la tarjeta experimental UAMI-AVR
35. Proyecto terminal de ingeniería electrónica
EEPROM se borran automáticamente antes de escribir nuevos datos en ellas.
Normalmente se usa la detección del nuevo byte de datos por ciclo o polling. Si el
polling no es usado se tendrá que esperar el tWD_PROG antes de enviar nuevos
datos. Ver tabla 11.
7- Cualquier localidad de memoria puede ser leída usando la instrucción de lectura
READ, que regresa el contenido de la dirección leída al pin 18 (MISO).
8- Al finalizar la sesión de programación el RESET debe ponerse en alto para iniciar con
el funcionamiento normal.
9- Secuencia de apagado (opcional): RESET a “1” y desconexión de Vcc.
Tabla 9. Características de programación y verificación.
Diseño de la tarjeta experimental UAMI-AVR
36. Proyecto terminal de ingeniería electrónica
4.3.2 Características de la programación serial
La figura 12 muestra el diagrama de tiempos de la programación serial.
Figura 12. Diagrama de tiempos de la programación serial.
Se observa claramente en el flanco de subida de SCK el envió y recepción de bytes MOSI y
MISO simultáneamente (FULL DUPLEX).
4.4 Sección Selección de microcontrolador A y B
Ya conformada esta sección y controlada adecuadamente por software, se procedió a
diseñar la etapa de selección de microcontroladores que para mayor detalle se muestra en
las figuras 13 y 14.
Los modelos soportados y las señales de habilitación correspondientes se muestran en la
tabla 12. En donde se observa que cuando el SW2 se encuentra con el led D3 encendido
obtenemos la señal de habilitación B1 para los buffers encapsulados en el CI DM74LS244
(U4), pines 2, 4, 6 y 8. con lo que tenemos la señal de RESET1 para los micros mostrados
en la tabla 12, mientras que la señal B2 se encuentra en alto con lo que el resto de buffers
están deshabilitados, es decir en tercer estado. Con esta señal RESET1 y la ayuda de otro CI
DM74LS244 podemos grabar los modelos para B1 mostrados en la tabla 12.
Señal de habilitación B1 (low) B2 (low)
Modelos soportados
AT90S1200
AT90S2313
ATtiny2313
ATMEGA16
ATMEGA32
ATMEGA8535
AT90S8535
SW2 pines 1 y 3 pines 4 y 6
LED D3 1 0
LED D4 0 1
Tabla 12. Sección selección de microcontrolador 1.
1 = ACTIVO
0 = INACTIVO
Diseño de la tarjeta experimental UAMI-AVR
37. Proyecto terminal de ingeniería electrónica
HABILITACIÓN
U4
SALIDAS
U4
B1 B2 RESET1 RESET2
1 0 E 3er EDO
0 1 3er EDO E
Tabla 13. Sección selección de microcontrolador 1.
E = ENABLE (SEÑAL HABILITADA)
HABILITACIÓN
U5
ENTRADAS
SALIDA
CTRL
SALIDAS DE SELECCION
RESET1 B2 RESET2 B1 SCK MOSI MISO 1MISO 2MISO 1MOSI 2MOSI 1SCK 2SCK
E 0
3er
EDO
1 E E E E E E
3er
EDO
3er
EDO
3er
EDO
3er
EDO
1 E 0 E E E
3er
EDO
3er
EDO
3er
EDO
E E E
Tabla 14. Sección selección de microcontrolador 2.
En el otro caso sucede a la inversa como se puede observar claramente en la tabla 14,
cuando RESET1 se va al 3er EDO RESET2 se habilita junto con las señales necesarias para
poder programar o borrar según sea el caso el otro conjunto de microcontroladores.
Por ultimo se opto por colocar dos bases para los microcontroladores soportados U6 de 20
pines y U7 de 40 pines, ambas de punto torneado.
Se decidió dejar dispuestas todas las terminales en headers de 2x20 para ambos tipos de
microcontroladores, ver tabla 15, con esto después de haber programado cualquiera de los
modelos soportados no será necesario extraer el microcontrolador, que podrá ser usado
conectando un cable plano de 20 terminales para facilitar el manejo de los pines de ambos
grupos y poder realizar la circuitería externa en un protoboard. Figura 15.
Pines
ATMEGA16
ATMEGA32
ATMEGA8535
AT90S8535
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Pines
AT90S2313
AT90S1200
ATtiny2313
1 3 5 7 9 11 13 15 17 19
Pines del
cable plano
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
Pines
AT90S2313
AT90S1200
ATtiny2313
2 4 6 8 10 12 14 16 18 20
Pines
ATMEGA16
ATMEGA32
ATMEGA8535
AT90S8535
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
Tabla 15. Distribución selección microcontrolador 1.
Diseño de la tarjeta experimental UAMI-AVR
38. Proyecto terminal de ingeniería electrónica
Como lo podemos observar en los diagramas correspondientes se necesita usar el mismo
cristal para poder sincronizar adecuadamente las señales que acceden a memoria, pero ya
que ha sido grabado el microcontrolador las aplicaciones podrían necesitar de un cristal de
distinta frecuencia por lo que se usaron dos headers de 2x3 para poder así (solo después de
haber programado el microcontrolador) hacer uso de un cristal externo de otro valor. Ver
tabla 16. Mientras los jumpers se encuentren en las posiciones 1 y 2 se usará el cristal de 4
u 8 MHz (programar), si se requiere usar otro cristal se deberán colocar los jumpers en las
posiciones 2 y 3 y acceder a las terminales XTAL1 y XTAL2 en los headers correspondientes
según el microcontrolador a emplear.
Figura 13. Selección de microcontrolador A.
Diseño de la tarjeta experimental UAMI-AVR
39. Proyecto terminal de ingeniería electrónica
Figura 14. Selección de microcontrolador B.
J6
XTAL2 XTAL1
J7
XTAL2 XTAL1
CRISTAL
EXTERNO
PROGRAMAR
1 1
2 2
CRISTAL
EXTERNO
PROGRAMAR
1 1
2 2
3 3 3 3
MICROS 1 MICROS 2
Tabla 16. Cristal externo.
Diseño de la tarjeta experimental UAMI-AVR
40. Proyecto terminal de ingeniería electrónica
Figura 15. Sección Programador.
Diseño de la tarjeta experimental UAMI-AVR
41. Proyecto terminal de ingeniería electrónica
4.5 Sección Programador
En esta sección de la tarjeta solo se montaron las dos bases que soportarán a los cinco
microcontroladores en este diseño, figura 15. En la base de 20 pines se podrán programar
los modelos AT90S1200, AT90S2313 y ATtiny2313, mientras que en el socket de 40 pines
podremos programar los modelos ATMEGA16, ATMEGA32, ATMEGA8535 y AT90S8535.
Ambas bases tendrán la mayor parte de sus pines accesibles desde una tira header con lo
que se facilitará la programación y el posterior uso sin la necesidad de desmontar el
microcontrolador cada vez que se requiera realizar cambios. Adicionalmente se coloco un
puerto DB9 para hacer uso de el mediante un header de 2 terminales (Rx y Tx), con el uso
de jumpers que realicen la conexión entre este header a las correspondientes terminales de
Rx y Tx en los headers de 2x20 según se uso uno u otro microcontrolador.
4.6 Sección Banco de leds
Adicionalmente se implementó un banco de leds de 8 bits para uso general, que consiste en
8 indicadores leds de salida y 8 push button para pulsos de habilitación “0” a “1”. Es
importante recordar que aunque estos pulsos de entrada contengan en su diseño
resistencias pull-up externas es necesario habilitar por software las resistencias pull-up
internas del microcontrolador si los puertos son usados como entradas. Figura 16a.
Figura 16a. Sección banco de leds (entrada).
Diseño de la tarjeta experimental UAMI-AVR
42. Proyecto terminal de ingeniería electrónica
El diseño en los indicadores de salida se dicta por las siguientes ecuaciones:
• Para encontrar el valor de la resistencia de base se realizó con la malla que inicia en
el puerto del “micro”, RB, voltaje base-emisor hasta tierra:
0
5
.
3 =
+
+
− BE
B
Bsat V
R
I
V
Sabemos que
mín
Bsat
Bsat
Csat
mín
Bsat
I
I
I
I
β
β =
→
=
Y que la LED
Csat I
I ≅ , y una beta mínima típica es: 40
≅
mín
β
Además mA
ILED 30
3 ≤
≤
Realizando el cálculo numérico obtenemos el valor requerido para la
resistencia de base:
Ω
=
=
−
=
→
=
=
∴ 7467
375
.
0
8
.
2
375
.
0
7
.
0
5
.
3
375
.
0
40
15
mA
V
mA
V
V
R
mA
mA
I B
Bsat
El valor comercial más cercano es de 8K2Ω que nos arroja una corriente de base en
saturación dentro del rango, por lo que el valor elegido es:
Ω
= 2
8K
RB
• Ahora es necesario encontrar el valor de la resistencia de LED, para esto trazamos la
malla desde VCC, RLED, VLED hasta tierra:
• 0
5 =
+
+
− LED
LED
Csat V
R
I
V
Entonces el cálculo numérico nos arroja el siguiente resultado:
Ω
=
=
−
= 220
15
3
.
3
15
7
.
1
5
mA
V
mA
V
V
RLED
Diseño de la tarjeta experimental UAMI-AVR
43. Proyecto terminal de ingeniería electrónica
Aprovechando el bajo consumo de esta etapa y el hecho de que están todas las resistencias
a un punto común, i.e., a VCC, se elige una red resistiva.
El valor comercial más cercano es de 330Ω lo cual nos deja dentro del rango aceptable para
que el LED encienda adecuadamente, entonces el valor es:
Ω
= 330
LED
Rred
Observar la figura 16b.
Figura 16b. Sección banco de leds (salida).
Diseño de la tarjeta experimental UAMI-AVR
48. Proyecto terminal de ingeniería electrónica
; ** Si se presiona el SW6 se activa un contador ascendente de 8 bits **
; ** Si se presiona el SW7 se activa un desplazamiento descendente de 8 bits **
; ** Si se presiona el SW8 se activa un desplazamiento ascendente de 8 bits **
; ** Si se presiona el SW9 todos los leds parpadeantes (8 bits) **
; ** Si se presiona el SW10 todos los bits en alto excepto el menos significativo **
; ** Si se presiona el SW11 todos los bits en alto excepto el menos significativo **
; ** Si se presiona el SW12 todos los bits en alto excepto el menos significativo **
.INCLUDE "M16DEF.INC" ;para que reconozca conjunto de instrucciones del ATMEGA16
.DEF TEMP = R16 ;registro temporal
.DEF DELAY = R17 ;delay variable 1
.DEF DELAY2 = R18 ;delay variable 2
; *** INICIALIZACIÓN ***
REINICIO:
SER TEMP ;pone registros a FF
OUT DDRB,TEMP ;selección de puerto B para salida
; *** PRUEBA ENTRADA / SALIDA ***
LOOP:
OUT PORTB,TEMP ;salida a LEDS por el puerto C
SBIS PIND,0x00 ;si se presiona el SW5 se incrementa R1 a FF
;brinca si el bit del registro i/o esta en 1
INC TEMP ;entonces el contador disminuye en 1
SBIS PIND,0x01 ;si se presiona el SW6 se decrementa R1 a 01
DEC TEMP ;entonces el contador crece en 1
SBIS PIND,0x02 ;si se presiona el SW7 se rota R1 a la derecha
ROR TEMP ;entonces los leds muestran 1bit con desplazamiento a la DERECHA
SBIS PIND,0x03 ;si se presiona el SW8 se rota R1 a la izquierda
ROL TEMP ;entonces los leds muestran 1bit con desplazamiento a la
IZQUIERDA
SBIS PIND,0x04 ;si se presiona el SW9 se hace un NOT a R1
COM TEMP ;entonces todos los leds se muestran invertidos
SBIS PIND,0x05 ;si se presiona el SW10 se hace un NOT a R1 y se suma 1 en LSB
NEG TEMP ;entonces los leds se invierten y se suma 1 a LSB
SBIS PIND,0x06 ;si se presiona el SW11 se hace un swaap de nibbles en R1
SWAP TEMP ;entonces los leds se alternan en nibles
RETRASO:
DEC DELAY ;retraso1
BRNE RETRASO ;bifurca si R17 no es cero
DEC DELAY2 ;retraso2
BRNE RETRASO ;bifurcación
RJMP LOOP ;siempre repite LOOP
Diseño de la tarjeta experimental UAMI-AVR
49. Proyecto terminal de ingeniería electrónica
Figura 21. Editor de archivo .asm.
7- Ya editado el archivo, ahora procedemos a construir los archivos .hex, .obj, .aps y
.txt entonces usamos la tecla F7 o el icono en la barra de herramientas mostrado en
la figura 22 encerrado en el circulo rojo o en la barra de menús Project y después
Build. Observamos en la ventana de salida en la parte inferior los mensajes después
de compilar el archivo .asm. Si no existen errores entonces el archivo .hex esta listo
para ser cargado en la memoria FLASH o EEPROM del microcontrolador. Al no haber
errores aparecerá un mensaje muy similar a este, resaltamos el resultado final de la
compilación en azul:
Diseño de la tarjeta experimental UAMI-AVR
50. Proyecto terminal de ingeniería electrónica
Building project...
AVRASM: AVR macro assembler version 1.76.4 (Aug 6 2004 07:02:13)
Copyright (C) 1995-2004 ATMEL Corporation
Creating 'E:Archivos de programaAtmelAVR ToolsWORKSD1d1.eep'
Creating 'E:Archivos de programaAtmelAVR ToolsWORKSD1d1.hex'
Creating 'E:Archivos de programaAtmelAVR ToolsWORKSD1d1.obj'
Creating 'E:Archivos de programaAtmelAVR ToolsWORKSD1d1.map'
Assembling 'E:Archivos de programaAtmelAVR ToolsWORKSD1D1.asm'
Including 'e:Archivos de programaAtmelAVR ToolsAvrAssemblerAppnotesM16DEF.INC'
Program memory usage:
Code : 24 words
Constants (dw/db): 0 words
Unused : 0 words
Total : 24 words
Assembly complete with no errors.
Deleting 'E:Archivos de programaAtmelAVR ToolsWORKSD1d1.eep'
Figura 22. Compilando el archivo .asm.
Diseño de la tarjeta experimental UAMI-AVR
52. Proyecto terminal de ingeniería electrónica
Figura 24. Espacio de trabajo del depurador.
9- La siguiente pestaña del Workspace, I/O, nos permite simular todo el espacio de
entrada salida e inclusive todos los periféricos integrados. Podemos visualizar al
ejecutar el programa paso por paso todos los valores en hexadecimal que contienen
los registros de propósito general, así como también los registros del procesador,
figura 25 y 26.
Figura 25. Espacio de trabajo del depurador I/O.
Diseño de la tarjeta experimental UAMI-AVR
53. Proyecto terminal de ingeniería electrónica
Figura 26. Espacio de trabajo del depurador I/O.
10- Para iniciar el depurador podemos ir a la barra de menús en el menú Debug y
seleccionar Start Debugging o hacer clic en el icono encerrado en el circulo rojo,
figura 26.
11- Para iniciar el depurador podemos ir a la barra de menús en Debug y seleccionar
Start Debugging o hacer clic en el icono encerrado en el círculo rojo en la figura 27.
Figura 27. Iniciar el depurador.
Diseño de la tarjeta experimental UAMI-AVR
54. Proyecto terminal de ingeniería electrónica
12- Ahora solo basta con correr paso por paso el programa (F11 paso por paso, ALT+F5
automático, o el resto de las opciones disponibles en el menú Debug) e ir mirando
en el espacio de trabajo algún periférico o los puertos I/O (ver figura 30) o según se
trate de la aplicación en específico, hasta conseguir lo deseado, no sin antes conocer el
conjunto de instrucciones del propio microcontrolador y además el lenguaje
ensamblador para estos microcontroladores, podemos hacerlo en la pagina del
fabricante www.atmel.com donde adicionalmente encontraremos las hojas de
especificaciones de los dispositivos que necesitemos y notas de aplicación. Es
importante mencionar que podemos cambiar el contenido de cualquiera de los
registros en el momento que lo deseemos.
Figura 28. Puertos I/O, bit por bit.
13- Una vez teniendo el código depurado y obteniendo los resultados que deseamos
procedemos a grabar nuestro microcontrolador. Nuestra tarjeta solo soporta la
herramienta AVR Prog, así entonces es conveniente colocar un botón en la barra de
herramientas para posteriores usos, para esto nos dirigimos al menú View, Toolbars
y Customize, figura 29, una vez en la ventana Customize en la pestaña Commands
seleccionamos en Categories Tools y en la ventana contigua AVR Prog… dejamos
presionado el botón del ratón y arrastramos hasta la ubicación que deseemos en la
barra de herramientas, figura 30.
Diseño de la tarjeta experimental UAMI-AVR
60. Proyecto terminal de ingeniería electrónica
Apéndice B
Guía rápida del Ensamblador AVR®
Registros
Los registros son posiciones especiales de almacenamiento, con 8 bits de capacidad. Un
registro tiene la siguiente apariencia:
Un registro puede almacenar valores numéricos de 0 a 255 (positivos sin signo) o entre -128
a 127 (con bit de signo en el bit 7), caracteres ASCII o simples conjuntos de bits sin
relaciones entre ellos.
Existen 32 registros en los microcontroladores AVR®, etiquetados originalmente como R0,
R1,..., R31, pero que pueden ser renombrados usando la directiva .def
.def registroTemporal=r16
Las directivas son útiles para el ensamblador pero en realidad no generan instrucciones
ejecutables. En vez de emplear el nombre r16 se puede acceder con el nombre definido en
la directiva. Así la instrucción
ldi registroTemporal, 150
carga en el r16 de manera inmediata el número 150.
Otra instrucción interesante es el de copiar datos desde un registro a otro con la instrucción
mov. El siguiente código copia el contenido del r16 al registro r20.
mov r20,r16
Obsérvese que el primer registro es siempre el registro destino de la operación.
Existen diferentes tipos de registros.
Así una instrucción del tipo
ldi r15, 15
no sería válida, ya que los únicos registros que permiten cargar un valor de forma inmediata
son los registros del r16 al r31. Es decir, no se puede realizar este tipo de operación con los
registros del r0 al r15. Existe una excepción a esta regla, el comando referido a limpiar los
bits (poner todos los bits a 0)
clr r15
es válido para todos los registros.
Diseño de la tarjeta experimental UAMI-AVR
61. Proyecto terminal de ingeniería electrónica
Aparte del comando ldi, las siguientes instrucciones no pueden emplearse con los registros
r0 a r15:
andi r15,4 ;Realiza el y lógico entre el registro y un número
cbr r14,45 ;Limpia los bits en el registro determinados por una máscara de bits
cpi r13,6 ;Compara el contenido del registro con una constante
sbci r9,7 ;Resta al registro el valor del contenido de la constante y del resultado
;actual del bit de carry
sbr r12,89 ;Coloca a '1' los bits en el registro determinados por una máscara de
;bits
ser r3 ;Coloca todos los bits del registro a 1
subi r15,9 ;Resta al registro el valor del contenido de la constante.
Registros punteros
Un papel especial es desempeñado por las parejas de registros r16:r27, r28:r29 y r30:r31.
Estas parejas de registros de 16 bits son nombrados de una forma especial, X, Y y Z.
Pueden acceder a direcciones de 16 bits en la SRAM (X, Y, Z) o dentro de la memoria del
programa (Z).
La parte alta de la dirección se coloca en el registro de índice más alto, mientras que la
parte baja de la dirección se almacena en el registro de índice más bajo. Estas partes alta y
baja tienen sus propios nombres. Así la parte alta del registro Z (r31) se puede acceder
como ZH mientras que la baja (r30) se puede acceder como ZL.
Ejemplo:
.EQU direccion = RAMEND ;en este comentario indicaremos que RAMEND es
;la dirección más alta en la SRAM
ldi YH,high(direccion) ; carga la parte alta de la dirección
ldi YL,low(direccion) ; carga la parte baja de la dirección
El acceso a direcciones a través de estos registros punteros es muy sencillo. Los siguientes
ejemplos ilustran estos accesos de lectura (ld) y de escritura (st) con el puntero X
ld r1,X ; Lee de la dirección X, sin cambiar el fichero
st X+,r1 ;Escribe en la dirección X, e incrementa el puntero a la siguiente dirección
ld r1,-X ;Decrementa el puntero a la anterior dirección y lee de la dirección X
Para insertar los valores en la memoria de programa se emplean las directivas .DB y .DW
Por ejemplo:
.DB 123,56,34,1 ; una lista de 4 bytes
.DB “Esto es un texto” ; una lista de bytes, cadena de caracteres.
.DW 13454 ; una palabra
Diseño de la tarjeta experimental UAMI-AVR
62. Proyecto terminal de ingeniería electrónica
En las definiciones es recomendable usar un número par de bytes ya que el ensamblador
añadirá un 0 al final, lo cual puede no ser deseado.
En vez de constantes se pueden definir etiquetas (destino de saltos) del siguiente modo,
siempre en la primera columna:
Etiqueta1:
; aquí irían unos comandos
Tabla:
.DW 134,12312
Puertos
Los puertos son puertas entre la unidad de procesamiento central hasta hardware o software
externo. La CPU se comunica con estos componentes, los lee y/o los escribe.
Los puertos tienen direcciones fijas, independientemente del microcontrolador AVR®.
Así, por ejemplo el puerto B se encuentra siempre en la dirección 0x18 (notación
hexadecimal). Por supuesto el programador no tiene necesidad de recordar todas estas
direcciones. Los nombres vienen definidos en un fichero de encabezado para los diferentes
tipos de microcontrolador y que son proporcionados por el fabricante. Estos ficheros ‘include’
tienen una línea para definir la dirección del puerto B como sigue:
.EQU PORTB, 0x18
por lo que solamente se debe recordar el nombre del puerto y no su dirección. El archivo
correspondiente se incluye mediante la siguiente directiva:
.include “8515def.inc”
Los puertos generalmente se organizan en conjunto de 8 bits relacionados entre sí, pero
pueden estar organizados en conjuntos sin relación. En este caso es habitual que cada uno
de los bits tenga su propio nombre y función determinados. Como ejemplo, el registro
MCUCR consiste en un número de bits de control del integrado, cada uno de ellos con sus
nombres (por ejemplo ISC00, ISC01). La forma de enviar un valor determinado a uno de
estos puertos es mediante la instrucción out y mediante el empleo de un registro
intermedio:
ldi r16, 0b00010000 ; ejemplo de configuración binaria
out MCUCR, r16
El caso contrario, el de lectura, se realiza mediante el comando in
in r16, MCUCR
En este caso debemos aclarar que existen algunos puertos que tienen bits que no son
usados o están reservados. En este caso se devuelve un bit a 0.
Es frecuente que se desee poner a 0 ó 1 un bit concreto de un puerto. Una opción para ello
consistiría en leer el registro correspondiente, emplear las operaciones lógicas para alterar el
bit seleccionado y reenviar el byte al puerto. Sin embargo, esto se puede llevar a cabo
mediante las instrucciones sbi (poner el bit a 1) y cbi (poner el bit a 0).
Diseño de la tarjeta experimental UAMI-AVR
63. Proyecto terminal de ingeniería electrónica
Como ejemplos:
.EQU bitCambiado = 5
sbi PortB, bitCambiado
cbi PortB, bitCambiado
Las dos instrucciones tienen una limitación, solamente afectan a puertos con una dirección
inferior a 0x20.
REGISTROS REELEVANTES DE LOS AVR
Componente Nombre del puerto Registro/Puerto
Acumulador SREG Registro de estado
Pila SPL/SPH Puntero de pila
SRAM externa,
interrupción externa
MCUCR Registro de Control General MCU
Interrupción externa
GIMSK
GIFR
Registro de mascara de interrupción
Registro de banderas de interrupción
Interrupción del Timer
TIMSK
TIFR
Registro de mascara de interrupción del timer
Registro de banderas de interrupción del timer
Timer0
TCCR0
TCNT0
Registro de control
Registro de cuenta
Timer1
TCCR1A
TCCR1B
TCNT1
OCR1A
OCR1B
ICR1L/H
Registro A de control
Registro B de control
Registro de cuenta
Registro de comparación A
Registro de comparación B
Registro de captura de entrada
EEPROM
EEAR
EEDR
EECR
Registro de direcciones
Registro de datos
Registro de control
UART
UDR
USR
UCR
UBRR
Registro de datos
Registro de estado
Registro de control
Registro de programación de baudios
Comparador analógico ACSR Registro de control y estado
Puertos de I/O
PORTx
DDRx
PINx
Registro de salida del puerto
Registro de dirección del puerto
Registro de entrada del puerto
RAM estática, SRAM
La SRAM es una memoria que no es accesible directamente por la CPU (ALU) como es el
caso de los registros. Para acceder a esta parte de la memoria se deben emplear los
registros como paso intermedio. Por lo tanto las operaciones que involucran a la SRAM son
más lentas que la de los registros. A partir del modelo AT90S8515 se permite conectar una
RAM externa adicional.
Uno de los casos de empleo más importante de la SRAM es como pila.
El acceso a la SRAM se lleva a cabo mediante las instrucciones STS y LDS.
Diseño de la tarjeta experimental UAMI-AVR
64. Proyecto terminal de ingeniería electrónica
Ejemplos:
STS 0x0060, R1 ; el contenido del registro R1 se copia en la dirección 0x0060
LDS R1, 0x0060 ; el contenido de la dirección 0x0060 se copia en el registro R1
Se suelen emplear nombres simbólicos para evitar emplear direcciones fijas.
.EQU direccionMemoria = 0x0060
STS direccionMemoria, R1
SRAM como pila
El uso más común de la SRAM es como pila. La pila es como una torre de bloques.
Cada bloque que se añade se coloca en el tope de la pila, cada vez que se extrae un dato de
la pila también se saca del tope de pila. Esta estructura es llamada LIFO (last in, first out, el
último en entrar, el primero en salir).
Para emplear la SRAM como pila se necesita definir el puntero de pila. El puntero de pila es
de 16 bits, accesible como un puerto. SPH es la parte más significativa y SPL la parte menos
significativa. Para construir la pila, el puntero se carga con el valor de la dirección más alta
de la SRAM (la pila crece hacia las direcciones más bajas).
ldi r16, HIGH(RAMEND)
out SPH, r16
ldi r16, LOW(RAMEND)
out SPL, r16
El empleo de la pila es sencillo. Los contenidos de los registros pueden volcarse en la pila de
la siguiente forma:
push r16
De modo análogo para extraer elementos de la pila,
pop r16
Un caso especial de uso de las pilas es el de la llamada a las subrutinas. Al llamar a la
subrutina el programa almacena en la pila la dirección de la próxima instrucción a ejecutar
rcall rutina ;saltar a la subrutina
...
rutina:
; aquí las instrucciones de la subrutina
ret ; instrucción de retorno de la subrutina
Directivas
.CODE
Para indicar el comienzo de un código de un programa.
.DSEG
Diseño de la tarjeta experimental UAMI-AVR
65. Proyecto terminal de ingeniería electrónica
La sección de la SRAM en el integrado (datos)
.ESEG
La sección EEPROM
.ORG
Para indicar que el segmento de código o datos comienza en una dirección distinta de la
dada por defecto.
Saltos
La ejecución de un programa es lineal. Sin embargo, las instrucciones de bifurcación
(branches) y los saltos incondicionales alteran esta ejecución lineal. Supóngase que se desea
implementar un contador de 32 bits empleando los registros r1 a r4. El bit más significativo
en r1 se incrementa en 1 (operación inc). Si el registro se desborda, el registro tendrá el
valor de 0 (255+1=0), y se tendrá que sumar 1 al r2. En caso de desbordamiento de r2, se
incrementa r3 y así sucesivamente. Para ello se emplea la instrucción brne.
inc r1
brne sigue
inc r2
brne sigue
inc r3
brne sigue
inc r1
sigue:
Como ejemplo de instrucciones de salto condicional:
brge ; mayor o igual (con bit de signo)
brlt ; menor que (con bit de signo)
Macros
Una macro permite la utilización repetida de secuencias de instrucciones.
Por ejemplo:
.MACRO Delay
nop
nop
nop
nop
.ENDMACRO
; instrucciones
Delay
; más instrucciones
Una macro no ahorra espacio de memoria puesto que al compilar la etiqueta de la macro es
reemplazada por el conjunto de instrucciones correspondientes. Para el caso de querer
ahorrar espacio se emplean las subrutinas.
Diseño de la tarjeta experimental UAMI-AVR
66. Proyecto terminal de ingeniería electrónica
Saltos incondicionales
Aparte del rcall para llamar a las subrutinas, existe otra clase de salto incondicional, el rjmp
saltar directamente a la dirección deseada. Aquí, a diferencia no va a haber un retorno (ret)
a la siguiente instrucción.
Existen unas instrucciones que permiten saltarse (skip) la siguiente instrucción a ejecutar,
por ejemplo:
sbrc r1,7 ;saltarse la siguiente dirección si el bit 7 del registro está a baja
rcall siBitDistinto7 ;ejecutada solamente si el bit 7 está a 0
rcall otro ;ejecutada de todas maneras
Análogamente se encuentra la instrucción sbic para los puertos de entrada/salida
sbic PINB,0 ; saltarse la siguiente instrucción si el bit 0 del puerto b está a baja
Otro tipo de instrucción de skip es la de comparación de registros
cpse r1,r2 ;saltarse la siguiente instrucción si los contenidos de r1 y r2 son
;iguales
INTERRUPCIONES
Con frecuencia se debe reaccionar ante condiciones hardware u otros eventos, por ejemplo
en el cambio de valor de un pin de un puerto (por ejemplo detectar que un usuario ha
pulsado una tecla). Un modo de procesarlo podría consistir en hacer un bucle que lea
continuamente el valor de esa línea. Desgraciadamente, un programa debe hacer en general
más cosas que estar leyendo en un bucle un puerto y no puede permitirse el lujo de ese
bucle. Además en caso de detección de pulsos muy pequeños, el método del bucle es inútil.
Es más adecuado emplear interrupciones.
Las interrupciones se disparan por alguna condición, que debe ser habilitada primero, ya que
todas las interrupciones de hardware se encuentran deshabilitadas por defecto. El
microprocesador posee un bit en su registro de estado para permitir que se procesen las
interrupciones. Para activar / desactivar este bit se emplean las instrucciones sei y cli.
Si la condición de la interrupción se produce, el procesador coloca en la pila, la dirección de
la siguiente instrucción a ejecutar. De este modo, la ejecución del programa puede continuar
después de procesar la interrupción. Después procesa la instrucción correspondiente en su
vector de interrupción, que generalmente es un salto incondicional a la subrutina de
procesamiento de interrupción. El vector de interrupción es una posición dependiente del
procesador.
Existe un orden de prioridad en las interrupciones, de modo que si dos o más interrupciones
habilitadas se producen simultáneamente solamente será procesada la de mayor prioridad.
Las demás simplemente esperarán a que se haya procesado la de prioridad más alta. La
rutina de procesamiento puede terminar con la instrucción RETI.
Diseño de la tarjeta experimental UAMI-AVR
68. Proyecto terminal de ingeniería electrónica
Apéndice D
Programa de aplicación de la tarjeta UAMI-AVR v1.0
El programa de aplicación (código fuente) que se muestra abajo pertenece al archivo a
cargar en el microcontrolador (AT90S2313) de la tarjeta: avr910_2313_v1_0.hex que se
anexa en el documento electrónico.
;*********************************************************************************
;*
;*
;*
;* Tarjeta : programador experimental UAMI_AVR v1.0
;*
;*
;* Leyendas:
;* ---------
;* Signature - es un numero identificador(en bytes) para el chip, el software
;* verificará si es la firma correcta según el dispositivo escogido
;* Code - Código unico del dispositivo usado por AVRProg para identificar avr
;* Flash - Número en bytes en memoria Flash
;* EEProm - Número en bytes en memoria EEProm
;* Lock - Lockbits (modo seguro que es aplicable al dispositivo seleccionado
;* cuando se selecciona la opcion fuse.
;* Fuse - Fusebits (muestra la configuracion de los fusibles, estos no son
;* afectados borrando el dispositivo)
;* PMode - Indica modo de programacion
;*
;* R/W - Acceso de lectura/escritura
;* R - Acceso a lectura solamente
;* W - Acceso a escritura solamente
;* NA - No Accesible
;*
;***************************************************************************
.nolist
.include "2313def.inc" ; Microcontrolador a utilizar
.list
.equ silicon_chip=1 ;Si es 1 Mosi y Miso son cambiadas de in / out
.equ xtal_8MHz=0 ;Si es 0 entonces Xtal = 4MHz
;***************************************************************************
;* CONSTANTES
;* Codigos para identificar los dispositivos
;*
;* DESCRIPCION
;* Los siguientes codigos deben ser usados por la PC. Note que los
;* codigos de los dispositivos son arbitrariamente seleccionados,
;* y nada tienen que ver con el "signature bytes" almacenados en el avr
;***************************************************************************
;Para mayor informacion consulta la nota de aplicacion original AVR910 en
www.atmel.com
Diseño de la tarjeta experimental UAMI-AVR
69. Proyecto terminal de ingeniería electrónica
;los autores: Ole Saether, Terje Frostad, Ingar Fredriksen, Morten W. Lund, Haakon
Skar, Paal Kastnes y las correcciones realizadas por: J. Samperi, sjdavies, sc y
Horacio Paredes. Traducción al español por: Horacio Paredes
;**** Revision de codigos ****
.equ SW_MAJOR = '3' ; Revision del numero mayor
.equ SW_MINOR = '3' ; Revision del numero menor
.equ HW_MAJOR = '1' ; Revision numero Mayor HW
.equ HW_MINOR = '0' ; Revision numero Menor HW
;***************************************************************************
;* MACROS
;* Programacion de Macros
;*
;* DESCRIPCION
;* Cambia los siguientes 4 macros si el RESET cambia de estado en la
;* tarjeta y/o si las señales SCK/MISO/MOSI cambian
;***************************************************************************
.equ resetpin = 4
.macro set_reset
sbi portb,resetpin
.endm
.macro clr_reset
cbi portb,resetpin
.endm
.macro ddrd_init
nop
.endm
.macro ddrb_init
ldi temp1,(0xFF ^ (1<<MISO))
out ddrb,temp1 ; PB5 es entrada, el resto es salida
.endm
.macro ddrb_release
ldi temp1,(1<<resetpin)
out ddrb,temp1 ; PB4 (RESET) es salida, el resto es entrada
.endm
.macro pulse_sck
sbi portb,SCK
ldi temp2,6 ;valor para un cristal de 4MHz
m0:
dec temp2
brne m0
cbi portb,SCK
ldi temp2,3 ;valor para cristal= 4MHz
m1:
dec temp2
brne m1
.endm ;fin de macros
;******************
;* Constantes SPI *
Diseño de la tarjeta experimental UAMI-AVR
70. Proyecto terminal de ingeniería electrónica
;******************
.if silicon_chip
.equ MOSI = 5 ; numero de bit en PORTB
.equ MISO = 6 ; numero de bit en PORTB
.else
.equ MOSI = 6 ; numero de bit en PORTB
.equ MISO = 5 ; numero de bit en PORTB
.endif
.equ SCK = 7 ; numero de bit en PORTB
;**************************
;* Constantes en la UART *
;**************************
.if xtal_8mhz
.equ N = 25 ; 19.2k valor de la velocidad de datos UBRR (cristal de 8MHz)
.else
.equ N = 12 ; 19.2k vel. de Tx UBRR (cristal 4MHz)
.endif
;**********************************
;* Registro de Variables Globales *
;**********************************
.def dev_code = r1 ;Codigo de dispositivo regresado por get_codes
.def pgm_mode = r2 ;modo de programacion para el avr 0 = byte mode
;<> 0 =page mode
.def device = r16 ; Codigo del dispositivo
.def temp1 = r17
.def temp2 = r18
.def s_data = r19 ;datos SPI (programacion en el sistema)
.def u_data = r20 ;datos de la UART
.def addrl = r21 ;orden de la direccion en el byte bajo
.def addrh = r22 ;orden de la direccion en el byte alto
.def cmd3 = r23 ;empleado para registro r30
.def rd_s_data = r24 ;utilizado para registro r31
.def cmd = r25 ;Comando de programacion serial
.def count = r26 ;Variable de tiempo para "entrar al modo de programacion"
.def param1 = r27
.def cmd1 = r28
.def cmd2 = r29
;****************************
;* Vectores de interrupcion *
;****************************
.CSEG
rjmp RESET ; Usamos RESET
;Inicializa la UART
u_init:
ldi temp1,N ; establecer la velocidad en baudios
out UBRR,temp1
ldi temp1,1<<TXEN|1<<RXEN ; inicializa UART para TX y RX
out UCR,temp1
Diseño de la tarjeta experimental UAMI-AVR
71. Proyecto terminal de ingeniería electrónica
ret
putc:
sbis USR,UDRE ; prueba(test) para registro de Tx vacio
rjmp putc ; Loop hasta que Tx sea vacio
out UDR,u_data ; se envia el byte
ret
getc:
sbis USR,RXC ; Espera hasta que el caracter ha sido recibido
rjmp getc
in u_data,UDR ; Se lee el byte de la UART
ret
delay:
ldi temp2,0xff
dl: dec temp2
brne dl
dec temp1
brne delay
ret
;***************************************************************************
;* FUNCION
;* wrser
;*
;* DESCRIPCION
;*
;* Escribe y lee los datos a/o desde la tarjeta SPI
;***************************************************************************
rdser:
clr s_data
wrser:
ldi temp1,8
ldi rd_s_data,0
wrs0:
rol s_data
brcc wrs1
sbi portb,MOSI
rjmp wrs2
wrs1:
cbi portb,MOSI
wrs2:
lsl rd_s_data
sbic pinb,MISO
ori rd_s_data,1
pulse_sck
dec temp1
brne wrs0
mov s_data,rd_s_data
ret
;***************************************************************************
;* FUNCION
;* spiinit (Entra en el modo de programacion)
;*
;* DESCRIPCION
;* Inicializa la interface SPI en el AVR
;***************************************************************************
spiinit:
Diseño de la tarjeta experimental UAMI-AVR
72. Proyecto terminal de ingeniería electrónica
ddrd_init ; inicializa port D
ddrb_init ; inicializa port B
cbi portb,SCK ; limpiamos SCK
set_reset ; ponemos RESET = 1
ldi temp1,0xff ; retardo (0xff);
rcall delay
clr_reset ; ponemos RESET = 0
ldi temp1,0xff ; retardo(0xff);
rcall delay
ldi s_data,0xac ; wrser(0xac)
;// SPI escribe (byte 1)
rcall wrser
ldi s_data,0x53 ; wrser(0x53)
;// SPI escribe (byte 2)
rcall wrser
; // SPI establece Sincronizacion
cpi device,0x20 ; if ( (device >= 0x20) && (device <= 0x7F) )
brlo s2
tst device
brmi s2
s0b:
ldi count,32 ; count = 32; cuenta igual a 32?
s1:
rcall rdser ; if (rdser == 0x53) // SPI lectura (byte 3)
cpi s_data,0x53
breq s3 ; break;
ldi s_data,0x00 ; wrser(0x00); // SPI escribe (byte 4)
rcall wrser
pulse_sck ; pulse SCK
ldi s_data,0xac ;wrser(0xac)
;// SPI escribe (byte 1)
rcall wrser
ldi s_data,0x53 ;wrser(0x53)
;// SPI escribe (byte 2)
rcall wrser
dec count ;} while(--count); decrementamos la cuenta
brne s1
rjmp s3 ; }
; else
s2: ; {
ldi s_data,0x00 ;wrser(0x00);// SPI escribe (byte 3)
rcall wrser
s3: ; }
ldi s_data,0x00 ;wrser(0x00);// SPI escribe (byte 4)
rcall wrser
ldi temp1,0x10 ; pausa(0x10);
rcall delay
ret
;Muestra el ID ("AVR ISP") en la linea serial.
show_id:
ldi zl,low(ID*2) ;Z apunta a la cadena de identificacion ID
ldi zh,high(ID*2)
rcall msg_out
ret
RESET:
ldi temp1,low(RAMEND)
Diseño de la tarjeta experimental UAMI-AVR