1_Introducción a Los AVR

70
LOS MICROCONTROLADORES AVR DE ATMEL Curso - Taller 1 M. C. Felipe Santiago Espinosa Abril/ 2013

Transcript of 1_Introducción a Los AVR

LOS MICROCONTROLADORES

AVR DE ATMEL

Curso - Taller

1

M. C. Felipe Santiago Espinosa Abril/ 2013

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

Libro de

Referencia

4

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).

Organización de un

Microcontrolador

Aplicaciones de los MCU 8

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

11

Organización

de los AVR

Procesamiento de Instrucciones 12

Fase de Ejecución 13

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

Espacios de memoria

16

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.

Vectores de Interrupciones 19

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

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 AVRStudio 39

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

Prácticas de Evaluación 62

M. C. Felipe Santiago Espinosa

Enero/ 2013

Sistemas Mecatrónicos

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.