Vous êtes sur la page 1sur 54

Haltica

Automatizacin

Curso de microcontroladores AVR de ATMEL Programacin en C


Para uso con la tarjeta Titn EX de Haltica.

Ver. 1.1 Noviembre 2007 Rev. B (Marzo 2008) javier.vazquez@haltica.com

www.haltica.com

Tel: 01 (55) 5359 7766

Contenido.
Captulo 1 Introduccin. Microcontrolador y Microprocesador. Arquitectura Abierta y Arquitectura Cerrada Tecnologa RISC y CISC Familia de Microcontroladores AVR de ATMEL..... Comparacin entre microcontroladores Arquitectura de los microcontroladores AVR de ATMEL............................................................. Programador AVR Titn EX de Haltica. IDE de programacin AVR Studio de ATMEL. WinAVR.. Mdulos y libreras de WinAVR....................... Entradas y Salidas. Componentes bsicos del microcontrolador Puertos de entrada salida... Prctica de entradas y salidas Notas... Interrupciones Externas. Interrupciones... Vector de interrupciones del microcontrolador ATmega8... Interrupciones externas... Prctica de interrupcin externa Notas.. Temporizador / Contador Temporizador y Contador Uso del Timer1.. Prctica de Timer1... Uso del Counter0.. Prctica de Counter0 y Timer1.. Notas.. Manejo de un LCD Introduccin... Manejo de un LCD de caracteres.. Prctica de uso de un LCD de caracteres Notas... 1 1 1 2 2 3 4 5 6 6

Captulo 2

7 8 9 11

Captulo 3

12 12 12 14 15

Captulo 4

16 16 18 19 19 22

Captulo 5

23 24 24 29

Captulo 6

Convertidor Analgico Digital Convertidor Analgico-Digital..... Consideraciones del ADC... Configuracin del ADC.... Prctica del ADC.. Notas.. Comparador Analgico Comparador Analgico.... Configuracin del comparador analgico. Prctica de uso del comparador analgico.. Notas.. USART USART... Norma RS-232...... Configuracin de la USART Prctica del USART. Notas.. PWM PWM... Tipos de PWM del microcontrolador ATmega8... Configuracin de la PWM Prctica de PWM.. Notas..

30 30 31 33 35

Captulo 7

36 36 37 39

Captulo 8

40 40 41 43 45

Captulo 9

46 47 48 49 52

1
1.1. MICROCONTROLADOR Y MICROPROCESADOR.

INTRODUCCIN.

Un microprocesador es un conjunto de circuitos electrnicos altamente integrado. Es utilizado como una unidad central de procesos (CPU). Las partes que componen a un microprocesador son: unidad aritmtica lgica (ALU), registros de almacenamiento, unidad de control, unidad de ejecucin, memoria cache y buses de datos. Un microcontrolador es un circuito integrado que incluye las tres unidades bsicas de un ordenador: CPU, memoria y unidades de entrada salida (I/O). Tiene prestaciones limitadas pero un alto nivel de especializacin. Un microcontrolador requiere de un mnimo de componentes externos para ponerlo en funcionamiento. Un microcontrolador tpico posee memoria RAM/ROM/EPROM/EEPROM, dispositivos de IO como convertidores analgico-digital (ADC), modulacin de ancho de pulso (PWM), 2 temporizadores (timers), UARTs y buses de interfaz especializados como SPI, I C, TWI, CAN, USB, ZigBee, LCD, etc.

1.2. ARQUITECTURA ABIERTA Y ARQUITECTURA CERRADA.


Una arquitectura abierta es aquella que puede ampliarse despus de la construccin de un sistema, generalmente aadiendo circuitos adicionales, por ejemplo aadiendo mdulos de memoria o conectando al sistema principal un chip con un nuevo microprocesador. En la arquitectura abierta, las especificaciones del sistema se hacen pblicas, lo que permite que otras empresas puedan fabricar los productos de expansin. Una arquitectura cerrada es aquella que es lo opuesto a una arquitectura abierta, es decir, suelen utilizarse en computadoras o equipos especializados que no requieren de ampliaciones.

1.3. TECNOLOGA RISC Y CISC.


1.3.1. RISC (Reduced Instruction Set Computer). Significa computadora con conjunto de instrucciones reducido. Su objetivo es contar con un conjunto simple de instrucciones que puedan realizarse en el menor tiempo posible. 1.3.2. CISC (Complex Instruction Set Computer). Significa computadora con conjunto de instrucciones complejo. Su objetivo es realizar tareas en pocas instrucciones. Para ilustrar la diferencia entre CISC y RISC observemos el siguiente ejemplo:
1

Se requiere realizar una operacin de multiplicacin: A = B x C RISC Cdigo:


load A,scr1 load B,scr2 mul A,B store C,A

CISC Cdigo:
mult A,B

Descripcin: Carga el valor scr1 en el registro A Carga el valor scr2 en el registro B Multiplica A x B Guarda A en dest

Descripcin: Multiplica los registros A x B y guarda el valor directamente en el registro C

Tabla 1.1 Comparacin entre tecnologa RISC y CISC.

1.4. FAMILIA DE MICROCONTROLADORES AVR DE ATMEL .


Dispositivos CMOS de 8 bits basados en tecnologa RISC, capaces de ejecutar instrucciones en cada ciclo de reloj y una estructura bien definida de I/O que limitan el uso de componentes externos. Poseen osciladores internos, timers, USART, SPI, PWM, ADC, watch-dog timers, comparadores analgicos entre otras cosas. Soportan programacin en ensamblador y en lenguaje C. programacin ISP (In-System Programming). Alto desempeo y bajo consumo de poder (<1A en estado apagado, 1.1mA en activo). Cuentan con una gama de instrucciones sencillas que operan con 32 registros de propsito general.

1.5. COMPARACIN ENTRE MICROCONTROLADORES.


A continuacin se presentan algunos datos comparativos entre diferentes microcontroladores.
Tarea a realizar. Suma de 16 bits Multiplicacin de 16 bits Divisin de 16 bits Multiplicacin de 32 bits Resta de 32 bits Ordenamiento de burbuja Movimiento y comparacin de bloques de memoria Saltos condicionales Pushing & Poping Tiempo empleado para desarrollar la tarea (en s). MSP430 ATmega323 PIC18F452 Rabbit (TI) (Atmel) (Microchip) 2000 27 40.4 71.6 63.6 72.4 480 182 57.2 992 6750 131.2 314 60.8 538 191 75.6 834 5800 143.6 258 193 940 344 76.4 3330 12400 169 412 80 608 286 172 6380 6360 242 426

8Mhz 8Mhz 20Mhz 22.1Mhz Frecuencia de la prueba: Tabla 1.2 Comparativo entre diferentes familias de microcontroladores 1

Fuente: http://www.freertos.org

1.6. ARQUITECTURA DE LOS MICROCONTROLADORES AVR DE ATMEL.


1.6.1. ALU Unidad Aritmtica y Lgica. La ALU Opera en conexin directa con los 32 registros de propsito general del AVR. Est dividida en 3 categoras: aritmtica, lgica y funciones de bits. Soportando inclusive operaciones de multiplicacin en algunos dispositivos. 1.6.2. Status Register (Registro de Estatus). Contiene informacin acerca de las operaciones aritmticas realizadas ms recientemente. Esta informacin puede ser utilizada para alterar el flujo del programa o realizar operaciones condicionales.

Figura 1.1 Registro SREG

Bit 7 I: Habilitacin global de interrupciones. Bit 6 T: Almacenamiento del bit copia. Bit 5 - H: Bandera de medio acarreo Bit 4 S: Bandera de signo, S=NV Bit 3 V: Bandera de sobreflujo de complemento a 2 Bit 2 N: Bandera negativa Bit 1 Z: Bandera de cero Bit 0 C: Bandera de acarreo

1.6.3.

Registros de propsito general.

Figura 1.2 Registros de propsito general.

1.6.4. Stack Pointer (Apuntador de pila). Es usada para almacenar direcciones de regreso despus de interrupciones o llamadas a subrutinas; as como para almacenar datos temporales o variables locales. El stack pointer siempre apunta a la parte ms alta de la pila de datos de la SRAM. El espacio del stack debe ser definido por el usuario antes de la ejecucin de un regreso de interrupcin o subrutina.

Figura 1.3 Stack pointer.

1.6.5.

Organizacin de memoria.

Figura 1.4 Organizacin de memoria Flash (izq.) y memoria SRAM (der.)

1.7. PROGRAMADOR AVR TITN EX DE HALTICA.


El programador AVR Titn EX de Haltica es un programador ISP, lo que significa que el microcontrolador es reprogramable en toda su memoria an montado en la placa de circuito impreso de la aplicacin final. Es posible reprogramar el microcontrolador va ISP a travs de un protocolo SPI de 4 pines (RESET, SCK, MOSI, MISO).

Figura 1.5 Terminales de programacin AVR Titn EX

1.8. IDE DE PROGRAMACIN AVR STUDIO DE ATMEL.


El ambiente integrado de desarrollo o IDE (Integrated Development Environment) AVR Studio de ATMEL es el software que su utiliza para programar y depurar aplicaciones en microcontroladores AVR bajo las plataformas Windows 98/XP/ME/2000/NT. Posee interfaz para manejo de proyectos, editor de cdigo fuente y emulador

Figura 1.6 IDE AVR Studio 4.12

1.9. WINAVR.
WinAVR es una suite de archivos ejecutables, de cdigo abierto, para el desarrollo de aplicaciones basadas en microcontroladores AVR de ATMEL, que corre en la plataforma de Windows. Incluye el compilador GNU GCC para C y C++. WinAVR, incluye todo lo necesario para el desarrollo en microcontroladores AVR, incluyendo el compilador (avr-gcc), depurador (avr-gdb) entre otros. WinAVR corre bajo la misma plataforma de desarrollo AVR Studio de ATMEL.

1.10. MDULOS Y LIBRERAS DE WINAVR.


Algunos de los mdulos que maneja WinAVR son: Utilidades de soporte para Bootloader Cmputo de CRC. Bucles de retraso / espera. Manejo de EEPROM Manejo de reloj Watchdog. Matemticas. Interrupciones y seales. Tipos estndar para enteros.

Entre otros. Para trabajar con WinAVR, se requiere la inclusin de las libreras que uno necesite. Estas pueden ser: io.h interrupt.h

Las cuales se encuentran dentro de la subcarpeta avr. Para incluirlas en nuestro proyecto, basta con hacer una inclusin de archivos .h tradicional de C / C++: #include <avr/io.h> #include <avr/interrupt.h>

ENTRADAS Y SALIDAS.

2.1. COMPONENTES BSICOS DEL MICROCONTROLADOR.


Un microcontrolador AVR requiere de muy pocos componentes externos para poder empezar a utilizarlo. Estos componentes son el circuito de reset y el circuito de reloj. Inclusive, llegando a ser estos, componentes opcionales en algunos microcontroladores. 2.1.1. Reloj. Para el funcionamiento del AVR, se requiere una fuente de pulsos de reloj, la cual se encargue de suministrar al AVR con una frecuencia de trabajo al reloj del CPU del microcontrolador. Este reloj de CPU est ligado a los mdulos de los registros de propsito general, registro de estado, registros de memoria de datos entre otros. Al detener el reloj del CPU, se inhibe al ncleo para realizar operaciones o clculos. Una fuente de reloj externa confiable, es un cristal o un oscilador. La conexin de un cristal como fuente de reloj del AVR se muestra en la figura 2.1. El microcontrolador ATMEGA8, tiene la caracterstica de que puede utilizar una fuente de reloj interna, precalibrada para frecuencias de 1Mhz, 2 Mhz, 4 Mhz y 8 Mhz.

2.1.2. Reset. El circuito de reset es aquel que permite regresar todos los registros de entradas y salidas a sus valores iniciales y empezar a ejecutar el programa en el vector de reset. Cuando una fuente de reset se activa, todos los puertos de entradas y salidas regresan inmediatamente a sus estados iniciales; sin requerir ningn ciclo de reloj. Una vez que todas las fuentes de reset son desactivadas, transcurre un ciclo de espera (retardo), que amplia la duracin del reset interno, permitiendo que las fuentes de poder alcancen un nivel estable antes de comenzar con las operaciones normales. Este tiempo de espera puede ser seleccionado por el usuario a travs de los bits fusibles de CKSEL. Un circuito bsico de reset y de un cristal externo es el siguiente:

Figura 2.1 Circuito de reset y cristal como fuente de reloj

Las fuentes de reset del microcontrolador ATMEGA8 son las siguientes: Reset de energizado: Cuando el voltaje de la fuente es aplicado por primera vez. Reset externo: Cuando se aplica un nivel lgico bajo al pin de RESET Reset por watchdog: Cuando expira el contador del watchdog (si es que esta habilitado) Reset Brown-out: Reset de proteccin ante cadas de tensin. (si es que esta habilitado)

2.2. PUERTOS DE ENTRADA SALIDA.


El AVR ATmega8 consiste de 3 puertos de entrada y salida (IO). Cada puerto de entrada / salida (I/O) consiste de 3 registros: DDRx, PINx y PORTx. 2.2.1. Registro DDRx. El registro DDRx configura la direccin. Escribir un uno a un bit de este registro, configura el pin correspondiente al bit como una salida. Escribir un cero lo hace entrada. 2.2.2. Registro PINx. Lee el estado de PORTx, independientemente del estado de DDRx. Bsicamente sirve para leer el estado del pin del puerto cuando este se ha configurado como entrada. 2.2.3. Registro PORTx. Si el pin esta configurado como salida, escribir un uno o un cero en el bit correspondiente de este registro, ocasiona que la salida en este pin sea uno o cero.

Si el pin esta configurado como entrada, escribir un uno en el bit correspondiente de este registro, habilita la resistencia de pull-up. Escribir un cero, estando configurado como entrada, deshabilita la resistencia de pull-up.

2.3. PRCTICA DE ENTRADAS Y SALIDAS.


2.3.1. Objetivo. Conocer las secciones que conforman un programa, as como registros que se utilizan para el direccionamiento de entradas y salidas. 2.3.2. Desarrollo Arme el circuito de la figura 2.2.

Figura 2.2 Circuito para prueba de entradas y salidas.

2.3.3.

Cdigo
INICIO DE PROGRAMA

//------------------------------#include <avr/io.h> #define #define #define #define step1 step2 step3 step4 8 4 2 1 // // // //

void config_io(void){ DDRC=0x0F; DDRD=0b11111011; PORTD=_BV(PD2); }

funcin de configuracin de IO Configuracin puertos de IO PD2 como entrada activar resistencia de pull-up en PD2

void retardo(void){ // funcin de retardo int i; // declaracion de entero de 16 bits for(i=0; i<25000; i++); } void secuencia1(void){ PORTC=step1; retardo(); PORTC=step2; retardo(); PORTC=step3; retardo(); PORTC=step4; retardo(); } void secuencia2(void){ PORTC=step4; retardo(); PORTC=step3; retardo(); PORTC=step2; retardo(); PORTC=step1; retardo(); } // funcin para secuencia de IO 1

// funcin para secuencia de IO 2

void main(void){ // funcin principal config_io(); // llamada a funcin config_io while(1){ switch(PIND) { case(4): secuencia1(); break; case(0): secuencia2(); break; } } } //------------------------------FIN DE PROGRAMA

10

2.4. NOTAS.

11

3
3.1. INTERRUPCIONES.

INTERRUPCIONES EXTERNAS.

La base de una interrupcin es la necesidad de un dispositivo perifrico de enviar informacin al procesador principal del sistema. A nivel operativo, una interrupcin tiene la ventaja de que delega la responsabilidad de comunicarse con el procesador al dispositivo perifrico en lugar de gastar tiempo de operacin en sondear el estado de dicho perifrico.

3.2. VECTOR DE INTERRUPCIONES DEL MICROCONTROLADOR ATMEGA8.


La tabla 3.1 muestra la ubicacin en la memoria del microcontrolador del vector de interrupciones.
Direccin 0x000 0x001 0x002 0x003 0x004 0x005 0x006 0x007 0x008 0x009 0x00A 0x00B 0x00C 0x00D 0x00E 0x00F 0x010 0x011 0X012 Descripcin Pin de reset, BOD Reset, Watchdog Reset, Power-on Reset SIG_INTERRUPT0 Requerimiento de interrupcin externa 0 SIG_INTERRUPT1 Requerimiento de interrupcin externa 1 SIG_OUTPUT_COMPARE2 Timer/Counter 2 Igualdad en comparacin SIG_OVERFLOW2 Timer/Counter 2 Sobreflujo SIG_INPUT_CAPTURE1 Timer/Counter 1 Evento de captura SIG_OUTPUT_COMPARE1A Timer/Counter 1 Igualdad en comparacin A SIG_OUTPUT_COMPARE1B Timer/Counter 1 Igualdad en comparacin B SIG_OVERFLOW1 Timer/Counter 1 Sobreflujo SIG_OVERFLOW0 Timer/Counter 0 Sobreflujo SIG_SPI Transferencia serial completa SIG_USART0_RECV Recepcin completa de la USART SIG_USART0_DATA Buffer de datos vaco de la USART SIG_USART_TRANS Transferencia completa de la USART SIG_ADC Conversin analgico - digital completa SIG_EEPROM EEPROM lista SIG_COMPARATOR Comparador analgico SIG_2WIRE_SERIAL Interfaz serial Two-Wire (I2C) SIG_SPM_READY Almacenamiento de memoria de programa listo Tabla 3.1 Seales de interrupcin microcontrolador ATMEGA8 para WinAVR. Nombre de la seal

3.3. INTERRUPCIONES EXTERNAS.


Las interrupciones externas del microcontrolador ATmega8 son activadas por las direcciones 0x001 y 0x002 (SIG_INTERRUPT0 y SIG_INTERRUPT1), que se encuentran en PD2 y PD3 (pines 4 y 5). Destaca el hecho de que estas interrupciones son activadas an cuando los pines estn configurados como salidas; lo que provee una forma de generar interrupciones va software.

12

Las interrupciones externas pueden ser activadas por flancos de subida, flancos de bajada o un nivel lgico bajo. Esto es configurable a travs del registro MCUCR. 3.3.1. MCUCR, registro de control del microcontrolador.

Figura 3.1 Registro MCUCR.

Para la configuracin de las interrupciones externas, se ocupan los 4 primeros bits de este registro. Estos bits tienen las siguientes funciones: Bit 3,2 ISC11, ISC10: Bits de control de sensado de interrupcin externa 1. Estos bits controlan la forma en la que se activara la interrupcin externa 1 y su configuracin es igual que la de los bits 1,0 Bit 1,0 ISC01, ISC00: Bits de control de sensado de interrupcin externa 0. La interrupcin externa 0 es activada por el pin correspondiente a INT0 (PD2), siempre y cuando el bit I del registro SREG y su correspondiente mscara de interrupcin estn activados. La tabla 3.2 muestra las posibles configuraciones para disparar la interrupcin 0.
ISC01 0 0 1 1 ISC00 0 1 0 1 Descripcin Un nivel bajo en INT0 genera una interrupcin. Cualquier cambio lgico en INT0 genera una interrupcin. Un flanco de bajada en INT0 genera una interrupcin. Un flanco de subida en INT0 genera una interrupcin. Tabla 3.2 Control de sensado de INT0

3.3.2.

GICR, registro de control de interrupciones.

Figura 3.2 Registro GICR

Bit 7 INT1: Habilitacin de interrupcin externa 1. Si el bit I del SREG esta en uno y este bit se pone en uno; se habilita la interrupcin externa 1. Bit 6 INT0: Habilitacin de interrupcin externa 0. Si el bit I del SREG esta en uno y este bit se pone en uno; se habilita la interrupcin externa 0.

3.3.3. GIFR Registro de banderas de interrupciones generales.

Figura 3.3 Registro GIFR

Bit 7 INTF1: Cuando un evento dispara la interrupcin externa 1, este bit de bandera se pone en uno. Si estn activados los bit I de SREG e INT1 de GICR, al activarse este bit se ejecuta un salto al vector de interrupciones. Este bit es limpiado por hardware al ejecutarse la rutina de interrupcin. Bit 6 INTF0: Igual que INTF0 pero es activado al disparase la interrupcin externa 0.

13

3.4. PRCTICA DE INTERRUPCIN EXTERNA.


3.4.1. Objetivo Conocer el funcionamiento de una interrupcin, como se conforma el vector de interrupciones y los registros que intervienen en el uso de las interrupciones externas. 3.4.2. Desarrollo Para la realizacin de esta prctica, utilizaremos el circuito de la figura 2.2 3.4.3. Cdigo
INICIO DE PROGRAMA

//------------------------------#include <avr/io.h> #include <avr/interrupt.h> #define #define #define #define step1 step2 step3 step4 8 4 2 1 // // // // // // //

void config_io(void){ DDRC=0x0F; DDRD=0b11111011; PORTD=_BV(PD2); MCUCR=_BV(ISC01); GICR=_BV(INT0); sei(); }

funcin de configuracin de IO Configuracin puertos de IO PD2 como entrada activar resistencia de pull-up en PD2 seleccin de comportamiento para INT0 activacin de interrupcin externa 0 activacin de interrupciones globales

void retardo(void){ // funcin de retardo int i; // declaracion de entero de 16 bits for(i=0; i<25000; i++); } void secuencia1(void){ PORTC=step1; retardo(); PORTC=step2; retardo(); PORTC=step3; retardo(); PORTC=step4; retardo(); } ISR(SIG_INTERRUPT0){ PORTC=step4; retardo(); PORTC=step3; retardo(); PORTC=step2; retardo(); PORTC=step1; retardo(); } // funcin para secuencia de IO 1

// interrupcin para secuencia de IO 2

void main(void){ // funcin principal config_io(); // llamada a funcin config_io while(1){ secuencia1(); } } //------------------------------- FIN DE PROGRAMA 14

3.5. NOTAS.

15

TEMPORIZADOR / CONTADOR.

4.1. TEMPORIZADOR Y CONTADOR.


Un temporizador, es un reloj especializado, que normalmente se ocupa para controlar la secuencia de un evento o proceso. Un contador es, en trminos generales, un dispositivo que almacena el nmero de veces que un evento se lleva a cabo. Un temporizador de un AVR, es un contador que almacena en un registro el nmero de pulsos de reloj que ocupa como base de tiempo y que, al llegar a un valor de sobreflujo (overflow), normalmente genera una interrupcin. Por otro lado, el contador del AVR es un registro que se compara constantemente contra otro registro y que al igualarse el valor de ambos normalmente genera una interrupcin. El AVR ATmega8 posee 3 timers, dos de ellos (timer0 y timer2) son de 8 bits; mientras que uno de ellos (timer1) es de 16 bits.

4.2. USO DEL TIMER1.


4.2.1. Registro de cuenta TCNT1.

Figura 4.1 Registro TCNT1

Este es el registro encargado de llevar la cuenta de los pulsos de reloj. 4.2.2. Registros de Control A, TCCR1A.

Figura 4.2 Registro TCCR1A

16

Bit 7:6 COM1A1:0 Modo de salida de comparacin para canal A. Bit 5:4 COM1B1:0 Modo de salida de comparacin para canal B. Bit 3 Forzamiento de salida de comparacin, canal A. Bit 2 Forzamiento de salida de comparacin, canal B. Bit 1:0 WGM11:10 Modo de generacin de formas de onda.

4.2.3.

Registro de Control B, TCCR1B.

Figura 4.3 Registro TCCR1B

Bit 7 ICNC1 Cancelador de ruido en entrada de captura. Bit 6 ICES1 Seleccionador de flanco de activacin para entrada de captura. Bit 5 Reservado Bit 4:3 WGM13:12 Modo de generacin de formas de onda. Bit 2:0 CS12:10 Fuente de reloj para el timer 1. Estos ltimos tres bits, configuran la fuente de reloj que utilizar el timer 1, de acuerdo a la siguiente tabla.
CS12 0 0 0 0 1 1 1 1 CS11 CS10 Descripcin 0 0 Sin fuente de reloj, (Timer/Counter detenido) 0 1 clkIO/1 (sin pre-escalamiento) 1 0 clkIO/8 1 1 clkIO/64 0 0 clkIO/256 0 1 clkIO/1024 1 0 Fuente externa en el pin T1, flanco de subida 1 1 Fuente externa en el pin T1, flanco de bajada Tabla 4.1 Bits de seleccin de fuente de reloj.

4.2.4.

Registro de Mscaras de Interrupcin del Timer/Counter, TIMSK.

Figura 4.7 Registro TIMSK.

Bit 5 TICIE1 Habilitacin de interrupcin por entrada de captura 1. Bit 4 OCIE1A Habilitacin de interrupcin por salida de comparacin 1, canal A. Bit 3 OCIE1B Habilitacin de interrupcin por salida de comparacin 1, canal B. Bit 2 TOIE1 Habilitacin de interrupcin por desbordamiento del timer 1.

17

4.2.5.

Registro de banderas de interrupciones del Timer/Counter, TIFR.

Figura 4.8 Registro TIFR.

Bit 5 ICF1 Bandera de entrada de captura 1. Bit 4 OCF1A Bandera de salida de comparacin 1, canal A. Bit 3 OCF1B Bandera de salida de comparacin 1, canal B. Bit 2 TOV1 Bandera de desbordamiento del timer 1.

4.3. PRCTICA DE TIMER1.


4.3.1. Objetivo. Comprender el funcionamiento de los timers del AVR ATmega8 as como los registros que intervienen en su configuracin. 4.3.2. Desarrollo. Para la realizacin de esta prctica utilizaremos el circuito de la figura 2.2. 4.3.3. Cdigo.
INICIO DE PROGRAMA

//------------------------------#include <avr/io.h> #include <avr/interrupt.h> #define #define #define #define step1 step2 step3 step4 8 4 2 1

static int step; void config_io(void){ DDRC=0x0F; TCCR1B=_BV(CS11); TIMSK=_BV(TOIE1); sei(); } // // // // // funcin de configuracin de IO Configuracin puertos de IO pre-escala para el timer 1 (clk/8) activar interrupcin por sobre flujo de timer1 activacin de interrupciones globales

ISR(SIG_OVERFLOW1){ // interrupcin por sobre flujo timer 1 step++; switch(step){ case(1): PORTC=step4; break; case(2): PORTC=step3; break; case(3): PORTC=step2; break; case(4): PORTC=step1; step=0; break; } }

18

void main(void){ // funcin principal config_io(); // llamada a funcin config_io while(1); } //------------------------------- FIN DE PROGRAMA

4.4. USO DEL COUNTER0.


Ahora veremos como configurar el counter0 del AVR. Este timer/counter es de 8 bits. Veremos que su configuracin es de forma anloga a la del Timer1, ya que los registros para su configuracin son similares. 4.4.1. Registro de Control del Timer 0, TCCR0.

Figura 4.9 Registro TCCR0.

Bit 2:0 CS02:CS00 Fuente de reloj para el Timer/Counter0

4.4.2.

Registro de cuenta 0, TCNT0.

Figura 4.10 Registro TCNT0.

4.4.3.

Registro de mascara de interrupciones del Timer/Counter, TIMSK y Registro de banderas de interrupcin del Timer/Counter, TIFR.

Son los mismos registros que se utilizaron para configurar el Timer1, la diferencia radica en seleccionar los bits adecuados para el Timer0.

4.5. PRCTICA DE COUNTER0 Y TIMER1.


4.5.1. Objetivo. Comprender el funcionamiento de los contadores del AVR ATmega8 as como los registros que intervienen en su configuracin. 4.5.2. Desarrollo. Arme el circuito de la figura 4.11

19

Figura 4.11 Circuito para prueba de timer / counter.

4.5.3.

Cdigo.

Realice las siguientes modificaciones adecuadas al cdigo de la seccin 4.3.4:


;------------------------------#include <avr/io.h> #include <avr/interrupt.h> #define #define #define #define step1 step2 step3 step4 8 4 2 1 INICIO DE PROGRAMA

int step; void config_io(void){ // funcin de configuracin de IO DDRC=0x0F; // Configuracin puertos de IO DDRD=0b11101111; // PD4 como entrada PORTD=_BV(PD4); // resistencia de pull up en PD4 TIMSK=_BV(TOIE0); // activar interrupcin por sobre flujo de timer0 TCCR0=_BV(CS02)|_BV(CS01); // fuente externa, flanco de bajada TCNT0=251; // cargar 251 al registro de cuenta del timer/counter0 sei(); // activacin de interrupciones globales } void config_timer1(void){ TCCR1B=_BV(CS11); // pre-escala para el timer 1 (clk/8) 20

TIMSK=_BV(TOIE1); }

// activar interrupcin por sobre flujo de timer1

ISR(SIG_OVERFLOW1){ // interrupcin por sobre flujo timer 1 step++; switch(step){ case(1): PORTC=step4; break; case(2): PORTC=step3; break; case(3): PORTC=step2; break; case(4): PORTC=step1; step=0; break; } } ISR(SIG_OVERFLOW0){ config_timer1(); } void main(void){ // funcin principal config_io(); // llamada a funcin config_io while(1); };------------------------------- FIN DE PROGRAMA

21

4.6. NOTAS.

22

5
5.1. INTRODUCCIN.

MANEJO DE UN LCD.

Un Display de Cristal Lquido o LCD por sus siglas en ingles Liquid Cristal Display es un elemento muy utilizado en la industria como interfaz para mostrar informacin acerca del estado de un proceso a un usuario. Existen dos tipos principales de LCDs, los LCDs de caracteres (figura 5.1) y los grficos (figura 5.2). Y dentro de estos, existen variantes en el tamao, lneas en pantalla, iluminacin, protocolo de comunicacin (RS232, I2C, paralelo), etc. Los LCDs son dispositivos con un procesador interno que administra las operaciones de datos. En un LCD se puede escribir y leer datos de la pantalla, asimismo se pueden generar caracteres personalizados para ser desplegados en la pantalla, si requieres de datos mas tcnicos puedes visitar la pgina www.hantronix.com.

Figura 5.1 LCD de caracteres.

Figura 5.2 LCD grfico. 23

5.2. MANEJO DE UN LCD DE CARACTERES.


Para esta prctica utilizaremos una pantalla LCD de caracteres de 2x16 con un protocolo de comunicacin paralelo de 4 bits de datos y 3 de control. Para empezar a utilizar un LCD, este requiere de una inicializacin; esta inicializacin esta basada en la carta de tiempos de la figura 5.3. Dependiendo de si se utilizarn 8 bits de datos y 3 de control o 4 de datos y 3 de control.

Figura 5.3 Carta de tiempos para la inicializacin de un LCD.

5.3. PRCTICA DE USO DE UN LCD DE CARACTERES.


5.3.1. Objetivo. Conocer el funcionamiento de un LCD de caracteres, proveer al estudiante de una coleccin de funciones sencillas y de fcil manejo para el envo de datos al LCD.

24

5.3.2. Desarrollo. Arme el circuito de la figura 5.4.

Figura 5.4 Circuito para prueba de LCD.

5.3.3.

Cdigo.
INICIO DE PROGRAMA

//------------------------------#include <avr/io.h> #include lcd.h

void main(void){ lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_gotoxy(5,0); lcd_puts("Haltica\n"); lcd_puts(" Automatizacion"); while(1); } //------------------------------- FIN DE PROGRAMA

//------------------------------/* prototipo de funciones */ void lcd_init(char dispAttr); void lcd_clrscr(void); void lcd_command(char cmd); void lcd_putc(char c); void lcd_puts(char *s);

INICIO DE LIBRERA lcd.h

/* Definiciones de puertos y pines #define LCD_DATA4_PORT PORTD // #define LCD_DATA5_PORT PORTD // #define LCD_DATA6_PORT PORTD // #define LCD_DATA7_PORT PORTD // #define LCD_RS_PORT PORTD // #define LCD_RW_PORT PORTD // #define LCD_E_PORT PORTD //

*/ puerto puerto puerto puerto puerto puerto puerto

para para para para para para para

bit de datos bit de datos bit de datos bit de datos linea RS linea RW linea ENABLE

0 1 2 3

25

#define #define #define #define #define #define #define

LCD_DATA4_PIN LCD_DATA5_PIN LCD_DATA6_PIN LCD_DATA7_PIN LCD_RS_PIN LCD_RW_PIN LCD_E_PIN

4 5 6 7 3 1 2

// // // // // // //

pin pin pin pin pin pin pin

para para para para para para para

bit de datos bit de datos bit de datos bit de datos linea RS linea RW linea ENABLE

0 1 2 3

/* Instrucciones, comandos y bits */ #define LCD_DISP_OFF 0x08 // apaga display #define LCD_DISP_ON 0x0C // enciende display, sin cursor #define LCD_DISP_ON_BLINK 0x0D // enciende display, con parpadeo #define LCD_DISP_ON_CURSOR 0x0E // enciende display, con cursor #define LCD_DISP_ON_CURSOR_BLINK 0x0F // enciende display, con cursor y parpadeo #define LCD_CLR 0 // DB0: limpiar display #define LCD_BUSY 7 // DB7: LCD ocupado /* Definiciones para tamao de display */ #define LCD_LINES 2 // numero de lineas visibles del LCD #define LCD_DISP_LENGTH 16 // numero de caracteres visibles del LCD #define LCD_START_LINE1 0x80 // direccion DDRAM de la linea 1 #define LCD_START_LINE2 0xC0 // direccion DDRAM de la linea 2 /* function set: longitud de datos y nuemro de lineas */ #define LCD_FUNCTION_4BIT_1LINE 0x20 // 4-bit interface, 1 linea, 5x7 dots #define LCD_FUNCTION_4BIT_2LINES 0x28 // 4-bit interface, 2 lineas, 5x7 dots /* definiciones de funciones */ #define lcd_e_delay() asm volatile("rjmp 1f\n 1:"); #define lcd_e_high() LCD_E_PORT|=_BV(LCD_E_PIN); #define lcd_e_low() LCD_E_PORT&=~_BV(LCD_E_PIN); #define lcd_rw_high() LCD_RW_PORT|=_BV(LCD_RW_PIN) #define lcd_rw_low() LCD_RW_PORT&=~_BV(LCD_RW_PIN) #define lcd_rs_high() LCD_RS_PORT|=_BV(LCD_RS_PIN) #define lcd_rs_low() LCD_RS_PORT&=~_BV(LCD_RS_PIN) #define DDR(x) (*(&x - 1)) /* address of data direction register of port x */ #define PIN(x) (*(&x - 2)) /* address of input register of port x */ // funcion de retardo void delay(void){ int i; for(i=0; i<500; i++); } // funcion de cambio de enable void lcd_e_toggle(void) { lcd_e_high(); lcd_e_delay(); lcd_e_low(); } // funcion de lectura char lcd_read(char rs) { char data; if (rs) lcd_rs_high(); // RS=1: leer dato else lcd_rs_low(); // RS=0: leer bandera de ocupado lcd_rw_high(); // RW=1 modo de lectura // configurar pines de datos como entradas DDR(LCD_DATA4_PORT) &= ~_BV(LCD_DATA4_PIN); DDR(LCD_DATA5_PORT) &= ~_BV(LCD_DATA5_PIN); DDR(LCD_DATA6_PORT) &= ~_BV(LCD_DATA6_PIN); DDR(LCD_DATA7_PORT) &= ~_BV(LCD_DATA7_PIN); // leer nibble alto 26

lcd_e_high(); data = 0; if ( PIN(LCD_DATA4_PORT) if ( PIN(LCD_DATA5_PORT) if ( PIN(LCD_DATA6_PORT) if ( PIN(LCD_DATA7_PORT) lcd_e_low(); lcd_e_delay(); // leer nibble bajo lcd_e_high(); if ( PIN(LCD_DATA4_PORT) if ( PIN(LCD_DATA5_PORT) if ( PIN(LCD_DATA6_PORT) if ( PIN(LCD_DATA7_PORT) lcd_e_low(); return data; }

& & & &

_BV(LCD_DATA4_PIN) _BV(LCD_DATA5_PIN) _BV(LCD_DATA6_PIN) _BV(LCD_DATA7_PIN)

) ) ) )

data data data data

|= |= |= |=

0x10; 0x20; 0x40; 0x80;

& & & &

_BV(LCD_DATA4_PIN) _BV(LCD_DATA5_PIN) _BV(LCD_DATA6_PIN) _BV(LCD_DATA7_PIN)

) ) ) )

data data data data

|= |= |= |=

0x01; 0x02; 0x04; 0x08;

void lcd_write(char data, char rs) { if (rs) // escribir dato (RS=1, RW=0) lcd_rs_high(); else // escribir instruccion (RS=0, RW=0) lcd_rs_low(); lcd_rw_low(); // configurar pines de datos como salidas DDR(LCD_DATA4_PORT) |= _BV(LCD_DATA4_PIN); DDR(LCD_DATA5_PORT) |= _BV(LCD_DATA5_PIN); DDR(LCD_DATA6_PORT) |= _BV(LCD_DATA6_PIN); DDR(LCD_DATA7_PORT) |= _BV(LCD_DATA7_PIN); // escribir nibble alto LCD_DATA7_PORT &= ~_BV(LCD_DATA7_PIN); LCD_DATA6_PORT &= ~_BV(LCD_DATA6_PIN); LCD_DATA5_PORT &= ~_BV(LCD_DATA5_PIN); LCD_DATA4_PORT &= ~_BV(LCD_DATA4_PIN); if(data & 0x80) LCD_DATA7_PORT |= _BV(LCD_DATA7_PIN); if(data & 0x40) LCD_DATA6_PORT |= _BV(LCD_DATA6_PIN); if(data & 0x20) LCD_DATA5_PORT |= _BV(LCD_DATA5_PIN); if(data & 0x10) LCD_DATA4_PORT |= _BV(LCD_DATA4_PIN); lcd_e_toggle(); // escribir nibble bajo LCD_DATA7_PORT &= ~_BV(LCD_DATA7_PIN); LCD_DATA6_PORT &= ~_BV(LCD_DATA6_PIN); LCD_DATA5_PORT &= ~_BV(LCD_DATA5_PIN); LCD_DATA4_PORT &= ~_BV(LCD_DATA4_PIN); if(data & 0x08) LCD_DATA7_PORT |= _BV(LCD_DATA7_PIN); if(data & 0x04) LCD_DATA6_PORT |= _BV(LCD_DATA6_PIN); if(data & 0x02) LCD_DATA5_PORT |= _BV(LCD_DATA5_PIN); if(data & 0x01) LCD_DATA4_PORT |= _BV(LCD_DATA4_PIN); lcd_e_toggle(); } void lcd_waitbusy(void) { char c; while ( (c=lcd_read(0)) & (1<<LCD_BUSY)); // esperar hasta que se desocupe } void lcd_init(char dispAttr){ DDR(LCD_RS_PORT) |= DDR(LCD_RW_PORT) |= DDR(LCD_E_PORT) |= DDR(LCD_DATA4_PORT) |= DDR(LCD_DATA5_PORT) |= DDR(LCD_DATA6_PORT) |= DDR(LCD_DATA7_PORT) |= delay();

_BV(LCD_RS_PIN); _BV(LCD_RW_PIN); _BV(LCD_E_PIN); _BV(LCD_DATA4_PIN); _BV(LCD_DATA5_PIN); _BV(LCD_DATA6_PIN); _BV(LCD_DATA7_PIN); // esperar 50ms o mas 27

LCD_DATA5_PORT = _BV(LCD_DATA5_PIN); // LCD_FUNCTION_4BIT_1LINE>>4 lcd_e_toggle(); lcd_command(LCD_FUNCTION_4BIT_2LINES); lcd_command(dispAttr); } // funcion para ubicarse en X,Y void lcd_gotoxy(char x, char y) { if ( y==0 ) lcd_command(LCD_START_LINE1+x); else lcd_command(LCD_START_LINE2+x); } // funcion para limpiar pantalla void lcd_clrscr(void) { lcd_command(1<<LCD_CLR); } // funcion para envio de comando void lcd_command(char cmd) { lcd_waitbusy(); lcd_write(cmd,0); } // funcion para escribir un caracter void lcd_putc(char c) { if (c=='\n') { lcd_command(LCD_START_LINE2); return; } lcd_waitbusy(); lcd_write(c, 1); } // funcion para escribir una cadena de caracteres void lcd_puts(char *s) { char c; while ( (c = *s++) ) { lcd_putc(c); } }//------------------------------- FINAL DE LIBRERIA

28

5.4. NOTAS.

29

6
6.1

CONVERTIDOR ANALGICO DIGITAL.

CONVERTIDOR ANALGICO-DIGITAL.

Un convertidor analgico digital (ADC) es un dispositivo capaz de convertir un nivel de voltaje analgico en un determinado valor binario (digital). Un convertidor analgico-digital establece una relacin entre su entrada y salida, dependiendo de la resolucin con que este cuente. El valor de la resolucin se obtiene, si sabemos, el valor mximo de entrada y la cantidad mxima de salida en dgitos binarios. El convertidor del ATmega8 posee una resolucin de 10 bits. Utiliza el metodo de aproximaciones sucesivas y puede ser multiplexado en 6 canales single-ended.

6.2

CONSIDERACIONES DEL ADC.

Para utilizar de mejor manera el convertidor analgico digital del AVR ATmega8, debemos tener presentes las siguientes consideraciones. 6.2.1 Tiempo de conversin. Para realizar adecuadamente una conversin, la frecuencia del circuito de aproximaciones sucesivas debe estar ente 50 Khz y 200 Khz, para una resolucin de 10 bits. Si se requiere una resolucin menor, se pueden utilizar frecuencias superiores a 200 Khz. Para obtener las frecuencias aceptables, el modulo del ADC contiene un circuito de pre-escala. Una vez que se inicia una conversin, el ADC toma 13 ciclos de reloj de ADC, llevar a cabo una conversin. Exceptuando la primera, que toma 25 ciclos. 6.2.2 Referencias de voltaje. El voltaje en el pin VREF indica el rango de voltaje de la conversin. Las referencias de voltaje pueden ser seleccionadas entre AVCC, referencia interna de 2.56 V o el voltaje en el pin externo AREF. Si se ocupa el pin de AREF, se recomienda conectar un capacitor entre el pin y tierra para aumentar la inmunidad al ruido del ADC. 6.2.3 Definiciones. El comportamiento ideal de un convertidor single-ended analgico digital de n bits, es conviertir linealmente el voltaje entre GND y VREF en 2n pasos. El cdigo ms pequeo corresponde a 0, mientras el ms alto corresponde a 2n-1. Algunos parmetros que miden el valor de la desviacin de este comportamiento son:

30

Offset: La desviacin de la primera conversin comparada con el valor ideal. Error de Ganancia: Una vez ajustado el offset, el error de ganancia es la desviacin del resultado obtenido en el valor ms grande comparado contra su valor ideal. No-linealidad Integral (INL, Integral non-linearity). Una vez ajustados el offset y el error de ganancia, el error de no linealidad integral es el valor de la desviacin mxima de una conversin actual comparada contra una conversin ideal. (0.5 LSB) No-linealidad diferencial (DNL, Diferencial non-linearity): La mxima desviacin del ancho del cdigo actual (el intervalo entre dos conversiones adyacentes) con respecto al cdigo ideal. Error de Cuantizacin: Debido a la cuantizacin del voltaje de entrada dentro de un rango finito de valores, un cierto rango de voltajes de entrada (1 LSB) se codificarn con el mismo valor. Certeza absoluta: Es la mxima desviacin de una conversin actual, comparada contra una conversin ideal de cualquier cdigo. Este es el efecto de compuesto del offset, error de ganancia, DNL, INL y error de cuantizacin (2 LSB).

Figura 6.1 Offset (izquierda) y error de ganancia (derecha).

Figura 6.2 INL (izquierda) y DNL (derecha).

6.3

CONFIGURACIN DEL ADC.

6.3.1 Registro de convertidor analgico-digital, ADC. Cuando una conversin analgico-digital se ha completado, el resultado es colocado en este par de registros. Cuando se lee ADCL, el registro no se actualiza hasta leer ADCH, si el resultado es ajustado a la izquierda y no se requieren ms de 8 bits, se puede leer solamente ADCH. De otra forma. se debe leer primero el registro ADCL, despus ADCH.

31

Figura 6.3 Registro ADC, con ADLAR = 1.

6.3.2

Registro de seleccin de multiplexor, ADMUX.

Figura 6.4 Registro ADMUX.

Bit 7:6 REFS1:REFS0 Bits de seleccin de referencia. Seleccionan la referencia de voltaje para el ADC. La opcin de referencia de voltaje interna no debe utilizarse si se tiene conectado el pin AREF. Ver tabla 7.1 Bit 5 ADLAR: Resultado alineado a la izquierda del ADC. Bit 4 Reservado Bit 3:0 MUX3:MUX0, Seleccin de canal analgico. Selecciona que canal del ADC se utilizara. Ver tabla 7.2
REFS1 0 0 1 1 REFS0 Seleccin de referencia de voltaje 0 AREF, Referencia interna Vref apagada 1 AVCC con capacitor externo en AREF 0 Reservado 1 Referencia interna 2.56 V con capacitor externo en AREF Tabla 6.1 Seleccin de referencia de voltaje. MUX3:0 Entrada single-ended 0000 ADC0 0001 ADC1 0010 ADC2 0011 ADC3 0100 ADC4 0101 ADC5 Tabla 6.2 Seleccin de canal analgico.

6.3.3

Registro de control y de estado A, ADCSRA.

Figura 6.5 Registro ADCSRA.

Bit 7 ADEN: Habilitacin de ADC. Escribir un uno a este bit, activa el ADC. Bit 6 ADSC: Iniciar conversin. En modo de conversin simple, escribir este bit a uno, inicia cada conversin. Permanece en uno mientras dure la conversin.
32

Bit 5 ADFR: Habilitar modo free-running. Si se activa este bit, el ADC realiza conversiones y actualizaciones al registro ADC continuamente. Bit 4 ADIF: Bandera de interrupcin por conversin del ADC. Se activa esta bandera cuando una conversin del ADC se completo. Bit 3 ADIE: Habilitacin de interrupcin por ADC. Si este bit se activa y tambin esta activado el bit I del SREG. Bit 2:0 ADPS2:ADPS0: Pre-escala del reloj del ADC. Ver tabla 7.3.
ADPS2 ADPS1 ADPS0 Factor de divisin 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 Tabla 6.3 Pre-escala de reloj para el ADC.

6.4

PRCTICA DEL ADC.

6.4.1 Objetivo. Conocer el funcionamiento del convertidor analgico digital del microcontrolador ATmega8 y los registros que intervienen en su funcionamiento. 6.4.2 Desarrollo. Arme el circuito de la figura 6.6.

Figura 6.6 Circuito para la prctica del ADC. 33

6.4.3

Cdigo.
INICIO DE PROGRAMA

//------------------------------#include <avr/io.h> #include <avr/interrupt.h> #include "lcd.h" int adc_value; ISR(SIG_ADC){ adc_value=ADC; }

void init_adc(void){ ADMUX=0; ADCSRA=_BV(ADEN)|_BV(ADFR)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS0)|_BV(ADSC); sei(); } void to_ascii(void){ long resultado; resultado=adc_value; resultado*=4889; lcd_putc(resultado/1000000+'0'); resultado%=1000000; lcd_putc('.'); lcd_putc(resultado/100000+'0'); resultado%=100000; lcd_putc(resultado/10000+'0'); resultado%=10000; lcd_putc(resultado/1000+'0'); } int main(void){ lcd_init(LCD_DISP_ON); init_adc(); lcd_puts("Voltaje:"); while(1){ lcd_gotoxy(10,1); to_ascii(); } } //------------------------------FIN DE PROGRAMA

34

6.5. NOTAS.

35

7
7.1

COMPARADOR ANALGICO.

COMPARADOR ANALGICO.

Un comparador analgico es un dispositivo que se utiliza cuando se requiere saber el cambio de nivel de una seal con respecto a una referencia, y visto desde un punto de vista simplificado podemos imaginarlo como un amplificador operacional en lazo abierto, y puede ser utilizado para detectar cuando algn nivel de voltaje rebasa un nivel peligroso para nuestra aplicacin, o cuando queremos saber cual es el comportamiento de dos seales la una con respecto a la otra. El principio de operacin es, suponiendo que se tienen dos seales A y B, dadas en trminos de niveles de voltaje analgicos la seal de control o de salida del comparador se disparar si: La seal A es ms grande que la seal B. La seal B es ms grande que la seal A. Hubo una basculacin de las seales A y B (es decir un cambio de nivel alto a nivel bajo con respecto a la otra seal que funciona como referencia).

7.2

CONFIGURACIN DEL COMPARADOR ANALGICO.

El comparador analgico del microcontrolador AVR ATmega8, compara los valores de entrada en su pin positivo (AIN0) y negativo (AIN1). Cuando el voltaje del pin positivo es mayor que el del pin negativo, la salida de comparador analgico (ACO) se activa. 7.2.1 Registro de funciones especiales de entradas y salidas, SFIOR.

Figura 7.1 Registro SFIOR

Bit 3 ACME: Habilitacin de multiplexor para comparador analgico. Cuando se activa este bit y el convertidor analgico-digital (ADC) esta deshabilitado (ADEN=0 en ADCSRA) el ADC selecciona la entrada negativa del comparador analgico.

36

7.2.2

Registro de estatus y control del comparador analgico, ACSR.

Figura 7.2 Registro ACSR

Bit 7 ACD: Deshabilita comparador analgico. Un uno en este bit, apaga el comparador analgico. Bit 6 ACBG: Seleccin de Bandgap, activar este bit, reemplaza la entrada positiva del comparador por el voltaje de bandgap (aprox. 1.23V @ 5V de VCC). Bit 5 ACO: Salida de comparador analgico. Bit 4 ACI: Bandera de interrupcin de comparador analgico. Este bit se activa por el comportamiento de interrupcin definido por los bits ACIS1 y ACIS0. Bit 3 ACIE: Habilitacin de interrupcin de comparador analgico. Escribir un uno a este bit, activa la interrupcin por comparador analgico. Bit 2 ACIC: Habilitacin de evento de captura por comparador analgico. Escribir un uno a este bit, activa la funcin del timer/counter1 para que esta sea activada por el comparador analgico. Para que se active el evento de captura, necesita estar an uno el bit TICIE del registro TIMSK. Bit 1:0 ACIS1:ACIS0: Seleccin de modo de interrupcin. Determinan que evento activar la interrupcin del comparador analgico. Las diferentes combinaciones se muestran en la tabla 6.1.
ACIS1 ACIS0 Modo de Interrupcin. 0 0 Activo en un cambio en la salida. 0 1 Reservado 1 0 Activo en flanco de subida. 1 1 Activo en flanco de bajada. Tabla 7.1 Combinaciones de ACIS1:ACIS0

7.3

PRCTICA DE USO DEL COMPARADOR ANALGICO.

7.3.1 Objetivo. Conocer el funcionamiento y los registros que intervienen en la configuracin del comparador analgico.

7.3.2 Desarrollo. Arme el circuito de la figura 7.3.

37

Figura 7.3 Circuito para la prctica de comparador analgico.

7.3.3

Cdigo.
INICIO DE PROGRAMA

//------------------------------#include <avr/io.h> #include <avr/interrupt.h> void init_comparador(void){ DDRD=0b00111111; ACSR=_BV(ACIE); sei(); } ISR(SIG_COMPARATOR){ if(PORTD==0x20) PORTD=0; else if(PORTD==0x00) PORTD=_BV(PD5); } void main(void){ init_comparador(); while(1); } //-------------------------------

// PD6 y PD7 como entradas // Interrupcion en cambio AIN0 vs. AIN1

// Interrupcion por comparador analogico // Si el LED esta prendido, apagarlo // Si el LED esta apagado, prenderlo

FIN DE PROGRAMA

38

7.4

NOTAS.

39

8
8.1. USART.

USART.

El Transmisor y Receptor serial Asncrono y Sncrono Universal o USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter) es una unidad de comunicacin perifrica muy flexible, que en el microcontrolador ATmega8, nos permite, entre otras funciones: Operacin full-duplex (se puede enviar y recibir datos simultaneamente). Operacin sncrona y asncrona. Operacin en modo maestro y esclavo con reloj sncrono. Soporta frames de 5, 6, 7, 8 y 9 bits de datos y 1 o 2 de parada. Generador de paridad par o impar. Deteccin de errores (data overrun, frame error) Filtrado de ruido (inicio falso, filtro digital) Generacin de interrupciones por transmisin completa, por recepcin completa o por registro de datos de transmisin vacio. Comunicacin entre multiprocesadores. Doblador de velocidades modo de comunicacin asincrona.

8.2. NORMA RS-232.


La norma RS-232 es un protocolo de comunicacin serial ya establecido que define la transmisin fsica entre una terminal DTE (Data Terminal Equipment) y un mdem DCE (Data Communication Equipment). Este protocolo define un uno lgico como una seal comprendida en el rango de -5V a -15 V y un cero lgico como una seal dentro del rango +5V a +15V. Bajo esta terminologa, la primera transicin de 1 a 0 lgico, define un bit de inicio (Stara bit) a la que le siguen 5, 6, 7 u 8 bits de datos. El octavo bit se puede utilizar como un bit de paridad (mecanismo para deteccin de errores); al final de la transmisin, la seal debe regresar al valor lgico cero; esto se define como el bit de parada (stop bit), que puede configurarse en 1, 1.5 o 2 bits de parada. El conector normalizado para este protocolo es el conector V24 (25 pines); sin embargo, en equipos de cmputo es ms utilizado el conector DB9 de 9 pines (figura 8.1); los pines de este conector se muestran en la tabla 8.1.

40

No. 1 2 3 4 5 6 7 8 9 Figura 8.1 Conector DB9 para RS232.

Nombre CD RXD TXD DTR GND DSR RTS CTS RI

Funcin. Carrier Detect Recepcin de dato Transmisin de dato Data Terminal Ready Tierra del sistema Data Set Ready Request to send Clear to send Ring indicator

Tabla 8.1 Pines de conexin RS232 conector DB9.

8.3. CONFIGURACIN DE LA USART.


8.3.1. Registro de entrada/salida de datos de la USART, UDR.

Figura 8.2 Registro UDR

Es el registro en donde se escriben los datos a transmitir (TXB) y de donde se leen los datos recibidos (RXB), Solo se puede escribir en este registro cuando el bit UDRE (USART Data Register Empty) los datos escritos en este registro mientras el UDRE este en cero, sern ignorados. 8.3.2. Registro de control y estado A de la USART, UCSRA.

Figura 8.3 Registro UCSRA.

Bit 7 RXC, recepcin completa: Este bit se activa cuando existen datos no leidos en el buffer de recepcin. Bit 6 TXC, transmisin completa: Este bit se activa cuando se han enviado todos los datos del buffer de transmisin. Bit 5 UDRE, Registro de datos de la USART vaco: Indica que el buffer UDR esta listo para recibir nuevos datos. Bit 4 FE, error en el frame: Se activa cuando existe un error en el frame de datos recibidos. Bit 3 DOR, data overrun: si el buffer de recepcin esta lleno y se detecta un nuevo start bit. Bit 2 PE, error de paridad: Si se activo el chequeo de paridad (UPM1=1) y existe un error de paridad en la transmisin, este bit se activa. Bit 1 U2X, Doblador de velocidad USART: solo tiene efecto en modo asncrono, reduce el divisor de baud rate de 16 a 8, lo que ocasiona que se duplique la velocidad de transmisin. Bit 0 MPCM, Modo de comunicacin multi-procesador: Activa el modo de comunicacin multi-procesador, todos los frames recibidos que no contengan informacin de direccin, sern ignorados.

41

8.3.3.

Registro de control y estado B de la USART, UCSRB.

Figura 8.4 Registro UCSRB.

Bit 7 RXCIE: Habilitacin de interrupcin por recepcin completa. Bit 6 TXCIE: Habilitacin de interrupcin por transmisin completa. Bit 5 UDRIE: Habilitacin de interrupcin por registro de datos de USART vaco. Bit 4 RXEN: Habilita el receptor de la USART. Bit 3 TXEN: Habilita el transmisor de la USART. Bit 2 UCSZ2: En conjunto con UCSZ1:0, establecen el tamao de bits de datos a utilizar. Bit 1 RXB8: Si se escogi un frame de 9 bits de datos, aqu se ubica el noveno bit recibido y debe ser leido antes de leer los 8 restantes. Bit 0 TXB8: Si se escogi un frame de 9 bits de datos, aqu se debe escribir el noveno bit de datos y debe escribirse antes de los ocho restantes. Registro de control y estado C de la USART, UCSRC.

8.3.4.

Figura 8.5 Registro UCSRC.

Bit 7 URSEL: Este bit selecciona si se accede al registro UCSRC (URSEL=1) o al registro UBRRH (URSEL=0). Bit 6 UMSEL: Modo de operacin de la USART, cero en este bit la USART opera en modo asncrono, con un uno en este bit, la USART operar de forma sncrona. Bit 5:4 Modo de paridad: las posibles combinaciones para el modo de operacin con paridad se muestran en la tabla 8.2.
UPM1 0 0 1 1 UPM0 Modo de Paridad 0 Desactivada 1 Reservado 0 Activada, paridad par 1 Activada, paridad impar Tabla 8.2 Modos de paridad.

Bit 3 USBS, seleccin de bits de parada: 0= 1 bit de parada, 1= 2 bits de parada. Bit 2:1 UCSZ1:UCSZ0, en conjunto con UCSZ2, establecen el tamao de bits de datos, de acuerdo a la tabla 8.3.
UCSZ2 0 0 0 0 1 1 1 1 UCSZ1 UCSZ0 Tamao de datos 0 0 5 bits 0 1 6 bits 1 0 7 bits 1 1 8 bits 0 0 Reservado 0 1 Reservado 1 0 Reservado 1 1 9 bits Tabla 8.3 Tamaos de datos.

42

Bit 0 UCPOL: Polaridad de reloj. Solo aplica en modo sncrono y determina la relacin entre el cambio en la salida de datos y la entrada de datos y el reloj de sincrona (XCK); de acuerdo a la tabla 8.4.
UCPOL 0 1 Cambio en transmisin (TXD) Muestreo de recepcin (RXD) Flanco de subida en XCK Flanco de bajada en XCK Flanco de bajada en XCK Flanco de subida en XCK Tabla 8.4 Configuracin de UCPOL.

8.3.5.

Registros de seleccin de baud rate, UBRRH y UBRRL.

Figura 8.6 Registro UBRR

Bit 11:0 UBRR11:UBRR0 Registro de Baud Rate del USART. Para una completa lista de valores de configuracin, consulte la hoja de datos del microcontrolador (paginas 156 159).

Figura 8.7 Ejemplo configuracin del registro UBRR.

8.4. PRCTICA DEL USART.


8.4.1 Objetivo. Conocer el funcionamiento y los registros que intervienen en la configuracin del USART.

8.4.2 Desarrollo. Arme el circuito de la figura 8.8.

43

Figura 8.8 Circuito para la practica de USART.

8.4.3

Cdigo.
INICIO DE PROGRAMA

;------------------------------#include <avr/io.h> #include <avr/interrupt.h> char data;

void init_USART(void){ UBRRL=25; UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0); sei(); } void TX_USART(void){ data=data-32; loop_until_bit_is_set(UCSRA,UDRE); UDR=data; } ISR(SIG_UART_RECV){ data=UDR; TX_USART(); } int main(){ init_USART(); while(1){ }; } ;-------------------------------

// // // //

configurar USART para: baudrate: 9600 a 4 MHz 2 stop bits, 8 databits sin paridad

// restar 32 para obtener // valor ASCII en mayscula // enviar dato

// Interrupcin de recepcin USART // leer dato recibido // funcin de envo de dato

FIN DE PROGRAMA

8.5. NOTAS.
44

9
9.1. PWM.

PWM.

Una seal analgica tiene un rango variable de valores con una resolucin infinita ya que puede tomar cualquier valor real; mientras que una seal digital solamente puede tomar valores dentro de un rango predeterminado y finito de posibilidades. El control analgico no es siempre la mejor opcin en la industria pues es ms propenso a alteraciones por ruido y con el tiempo suele presentar derivas lo cual va complicando la sintonizacin de los mismos. Los controles analgicos de alta precisin suelen ser muy caros, espaciosos y pesados. La modulacin por ancho de pulso, o PWM (Pulse Width Modulation) por sus siglas en ingles, es una poderosa tcnica para el control de circuitos analgicos utilizando una seal digital. En este caso la salida digital de un microcontrolador. Visto de una forma sencilla la PWM es una forma de codificar seales analgicas de una forma digital. A travs del uso de contadores una seal cuadrada es modulada para obtener un determinado nivel analgico.

90%

50%

25%

Figura 9.1 Diferentes ciclos de trabajo de una PWM.

45

9.2. TIPOS DE PWM DEL ATMEGA8.


El microcontrolador ATmega8 posee 3 canales de PWM (OC1A, OC1B y OC2), las dos primeras son canales de 16 bits mientras que OC2 es de 8 bits. 9.2.1. Caractersticas de PWM rpida:

PWM de alta frecuencia. Modo de operacin single-slope (cuesta simple). Modo de operacin invertido y no-invertido. Resolucin de 8, 9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolucin mnima de 2 bits o 16 bits).

Figura 9.2 Diagrama de tiempos del modo de PWM rpida.

9.2.2.

Caractersticas de PWM con correccin de fase.

Alta resolucin. Modo de operacin dual-slope (doble cuesta). Modo de operacin invertido y no-invertido. Resolucin de 8, 9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolucin mnima de 2 bits o 16 bits). Caractersticas de PWM con correccin de fase y frecuencia.

9.2.3.

Alta resolucin. Modo de operacin dual-slope (doble cuesta). Modo de operacin invertido y no-invertido. Resolucin de 8, 9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolucin mnima de 2 bits o 16 bits).

Como se ve en la figura 9.4 la salida generada es, en contraste con la PWM de correccin de fase, simtrica en todos los periodos. Ya que los registros OCR1x son actualizados en la parte baja del conteo, la longitud tanto de la cuesta de subida como de la cuesta de bajada son siempre iguales. Lo que nos da una salida simtrica en pulsos y por lo tanto la frecuencia es correcta.

46

Figura 9.3 Diagrama de tiempos del modo de PWM con correccin de fase.

Figura 9.4 Diagrama de tiempos del modo de PWM con correccin de fase.

9.3. CONFIGURACIN DE LA PWM.


Los registros que intervienen en la configuracin de la PWM son los mismos que intervienen en la configuracin de los timers 1 y 2. Solo veremos los bits referentes al PWM.
47

9.3.1.

Registros de Control A, TCCR1A.

Figura 9.5 Registro TCCR1A

Bit 7:6 COM1A1:0 Modo de salida de comparacin para canal A. Bit 5:4 COM1B1:0 Modo de salida de comparacin para canal B. Bit 1:0 WGM11:10 Modo de generacin de formas de onda.

9.3.2.

Registro de Control B, TCCR1B.

Figura 9.6 Registro TCCR1B

Bit 4:3 WGM13:12 Modo de generacin de formas de onda. Bit 2:0 CS12:10 Fuente de reloj para el timer 1. Estos ltimos tres bits, configuran la fuente de reloj que utilizar el timer 1, de acuerdo a la siguiente tabla.

Figura 9.7 Bits de seleccin de WGM.

9.4. PRCTICA DE PWM.


9.4.1. Objetivo. Conocer el funcionamiento y registros que intervienen en la configuracin de la PWM del microcontrolador ATmega8.

48

9.4.2. Desarrollo. Utilice el circuito de la prctica de la USART, aada los componentes que se muestran en le figura 9.8

Figura 9.8 Circuito para la prctica de PWM. 49

9.4.3.

Cdigo.
INICIO DE PROGRAMA

;------------------------------#include <avr/io.h> #include <avr/interrupt.h> char data, parametro;

void init_PWM(void){ TCCR1A=(1<<COM1A1)|(1<<WGM10); TCCR1B=(1<<WGM12)|(3<<CS10); } void init_USART(void){ UBRRL=25; UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0); sei(); } void incrementa(void){ if(parametro!=255) parametro++; OCR1A=parametro;; } void decrementa(void){ if(parametro!=0) parametro--; OCR1A=parametro; } void para(void){ PORTB=0; } void avanza(void){ PORTB=1; } ISR(SIG_UART_RECV){ data=UDR; switch(data){ case('i'): incrementa(); break; case('d'): decrementa(); break; case('p'): para(); break; case('a'): avanza(); break; } } int main(){ DDRB=255; init_PWM(); init_USART(); while(1); } ;-------------------------------

// configura PWM rapida // 8 bits, no invertida

// // // //

configurar USART para: baudrate: 9600 a 4 MHz 2 stop bits, 8 databits sin paridad

// Interrupcin de recepcin USART // leer dato recibido // determinar que accin seguir

FIN DE PROGRAMA

50

9.5. NOTAS.

51