Download - 1_Introducción a Los AVR
Objetivo 2
Que el participante conozca la organización de los
microcontroladores AVR y utilice los recursos del
ATMega8 para el desarrollo de aplicaciones,
programando en Lenguaje C.
Contenido 3
1. Organización de los Microcontroladores AVR
2. Programación en Lenguaje C
3. Interrupciones Externas, Temporizadores y PWM
4. Información Analógica
5. Comunicación Serial
6. Manejo de LCD y Teclado Matricial
Curso – Taller
Los Microcontroladores AVR de ATMEL
Organización de los Microcontroladores AVR 1
M. C. Felipe Santiago Espinosa
Abril/2013
Microcontrolador 6
Un Microcontrolador es un Circuito Integrado con
tecnología VLSI, el cual contiene una Unidad Central de
Procesos (CPU), memoria para código, memoria para
datos, además de otros recursos necesarios para el
desarrollo de aplicaciones, por lo general con un
propósito específico.
Un Microcontrolador es de hecho una computadora
completa situada en un único chip.
Un Microcontrolador también suelen ser referidos como
MCU (Micro-Controller Unit).
Microcontroladores AVR de Atmel 9
Los AVR son dispositivos de alto rendimiento. Sus características principales son:
Arquitectura RISC
Arquitectura Harvard
Ejecución de una instrucción en 1 ciclo de reloj
1 MIPS por 1 MHz
Arquitectura del tipo Registro-Registro, con 32 Registros de propósito general
Operación en un rango de voltaje de 1.8 a 5.5 V
Tecnología de memoria sobresaliente, 3 tecnologías diferentes en el mismo dispositivo: Flash, EEPROM y SRAM
Microcontroladores AVR de ATMEL 10
La familia de microcontroladores AVR es numerosa, incluye más de 70
dispositivos que comparten el núcleo, pero difieren en recursos.
XMEGA
megaAVR
tinyAVR
núcleoAVR
Características
Ta
mañ
o
AVR: Alf-Egil Bogen, Vegard Wollan, RISC Processor
El ATMega8 14
Incluye 3 puertos,
todas las terminales
con una función
alterna.
• PB – 8 bits
• PC – 7 bits
• PD – 8 bits
Principales características de un ATMega8
15
Flash para código 8 Kbyte Programación in-system
(ISP) Si
EEPROM para datos 512 Bytes
SRAM para datos 1024 Bytes ADC de 10-bits (canales) 8 (6 en encapsulado PDIP)
Terminales I/O 23 Comparador Analógico Si
Frec. Max. 16 Watchdog Timer Si
Rango de Vcc 2.7-5.5 Oscilador Interno Si
Temporizadores de
16 bits 1
Multiplicador por
Hardware Si
Temporizadores de
8 bits 2 Fuentes de Interrupción 19
Canales PWM 3 Interfaz TWI Si
Reloj de Tiempo
Real Si Interrupciones Externas 2
SPI
Maestro/Esclavo 1
Facilidades para Auto-
Programación Si
USART 1 Encapsulados PDIP 28 TQFP 32 MLF 32
Archivo de Registros 17
Contiene 32 registros de propósito general de 8 bits, habilitados para un acceso rápido.
6 registros pueden ser usados como apuntadores de 16 bits para direccionamiento indirecto en el espacio de datos. Para ello, estos registros se denominan X, Y y Z.
El registro Z también puede usarse como apuntador a la memoria de programa.
Arquitectura Optimizada para ejecutar código C compilado.
7 0 Dir.
R0 0x00
R1 0x01
R2 0x02
. . .
R13 0x0D
R14 0x0E
R15 0x0F
R16 0x10
R17 0x11
. . .
X { R26 (XL) 0x1A
R27 (XH) 0x1B
Y { R28 (YL) 0x1C
R29 (YH) 0x1D
Z { R30 (ZL) 0x1E
R31 (ZH) 0x1F
Memoria Flash para el programa 18
Su tamaño varía entre los miembros de la familia AVR.
Está organizada en palabras de 16 bits porque la mayoría de las instrucciones utilizan una palabra.
Para el ATMega8 es de 8 KB, el rango de direcciones es de 0x000 a 0xFFF.
SRAM
Memoria de datos 20
EEPROM
8 bits
Archivo deRegistros
RegistrosI/O
SRAM depropósitogeneral
32
64
1024
0x000
0x01F0x020
0x05F0x060
0x45F8 bits
0x000
0x1FF
(a) (b)
Son 1120 localidades de 8 bits, incluyen:
- Un Archivo de Registros de 32 localidades.
- 64 Registros I / O.
- 1024 localidades de propósito general.
Memoria SRAM de datos 21
Archivo de Registros
R0
R1
R2
. . .
R29
R30
R31
Registros I/O
0x00
0x01
0x02
. . .
0x3D
0x3E
0x3F
SRAM Interna
0x0060
0x0061
. . .
0x045E
0x045F
Direcciones en el espacio de datos
0x0000
0x0001
0x0002
. . .
0x001D
0x001E
0x001F
0x0020
0x0021
0x0022
. . .
0x005D
0x005E
0x005F
Registros I/O 22
Son 64 Registros e incluyen a los Puertos de Entrada/Salida,
así como registros para la configuración, el control y el estado
de los periféricos con que cuenta el ATmega8.
Registro de ESTADO (SREG: 0x3F o 0x5F)
– I:
– T:
– H:
– S:
– V:
– N:
– Z:
– C:
Habilitador global de Interrupciones,
con un 1 lógico, las interrupciones son habilitadas.
Para respaldo de un bit, se usa con instrucciones de Carga y
Almacenamiento de bits (en ensamblador).
Bandera de acarreo de los 4 bits inferiores (Half)
Bit de signo (Mantiene una XOR entre N y V)
Bandera de Sobreflujo, en operaciones de complemento a dos.
Bandera de Negativo
Bandera de Cero
Bandera de Acarreo
Se generan con operaciones
Aritméticas y lógicas
23
La pila es implementada en el espacio de propósito general (que es de 1024
bytes).
Es usada durante las llamadas de funciones o rutinas para el servicio de
interrupciones.
El registro SP es el apuntador al tope de la pila. Realmente el SP se compone de
2 registros, para la parte alta (SPH) y para la parte baja (SPL), esto para
direccionar al espacio completo de memoria.
La pila tiene un crecimiento hacia abajo, es decir, de las direcciones altas de
memoria a las direcciones bajas.
Al programar en alto nivel, la inicialización del apuntador y el manejo de la pila
quedarán transparentes al programador.
El Apuntador de Pila (SP) 24
$3E
$3D
25
El compilador intentará almacenar a las variables en registros, sin embargo,
si el número de registros no es suficiente empleará a la SRAM de propósito
general.
En bajo nivel se realizarán cargas y almacenamientos. En alto nivel, el
manejo de la memoria queda transparente al programador.
Archivo de Registros
R0
R1
R2
. . .
R29
R30
R31
SRAM Interna
0x0060
0x0061
. . .
0x045E
0x045F
Carga
( )load, LD
Almacenamiento
( )store, ST
Acceso al espacio de propósito general
26
El tamaño de la EEPROM es de 512 bytes en una ATMega8.
Su acceso requiere de 3 registros I/O:
EEAR - Para la dirección (0x1F, 0x1E).
EEDR - Para el dato (0x1D)
EECR - Para el control (0x1C)
El entorno de desarrollo incluye una biblioteca de funciones para su
manejo.
Acceso a la EEPROM
Bits del registro de CONTROL :
– EERIE:
– EEMWE:
– EEWE:
– EERE:
EEPROM Ready Interrupt Enable
En alto habilita la interrupción por EEPROM. La EEPROM genera
una interrupción cuando EEWE es limpiado.
EEPROM Master Write Enable
Determina si la puesta en alto de EEWE producirá una escritura en
la EEPROM. Al ponerse en alto, se cuenta con 4 ciclos para iniciar la
escritura con EEWE, de lo contrario se limpiará automáticamente por
Hardware.
EEPROM Write Enable
Debe ponerse en alto para dar inicio a un ciclo de escritura. Se
limpiará automáticamente por Hardware al finalizar la escritura. Un
programa de usuario puede monitorear este bit o si se pone en alto
a EERIE se producirá una interrupción.
EEPROM Read Enable
Debe ponerse en alto para un ciclo de lectura, se limpiará
automáticamente por Hardware. El dato leído está disponible de
manera inmediata. No es posible realizar una lectura si hay una
escritura en proceso. 27
Función de Escritura en EEPROM :
// Recibe el dato y la dirección a escribir
void EEPROM_write (unsigned char dato,
unsigned int direccion )
{
// Asegura que no hay escritura en proceso
while ( EECR & 1 << EEWE )
;
// Establece la dirección
EEAR = direccion;
// Coloca el dato
EEDR = dato;
// Pone en alto al habilitador maestro
EECR |= ( 1 << EEMWE );
// Inicia la escritura
EECR |= ( 1 << EEWE );
}
28
Función de Lectura en EEPROM :
// Regresa el dato leído, se recibe la dirección
unsigned char EEPROM_read(unsigned int direccion)
{
// Asegura que no hay una escritura en proceso
while ( EECR & 1 << EEWE)
;
// Establece la dirección
EEAR = direccion;
// Inicia la lectura
EECR |= ( 1 << EERE );
// Regresa el dato
return EEDR;
}
29
Puertos de Entrada/Salida 30
Incluye 3 puertos,
todas las terminales
con una función
alterna.
• PB – 8 bits
• PC – 7 bits
• PD – 8 bits
Puertos de Entrada/Salida 31
Para cada puerto se manejan tres registros, dentro del espacio de registros I/O
PORTx: Un registro de lectura/escritura sobre un lacth, conectado a la terminal del puerto. En éste se escribe cuando el puerto está configurado como salida.
DDRx: Un registro de lectura/escritura que define la dirección del puerto. Las direcciones pueden configurarse de manera independiente, para cada terminal.
1 – Salida
0 – Entrada
PINx: Un registro solo de lectura, para hacer lecturas directas en las terminales de los puertos.
Puertos de
Entrada/Salida
El bit PUD (Pull-Up
disable) está en el
registro SFIOR
(Special Function
IO Register).
32
DQ
QCLR
RESET
DDRxn
WDDRx
RDDRx
DQ
QCLR
RESET
PORTxn
WPORTx
RPORTx
RPINx
PUD
DD QQ
PINxn
SINCRONIZACIÓN
SLEEP
clkI/O
Pxn
BU
S D
E D
AT
OS
INTERIOR DELMICROCONTROLADOR
Terminal delPuerto
n x
Puertos de Entrada/Salida
( Configuraciones ) 33
DDRxn PORTxn PUD
(en SFIOR) E/S Pull-Up Comentario
0 0 X Entrada No Entrada sin resistor de Pull-Up
0 1 0 Entrada Si Entrada con resistor de Pull-Up
0 1 1 Entrada No Entrada sin resistor de Pull-Up
1 0 X Salida No Salida en bajo
1 1 X Salida No Salida en alto
Registros para el manejo de los puertos 34
7 6 5 4 3 2 1 0
0x18 PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 PORTB
0x17 DDRB7 DDRB6 DDRB5 DDRB4 DDRB3 DDRB2 DDRB1 DDRB0 DDRB
0x16 PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0 PINB
0x15 - PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 PORTC
0x14 - DDRC6 DDRC5 DDRC4 DDRC3 DDRC2 DDRC1 DDRC0 DDRC
0x13 - PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 PINC
0x12 PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 PORTD
0x11 DDRD7 DDRD6 DDRD5 DDRD4 DDRD3 DDRD2 DDRD1 DDRD0 DDRD
0x10 PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0 PIND
Ejemplos 35
1. Muestre el código requerido para configurar los pines de la parte alta del puerto B como entradas y los de la parte baja como salidas, y habilite los resistores de Pull-Up de las 2 entradas más significativas.
2. Muestre la secuencia de código que configure al puerto B como entrada y al puerto D como salida, para luego transferir continuamente la información del puerto B al puerto D.
Programación en Lenguaje C 2
Curso – Taller
Los Microcontroladores AVR de ATMEL
M. C. Felipe Santiago Espinosa
Abril/2013
El microcontrolador puede ser programado en alto nivel o
directamente en Ensamblador.
A nivel Ensamblador, el repertorio de instrucciones del
ATMega8 incluye 128 instrucciones, las cuales están
organizadas en 5 grupos:
Instrucciones Aritméticas y lógicas (28)
Instrucciones de control de flujo (Bifurcaciones) (34)
Instrucciones de transferencia de datos (35)
Instrucciones para el manejo y evaluación de bits (28)
Instrucciones especiales (3)
La mayoría de las instrucciones son de 16 bits.
Instrucciones 37
Entorno de desarrollo 38
El AVR Studio únicamente incluye al programa ensamblador (AVRASM), sin embargo, proporciona las facilidades para enlazarse con compiladores de lenguaje C desarrollados por alguna fuente diferente a ATMEL.
Instalando al compilador adecuado, desde el mismo entorno será posible la edición de programas, la invocación del compilador con exhibición de resultados, su simulación y depuración en lenguaje C.
Herramienta desarrollada
y distribuida libremente
por ATMEL.
El Compilador de C 40
Avr-GCC es un compilador incluido en una suite conocida como WinAVR, la cual es parte del proyecto GNU.
Después de instalar a la suite, el compilador será llamado automáticamente desde el entorno del AVR Studio cada vez que sea requerido, su uso quedará transparente al programador.
Además del compilador, la suite incluye un conjunto de bibliotecas con funciones enfocadas a los recursos de los AVR.
El compilador está orientado al estándar ANSI C, se pueden emplear a todos los elementos del lenguaje, como tipos de datos y estructuras de control de flujo.
ISIS de Proteus :
• Edición de Esquemáticos
• Simulación Visual de Sistemas
ARES:
• Desarrollo de Circuitos
Impresos
Simulador Visual 41
42
Tipo Tamaño (bits) Rango
char 8 -128 a 127
unsigned char 8 0 a 255
signed char 8 -128 a 127
int 16 -32, 768 a 32, 767
short int 16 -32, 768 a 32, 767
unsigned int 16 0 a 65, 535
signed int 16 -32, 768 a 32, 767
long int 32 -2, 147, 483, 648 a 2, 147, 483, 647
unsigned long int 32 0 a 4, 294, 967, 295
signed long int 32 -2, 147, 483, 648 a 2, 147, 483, 647
float 32 +/- 1.175 x 10-38 a +/- 3.402 x 10+38
double 32 +/- 1.175 x 10-38 a +/- 3.402 x 10+38
Tipos de datos
43
typedef signed char int8_t
typedef unsigned char uint8_t
typedef signed int int16_t
typedef unsigned int uint16_t
typedef signed long int int32_t
typedef unsigned long int uint32_t
Definiciones en WinAVR
Variables: Datos que van a ser leídos o escritos continuamente. La
SRAM es el espacio de almacenamiento por default.
unsigned char x, y;
unsigned int a, b, c;
Si es posible, el compilador utilizará los registros de propósito general
(R0 a R31).
Los apuntadores son manejados en SRAM y hacen referencia a
objetos de SRAM, un ejemplo de declaraciones y uso es:
char cadena[] = "hola mundo";
char *pcad;
pcad = cadena;
44
Datos en SRAM
Constantes: Datos que no cambiarán durante la ejecución normal de
un programa.
Si las constantes se manejan en memoria FLASH se liberarán
espacios significativos de SRAM. Útil para cadenas de texto o tablas
de búsqueda (arreglos con constantes).
Se requiere el uso de la palabra reservada const e incluir al atributo
PROGMEM, definido en la biblioteca pgmspace.h (en WinAVR).
Ejemplos de declaraciones:
const char cadena[] PROGMEM = “Cadena con un mensaje constante”;
const unsigned char tabla[] PROGMEM = { 0x24, 0x36, 0x48, 0x5A, 0x6C };
45
Datos en Flash
La declaración de constantes debe hacerse en un ámbito global.
Para el acceso se utilizan las funciones de la biblioteca pgmspace.h
Ejemplos:
pgm_read_byte(address); // Lee 8 bits
pgm_read_word(address); // Lee 16 bits
pgm_read_dword(address); // Lee 32 bits
Reciben como argumento la dirección del dato en FLASH.
x = pgm_read_byte(&tabla[i]);
Datos en FLASH 46
Es posible el manejo de apuntadores, un apuntador a datos en
memoria FLASH se declara como PGM_P.
La biblioteca incluye funciones que trabajan con bloques completos
de memoria FLASH.
strcpy_P: Sirve para leer una cadena de memoria FLASH y
depositarla en SRAM.
char buf[32]; // Buffer destino, en SRAM
PGM_P p; // Apuntador a memoria FLASH
p = cadena; // p apunta a la cadena en FLASH
strcpy_P(buf, p); // copia de FLASH a SRAM
47
Datos en FLASH
Las variables en las que se requiera conservar su contenido aún en
ausencia de energía, deberán almacenarse en la EEPROM.
Deberá utilizarse el atributo EEMEM, definido en la biblioteca eeprom.h,
también en WinAVR.
Son declaraciones globales y se deben hacer antes de cualquier
declaración enfocada hacia la SRAM.
#include <avr/eeprom.h> //Biblioteca para la EEPROM
EEMEM int contador = 0x1234; // Un entero: 2 bytes
EEMEM unsigned char clave[4] = { 1, 2, 3, 4}; // 4 bytes
En la EEPROM:
34 12 01 02 03 04 FF FF FF . . .
48
Datos en EEPROM
El acceso a los datos en la EEPROM se puede realizar con los
registros EEAR, EEDR y EECR (ver sección anterior).
Sin embargo, en la biblioteca eeprom.h se cuenta con funciones
para realizar el acceso, ejemplos:
eeprom_read_byte: Lee un byte de la EEPROM, en la dirección que
recibe como argumento.
eeprom_write_byte: Escribe un byte en la EEPROM, como
argumentos recibe la dirección y el dato.
También se incluyen funciones para datos de 16 y 32 bits, así como
para el manejo de bloques de memoria.
49
Datos en EEPROM
30
z *= 12; equivale a z = z * 12;
k /= 2; equivale a k = k / 2;
Operadores y expresiones
Operadores Aritméticos
Operador Descripción Ejemplo
* Multiplicación a*b
/ División a/b
% Módulo (residuo) a % b
+ Suma a + b
- Resta a - b
Operadores de Asignación
Operador Descripción Ejemplo
= Asignación
simple
a = b
*= a *= b a = a*b
/= a /= b a = a/b
%= a %= b a = a % b
+= a += b a = a + b
-= a -= b a = a - b
Una expresión es una combinación de variables y operadores.
Una proposición es una expresión finalizada con ;
Una proposición compuesta o bloque debe encerrarse en llaves { }
50
51
Operadores de Incremento/Decremento
Operador Descripción Ejemplo
++ Incremento a++, ++a
-- Decremento a--, --a
En una expresión simple es
equivalente:
a++; <-> ++a;
Sin embargo:
b = a++; // copia e incrementa
b = ++a; // incrementa y copia
Operadores Relacionales
Operador Descripción Ejemplo
< Menor que a < b
> Mayor que a > b
<= Menor o igual
que
a <= b
>= Mayor o igual
que
a >= b
== Igual a == b
!= Diferente (no
igual)
a != b
El resultado de aplicar un operador
relacional es: verdadero o falso.
Los operadores relacionales se
ocupan en estructuras selectivas y
repetitivas.
El lenguaje considera al 0 como
falso y cualquier valor diferente de
0 como verdadero.
31
Operadores Operadores Lógicos (entre expresiones)
Operador Descripción Ejemplo
&& AND lógico a && b
|| OR lógico a || b
! NOT lógico ! a
Para hacer expresiones complejas
combinando expresiones simples.
Cada expresión simple será
verdadera o falsa. Por lo que la
expresión resultante también será:
verdadera o falsa.
Operadores para la manipulación de bits
Operador Descripción Ejemplo
& AND bit a bit a & b
| OR bit a bit a | b
^ OR exclusivo bit a bit a ^ b
<< Desplazamiento a la
izquierda (llena con
ceros)
a = a << 2
>> Desplazamiento a la
derecha
(llena con ceros)
a = a >> 2
~ Complemento a 1 a = ~b
Las variables son
secuencias de 1’s y 0’s.
Con estos operadores
se revisan las variables
bit a bit para generar
información diferente.
En los AVR se emplean
para evaluar o
modificar un bit, sin
considerar los demás
(máscaras).
52
31
Operadores
Operador ternario
Expresión1 ? Expresión2 : Expresión3;
Otros Operadores de Asignación
Operador Descripción Ejemplo
&= a &= b a = a & b
|= a |= b a = a | b
<<= a <<= b a = a << b
>>= a >>= b a = a >> b
^= a ^= b a = a ^ b
Los operadores de
manipulación de bits
también se pueden
combinar para hacer
asignaciones en forma
simplificada.
Único operador con 3 operandos. Se revisa la Expresión1, si es
verdadera se ejecuta la Expresión 2, pero si es falsa se
ejecutará la Expresión3.
53
54
Precedencia y asociatividad de operadores
OPERADORES ASOCIATIVIDAD
( ) [ ] -> Izquierda a derecha
! ~ ++ -- * & (tipo) sizeof (unarios) Derecha a izquierda
* / % Izquierda a derecha
+ - Izquierda a derecha
<< >> Izquierda a derecha
< <= > >= Izquierda a derecha
== != Izquierda a derecha
& Izquierda a derecha
^ Izquierda a derecha
| Izquierda a derecha
&& Izquierda a derecha
|| Izquierda a derecha
?= Derecha a izquierda
= += -= *= /= %= &= ^= |= <<= >>= Derecha a izquierda
13
La programación estructurada es el conjunto de técnicas que
incorporan: Diseño descendente, Recursos Abstractos y
Estructuras.
Esto significa que:
• Todo programa tiene un diseño modular
• Cada módulo se diseña con la metodología descendente
• Cada módulo se codifica utilizando las estructuras de
control básicas
• Secuenciales
• Selectivas
• Repetitivas
(ausencia total de GOTO)
Programación Estructurada 55
13
En un programa estructurado sólo existen dos maneras de
combinar las estructuras de control y son apilándolas y
anidándolas.
Anidadas Apiladas Traslapadas
Programación Estructurada 56
Estructuras de Control
Pseudocódigo:
acción_1
acción_2
…
acción_n
Diagrama de flujo: Código
// Ejemplos
a = conta + 5;
x = y + z;
contador++;
Selección Simple
Pseudocódigo: Diagrama de flujo: Código
si(condición)
acciones
fin_si
if(expresión)
Proposición
Secuenciales
57
Pseudocódigo: Diagrama de flujo: Código
Selección Múltiple
Pseudocódigo: Diagrama de flujo: Código
Selección Doble
si(condición)
acciones1
si_no
accione2
fin_si
if(expresión)
proposición1
else
proposición2
Según_sea (expresión)
valor1: acciones1
valor2: acciones2
. . .
valorn: accionesN
Otros valores:
otras_acciones
fin_segun
switch (expresión){
case exp-const:
proposiciones
case exp-const:
proposiciones
default:
proposiciones
}
58
Pseudocódigo: Diagrama de flujo: Código
Repetitiva por Condición (hacer-mientras)
Pseudocódigo: Diagrama de flujo: Código
Repetitiva por Condición (mientras)
mientras(condición)
acciones
fin_mientras
hacer
acciones
mientras(condición)
do
proposición
while(expresión);
while(expresión)
proposición
59
Pseudocódigo: Diagrama de flujo:
Código
Repetitiva por Contador
para init mientras cond con [inc|dec]
acciones
fin_para
for (expr1; expr2; expr3)
proposición
Generalmente la expresión 1 es una inicialización, la expresión 2 es una
condición y la expresión 3 es un incremento o decremento.
Una estructura Repetitiva por Contador debe utilizarse cuando se conoce de
antemano el número de veces que se repetirá la proposición.
60
1. Empiece con el diagrama de flujo más simple
2. Cualquier rectángulo de acción puede ser
remplazado por dos rectángulos de acción en
secuencia.
3. Cualquier rectángulo de acción puede ser
sustituido por cualquier estructura de control.
4. Las reglas 2 y 3 pueden ser aplicadas tan
frecuentemente como se desee y en cualquier
orden.
Reglas para crear programas estructurados:
61
Proceso de Desarrollo 63
1. Planteamiento del problema
2. Diseño del Hardware (en papel)
3. Diseño del Software (Diagrama de Flujo)
4. Desarrollo del Software (AVRStudio)
5. Simulación Visual (Proteus)
6. Programación del Microcontrolador e Implementación del Hardware
7. Evaluación de resultados
8. Correcciones
1. Parpadeo de un LED
Realice un programa que haga parpadear un LED conectado
en la terminal PB0, considerando ½ segundo encendido y ½
segundo apagado.
64
El WinAVR incluye a la biblioteca <util/delay.h>, la cual cuenta con funciones para
retrasos:
_delay_us(double_ms)
_delay_ms(double_ms)
Para una adecuada operación, se debe indicar la frecuencia de operación del
MCU:
#define F_CPU 1000000UL
Para _delay_ms(double_ms), el retraso máximo es de 262.14 ms/F_CPU, con la
frecuencia en MHz.
Construya una ALU de 4 bits utilizando un ATMega8: Los
operandos se deben leer en el puerto B (nibble bajo para
un operando y nibble alto para el otro operando), el
resultado se debe generar en el puerto D y con los 3 bits
menos significativos del puerto C se debe definir la
operación.
65
PortC[2:0] Operación
000 R = A + B
001 R = A - B
010 R = A * B
011 R = A AND B
100 R = A OR B
101 a 111 R = 0
2. Diseño de una ALU de 4 bits
Desarrolle un programa que lea los 4 bits menos
significativos del Puerto D [PD3:PD0] y genere su código
en 7 segmentos en el Puerto B.
66
3. Decodificador de binario a 7 segmentos
Desarrolle un programa que continuamente revise el
estado de un BOTÓN conectado en el bit 0 del Puerto D,
si el botón es presionado, se debe incrementar un
contador binario que se mostrará en el Puerto B.
Inicialmente la salida deberá tener el valor de 0.
Nota: Al presionar un botón, el usuario tarda entre 200 y
300 ms, que contrasta con las operaciones del MCU, las
cuales están en el orden de µS.
67
4. Contador de eventos
Combine los ejercicios 3 y 4 para que el contador de
eventos genere las salidas en 7 segmentos.
El valor máximo del contador será 15 (en el display se
mostrará F) y de ahí iniciará nuevamente en 0.
68
5. Contador de eventos con salida en un display de 7
segmentos
69
Ejercicios
1. Implemente un sistema que maneje 2 semáforos con los 3 colores básicos (Rojo, Amarillo y Verde), siguiendo la secuencia de tiempos mostrada en la tabla siguiente:
• Para el parpadeo en el color verde, considere medio segundo encendido y medio segundo apagado.
Rojo1 Amarillo1 Verde1 Rojo2 Amarillo2 Verde2 Tiempo (Seg) 1 0 0 0 0 1 10 1 0 0 0 0 parpadeo 5 1 0 0 0 1 0 5 0 0 1 1 0 0 10 0 0 parpadeo 1 0 0 5 0 1 0 1 0 0 5
70
2. Diseñe un decodificador de 3 a 8, es decir, un circuito que reciba 3 entradas y active sólo una de 8 salidas, manejando lógica positiva.
3. Realice un comparador de dos datos de 4 bits (A y B), tomando ambas entradas en el puerto B, nibble bajo para A y nibble alto para B. Genere tres salidas en el puerto C, activando una a la vez, cuando A > B, A == B ó A < B.
4. Codifique los nombres de los integrantes del equipo en 7 segmentos e implemente un circuito con un display y un botón, cuando el circuito se encienda muestre en el display la primera letra, cada vez que el botón se presione avance para mostrar el carácter siguiente. Una vez que se alcance el final, inicie nuevamente con el primer carácter.