Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Micros PDF
Curso Micros PDF
Automatización
Curso de microcontroladores
AVR de ATMEL®
Programación en C
Para uso con la tarjeta Titán EX de Haltica.
Capítulo 8 USART
USART………………………………………………... 40
Norma RS-232……………………………………...... 40
Configuración de la USART………………………… 41
Práctica del USART…………………………………. 43
Notas………………………………………………….. 45
Capítulo 9 PWM
PWM…………………………………………………... 46
Tipos de PWM del microcontrolador ATmega8…... 47
Configuración de la PWM…………………………… 48
Práctica de PWM…………………………………….. 49
Notas………………………………………………….. 52
3
1 INTRODUCCIÓN.
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),
2
temporizadores (timers), UARTs y buses de interfaz especializados como SPI, I C, TWI, CAN, USB,
ZigBee®, LCD, etc.
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
Se requiere realizar una operación de multiplicación: A = B x C
RISC CISC
Código: Código:
load A,scr1 mult A,B
load B,scr2
mul A,B
store C,A
Descripción: Descripción:
• Carga el valor scr1 en el registro A • Multiplica los registros A x B y guarda
• Carga el valor scr2 en el registro B el valor directamente en el registro C
• Multiplica A x B
• Guarda A en dest
Tabla 1.1 Comparación entre tecnología RISC y CISC.
1
Fuente: http://www.freertos.org
2
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.
3
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.
Es posible reprogramar el microcontrolador vía ISP a través de un protocolo SPI de 4 pines (RESET,
SCK, MOSI, MISO).
4
Figura 1.5 Terminales de programación AVR Titán EX
5
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++.
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>
6
2 ENTRADAS Y SALIDAS.
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.
7
Figura 2.1 Circuito de reset y cristal como fuente de reloj
8
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.2. Desarrollo
Arme el circuito de la figura 2.2.
#define step1 8
#define step2 4
#define step3 2
#define step4 1
9
void retardo(void){ // función de retardo
int i; // declaracion de entero de 16 bits
for(i=0; i<25000; i++);
}
10
2.4. NOTAS.
11
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.
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
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.
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.
• 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.
• 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.
13
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
#define step1 8
#define step2 4
#define step3 2
#define step4 1
14
3.5. NOTAS.
15
4 TEMPORIZADOR / CONTADOR.
Un contador es, en términos generales, un dispositivo que almacena el número de veces que un
evento se lleva a cabo.
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.
16
• 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.
17
4.2.5. Registro de banderas de interrupciones del Timer/Counter, TIFR.
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.
#define step1 8
#define step2 4
#define step3 2
#define step4 1
18
void main(void){ // función principal
config_io(); // llamada a función config_io
while(1);
}
//------------------------------- FIN DE PROGRAMA
Son los mismos registros que se utilizaron para configurar el Timer1, la diferencia radica en
seleccionar los bits adecuados para el Timer0.
4.5.2. Desarrollo.
Arme el circuito de la figura 4.11
19
Figura 4.11 Circuito para prueba de timer / counter.
4.5.3. Código.
#define step1 8
#define step2 4
#define step3 2
#define step4 1
int step;
void config_timer1(void){
TCCR1B=_BV(CS11); // pre-escala para el timer 1 (clk/8)
20
TIMSK=_BV(TOIE1); // activar interrupción por sobre flujo de timer1
}
ISR(SIG_OVERFLOW0){
config_timer1();
}
21
4.6. NOTAS.
22
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.
23
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.
24
5.3.2. Desarrollo.
Arme el circuito de la figura 5.4.
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
25
#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
/* 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 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) & _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_waitbusy(void) {
char c;
while ( (c=lcd_read(0)) & (1<<LCD_BUSY)); // esperar hasta que se desocupe
}
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);
}
28
5.4. NOTAS.
29
6 CONVERTIDOR ANALÓGICO DIGITAL.
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.
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.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.
30
• 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).
31
Figura 6.3 Registro ADC, con ADLAR = 1.
• 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.
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 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.
6.4.2 Desarrollo.
Arme el circuito de la figura 6.6.
33
6.4.3 Código.
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();
}
}
34
6.5. NOTAS.
35
7 COMPARADOR ANALÓGICO.
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:
• 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
7.2.2 Registro de estatus y control del comparador analógico, 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.
7.3.2 Desarrollo.
Arme el circuito de la figura 7.3.
37
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();
}
void main(void){
init_comparador();
while(1);
}
38
7.4 NOTAS.
39
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:
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
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
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.
• 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.
41
8.3.3. Registro de control y estado B de la USART, UCSRB.
• 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.
42
• 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.
• 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).
8.4.2 Desarrollo.
Arme el circuito de la figura 8.8.
43
Figura 8.8 Circuito para la practica de USART.
8.4.3 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
}
int main(){
init_USART();
while(1){
};
}
;------------------------------- FIN DE PROGRAMA
8.5. NOTAS.
44
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.
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
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.
• 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).
• 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.
46
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.
47
9.3.1. Registros de Control A, TCCR1A.
48
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
49
9.4.3. Código.
;------------------------------- INICIO DE PROGRAMA
#include <avr/io.h>
#include <avr/interrupt.h>
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;
}
int main(){
DDRB=255;
init_PWM();
init_USART();
while(1);
}
;------------------------------- FIN DE PROGRAMA
50
9.5. NOTAS.
51