Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Automatizacin
www.haltica.com
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.
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
8Mhz 8Mhz 20Mhz 22.1Mhz Frecuencia de la prueba: Tabla 1.2 Comparativo entre diferentes familias de microcontroladores 1
Fuente: http://www.freertos.org
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.
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.
1.6.5.
Organizacin de memoria.
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.
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.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:
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)
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.3.
Cdigo
INICIO DE PROGRAMA
//------------------------------#include <avr/io.h> #define #define #define #define step1 step2 step3 step4 8 4 2 1 // // // //
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
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.
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.
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.
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.
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
//------------------------------#include <avr/io.h> #include <avr/interrupt.h> #define #define #define #define step1 step2 step3 step4 8 4 2 1 // // // // // // //
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
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.
Este es el registro encargado de llevar la cuenta de los pulsos de reloj. 4.2.2. Registros de Control A, 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.
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.
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.
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.
//------------------------------#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.2.
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.
19
4.5.3.
Cdigo.
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); }
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.
24
5.3.3.
Cdigo.
INICIO DE PROGRAMA
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);
/* 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 //
bit de datos bit de datos bit de datos bit de datos linea RS linea RW linea ENABLE
0 1 2 3
25
4 5 6 7 3 1 2
// // // // // // //
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; }
) ) ) )
|= |= |= |=
) ) ) )
|= |= |= |=
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.
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
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).
6.3
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
6.3.2
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
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
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.
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
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.
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
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
7.3.1 Objetivo. Conocer el funcionamiento y los registros que intervienen en la configuracin del comparador analgico.
37
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); } //-------------------------------
// 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.
40
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
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.
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.
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.
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.
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).
43
8.4.3
Cdigo.
INICIO DE PROGRAMA
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
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%
45
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).
9.2.2.
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.1.
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.
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.
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
9.4.3.
Cdigo.
INICIO DE PROGRAMA
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); } ;-------------------------------
// // // //
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