curso micros

54
Haltica Automatización Curso de microcontroladores AVR de ATMEL® Programación en C Para uso con la tarjeta Titán EX de Haltica. Ver. 1.1 Noviembre 2007 Rev. B (Marzo 2008) [email protected] www.haltica.com Tel: 01 (55) 5359 7766

Upload: sandoval-daniel

Post on 20-Oct-2015

155 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Curso Micros

Haltica Automatización Curso de microcontroladores AVR de ATMEL® Programación en C Para uso con la tarjeta Titán EX de Haltica.

Ver. 1.1 Noviembre 2007 Rev. B (Marzo 2008)

[email protected]

www.haltica.com Tel: 01 (55) 5359 7766

Page 2: Curso Micros

Contenido. Capítulo 1 Introducción. Microcontrolador y Microprocesador……………….

Arquitectura Abierta y Arquitectura Cerrada……… Tecnología RISC y CISC…………………………… Familia de Microcontroladores AVR de ATMEL..... Comparación entre microcontroladores…………… Arquitectura de los microcontroladores AVR de ATMEL……............................................................. Programador AVR Titán EX de Haltica……………. IDE de programación AVR Studio de ATMEL……. WinAVR…………………….…………………………. Módulos y librerías de WinAVR…….......................

1 1 1 2 2 3 4 5 6 6

Capítulo 2 Entradas y Salidas. Componentes básicos del microcontrolador………

Puertos de entrada salida…………………………... Práctica de entradas y salidas……………………… Notas…………………………………………………...

7 8 9 11

Capítulo 3 Interrupciones Externas. Interrupciones………………………………………...

Vector de interrupciones del microcontrolador ATmega8……………………………………………... Interrupciones externas……………………………... Práctica de interrupción externa…………………… Notas…………………………………………………..

12 12 12 14 15

Capítulo 4 Temporizador / Contador Temporizador y Contador……………………………

Uso del Timer1……………………………………….. Práctica de Timer1…………………………………... Uso del Counter0…………………………………….. Práctica de Counter0 y Timer1…………………….. Notas…………………………………………………..

16 16 18 19 19 22

Capítulo 5 Manejo de un LCD Introducción…………………………………………...

Manejo de un LCD de caracteres………………….. Práctica de uso de un LCD de caracteres………… Notas…………………………………………………...

23 24 24 29

Page 3: Curso Micros

3

Capítulo 6 Convertidor Analógico – Digital Convertidor Analógico-Digital……..………………...

Consideraciones del ADC…………………………... Configuración del ADC……..……………………….. Práctica del ADC……………….……………………. Notas…………………………………………………..

30 30 31 33 35

Capítulo 7 Comparador Analógico Comparador Analógico……….……………………...

Configuración del comparador analógico…………. Práctica de uso del comparador analógico……….. Notas…………………………………………………..

36 36 37 39

Capítulo 8 USART USART………………………………………………...

Norma RS-232……………………………………...... Configuración de la USART………………………… Práctica del USART…………………………………. Notas…………………………………………………..

40 40 41 43 45

Capítulo 9 PWM PWM…………………………………………………...

Tipos de PWM del microcontrolador ATmega8…... Configuración de la PWM…………………………… Práctica de PWM…………………………………….. Notas…………………………………………………..

46 47 48 49 52

Page 4: Curso Micros

1 INTRODUCCIÓN. 1.1. MICROCONTROLADOR Y MICROPROCESADOR. Un microprocesador es un conjunto de circuitos electrónicos altamente integrado. Es utilizado como una unidad central de procesos (CPU). Las partes que componen a un microprocesador son: unidad aritmética lógica (ALU), registros de almacenamiento, unidad de control, unidad de ejecución, memoria cache y buses de datos. Un microcontrolador es un circuito integrado que incluye las tres unidades básicas de un ordenador: CPU, memoria y unidades de entrada salida (I/O). Tiene prestaciones limitadas pero un alto nivel de especialización. Un microcontrolador requiere de un mínimo de componentes externos para ponerlo en funcionamiento. Un microcontrolador típico posee memoria RAM/ROM/EPROM/EEPROM, dispositivos de IO como convertidores analógico-digital (ADC), modulación de ancho de pulso (PWM), temporizadores (timers), UARTs y buses de interfaz especializados como SPI, I2C, TWI, CAN, USB, ZigBee®, LCD, etc. 1.2. ARQUITECTURA ABIERTA Y ARQUITECTURA CERRADA. Una arquitectura abierta es aquella que puede ampliarse después de la construcción de un sistema, generalmente añadiendo circuitos adicionales, por ejemplo añadiendo módulos de memoria o conectando al sistema principal un chip con un nuevo microprocesador. En la arquitectura abierta, las especificaciones del sistema se hacen públicas, lo que permite que otras empresas puedan fabricar los productos de expansión. 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. TECNOLOGÍA 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

Page 5: Curso Micros

2

Se requiere realizar una operación de multiplicación: A = B x C

RISC CISC Código: Código:

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

mult A,B

Descripción: Descripción: • Carga el valor scr1 en el registro A • Carga el valor scr2 en el registro B • Multiplica A x B • Guarda A en dest

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

Tabla 1.1 Comparación entre tecnología RISC y CISC. 1.4. FAMILIA DE MICROCONTROLADORES AVR DE ATMEL ®. Dispositivos CMOS de 8 bits basados en tecnología 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 analógicos entre otras cosas.

Soportan programación en ensamblador y en lenguaje C. programación ISP (In-System Programming). Alto desempeño y bajo consumo de poder (<1µA en estado apagado, 1.1mA en activo). Cuentan con una gama de instrucciones sencillas que operan con 32 registros de propósito

general. 1.5. COMPARACIÓN ENTRE MICROCONTROLADORES. A continuación se presentan algunos datos comparativos entre diferentes microcontroladores.

Tarea a realizar. Tiempo empleado para desarrollar la tarea (en µs).

MSP430 (TI®)

ATmega323(Atmel®)

PIC18F452 (Microchip®)

Rabbit 2000®

Suma de 16 bits 27 40.4 71.6 63.6 Multiplicación de 16 bits 72.4 60.8 193 80 División de 16 bits 480 538 940 608 Multiplicación de 32 bits 182 191 344 286 Resta de 32 bits 57.2 75.6 76.4 172 Ordenamiento de burbuja 992 834 3330 6380 Movimiento y comparación de bloques de memoria 6750 5800 12400 6360

Saltos condicionales 131.2 143.6 169 242 Push’ing & Pop’ing 314 258 412 426 Frecuencia de la prueba: 8Mhz 8Mhz 20Mhz 22.1Mhz

Tabla 1.2 Comparativo entre diferentes familias de microcontroladores 1

1 Fuente: http://www.freertos.org

Page 6: Curso Micros

3

1.6. ARQUITECTURA DE LOS MICROCONTROLADORES AVR DE ATMEL®. 1.6.1. ALU – Unidad Aritmética y Lógica. La ALU Opera en conexión directa con los 32 registros de propósito general del AVR. Está dividida en 3 categorías: aritmética, lógica y funciones de bits. Soportando inclusive operaciones de multiplicación en algunos dispositivos. 1.6.2. Status Register (Registro de Estatus). Contiene información acerca de las operaciones aritméticas realizadas más recientemente. Esta información puede ser utilizada para alterar el flujo del programa o realizar operaciones condicionales.

Figura 1.1 Registro SREG

• Bit 7 – I: Habilitación global de interrupciones. • Bit 6 – T: Almacenamiento del bit copia. • Bit 5 - H: Bandera de medio acarreo • Bit 4 – S: Bandera de signo, S=N⊕V • 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 propósito general.

Figura 1.2 Registros de propósito general.

Page 7: Curso Micros

4

1.6.4. Stack Pointer (Apuntador de pila). Es usada para almacenar direcciones de regreso después de interrupciones o llamadas a subrutinas; así como para almacenar datos temporales o variables locales. El stack pointer siempre apunta a la parte más alta de la pila de datos de la SRAM. El espacio del stack debe ser definido por el usuario antes de la ejecución de un regreso de interrupción o subrutina.

Figura 1.3 Stack pointer.

1.6.5. Organización de memoria.

Figura 1.4 Organización de memoria Flash (izq.) y memoria SRAM (der.)

1.7. PROGRAMADOR AVR TITÁN EX DE HALTICA. El programador AVR Titán EX de Haltica es un programador ISP, lo que significa que el microcontrolador es reprogramable en toda su memoria aún montado en la placa de circuito impreso de la aplicación final. Es posible reprogramar el microcontrolador vía ISP a través de un protocolo SPI de 4 pines (RESET, SCK, MOSI, MISO).

Page 8: Curso Micros

5

Figura 1.5 Terminales de programación AVR Titán EX

1.8. IDE DE PROGRAMACIÓN 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 código fuente y emulador

Figura 1.6 IDE AVR Studio 4.12

Page 9: Curso Micros

6

1.9. WINAVR. WinAVR es una suite de archivos ejecutables, de código 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. MÓDULOS Y LIBRERÍAS DE WINAVR. Algunos de los módulos que maneja WinAVR son:

- Utilidades de soporte para Bootloader - Cómputo de CRC. - Bucles de retraso / espera. - Manejo de EEPROM - Manejo de reloj Watchdog. - Matemáticas. - Interrupciones y señales. - Tipos estándar para enteros.

Entre otros. Para trabajar con WinAVR, se requiere la inclusión de las librerías 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 inclusión de archivos .h tradicional de C / C++: #include <avr/io.h> #include <avr/interrupt.h>

Page 10: Curso Micros

2 ENTRADAS Y SALIDAS. 2.1. COMPONENTES BÁSICOS 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 módulos de los registros de propósito general, registro de estado, registros de memoria de datos entre otros. Al detener el reloj del CPU, se inhibe al núcleo para realizar operaciones o cálculos. Una fuente de reloj externa confiable, es un cristal o un oscilador. La conexión de un cristal como fuente de reloj del AVR se muestra en la figura 2.1. El microcontrolador ATMEGA8, tiene la característica 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 ningún ciclo de reloj. Una vez que todas las fuentes de reset son desactivadas, transcurre un ciclo de espera (retardo), que amplia la duración 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 través de los bits fusibles de CKSEL. Un circuito básico de reset y de un cristal externo es el siguiente:

7

Page 11: Curso Micros

8

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 lógico bajo al pin de RESET Reset por watchdog: Cuando expira el contador del watchdog (si es que esta habilitado) Reset Brown-out: Reset de protección ante caídas de tensión. (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 dirección. 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. Básicamente 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.

Page 12: Curso Micros

9

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. PRÁCTICA 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. Código //------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #define step1 8 #define step2 4 #define step3 2 #define step4 1 void config_io(void){ // función de configuración de IO

DDRC=0x0F; // Configuración puertos de IO DDRD=0b11111011; // PD2 como entrada PORTD=_BV(PD2); // activar resistencia de pull-up en PD2 }

Page 13: Curso Micros

10

void retardo(void){ // función de retardo int i; // declaracion de entero de 16 bits for(i=0; i<25000; i++); } void secuencia1(void){ // función para secuencia de IO 1 PORTC=step1; retardo(); PORTC=step2; retardo(); PORTC=step3; retardo(); PORTC=step4; retardo(); } void secuencia2(void){ // función para secuencia de IO 2 PORTC=step4; retardo(); PORTC=step3; retardo(); PORTC=step2; retardo(); PORTC=step1; retardo(); } void main(void){ // función principal config_io(); // llamada a función config_io while(1){ switch(PIND) { case(4): secuencia1(); break; case(0): secuencia2(); break; } } } //------------------------------- FIN DE PROGRAMA

Page 14: Curso Micros

11

2.4. NOTAS.

Page 15: Curso Micros

3 INTERRUPCIONES EXTERNAS. 3.1. INTERRUPCIONES. La base de una interrupción es la necesidad de un dispositivo periférico de enviar información al procesador principal del sistema. A nivel operativo, una interrupción tiene la ventaja de que delega la responsabilidad de comunicarse con el procesador al dispositivo periférico en lugar de gastar tiempo de operación en sondear el estado de dicho periférico. 3.2. VECTOR DE INTERRUPCIONES DEL MICROCONTROLADOR ATMEGA8. La tabla 3.1 muestra la ubicación en la memoria del microcontrolador del vector de interrupciones.

Dirección Nombre de la señal Descripción

0x000 Pin de reset, BOD Reset, Watchdog Reset, Power-on Reset 0x001 SIG_INTERRUPT0 Requerimiento de interrupción externa 0 0x002 SIG_INTERRUPT1 Requerimiento de interrupción externa 1 0x003 SIG_OUTPUT_COMPARE2 Timer/Counter 2 Igualdad en comparación 0x004 SIG_OVERFLOW2 Timer/Counter 2 Sobreflujo 0x005 SIG_INPUT_CAPTURE1 Timer/Counter 1 Evento de captura 0x006 SIG_OUTPUT_COMPARE1A Timer/Counter 1 Igualdad en comparación A 0x007 SIG_OUTPUT_COMPARE1B Timer/Counter 1 Igualdad en comparación B 0x008 SIG_OVERFLOW1 Timer/Counter 1 Sobreflujo 0x009 SIG_OVERFLOW0 Timer/Counter 0 Sobreflujo 0x00A SIG_SPI Transferencia serial completa 0x00B SIG_USART0_RECV Recepción completa de la USART 0x00C SIG_USART0_DATA Buffer de datos vacío de la USART 0x00D SIG_USART_TRANS Transferencia completa de la USART 0x00E SIG_ADC Conversión analógico - digital completa 0x00F SIG_EEPROM EEPROM lista 0x010 SIG_COMPARATOR Comparador analógico 0x011 SIG_2WIRE_SERIAL Interfaz serial Two-Wire (I2C) 0X012 SIG_SPM_READY Almacenamiento de memoria de programa listo

Tabla 3.1 Señales de interrupción microcontrolador ATMEGA8 para WinAVR. 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 aún cuando los pines estén configurados como salidas; lo que provee una forma de generar interrupciones vía software.

12

Page 16: Curso Micros

13

Las interrupciones externas pueden ser activadas por flancos de subida, flancos de bajada o un nivel lógico bajo. Esto es configurable a través del registro MCUCR. 3.3.1. MCUCR, registro de control del microcontrolador.

Figura 3.1 Registro MCUCR.

Para la configuración 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 interrupción externa 1. Estos bits controlan la forma en la que se activara la interrupción externa 1 y su configuración es igual que la de los bits 1,0

• Bit 1,0 – ISC01, ISC00: Bits de control de sensado de interrupción externa 0. La interrupción externa 0 es activada por el pin correspondiente a INT0 (PD2), siempre y cuando el bit I del registro SREG y su correspondiente máscara de interrupción estén activados. La tabla 3.2 muestra las posibles configuraciones para disparar la interrupción 0.

ISC01 ISC00 Descripción

0 0 Un nivel bajo en INT0 genera una interrupción. 0 1 Cualquier cambio lógico en INT0 genera una interrupción. 1 0 Un flanco de bajada en INT0 genera una interrupción. 1 1 Un flanco de subida en INT0 genera una interrupción.

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: Habilitación de interrupción externa 1. Si el bit I del SREG esta en uno y este bit

se pone en uno; se habilita la interrupción externa 1. • Bit 6 – INT0: Habilitación de interrupción externa 0. Si el bit I del SREG esta en uno y este bit

se pone en uno; se habilita la interrupción 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 interrupción externa 1, este bit de bandera se

pone en uno. Si están 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 interrupción.

• Bit 6 – INTF0: Igual que INTF0 pero es activado al disparase la interrupción externa 0.

Page 17: Curso Micros

14

3.4. PRÁCTICA DE INTERRUPCIÓN EXTERNA. 3.4.1. Objetivo Conocer el funcionamiento de una interrupción, 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 realización de esta práctica, utilizaremos el circuito de la figura 2.2 3.4.3. Código //------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #include <avr/interrupt.h> #define step1 8 #define step2 4 #define step3 2 #define step4 1 void config_io(void){ // función de configuración de IO DDRC=0x0F; // Configuración puertos de IO DDRD=0b11111011; // PD2 como entrada PORTD=_BV(PD2); // activar resistencia de pull-up en PD2 MCUCR=_BV(ISC01); // selección de comportamiento para INT0 GICR=_BV(INT0); // activación de interrupción externa 0 sei(); // activación de interrupciones globales } void retardo(void){ // función de retardo int i; // declaracion de entero de 16 bits for(i=0; i<25000; i++); } void secuencia1(void){ // función para secuencia de IO 1 PORTC=step1; retardo(); PORTC=step2; retardo(); PORTC=step3; retardo(); PORTC=step4; retardo(); } ISR(SIG_INTERRUPT0){ // interrupción para secuencia de IO 2 PORTC=step4; retardo(); PORTC=step3; retardo(); PORTC=step2; retardo(); PORTC=step1; retardo(); } void main(void){ // función principal config_io(); // llamada a función config_io while(1){ secuencia1(); } } //------------------------------- FIN DE PROGRAMA

Page 18: Curso Micros

15

3.5. NOTAS.

Page 19: Curso Micros

4 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 términos generales, un dispositivo que almacena el número de veces que un evento se lleva a cabo. Un temporizador de un AVR, es un contador que almacena en un registro el número de pulsos de reloj que ocupa como base de tiempo y que, al llegar a un valor de sobreflujo (overflow), normalmente genera una interrupción. 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 interrupción. 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

Page 20: Curso Micros

17

• Bit 7:6 – COM1A1:0 Modo de salida de comparación para canal A. • Bit 5:4 – COM1B1:0 Modo de salida de comparación para canal B. • Bit 3 – Forzamiento de salida de comparación, canal A. • Bit 2 – Forzamiento de salida de comparación, canal B. • Bit 1:0 – WGM11:10 Modo de generación 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 activación para entrada de captura. • Bit 5 – Reservado • Bit 4:3 – WGM13:12 Modo de generación 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 CS11 CS10 Descripción 0 0 0 Sin fuente de reloj, (Timer/Counter detenido) 0 0 1 clkIO/1 (sin pre-escalamiento) 0 1 0 clkIO/8 0 1 1 clkIO/64 1 0 0 clkIO/256 1 0 1 clkIO/1024 1 1 0 Fuente externa en el pin T1, flanco de subida 1 1 1 Fuente externa en el pin T1, flanco de bajada

Tabla 4.1 Bits de selección de fuente de reloj. 4.2.4. Registro de Máscaras de Interrupción del Timer/Counter, TIMSK.

Figura 4.7 Registro TIMSK.

• Bit 5 – TICIE1 Habilitación de interrupción por entrada de captura 1. • Bit 4 – OCIE1A Habilitación de interrupción por salida de comparación 1, canal A. • Bit 3 – OCIE1B Habilitación de interrupción por salida de comparación 1, canal B. • Bit 2 – TOIE1 Habilitación de interrupción por desbordamiento del timer 1.

Page 21: Curso Micros

18

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 comparación 1, canal A. • Bit 3 – OCF1B Bandera de salida de comparación 1, canal B. • Bit 2 – TOV1 Bandera de desbordamiento del timer 1.

4.3. PRÁCTICA DE TIMER1. 4.3.1. Objetivo. Comprender el funcionamiento de los timers del AVR ATmega8 así como los registros que intervienen en su configuración. 4.3.2. Desarrollo. Para la realización de esta práctica utilizaremos el circuito de la figura 2.2. 4.3.3. Código. //------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #include <avr/interrupt.h> #define step1 8 #define step2 4 #define step3 2 #define step4 1 static int step; void config_io(void){ // función de configuración de IO DDRC=0x0F; // Configuración puertos de IO TCCR1B=_BV(CS11); // pre-escala para el timer 1 (clk/8) TIMSK=_BV(TOIE1); // activar interrupción por sobre flujo de timer1 sei(); // activación de interrupciones globales } ISR(SIG_OVERFLOW1){ // interrupción 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; } }

Page 22: Curso Micros

19

void main(void){ // función principal config_io(); // llamada a función 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 configuración es de forma análoga a la del Timer1, ya que los registros para su configuración 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 interrupción 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. PRÁCTICA 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 configuración. 4.5.2. Desarrollo. Arme el circuito de la figura 4.11

Page 23: Curso Micros

20

Figura 4.11 Circuito para prueba de timer / counter.

4.5.3. Código.

Realice las siguientes modificaciones adecuadas al código de la sección 4.3.4: ;------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #include <avr/interrupt.h> #define step1 8 #define step2 4 #define step3 2 #define step4 1 int step; void config_io(void){ // función de configuración de IO DDRC=0x0F; // Configuración puertos de IO DDRD=0b11101111; // PD4 como entrada PORTD=_BV(PD4); // resistencia de pull up en PD4

TIMSK=_BV(TOIE0); // activar interrupción 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(); // activación de interrupciones globales } void config_timer1(void){ TCCR1B=_BV(CS11); // pre-escala para el timer 1 (clk/8)

Page 24: Curso Micros

21

TIMSK=_BV(TOIE1); // activar interrupción por sobre flujo de timer1 } ISR(SIG_OVERFLOW1){ // interrupción 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){ // función principal config_io(); // llamada a función config_io while(1); };------------------------------- FIN DE PROGRAMA

Page 25: Curso Micros

22

4.6. NOTAS.

Page 26: Curso Micros

5 MANEJO DE UN LCD. 5.1. INTRODUCCIÓN. Un Display de Cristal Líquido o LCD por sus siglas en ingles Liquid Cristal Display es un elemento muy utilizado en la industria como interfaz para mostrar información acerca del estado de un proceso a un usuario. Existen dos tipos principales de LCDs, los LCDs de caracteres (figura 5.1) y los gráficos (figura 5.2). Y dentro de estos, existen variantes en el tamaño, líneas en pantalla, iluminación, protocolo de comunicación (RS232, I2C, paralelo), etc. Los LCD’s 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 técnicos puedes visitar la página www.hantronix.com.

Figura 5.1 LCD de caracteres.

Figura 5.2 LCD gráfico.

23

Page 27: Curso Micros

24

5.2. MANEJO DE UN LCD DE CARACTERES. Para esta práctica utilizaremos una pantalla LCD de caracteres de 2x16 con un protocolo de comunicación paralelo de 4 bits de datos y 3 de control. Para empezar a utilizar un LCD, este requiere de una inicialización; esta inicialización esta basada en la carta de tiempos de la figura 5.3. Dependiendo de si se utilizarán 8 bits de datos y 3 de control o 4 de datos y 3 de control.

Figura 5.3 Carta de tiempos para la inicialización de un LCD.

5.3. PRÁCTICA DE USO DE UN LCD DE CARACTERES. 5.3.1. Objetivo. Conocer el funcionamiento de un LCD de caracteres, proveer al estudiante de una colección de funciones sencillas y de fácil manejo para el envío de datos al LCD.

Page 28: Curso Micros

25

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

Figura 5.4 Circuito para prueba de LCD.

5.3.3. Código. //------------------------------- 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 //------------------------------- INICIO DE LIBRERÍA lcd.h /* 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); /* Definiciones de puertos y pines */ #define LCD_DATA4_PORT PORTD // puerto para bit de datos 0 #define LCD_DATA5_PORT PORTD // puerto para bit de datos 1 #define LCD_DATA6_PORT PORTD // puerto para bit de datos 2 #define LCD_DATA7_PORT PORTD // puerto para bit de datos 3 #define LCD_RS_PORT PORTD // puerto para linea RS #define LCD_RW_PORT PORTD // puerto para linea RW #define LCD_E_PORT PORTD // puerto para linea ENABLE

Page 29: Curso Micros

26

#define LCD_DATA4_PIN 4 // pin para bit de datos 0 #define LCD_DATA5_PIN 5 // pin para bit de datos 1 #define LCD_DATA6_PIN 6 // pin para bit de datos 2 #define LCD_DATA7_PIN 7 // pin para bit de datos 3 #define LCD_RS_PIN 3 // pin para linea RS #define LCD_RW_PIN 1 // pin para linea RW #define LCD_E_PIN 2 // pin para linea ENABLE /* 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 tamaño 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

Page 30: Curso Micros

27

lcd_e_high(); data = 0; if ( PIN(LCD_DATA4_PORT) & _BV(LCD_DATA4_PIN) ) data |= 0x10; if ( PIN(LCD_DATA5_PORT) & _BV(LCD_DATA5_PIN) ) data |= 0x20; if ( PIN(LCD_DATA6_PORT) & _BV(LCD_DATA6_PIN) ) data |= 0x40; if ( PIN(LCD_DATA7_PORT) & _BV(LCD_DATA7_PIN) ) data |= 0x80; lcd_e_low(); lcd_e_delay(); // leer nibble bajo lcd_e_high(); if ( PIN(LCD_DATA4_PORT) & _BV(LCD_DATA4_PIN) ) data |= 0x01; if ( PIN(LCD_DATA5_PORT) & _BV(LCD_DATA5_PIN) ) data |= 0x02; if ( PIN(LCD_DATA6_PORT) & _BV(LCD_DATA6_PIN) ) data |= 0x04; if ( PIN(LCD_DATA7_PORT) & _BV(LCD_DATA7_PIN) ) data |= 0x08; lcd_e_low(); return data; } 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) |= _BV(LCD_RS_PIN); DDR(LCD_RW_PORT) |= _BV(LCD_RW_PIN); DDR(LCD_E_PORT) |= _BV(LCD_E_PIN); 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); delay(); // esperar 50ms o mas

Page 31: Curso Micros

28

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

Page 32: Curso Micros

29

5.4. NOTAS.

Page 33: Curso Micros

6 CONVERTIDOR ANALÓGICO DIGITAL. 6.1 CONVERTIDOR ANALÓGICO-DIGITAL. Un convertidor analógico digital (ADC) es un dispositivo capaz de convertir un nivel de voltaje analógico en un determinado valor binario (digital). Un convertidor analógico-digital establece una relación entre su entrada y salida, dependiendo de la resolución con que este cuente. El valor de la resolución se obtiene, si sabemos, el valor máximo de entrada y la cantidad máxima de salida en dígitos binarios. El convertidor del ATmega8 posee una resolución 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 analógico digital del AVR ATmega8, debemos tener presentes las siguientes consideraciones. 6.2.1 Tiempo de conversión. Para realizar adecuadamente una conversión, la frecuencia del circuito de aproximaciones sucesivas debe estar ente 50 Khz y 200 Khz, para una resolución de 10 bits. Si se requiere una resolución 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 conversión, el ADC toma 13 ciclos de reloj de ADC, llevar a cabo una conversión. 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 conversión. 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 analógico digital de n bits, es conviertir linealmente el voltaje entre GND y VREF en 2n “pasos”. El código más pequeño corresponde a 0, mientras el más alto corresponde a 2n-1. Algunos parámetros que miden el valor de la desviación de este comportamiento son:

30

Page 34: Curso Micros

31

• Offset: La desviación de la primera conversión comparada con el valor ideal. • Error de Ganancia: Una vez ajustado el offset, el error de ganancia es la desviación del

resultado obtenido en el valor más 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 desviación máxima de una conversión actual comparada contra una conversión ideal. (0.5 LSB)

• No-linealidad diferencial (DNL, Diferencial non-linearity): La máxima desviación del ancho del código actual (el intervalo entre dos conversiones adyacentes) con respecto al código ideal.

• Error de Cuantización: Debido a la cuantización del voltaje de entrada dentro de un rango finito de valores, un cierto rango de voltajes de entrada (1 LSB) se codificarán con el mismo valor.

• Certeza absoluta: Es la máxima desviación de una conversión actual, comparada contra una conversión ideal de cualquier código. Este es el efecto de compuesto del offset, error de ganancia, DNL, INL y error de cuantización (2 LSB).

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

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

6.3 CONFIGURACIÓN DEL ADC. 6.3.1 Registro de convertidor analógico-digital, ADC. Cuando una conversión analógico-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 más de 8 bits, se puede leer solamente ADCH. De otra forma. se debe leer primero el registro ADCL, después ADCH.

Page 35: Curso Micros

32

Figura 6.3 Registro ADC, con ADLAR = 1.

6.3.2 Registro de selección de multiplexor, ADMUX.

Figura 6.4 Registro ADMUX.

• Bit 7:6 – REFS1:REFS0 Bits de selección de referencia. Seleccionan la referencia de voltaje

para el ADC. La opción 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, Selección de canal analógico. Selecciona que canal del ADC se

utilizara. Ver tabla 7.2

REFS1 REFS0 Selección de referencia de voltaje0 0 AREF, Referencia interna Vref apagada 0 1 AVCC con capacitor externo en AREF 1 0 Reservado 1 1 Referencia interna 2.56 V con capacitor externo en AREF

Tabla 6.1 Selección de referencia de voltaje.

MUX3:0 Entrada single-ended0000 ADC0 0001 ADC1 0010 ADC2 0011 ADC3 0100 ADC4 0101 ADC5

Tabla 6.2 Selección de canal analógico. 6.3.3 Registro de control y de estado A, ADCSRA.

Figura 6.5 Registro ADCSRA.

• Bit 7 – ADEN: Habilitación de ADC. Escribir un uno a este bit, activa el ADC. • Bit 6 – ADSC: Iniciar conversión. En modo de conversión simple, escribir este bit a uno, inicia

cada conversión. Permanece en uno mientras dure la conversión.

Page 36: Curso Micros

33

• 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 interrupción por conversión del ADC. Se activa esta bandera cuando una conversión del ADC se completo.

• Bit 3 – ADIE: Habilitación de interrupción por ADC. Si este bit se activa y también 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 división0 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 PRÁCTICA DEL ADC. 6.4.1 Objetivo. Conocer el funcionamiento del convertidor analógico 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 práctica del ADC.

Page 37: Curso Micros

34

6.4.3 Código. //------------------------------- 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

Page 38: Curso Micros

35

6.5. NOTAS.

Page 39: Curso Micros

7 COMPARADOR ANALÓGICO. 7.1 COMPARADOR ANALÓGICO. Un comparador analógico es un dispositivo que se utiliza cuando se requiere saber el cambio de nivel de una señal 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 algún nivel de voltaje rebasa un nivel peligroso para nuestra aplicación, o cuando queremos saber cual es el comportamiento de dos señales la una con respecto a la otra. El principio de operación es, suponiendo que se tienen dos señales A y B, dadas en términos de niveles de voltaje analógicos la señal de control o de salida del comparador se disparará si:

La señal A es más grande que la señal B. La señal B es más grande que la señal A. Hubo una basculación de las señales A y B (es decir un cambio de nivel alto a nivel bajo con

respecto a la otra señal que funciona como referencia). 7.2 CONFIGURACIÓN DEL COMPARADOR ANALÓGICO. El comparador analógico 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 analógico (ACO) se activa. 7.2.1 Registro de funciones especiales de entradas y salidas, SFIOR.

Figura 7.1 Registro SFIOR

• Bit 3 – ACME: Habilitación de multiplexor para comparador analógico. Cuando se activa este

bit y el convertidor analógico-digital (ADC) esta deshabilitado (ADEN=0 en ADCSRA) el ADC selecciona la entrada negativa del comparador analógico.

36

Page 40: Curso Micros

37

7.2.2 Registro de estatus y control del comparador analógico, ACSR.

Figura 7.2 Registro ACSR

• Bit 7 – ACD: Deshabilita comparador analógico. Un uno en este bit, apaga el comparador analógico.

• Bit 6 – ACBG: Selección 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 analógico. • Bit 4 – ACI: Bandera de interrupción de comparador analógico. Este bit se activa por el

comportamiento de interrupción definido por los bits ACIS1 y ACIS0. • Bit 3 – ACIE: Habilitación de interrupción de comparador analógico. Escribir un uno a este bit,

activa la interrupción por comparador analógico. • Bit 2 – ACIC: Habilitación de evento de captura por comparador analógico. Escribir un uno a

este bit, activa la función del timer/counter1 para que esta sea activada por el comparador analógico. Para que se active el evento de captura, necesita estar an uno el bit TICIE del registro TIMSK.

• Bit 1:0 – ACIS1:ACIS0: Selección de modo de interrupción. Determinan que evento activará la interrupción del comparador analógico. Las diferentes combinaciones se muestran en la tabla 6.1.

ACIS1 ACIS0 Modo de Interrupción.

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 PRÁCTICA DE USO DEL COMPARADOR ANALÓGICO. 7.3.1 Objetivo. Conocer el funcionamiento y los registros que intervienen en la configuración del comparador analógico. 7.3.2 Desarrollo. Arme el circuito de la figura 7.3.

Page 41: Curso Micros

38

Figura 7.3 Circuito para la práctica de comparador analógico.

7.3.3 Código. //------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #include <avr/interrupt.h> void init_comparador(void){ DDRD=0b00111111; // PD6 y PD7 como entradas ACSR=_BV(ACIE); // Interrupcion en cambio AIN0 vs. AIN1 sei(); } ISR(SIG_COMPARATOR){ // Interrupcion por comparador analogico if(PORTD==0x20) // Si el LED esta prendido, apagarlo PORTD=0; else if(PORTD==0x00) // Si el LED esta apagado, prenderlo PORTD=_BV(PD5); } void main(void){ init_comparador(); while(1); } //------------------------------- FIN DE PROGRAMA

Page 42: Curso Micros

39

7.4 NOTAS.

Page 43: Curso Micros

8 USART. 8.1. USART. El Transmisor y Receptor serial Asíncrono y Síncrono Universal o USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter) es una unidad de comunicación periférica muy flexible, que en el microcontrolador ATmega8, nos permite, entre otras funciones:

• Operación full-duplex (se puede enviar y recibir datos simultaneamente). • Operación síncrona y asíncrona. • Operación en modo maestro y esclavo con reloj síncrono. • Soporta frames de 5, 6, 7, 8 y 9 bits de datos y 1 o 2 de parada. • Generador de paridad par o impar. • Detección de errores (data overrun, frame error) • Filtrado de ruido (inicio falso, filtro digital) • Generación de interrupciones por transmisión completa, por recepción completa o por registro

de datos de transmisión vacio. • Comunicación entre multiprocesadores. • Doblador de velocidades modo de comunicación asincrona.

8.2. NORMA RS-232. La norma RS-232 es un protocolo de comunicación serial ya establecido que define la transmisión física entre una terminal DTE (Data Terminal Equipment) y un módem DCE (Data Communication Equipment). Este protocolo define un uno lógico como una señal comprendida en el rango de -5V a -15 V y un cero lógico como una señal dentro del rango +5V a +15V. Bajo esta terminología, la primera transición de 1 a 0 lógico, 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 detección de errores); al final de la transmisión, la señal debe regresar al valor lógico 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 cómputo es más utilizado el conector DB9 de 9 pines (figura 8.1); los pines de este conector se muestran en la tabla 8.1.

40

Page 44: Curso Micros

41

Figura 8.1 Conector DB9 para RS232.

No. Nombre Función. 1 CD Carrier Detect 2 RXD Recepción de dato 3 TXD Transmisión de dato 4 DTR Data Terminal Ready 5 GND Tierra del sistema 6 DSR Data Set Ready 7 RTS Request to send 8 CTS Clear to send 9 RI Ring indicator

Tabla 8.1 Pines de conexión RS232 conector DB9.

8.3. CONFIGURACIÓN 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, serán ignorados. 8.3.2. Registro de control y estado A de la USART, UCSRA.

Figura 8.3 Registro UCSRA.

• Bit 7 – RXC, recepción completa: Este bit se activa cuando existen datos no leidos en el buffer

de recepción. • Bit 6 – TXC, transmisión completa: Este bit se activa cuando se han enviado todos los datos

del buffer de transmisión. • Bit 5 – UDRE, Registro de datos de la USART vacío: 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 recepción 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 transmisión, este bit se activa. • Bit 1 – U2X, Doblador de velocidad USART: solo tiene efecto en modo asíncrono, reduce el

divisor de baud rate de 16 a 8, lo que ocasiona que se duplique la velocidad de transmisión. • Bit 0 – MPCM, Modo de comunicación multi-procesador: Activa el modo de comunicación

multi-procesador, todos los frames recibidos que no contengan información de dirección, serán ignorados.

Page 45: Curso Micros

42

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

Figura 8.4 Registro UCSRB.

• Bit 7 – RXCIE: Habilitación de interrupción por recepción completa. • Bit 6 – TXCIE: Habilitación de interrupción por transmisión completa. • Bit 5 – UDRIE: Habilitación de interrupción por registro de datos de USART vacío. • 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 tamaño 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. 8.3.4. Registro de control y estado C de la USART, UCSRC.

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 operación de la USART, cero en este bit la USART opera en modo

asíncrono, con un uno en este bit, la USART operará de forma síncrona. • Bit 5:4 – Modo de paridad: las posibles combinaciones para el modo de operación con paridad

se muestran en la tabla 8.2.

UPM1 UPM0 Modo de Paridad0 0 Desactivada 0 1 Reservado 1 0 Activada, paridad par 1 1 Activada, paridad impar

Tabla 8.2 Modos de paridad.

• Bit 3 – USBS, selección 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 tamaño de bits de datos, de

acuerdo a la tabla 8.3.

UCSZ2 UCSZ1 UCSZ0 Tamaño de datos0 0 0 5 bits 0 0 1 6 bits 0 1 0 7 bits 0 1 1 8 bits 1 0 0 Reservado 1 0 1 Reservado 1 1 0 Reservado 1 1 1 9 bits

Tabla 8.3 Tamaños de datos.

Page 46: Curso Micros

43

• Bit 0 – UCPOL: Polaridad de reloj. Solo aplica en modo síncrono y determina la relación entre el cambio en la salida de datos y la entrada de datos y el reloj de sincronía (XCK); de acuerdo a la tabla 8.4.

UCPOL Cambio en transmisión (TXD) Muestreo de recepción (RXD)

0 Flanco de subida en XCK Flanco de bajada en XCK 1 Flanco de bajada en XCK Flanco de subida en XCK

Tabla 8.4 Configuración de UCPOL. 8.3.5. Registros de selección 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 configuración, consulte la hoja de datos del microcontrolador (paginas 156 – 159).

Figura 8.7 Ejemplo configuración del registro UBRR.

8.4. PRÁCTICA DEL USART. 8.4.1 Objetivo. Conocer el funcionamiento y los registros que intervienen en la configuración del USART. 8.4.2 Desarrollo. Arme el circuito de la figura 8.8.

Page 47: Curso Micros

44

Figura 8.8 Circuito para la practica de USART.

8.4.3 Código. ;------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #include <avr/interrupt.h> char data; void init_USART(void){ UBRRL=25; // configurar USART para: UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // baudrate: 9600 a 4 MHz UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // 2 stop bits, 8 databits sei(); // sin paridad } void TX_USART(void){ data=data-32; // restar 32 para obtener loop_until_bit_is_set(UCSRA,UDRE); // valor ASCII en mayúscula UDR=data; // enviar dato } ISR(SIG_UART_RECV){ // Interrupción de recepción USART data=UDR; // leer dato recibido TX_USART(); // función de envío de dato } int main(){ init_USART(); while(1){ }; } ;------------------------------- FIN DE PROGRAMA 8.5. NOTAS.

Page 48: Curso Micros

9 PWM. 9.1. PWM. Una señal analógica tiene un rango variable de valores con una resolución infinita ya que puede tomar cualquier valor real; mientras que una señal digital solamente puede tomar valores dentro de un rango predeterminado y finito de posibilidades. El control analógico no es siempre la mejor opción en la industria pues es más propenso a alteraciones por ruido y con el tiempo suele presentar derivas lo cual va complicando la sintonización de los mismos. Los controles analógicos de alta precisión suelen ser muy caros, espaciosos y pesados. La modulación por ancho de pulso, o PWM (Pulse Width Modulation) por sus siglas en ingles, es una poderosa técnica para el control de circuitos analógicos utilizando una señal digital. En este caso la salida digital de un microcontrolador. Visto de una forma sencilla la PWM es una forma de codificar señales analógicas de una forma digital. A través del uso de contadores una señal cuadrada es modulada para obtener un determinado nivel analógico.

90%

50%

25% Figura 9.1 Diferentes ciclos de trabajo de una PWM.

45

Page 49: Curso Micros

46

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. Características de PWM rápida: • PWM de alta frecuencia. • Modo de operación single-slope (cuesta simple). • Modo de operación invertido y no-invertido. • Resolución de 8, 9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolución mínima de 2 bits o 16

bits).

Figura 9.2 Diagrama de tiempos del modo de PWM rápida. 9.2.2. Características de PWM con corrección de fase. • Alta resolución. • Modo de operación dual-slope (doble cuesta). • Modo de operación invertido y no-invertido. • Resolución de 8, 9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolución mínima de 2 bits o 16

bits). 9.2.3. Características de PWM con corrección de fase y frecuencia. • Alta resolución. • Modo de operación dual-slope (doble cuesta). • Modo de operación invertido y no-invertido. • Resolución de 8, 9 y 10 bits, o bien, definida por ICR1 o OCR1A (resolución mínima de 2 bits o 16

bits). Como se ve en la figura 9.4 la salida generada es, en contraste con la PWM de corrección de fase, simétrica 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 simétrica en pulsos y por lo tanto la frecuencia es correcta.

Page 50: Curso Micros

47

Figura 9.3 Diagrama de tiempos del modo de PWM con corrección de fase.

Figura 9.4 Diagrama de tiempos del modo de PWM con corrección de fase. 9.3. CONFIGURACIÓN DE LA PWM. Los registros que intervienen en la configuración de la PWM son los mismos que intervienen en la configuración de los timers 1 y 2. Solo veremos los bits referentes al PWM.

Page 51: Curso Micros

48

9.3.1. Registros de Control A, TCCR1A.

Figura 9.5 Registro TCCR1A

• Bit 7:6 – COM1A1:0 Modo de salida de comparación para canal A. • Bit 5:4 – COM1B1:0 Modo de salida de comparación para canal B. • Bit 1:0 – WGM11:10 Modo de generación de formas de onda.

9.3.2. Registro de Control B, TCCR1B.

Figura 9.6 Registro TCCR1B

• Bit 4:3 – WGM13:12 Modo de generación 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 selección de WGM.

9.4. PRÁCTICA DE PWM. 9.4.1. Objetivo. Conocer el funcionamiento y registros que intervienen en la configuración de la PWM del microcontrolador ATmega8.

Page 52: Curso Micros

49

9.4.2. Desarrollo. Utilice el circuito de la práctica de la USART, añada los componentes que se muestran en le figura 9.8

Figura 9.8 Circuito para la práctica de PWM.

Page 53: Curso Micros

50

9.4.3. Código. ;------------------------------- INICIO DE PROGRAMA #include <avr/io.h> #include <avr/interrupt.h> char data, parametro; void init_PWM(void){ TCCR1A=(1<<COM1A1)|(1<<WGM10); // configura PWM rapida TCCR1B=(1<<WGM12)|(3<<CS10); // 8 bits, no invertida } void init_USART(void){ UBRRL=25; // configurar USART para: UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); // baudrate: 9600 a 4 MHz UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // 2 stop bits, 8 databits sei(); // sin paridad } 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){ // Interrupción de recepción USART data=UDR; // leer dato recibido switch(data){ // determinar que acción seguir case('i'): incrementa(); break; case('d'): decrementa(); break; case('p'): para(); break; case vanza(); ('a'): a break; } } int main(){ DDRB=255; init_PWM(); init_USART(); while(1); } ;------------------------------- FIN DE PROGRAMA

Page 54: Curso Micros

51

9.5. NOTAS.