Você está na página 1de 44

UNIVERSIDAD AUTÓNOMA DE QUERÉTARO

FACULTAD DE INGENIERÍA

MANUAL DE PRÁCTICAS

PROGRAMACIÓN AVANZADA
MICROCONTROLADORES

JUAN MANUEL RAMOS ARREGUÍN

ENERO - DICIEMBRE 2017


ÍNDICE

PRÁCTICA 1. Introducción General a los Microcontroladores ..........................................................................4


PRÁCTICA 2. Manejo de interrupciones externas INT0 e INT1. ..................................................................... 14
PRÁCTICA 3. Manejo del Temporizador ......................................................................................................... 19
PRÁCTICA 4. Conversión Analógica/Digital (ADC) .......................................................................................... 25
PRÁCTICA 5. Comunicación Serial .................................................................................................................. 31
PRÁCTICA 6. Comunicación serial con un módulo Bluetooth ........................................................................ 38
PRÁCTICA 7. Desarrollo de proyecto .............................................................................................................. 42
CONDICIONES DE ENTREGA

Las prácticas deberán ser entregadas funcionando al 100%, y se debe entregar un reporte que
cumpla con las siguients condiciones:

1. Debe ser en formato PDF.


2. Debe contener todos los puntos de la práctica, con la evidencia en cada punto de que se
cumple con el punto respectivo. Esto incluye diagramas, códigos, fotos y video de resultados.
3. El video no debe tener un tiempo mayor a 10 segundos, y se debe apreciar correctamente el
circuito funcionando.
4. Agregar al final, las conclusiones de cada uno de los integrantes del equipo.
5. La práctica debe ser entregada en el tiempo especificado para tener derecho a la máxima
calificación, de lo contrario, disminuirá 1 punto por cada sesión que se atrase la entrega.
6. Prácticas entregadas después de la evaluación parcial, tendrá un valor de cero.
7. Las fechas de entrega de cada práctica serán las siguientes.

Grupo 31 Grupo 32
Practica 1 28 enero 2017 26 enero 2017
Practica 2 25 febrero 2017 23 febrero 2017
Practica 3 18 marzo 2017 16 marzo 2017
Practica 4 1 abril 2017 30 marzo 2017
Practica 5 22 abril 2017 20 abril 2017
Practica 6 13 mayo 2017 11 mayo 2017
Practica 7 3 junio 2017 1 de junio 2017
PRÁCTICA 1. Introducción General a los Microcontroladores

1.1 OBJETIVO

Aprender a instalar las herramientas de software para programar un microcontrolador, así como
implementar el sistema mínimo de un microcontrolador y utilizando el microcontrolador Atmega 328P,
para controlar hardware.

1.2 MARCO TEÓRICO

El uso de los microcontroladores se ha extendido de manera exponencial hoy en día. Sus usos
más comunes los podemos ver alrededor de nosotros día con día, por lo que resulta muy importante
para un ingeniero en computación aprender a utilizar tales dispositivos e interactuar con ellos a través
de uns computadora personal, para el control y monitoreo de procesos.

En esta práctica, el estudiante comprenderá algunos conceptos básicos de microcontroladores,


los cuales son necesarios para comprender adecuadamente la manera como se programan, así como
las capacidades de los mismos para poder resolver problemas.

1.2.1 Conceptos Básicos.

• Arquitectura de hardware. Establece la manera como se conecta el hardware, para realizar


una función específica. En microcontroladores y microprocesadores, se utiliza básicamente 2
arquitecturas, Von Neummann y Hardvare.
• Datos digitales. Son los valores que se utilizan para programar y configurar el funcionamiento
del µP y µC, y se representan en binario, octal o hexadecimal.
• Dirección de memoria. El funcionamiento de los microcontroladores y microprocesadores se
basa en el uso de direcciones de memoria. En microcontroladres, la dirección de memoria es
interna, y en microprocesadores la dirección de memoria está presente en terminales de los
microcontroladores. Se utiliza para direccionar la información procesada o a procesar, a
registros específicos de manera interna o externa, dependiendo del caso.
• Lenguaje de alto nivel. Son lenguajes que se asemejan más al lenguaje natural de las
personas, y que son más fáciles de utilizar, especialmente para personas que no tienen
mucha experiencia manejando µP y µC. Dentro de la categoría de estos lenguajes, se
encuentran, por ejemplo: C, C++, C#, Java, Basic, entre otros. Para µC son muy comunes
PIC-C, PIC-Basic, Processing, Atmel Studio (especialmente C), entre otros.
• Lenguaje ensamblador. Es el lenguaje de programación del µP y µC más básico, previo al
lenguaje máquina. Se caracteriza por el uso de mnemónicos, y cada instrucción puede estar
conformada por 1 a 3 palabras. Para cada µP y µC existe un lenguaje ensamblador propio, el
cual es definido por el fabricante del dispositivo.
• Lenguaje máquina. Es el lenguaje natural de cualquier sistema digital, y se basa en el
manejo de valores binarios, es decir, solamente se procesan 1’s y 0’s.
• Mapa de memoria. Se utiliza para organizar el conjunto de registros que se utilizan para
configurar la funcionalidad de un microprocesador y de un microcontrolador. Está relacionado
directamente con la dirección de memoria, pues cada registro se encuentra ubicado en una
localidad de memoria específica.
Práctica 1: Introducción General a los Microcontroladores

• Microcontrolador (µC). Es un circuito integrado que tiene la capacidad de realizar


procesamiento de datos digitales. Contienen de manera interna una Unidad Central de
Procesamiento (CPU), Memoria de Acceso Aleatorio (RAM), Memoria de Almacenamiento
Permanente (Memoria FLASH), así como Puertos de Entrada / Salida (PIO). Algunos
dispositivos cuentan con convertidores Analógico/Digital, temporizadores, comunicación
UART, SPI, I2C, entre otras características adicionales. Estos circuitos funcionan de acuerdo
a un programa de usuario, el cual es almacenado en la memoria FLASH. Se utilizan
principalmente para controlar un proceso específico.
• Microprocesador (µP). Es un circuito integrado que tiene la capacidad de realizar el
procesamiento de una gran cantidad de datos digitales. Se basan principalmente en una
unidad interna CPU (Unidad Central de Procesamiento), así como Puertos de Entrada / Salida
(PIO). No cuentan con memoria interna, unidades de comunicación, ni alguna otra
característica adicional. Esto es debido a que el microprocesador se utiliza para en procesos
de alta demanda, por lo que se requiere el uso de periféricos externos. En una computadora
personal, el microprocesador se encarga de administrar el hardware utilizado.
• Registro. Se utilizan para almacenar información digital, y puede tener diversos usos, como
se especifica a continuación.
o Configuración. Son registros que se utilizan para configurar el modo de funcionamiento
del microcontrolador o microprocesador. Por ejemplo, en un microcontrolador:
configuración de los puertos de entrada/salida (E/S ó I/O), convertidor Analógico/Digital
(A/D), temporizador, comunicación serial, entre otros.
o Operación. Son los registros que se utilizan para el funcionamiento normal del
microcontrolador, y que se requiere para almacenar valores. Algunos de estos
registros se conocen como Acumuladores. Todo µP y µC utilizan acumuladores en los
procesos de cómputo.
o Memoria. En los microcontroladores, también se les llama a los registros “localidades
de memoria”, que es donde se almacena información de manera temporal (RAM) o
permanente (FLASH).
• Cristal. Elemento de hardware utilizado para alimentar al µP y µC con la señal de reloj. Este
cristal define la velocidad a la cual se va a procesar los datos digitales.

1.2.2 El microcontrolador.

Algunas de las principales características de un µC se presentan a continuación. Son importantes


para definir si nos conviene ese circuito, o se debe buscar alguna otra alternativa.

• Arquitectura.
• Velocidad de procesamiento en Número de Instrucciones por Segundo (IPS).
• Número de multiplicadores implementados en hardware.
• Capacidad de memoria para usuario y para programa, en bytes.
• Número de ciclos de escritura/borrado para la memoria Flash.
• Tiempo de retención del dato.
• Seguridad para evitar el robo de software.
• Periféricos disponibles. Por ejemplo, puertos, temporizadores, convertidor A/D,
comunicación serial, entre otros.
• Número de bits de datos.

5
Práctica 1: Introducción General a los Microcontroladores

1.2.3 El microcontrolador ATMega328P

En la figura 1.1, se muestra el encapsulado del µC mencionado.

Figura 1.1. Encapsulado del µC ATMega 328P.

1.2.4 El mapa de memoria.

El µC ATMega328P, maneja 3 mapas de memoria, para los cuales utiliza 3 conjuntos de


direcciones de memoria, para tener independencia en el manejo de tales mapas. En la figura 1.2, se
muestra el mapa de memoria de datos y de programa.

0x0000 0x0000

32 Registros

0x001F
0x0020 Sección de
memoria
64 Registros
Flash para
de I/O
programación
0x005F del µC
0x0060
160
Registros de
I/O
extendidos
0x00FF
0x0100
Memoria Sección
interna Flash para
SRAM memoria de
(1048 x 8) arranque
0x08FF 0x3FFF
Memoria de Memoria de
Datos Programa

Figura 1.2. Mapa de memoria ATMega328P.

6
Práctica 1: Introducción General a los Microcontroladores

1.2.5 Registros de configuración de puertos I/O.

Los puertos del µC se consideraciones como puertos de propósito general, es decir, podemos
utilizarlos como puertos de I/O, o bien, configurarlos para un uso especial. Los usos especiales se
verán posteriormente en otras prácticas.

Para cada puerto se encuentran asociados dos registros. Configuración de terminales, el cual se
usa para indicar que pines serán entradas y cuales van a funcionar como salida. Escritura/lectura
externa, es decir, se utiliza para escribir datos del interior del µC hacia el exterior, o bien, en sentido
contrario.

Los puertos asociados son los siguientes.

PINB: Registro de Lectura de Datos del Puerto B. Se utiliza para leer datos de elementos externos
al µC. Solamente se pueden leer los bits que han sido configurados como lectura en el DDRB.

Bit 7 6 5 4 3 2 1 0
0x03 (0x23) PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value N/A N/A N/A N/A N/A N/A N/A N/A

DDRB: Registro de Configuración de Dirección de Datos del Puerto B. Se utiliza para configurar
cada una de las terminales del puerto del µC. Si se escribe un ‘1’, la terminal se configura como
salida. El ‘0’ configura la terminal como entrada. Por ejemplo, si en el bit 6 se escribe un ‘1’ y el resto
permanece en ‘0’, la terminal 6 del puerto B (PB6) va a funcionar como salida de datos y solamente
se puede leer su valor a través del PINB. El resto funciona como entrada de datos.

Bit 7 6 5 4 3 2 1 0
0x04 (0x24) PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

PORTB: Registro de Salida de Datos del Puerto B. Se utiliza para escribir datos al exterior del µC.
La escritura de bits funciona solamente con aquellos que fueron configurados como salidas en el
DDRB.

Bit 7 6 5 4 3 2 1 0
0x05 (0x25) PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

PINC: Registro de Lectura de Datos del Puerto C.

Bit 7 6 5 4 3 2 1 0
0x06 (0x26) PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value N/A N/A N/A N/A N/A N/A N/A N/A

DDRC: Registro de Configuración de Dirección de Datos del Puerto C.

Bit 7 6 5 4 3 2 1 0
0x07 (0x27) PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

7
Práctica 1: Introducción General a los Microcontroladores

PORTC: Registro de Salida de Datos del Puerto C.

Bit 7 6 5 4 3 2 1 0
0x08 (0x28) PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

PIND: Registro de Lectura de Datos del Puerto D.

Bit 7 6 5 4 3 2 1 0
0x09 (0x29) PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value N/A N/A N/A N/A N/A N/A N/A N/A

DDRD: Registro de Configuración de Dirección de Datos del Puerto D.

Bit 7 6 5 4 3 2 1 0
0x0A (0x2A) PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

PORTD: Registro de Salida de Datos del Puerto D.

Bit 7 6 5 4 3 2 1 0
0x0B (0x2B) PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

1.3 DESARROLLO:

1.3.1 Implemente el siguiente circuito.

8
Práctica 1: Introducción General a los Microcontroladores

1.3.2 Programe el microcontrolador utilizando el siguiente código, para leer el dato digital de los 6
interruptores conectados al Puerto D, y el valor digital se debe exhibir en los led’s conectados
al Puerto C

#include <avr/io.h>

void Ports_Setup(); //Prototipo de la función para que pueda


//ser utilizada en cualquier parte del código.

void Ports_Setup() //Función que define la configuración de los puertos


{
DDRD = 0x00; //Especificamos el Puerto D como Entrada
DDRC = 0xFF; //Especificamos el Puerto C como Salida
}

int main(void)
{
Ports_Setup(); //Mandamos llamar la función Ports_Setup()
while(1)
{
PORTC = PIND; //El Puerto D es leido y desplegado a través del Puerto C
}
}

1.3.3 Arme el siguiente circuito.

1.3.4 Utilice el siguiente código para programar el microcontrolador. Se debe mostrar un contador
binario.

9
Práctica 1: Introducción General a los Microcontroladores

//Este programa implementa la función de incrementar un puerto y desplegar dicho


//valor por un periodo de tiempo de 200ms

# define F_CPU 11059200 //Especificamos la frecuencia del cristal que será


//utilizado para calcular el delay en la librería delay.h
#include <avr/io.h>
#include <util/delay.h> //Librería delay.h para colocar retardos en ms

void Ports_Setup();

void Ports_setup()
{
DDRC = 0xFF; //Colocamos todo el puerto de Salida
}

int main(void)
{
Ports_setup();
while(1)
{
_delay_ms(200); //Espera 200 ms
PORTC++; //Despliega el dato en el Puerto C e incrementa el puerto
//C después de desplegarlo
}
}

1.3.5 Implemente el siguiente circuito, el cual representa el funcionamiento de un semáforo.

1.3.6 Programe al microcontrolador con el siguiente código.

#define F_CPU 14745600

#include <avr/io.h>
10
Práctica 1: Introducción General a los Microcontroladores

#include <util/delay.h>
void ports_setup();

void ports_setup()
{
DDRC = 0xFF;
PORTC = 0x00;
}

int main(void)
{
ports_setup();
while(1)
{
PORTC = 0x21;
_delay_ms(8000);
PORTC = 0x22;
_delay_ms(2000);
PORTC = 0xC;
_delay_ms(8000);
PORTC = 0x14;
_delay_ms(2000);
}
}

1.3.7 Implemente el siguiente circuito, para controlar el arranque de un motor de corriente directa.
Se omite las conexiones de alimentaciones y del cristal, para hacer más simple el diagrama, si
embargo, no olvide conectar esas etapas. Utilice un motor que consuma menos de 500 mA de
corriente. Vm es el voltaje de alimentación del motor.

11
Práctica 1: Introducción General a los Microcontroladores

1.3.8 Utilice el siguiente código para programar el microcontrolador.

#define F_CPU 14745600


#include <avr/io.h>
#include <util/delay.h>

void ports_setup();

void ports_setup()
{
DDRC = 0xFF;
PORTC = 0x00;
}

int main(void)
{
ports_setup();

while(1)
{
PORTC = 0x01;
_delay_ms(2000);

PORTC = 0x00;
_delay_ms(2000);
}
}

1.3.9 Modifique el ejemplo del semáforo para controlar 3 semáforos y un semáforo peatonal.
1.3.10 Ahora, cambie el motor por un relevador, y modifique el código y el hardware, para encender
un foco de 120 Vac, cuando se detecte la falta de luz ambiental. Se recomienda utilizar una
fotoresistencia.
1.3.11 En base a los ejercicios de los puntos 1 a 3, desarrolle los siguientes ejercicios:
a. Genere la siguiente secuencia en el puerto C: 000001, 000010, 000100, 001000,
010000, 100000 y se repite.
b. Modifique la secuencia del inciso b, para que el desplazamiento del 1 sea en las dos
direcciones, es decir: 000001, 000010, 000100, 001000, 010000, 100000, 010000,
001000, 000100, 000010, y se repite la secuencia.
c. Implemente un contador del 0 al 9 en un exhibidor de 7 segmentos.
d. Modifique el contador, para que una vez que llegue a 10, comience a contar
descendente. Mientras la cuenta desciende el motor debe estar encendido. Cuando la
cuenta llega a cero, se apaga el motor y comienza a contar ascendente.
1.3.12 Modifique el circuito del microcontrolador para controlar el sentido de giro de un motor de CD.
1.3.13 En base al ejercicio 5a y 5b, implemente un circuito para controlar el giro de un motor a pasos
unipolar.
1.3.14 En base al ejercicio 5a y 5b, implemente un circuito para controlar el giro de un motor a pasos
bipolar.

1.4 Actividades Adicionales.

1. Haga una tabla comparativa de las principales características entre el µC ATMega328P, y el


PIC16F873.

12
Práctica 1: Introducción General a los Microcontroladores

2. Muestre y compare el mapa de memoria de los µC’s del punto 1.


3. En dos tablas, muestre una descripción de las terminales de los µC’s del punto 1.
4. Investigue un código ejemplo en lenguaje ensamblador para los µC’s del punto 1, y explique el
funcionamiento de cada instrucción. No menos de 20 líneas.

13
PRÁCTICA 2. Manejo de interrupciones externas INT0 e INT1.

2.1 OBJETIVO: Aprender a utilizar las interrupciones externas INT0 e INT1 en el microcontrolador, y
utilizarlas en tareas relacionadas con aplicaciones de control.

2.2 MARCO TEÓRICO.

Las interrupciones son eventos que se generan de manera externa o interna al


microcontrolador, y tienen la característica de “interrumpir” cualquier tarea que en ese momento esté
desarrollando el microcontrolador, para que atienda otra tarea diferente y una vez que termina de
atender dicha tarea, “retorna” a la línea de programa donde se encontraba cuando se generó la
interrupción, para continuar con la tarea que dejó pendiente.

Cuando una interrupción se genera, el microcontrolador lee una dirección de memoria


relacionada con la fuente de interrupción, la cual se ubica en una dirección específica del mapa de
memoria de programa (vector de interrupción) del microcontrolador. La tabla siguiente muestra los
vectores de interrupción, para el microcontrolador Atmega328P.
Práctica 2: Manejo de interrupciones externas INT0 e INT1

Los principales registros relacionados con la configuración de las interrupciones son los
siguientes:

2.2.1 Registro de Control de Interrupciones Externas – EICRA

Este registro se utiliza para configurar el funcionamiento de las interrupciones externas,


relacionadas con las terminales INT1 e INT0.

Bit 7 6 5 4 3 2 1 0
(0x69) - - - - ISC11 ISC10 ISC01 ISC00
Read/Write - - - - R/W R/W R/W R/W
Initial Value - - - - 0 0 0 0

• Bit 3:0 – ISC11:ISC10 Control de Sensor de Interrupción

Estos bits sirven para configurar el nivel y borde de activación de las interrupciones INT1 e
INT0, de acuerdo a la siguiente tabla.

ISC11 ISC10 ISC01 ISC00 Descripción


- - 0 0 El nivel bajo de la terminal INT0 genera una petición de interrupción
- - 0 1 Cualquier cambio lógico en INT0 genera una petición de interrupción
- - 1 0 El borde de bajada en INT0 genera una petición de interrupción
- - 1 1 El borde de subida en INT0 genera una petición de interrupción
0 0 - - El nivel bajo de la terminal INT1 genera una petición de interrupción
0 1 - - Cualquier cambio lógico en INT1 genera una petición de interrupción
1 0 - - El borde de bajada en INT1 genera una petición de interrupción
1 1 - - El borde de subida en INT1 genera una petición de interrupción

2.2.2 Registro General de Interrupciones Externas – GICR

Este registro es utilizado para habilitar y deshabilitar (apagar y encender) las interrupciones
externas INT0 e INT1.

Bit 7 6 5 4 3 2 1 0
INT1 INT0 - - - - - -
Read/Write R/W R/W - - - - - -
Initial Value 0 0 - - - - - -

• Bit 7:6 – Bits de habilitación de interrupcíon

Estos bits sirven para habilitar las interrupciones externas. Si se escribe un ‘1’ lógico, se
habilita la interrupción correspondiente, si se escribe un ‘0’, la interrupción queda deshabilitada.
Observe la siguiente tabla.

INT1 INT0 Descripción


0 - Interrupción 1 deshabilitada
1 - Interrupción 1 habilitada
- 0 Interrupción 0 deshabilitada
- 1 Interrupción 0 habilitada

2.2.3 Registro General de Banderas de Interrupciones Externas – EIFR

Este registro se relaciona con las banderas de interrupción. Cuando una bandera se pone en
‘1’ lógico, indica que se ha realizado una petición de interrupción en la terminal INT correspondiente.
Mientras la, correspondiente a la interrupción INT1. Cuando la bandera se pone en ‘1’ y está

15
Práctica 2: Manejo de interrupciones externas INT0 e INT1

habilitada la interrupción correspondiente, entonces el microcontrolador atiende la interrupción. La


bandera es automáticamente puesta en ‘0’ cuando la rutina de interrupción es ejecutada.

Bit 7 6 5 4 3 2 1 0
INTF1 INTF0 - - - - - -
Read/Write R/W R/W - - - - - -
Initial Value 0 0 - - - - - -

• Bit 7:5 – Bits de habilitación de interrupcíon

Estos bits sirven para habilitar las interrupciones externas. Si se escribe un ‘1’ lógico, se
habilita la interrupción correspondiente, si se escribe un ‘0’, la interrupción queda deshabilitada.
Observe la siguiente tabla.

INT2 INT1 INT0 Descripción


0 - - Interrupción 2 deshabilitada
1 - - Interrupción 2 habilitada
- 0 - Interrupción 1 deshabilitada
- 1 - Interrupción 1 habilitada
- - 0 Interrupción 0 deshabilitada
- - 1 Interrupción 0 habilitada

2.3 DESARROLLO:

2.3.1 Implemente el siguiente circuito, para el manejo de las interrupciones INT0 e INT1.

2.3.2 Programe al microcontrolador con el siguiente código.

//Este código consiste en incrementar el puerto C al activarse la interrupción 0 y


//decrementar el puerto C al activarse la interrupción 1
#include <avr/io.h>
16
Práctica 2: Manejo de interrupciones externas INT0 e INT1

#include <avr/interrupt.h> //Libreria para el manejo de Interrupciones

void Ports_Setup(); //Prototipo de la función para configurar puertos


void External_Interrupts_Setup(); //Prototipo para configurar las interrupciones

void Ports_Setup()
{
DDRD = 0x00; //Se configura el puerto D como entrada
DDRC = 0xFF; //Se configura el puerto C como salida
PORTC = 0x00; //Limpiamos el puerto C
}

void External_Interrupts_Setup()
{
EICRA = (1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00); //La interrupción 0 es
//configurada para sensar flancos de bajada, la interrupción
//1 se configura para sensar flancos de bajada
EIMSK = (1<<INT1)|(1<<INT0); //Las interrupciones 0 y 1 son habilitadas
EIFR = (0<<INTF1)|(0<<INTF0); //Las banderas de interrupciones son borradas
PCICR = (0<<PCIE2)|(0<<PCIE1)|(0<<PCIE0); //Son deshabilitadas las
//interrupciones externas tipo "Pin-Change"
PCIFR = (0<<PCIF2)|(0<<PCIF1)|(0<<PCIF0); //Son borradas las banderas de las
//interrupciones tipo "Pin-Change"
PCMSK2 = 0x00; //Se deshabilitan las interrupciones Pin-Change para PCINT[23:16]
PCMSK1 = 0x00; //Se deshabilitan las interrupciones Pin-Change para PCINT[14:8]
PCMSK0 = 0x00; //Se deshabilitan las interrupciones Pin-Change para PCINT[7:0]
}

ISR(INT0_vect,ISR_NAKED)
{
PORTC++; //Se muestra el valor del puerto C y después se incrementa su valor
reti(); //Regreso de la interrupcion
}

ISR(INT1_vect,ISR_NAKED)
{
PORTC--; //Se muestra el valor del Puerto C y después decrementa su valor
reti(); //Regreso de la interrupcion
}

int main(void)
{
Ports_Setup();
External_Interrupts_Setup();
sei();
while(1)
{
}
}

2.3.3 Arme el siguiente circuito, el cual utiliza señales acopladas ópticamente (optoacopladores).
Considere que las tierras del motor son diferentes a las tierras del microcontrolador, esto
quiere decir que la tierra del motor y del microcontrolador NO deben unirse. Escriba un
programa que permita encender un motor cuando se active la interrupción INT1. Se debe
apagar una vez que la misma interrupción se vuelve a activar. El otro motor debe controlarse
utilizando la interrupción INT0.

17
Práctica 2: Manejo de interrupciones externas INT0 e INT1

2.3.4 Utilizando el mismo principio de señales aisladas ópticamente, investigue sobre un circuito
que permita controlar el sentido de giro de un motor, ármelo y conéctelo en lugar de los dos
motores del punto 3 de esta práctica.
2.3.5 Arme un circuito digital basado en el microcontrolador de forma que el funcionamiento sea el
siguiente:
a. Inicie el conteo en 0.
b. Al activar la interrupción INT0, el contador comienza a contar automáticamente en
forma ascendente, cada 250 ms.
c. Al activar la interrupción INT1, el contador cambia de dirección de conteo, es decir,
descendente, con el mismo intervalo de tiempo. Cada que se active INT1, se invierte el
sentido de conteo.
d. Al activar nuevamente la interrupción INT0, se detiene el conteo, sin perder la cuenta
ni el sentido de cuenta. Para continuar el conteo, se debe volver a activar INT0.
e. El conteo se debe mostrar en el exhibidor de 7 segmentos.
2.3.6 Arme un circuito que controle un motor a pasos unipolar, diseñe el programa y pruebe su
funcionamiento. Si el motor consume más de 100 mA, utilice el pricipio de señales opto-
acopladas.
2.3.7 Arme un circuito que controle un motor a pasos bipolar, diseñe el programa y pruebe su
funcionamiento. Si el motor consume más de 100 mA, utilice el principio de señales opto-
acopladas.
2.3.8 Modifique el ejercicio del semáforo, para que el semáforo peatonal se active únicamente por
medio de interrupción. Es decir, el semáforo peatonal no se activa si no existe petición de un
usuario.

18
PRÁCTICA 3. Manejo del Temporizador

3.1 OBJETIVO: Aprender a utilizar el temporizador como sistema de medición de tiempo, y utilizarlas
en tareas de control de secuencias de tiempo.

3.2 MARCO TEÓRICO

El microcontrolador de ATMega328P, cuenta con temporizadores de propósito general para la


medición de tiempo, y puede usarse para medición de periodo de una señal, generación de
Modulación en Ancho de Pulso (PWM), y generación periódica de interrupciones.

La figura muestra un diagrama a bloques del temporizador/contador de 8 bit.

Los registros a utilizar en la configuración del temporizador son los siguientes:

3.2.1 Registro de Control A del Temporizador / Contador 1 – TCCR1A

Bit 7 6 5 4 3 2 1 0
COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
Read/Write R/W R/W R/W R/W W W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7:6 – COM1A1:0: Compare Output Mode for Compare unit A


• Bit 5:4 – COM1B1:0: Compare Output Mode for Compare unit B
Los bits COM1A1:0 y COM1B1:0 son registros de control de las terminales de Comparación de
Salida de OC1A y OC1B, respectivamente, y son las terminales 15 y 16, control the Output Compare
pins (OC1A and OC1B respectively). Estos bits controlan el comportamiento de estas terminales. El
comportamiento está definido por las siguientes tablas, dependiendo del modo en que se desea que
funcione. El microcontrolador tiene tres modos para utilizar el comparador de salida, los cuales son
Práctica 3: Manejo del Temporizador

Modo Salida de Comparación, Modo PWM Rápido y PWM Corrección de Fase y Corrección de Fase
y Frecuencia.

Modo Salida de Comparación (Compare Output Mode)


COM1A1/COM1B1 COM1A0/COM1B0 Descripción
0 0 Operación normal del puerto. Entrada/Salida.
Se invierte el estado lógico de la salida de la terminal, cuando se iguala la
0 1
comparación OC1A/OC1B.
La salida de la terminal se va a 0 lógico, cuando se iguala la comparación
1 0
OC1A/OC1B.
La salida de la terminal se va a 1 lógico, cuando se iguala la comparación
1 1
OC1A/OC1B.

Modo Salida de Comparación, PWM Rápido


COM1A1/COM1B1 COM1A0/COM1B0 Descripción
0 0 Operación normal del puerto. Entrada/Salida.
WGM13:0 = 15, Se invierte el estado lógico de la salida de la terminal OC1A
cuando se iguala la comparación, y OC1B tiene su comportamiento normal
0 1 como Entrada/Salida.
Para todos los demás valores de WGM13:0, las terminales OC1A/OC1B
tienen funcionamiento normal como E/S.
La salida de la terminal OC1A/OC1B se va a 0 lógico, cuando la
1 0
comparación se iguala, y se pone en uno en la cuenta más baja (BOTTOM).
La salida de la terminal OC1A/OC1B se pone en 1 lógico, cuando se iguala
1 1
la comparación, y se pone en 0 en la cuenta más baja (BOTTOM).

PWM Corrección de Fase y Corrección de Fase y Frecuencia


COM1A1/COM1B1 COM1A0/COM1B0 Descripción
0 0 Operación normal del puerto. Entrada/Salida.
WGM13:0 = 9 o 14, Se invierte el estado lógico de la salida de la terminal
OC1A cuando se iguala la comparación, y OC1B tiene su comportamiento
0 1 normal como Entrada/Salida.
Para todos los demás valores de WGM13:0, las terminales OC1A/OC1B
tienen funcionamiento normal como E/S.
La salida de la terminal OC1A/OC1B se va a 0 lógico, cuando el conteo es
1 0
ascendente. Se pone en 1 cuando el conteo es descendente.
La salida de la terminal OC1A/OC1B se pone en 1 lógico, cuando se iguala
1 1 la comparación y el conteo es ascendente, y se pone en 0 lógico si el
conteo es descendente.

• Bit 3 – FOC1A: Force Output Compare for Compare unit A


• Bit 2 – FOC1B: Force Output Compare for Compare unit B
Los bits FOC1A y FOC1B se utilizan únicamente cuando los bits WGM13:0 desactivan el modo
PWM. Cuando no se use el modo PWM, estos bits deben valer 0 lógico. Cuando se escribe un 1 al bit
FOC1A/FOC1B se forza una igualación de comparación inmediata en la unidad de Generación de
Forma de Onda. Los bits OC1A/OC1B cambian acorde con la configuración del bit COM1x1:0. Estos
bit se leen como 0.

• Bit 1:0 – WGM11:10: Modo de Generación de Forma de Onda (WGM, Waveform Generation
Mode)

Se combinan con los bits WGM13:12 del registro TCCR1B, y sirven para controlar la secuencia
del contador, la fuente del máximo valor de la cuenta (TOP), y el tipo de generación de forma de onda
a ser usada. En la tabla siguiente se observa las distintas combinaciones.

20
Práctica 3: Manejo del Temporizador

Mode WGM13 WGM12 WGM11 WGM10 Modo de Operación TOP Cambio Encendido
(CTC1) (PWM11) (PWM10) Temporizador/Contador en bandera
OCR1x TOV1
0 0 0 0 0 Normal 0xFFFF Inmediato MAX
1 0 0 0 1 PWM, fase corregida, 8 bit 0x00FF TOP BOTTOM
2 0 0 1 0 PWM, fase corregida, 9 bit 0x01FF TOP BOTTOM
3 0 0 1 1 PWM, fase corregida, 10 0x03FF TOP BOTTOM
bit
4 0 1 0 0 CTC OCR1A Inmediato MAX
5 0 1 0 1 Rápido PWM, 8 bit 0x00FF BOTTOM TOP
6 0 1 1 0 Rápido PWM, 9 bit 0x01FF BOTTOM TOP
7 0 1 1 1 Rápido PWM, 10 bit 0x03FF BOTTOM TOP
8 1 0 0 0 PWM, corrección de fase ICR1 BOTTOM BOTTOM
y frecuencia
9 1 0 0 1 PWM, corrección de fase OCR1A BOTTOM BOTTOM
y frecuencia
10 1 0 1 0 PWM, corrección de fase ICR1 TOP BOTTOM
11 1 0 1 1 PWM, corrección de fase OCR1A TOP BOTTOM
12 1 1 0 0 CTC ICR1 Inmediato MAX
13 1 1 0 1 Reservado - - -
14 1 1 1 0 Rápido PWM ICR1 BOTTOM TOP
15 1 1 1 1 Rápido PWM OCR1A BOTTOM TOP

3.2.2 Registro de Control B del Temporizador / Contador 1 – TCCR1B

Bit 7 6 5 4 3 2 1 0
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
Read/Write R/W R/W R R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7 – ICNC1: Cancelador de ruido de entrada (Input Capture Noise Canceler)


ICNC1 = 1 : Cancelador de Ruido activado.
ICNC1 = 0 : Cancelador de Ruido desactivado.

• Bit 6 – ICES1: Selección de Borde de Captura de Entrada (Input Capture Edge Select)
ICES1 = 0 : Borde negativo
ICES1 = 1 : Borde positivo

• Bit 5 – Bit Reservado


No accesible al usuario

• Bit 4:3 – WGM13:2: Modo de Generación de Forma de Onda (Waveform Generation Mode)
Ver la descripción del registro TCCR1A.

• Bit 2:0 – CS12:10: Selección de reloj (Clock Select)


Estos 3 bit de selección se utilizan para elegir la fuente de reloj a utilizar por el Temporizador /
Contador, de acuerdo a la siguiente tabla.

CS12 CS11 CS10 Descripción


0 0 0 Temporizador/Contador deshabilitado
0 0 1 CLK/1
0 1 0 CLK/8
0 1 1 CLK/64
1 0 0 CLK/256
1 0 1 CLK/1024
1 1 0 Fuente de reloj externa en terminal T1, borde negativo.
1 1 1 Fuente de reloj externa en terminal T1, borde positivo.
21
Práctica 3: Manejo del Temporizador

3.2.3 Registro TCNT1 Temporizador/Contador

Registro utilizado para llevar la cuenta del temporizador, tomando como base la señal de reloj
configurada en CS1.

Bit 7 6 5 4 3 2 1 0
TCNT1H TCNT1[15:8]
TCNT1L TCNT1[7:0]
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

3.2.4 Registro de Comparación de Salida 1 A – OCR1A

Registro utilizado para realizar la comparación con el contenido del registro TCNT1, y cuando
ambos registros se igualan, generar la salida configurada en el registro TCCR1A.

Bit 7 6 5 4 3 2 1 0
OCR1AH OCR1A[15:8]
OCR1AL OCR1A[7:0]
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

3.2.5 Registro de Comparación de Salida 1 B – OCR1B

Registro utilizado para realizar la comparación con el contenido del registro TCNT1, y cuando
ambos registros se igualan, generar la salida configurada en el registro TCCR1B.

Bit 7 6 5 4 3 2 1 0
OCR1AH OCR1B[15:8]
OCR1AL OCR1B[7:0]
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

3.2.6 Registro de Captura de Entrada – ICR1

Cuando se activa la terminal ICP1 del microcontrolador, el valor del registro TCNT1 pasa a este
registro. Este registro puede ser utilizado para la configuración del valor TOP del contador.

Bit 7 6 5 4 3 2 1 0
ICR1H ICR1[15:8]
ICR1L ICR1[7:0]
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

3.3 DESARROLLO.

3.3.1 Implemente el siguiente circuito, el cual se utiliza para controlar un servomotor, utilizando la
técnica de PWM. Observe la señal PWM en un osciloscopio para que se reporte la forma de
onda.

22
Práctica 3: Manejo del Temporizador

3.3.2 Programe al microcontrolador con el siguiente código, y compruebe el funcionamiento.

//Este código consiste en generar PWM Rápido a 50Hz para el control de un


//servomotor a partir del Timer 1
#include <avr/io.h>

void Ports_Setup(); //Prototipo función de configuración de puertos para


//ser usado en cualquier parte del código
void Timer1_Setup(); //Prototipo configuración de temporizador 1 para
//ser usado en cualquier parte del código
void Timer1_Start(); //Prototipo arranque del temporizador 1 para
//ser usado en cualquier parte del código

void Ports_Setup()
{
DDRB = 0x02; //Se configura el pin OC1A como salida para el PWM rápido
}

void Timer1_Setup()
{
//PWM Rapido No Inverso, OC1B desconectado,
//TOP especificado por el registro ICR1
TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|
(1<<WGM11)|(0<<WGM10);
//Colocamos el Timer1 Detenido
TCCR1B = (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|
(0<<CS11)|(0<<CS10);

23
Práctica 3: Manejo del Temporizador

//Force Output Compare = deshabilitados


TCCR1C = (0<<FOC1A)|(0<<FOC1B);
TCNT1 = 0; //Inicializamos la cuenta a 0
ICR1 = 19999; //Colocamos como TOP = 0x4E1F
OCR1A = 5000; //Ciclo útil a 25%
OCR1B = 0;
TIMSK1 = 0x00; //Sin interrupciones
TIFR1 = 0x00; //Limpiamos las banderas de las interrupciones
}

void Timer1_Start()
{
//Encendemos el Timer con un prescalador de 8
TCCR1B = (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|
(0<<CS12)|(1<<CS11)|(0<<CS10);
}

int main(void)
{
Ports_Setup(); //Se llama la función de configuración de los puertos
Timer1_Setup(); //Se llama la función de configuración del Timer 1
Timer1_Start(); //Se enciende el Timer 1
OCR1A = 5000; //Ciclo util a 25%

while(1)
{
}
}

3.3.3 Modifique el código, para controlar la velocidad de un motor a pasos unipolar, utilizando el
temporizador en lugar de la función delay.
3.3.4 Modifique el código para controlar la velocidad y dirección de dos motores de DC, utilizando
las interrupciones para el arranque y paro de los motores. El funcionamiento de cada motor
debe ser de manera independiente.
3.3.5 Utilizando el modo de captura de entrada, realice un programa para el microcontrolador para
medir el tiempo de ocurrencia entre dos eventos. Lea la sección INPUT CAPTURE UNIT,
página 117, de la hoja de datos del Atmega328P. Así mismo, la sección de registros a partir
de la página 131.
3.3.6 Investigue que es un encoder y los tipos de encoder que existen, así como su principio de
funcionamiento.
3.3.7 Implemente un programa que maneje un encoder incremental/decremental.0

24
PRÁCTICA 4. Conversión Analógica/Digital (ADC)

4.1 OBJETIVO

Aprender a configurar los registros del convertidor analógico-digital, para digitalizar señales
analógicas.

4.2 MARCO TEÓRICO

El convertidor Analógico/Digital (ADC) del microcontrolador ATMega328P, tiene las siguientes


características importantes.

• Resolución de 10 bit
• Presición absoluta de ±2 LSB
• Tiempo de conversión de 13 μs a 260 μs
• Velocidad de conversión de 15 kSPS a máxima resolución
• 8 canales sencillos de entrada multiplexado
• 7 Differential Input Channels
• 2 Differential Input Channels with Optional Gain of 10x and 200x
• Intervalo del voltaje de entrada analógico de 0 a VCC
• Referencia de voltaje seleccionable de 2.56V
• Modo de carrera libre o conversión sencilla
• Inicio de conversión ADC por disparo automático o por fuentes de interrupción
• Interrupción de conversión ADC completa
• Cancelador de ruido en modo de suspensión

La siguiente figura muestra un diagrama a bloques del sistema de ADC del dispositivo ATMega328P.
Práctica 3: Manejo del Temporizador

Los registros involucrados en las conversiones ADC se listan y explican a continuación.

4.2.1 Registro de Selector del Multiplexor – ADMUX

Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
Read/Write R/W R/W R R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7:6 – REFS1:0: Bit de selección de voltaje de referencia

REFS1 REFS0 VOLTAJE DE REFERENCIA SELECCIONADO


0 0 Voltaje de referencia interno apagado, se usa AREF.
0 1 Terminal AVCC conectada a la terminal AREF con un capacitor externo.
1 0 Reservado
1 1 Se usa el Voltaje de referencia interno con capacitor externo a la terminal AREF.

• Bit 5 – ADLAR: Resultado del ADC ajustado a la izquierda

1 ∶ 𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽 𝑎𝑎 𝑙𝑙𝑙𝑙 𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖𝑖


𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 = �
0 ∶ 𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽𝐽 𝑎𝑎 𝑙𝑙𝑙𝑙 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑ℎ𝑎𝑎

• Bits 4:0 – MUX4:0: Bit de selección de canal analógico y ganancia

Entrada Entrada Entrada Entrada


Entrada Entrada
MUX4..0 Diferencial Diferencial Ganancia MUX4..0 Diferencial Diferencial Ganancia
Sencilla Sencilla
Positiva Negativa Positiva Negativa
00000 ADC0 10000 ADC0 ADC1
00001 ADC1 10001 ADC1 ADC1
00010 ADC2 10010 ADC2 ADC1
00011 ADC3 10011 ADC3 ADC1
00100 ADC4 10100 ADC4 ADC1
00101 ADC5 10101 ADC5 ADC1
00110 ADC6 10110 ADC6 ADC1
1X
00111 ADC7 10111 ADC7 ADC1
01000 ADC0 ADC0 11000 ADC0 ADC2
10X
01001 ADC1 ADC0 11001 ADC1 ADC2
01010 ADC0 ADC0 11010 ADC2 ADC2
200X
01011 ADC1 ADC0 11011 ADC3 ADC2
01100 ADC2 ADC2 11100 ADC4 ADC2
10X
01101 ADC3 ADC2 11101 ADC5 ADC2
01110 ADC2 ADC2 11110 1.22V
(V BG )
200X
01111 ADC3 ADC2 11111 0V
(GND)

4.2.2 Registro de Control y Estado – ADCSRA

Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
Read/Write R/W R/W R R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7 – ADEN: Habilitar ADC

1 ∶ 𝐴𝐴𝐴𝐴𝐴𝐴 ℎ𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎
𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 = �
0 ∶ 𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑𝑑𝑑ℎ𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎

26
Práctica 3: Manejo del Temporizador

• Bit 6 – ADSC: Inicio de Conversión del ADC

1 ∶ 𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼𝐼 𝑙𝑙𝑙𝑙 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐ó𝑛𝑛


𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 = �
0 ∶ 𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐ó𝑛𝑛 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑

El bit ADSC se lee como ‘1’ lógico mientras se está convirtiendo un dato, y cuando termina la convesión,
automáticamente retorna a ‘0’ lógico.

• Bit 5 – ADATE: Habilitación del Autodisparo del ADC

1 ∶ 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 − 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 ℎ𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎


𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 = �
0 ∶ 𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 − 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 𝑑𝑑𝑑𝑑𝑑𝑑ℎ𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎

El ADC comenzará la conversión en el borde positivo de la señal de disparo seleccionada. La fuente de disparo
es seleccionada configurando los bit ADTS del registro ADCSRB.

• Bit 4 – ADIF: Bandera de Interrupción del ADC Interrupt

Este bit se pone en 1 cuando el ADC ha realizado una conversión completa, y el registro de datos ha sido
actualizado. Se borra escribiendo un 1 lógico en la bandera, o por hardware cuando se ejectua una interrupción
de conversión completa.

• Bit 3 – ADIE: ADC Interrupt Enable

Cuando se escribe un 1 a este bit I de SREG está en 1, se activa la Interrupción de Conversión Completa del
ADC.

• Bits 2:0 – ADPS2:0: Bits de selección del Preescalador del ADC

Estos bits determinan el factor de división entre la frecuencia del cristal y el reloj de entrada al ADC.

Factor de
ADSP2 ADSP1 ADSP0
división
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

4.2.3 Registro de Control y Estado B – ADCSRB

Bit 7 6 5 4 3 2 1 0
ACME ADTS2 ADTS1 ADTS0
Read/Write R/W R/W R/W R R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

Los bits 7, 5,4 y 3 no se utilizan.

• Bit 6 – ACME: Si se configura con un 1 lógico, indica si el ADC va a trabajar con el comparador analógico. Si
no se utiliza, entonces se pone en 0 lógico.

• Bit 2:0 – ADTS2:0: Configuración de la Fuente de Disparo Automático del ADC

Se utilizan para configurar la fuente de la señal de auto disparo.

27
Práctica 3: Manejo del Temporizador

ADTS2 ADTS1 ADTS0 FUENTE DE DISPARO


0 0 0 Modo de carrera libre
0 0 1 Comparador analógico
0 1 0 Interrupción externa 0
0 1 1 Igualación de comparación Temporizador/Comparador 0
1 0 0 Sobreflujo del Temporizador/Comparador 0
1 0 1 Igualación de comparación Temporizador/Comparador 1
1 1 0 Sobreflujo del Temporizador/Comparador 1
1 1 1 Captura de eventos del Temporizador/Comparador 1

4.2.4 Registro de Control – DIDR0

Bit 7 6 5 4 3 2 1 0
ADC5D ADC4D ADC3D ADC2D ADC1D ADC0D
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 5:0 – ADC5:0D: Se configura la terminal del microcontrolador, que va a ser utilizada como entrada
analógica, para que sólo funcione con el ADC, y que la parte interna de la terminal que tiene que ver con el
comportamiento digital no se vea afectado.

4.2.5 Registro de Datos del ADC

ADLAR = 0

Bit 15 14 13 12 11 10 9 8
ADCH ADC9 ADC8
ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
7 6 5 4 3 2 1 0
Read/Write R R R R R R R R
Initial Value 0 0 0 0 0 0 0 0

ADLAR = 1

Bit 15 14 13 12 11 10 9 8
ADCH ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
ADCL ADC1 ADC0
7 6 5 4 3 2 1 0
Read/Write R R R R R R R R
Initial Value 0 0 0 0 0 0 0 0

4.3 DESARROLLO.

4.3.1 Escriba y analice el siguiente código, el cual es para utilizar el convertidor analógico-digital, y
conteste las preguntas siguientes:
a. ¿Cuántos canales de conversión Analógico-Digital tiene el microcotnrolador?
b. ¿Cuál es el canal que se va a muestrear?
c. ¿Cuál es el número de bit de conversión?
d. ¿Cuál es la frecuencia de muestreo?
e. ¿Qué puerto es el que se utiliza para convertir?
f. ¿En qué puertos se muestran los resultados?
g. ¿Cuál es el valor del voltaje de referencia?
h. Coloque comentarios al código que explique la configuración que se está utilizando
para el microcontrolador.

28
Práctica 3: Manejo del Temporizador

#include <avr/io.h>
#include <avr/interrupt.h>

void Ports_Setup();
void ADC_Setup();

void Ports_Setup()
{
DDRD = 0xFF;
DDRC = 0x03;
}

void ADC_Setup()
{
ADMUX =
(0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0);
ADCSRA =
(1<<ADEN)|(0<<ADSC)|(1<<ADATE)|(0<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1
<<ADPS1)| (1<<ADPS0);
ADCSRB = (0<<ACME)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0);
DIDR0 =
(1<<ADC5D)|(0<<ADC4D)|(0<<ADC3D)|(0<<ADC2D)|(0<<ADC1D)|(0<<ADC0D);
}

ISR(ADC_vect,ISR_NAKED)
{
PORTD = ADCL;
PORTC = ADCH;
reti();
}

int main(void)
{
Ports_Setup();
ADC_Setup();
sei();
ADCSRA |= (1<<ADSC);

while(1){}
}

4.3.2 Conecte un potenciómetro en configuración de divisor de tensión en el canal de conversión del


convertidor, y obtenga el valor digital correspondiente a cada uno de los siguientes voltajes.
i. 3.3V
j. 0.5V
k. 1.2V
l. 4.5V
m. 5V

4.3.3 Compruebe que el valor digital obtenido corresponde a los voltajes de entrada del punto 2.

29
Práctica 3: Manejo del Temporizador

4.3.4 Utilizando el código de la práctica 3 y de la práctica 4, realice un programa que permita variar
el ciclo de trabajo de una señal PWM, de acuerdo al valor analógico que entra al convertidor,
utilizando un potenciómetro en divisor de tensión.
4.3.5 Anote sus conclusiones.

30
PRÁCTICA 5. Comunicación Serial

5.1 OBJETIVO.

Desarrollar aplicaciones para el microcontrolador que sirva para realizar comunicación entre dos
dispositivos, para transferencia de datos.

5.2 MARCO TEÓRICO

La comunicación serial se utiliza para la transferencia de datos entre el microcontrolador y un


dispositivo externo, como es una computadora personal, un módulo WiFi, módulo Bluetooth, entre
otros muchos. Los registros del microcontrolador Atmega328P, se muestran a continuación.

5.2.1 Registro de Datos E/S del USART – UDR

Bit 7 6 5 4 3 2 1 0
UDR Lectura RxB 7 RxB 6 RxB 5 RxB 4 RxB 3 RxB 2 RxB 1 RxB 0
UDR Write TxB 7 TxB 6 TxB 5 TxB 4 TxB 3 TxB 2 TxB 1 TxB 0
Read/Write R/W R/W R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0

El Registro UDR se utiliza para el envío/recepción de datos seriales. Cuando se reciben datos, el
dato recibido está disponible en los bits RxB, y cuando se transmite se escribe en el registro TxB. Aún
cuando el registro UDR se llama de la misma manera, está configurado para realizar la doble función
de escritura/lectura.

5.2.2 Registro de Control de Datos del USART – UCSRA

Bit 7 6 5 4 3 2 1 0
RXC TXC UDRE FE DOR PE U2X MPCM
Read/Write R R/W R R R R R/W R/W
Initial Value 0 0 1 0 0 0 0 0

• Bit 7 – RXC: Recepción Completa del USART

La bandera RXC se pone en 1 cuando se ha terminado de recibir un dato, y se pone en 0 cuando


el bufer de recepción está vacío. Si el receptor está deshabilitado, el bufer de recepción se vacía y el
bit RXC se pone en 0. La bandera RXC puede ser usada para habilitar una interrupción por recepción
completa (RXCIE).

• Bit 6 – TXC: Transmisión Completa del USART

La bandera TXC se pone en 1 cuando se ha terminado de enviar un dato, y no existen más datos
en el bufer para ser transmitido. La bandera TXC se limpia automáticamente cuando se genera una
interrupción por recepción completa. En caso de no usar interrupción, se limpia escribiendo un 0 al bit
TXC. Esta bandera puede provocar una interrupción por transmisión completa (TXCIE).

• Bit 5 – UDRE: Registro de Datos Vacío del USART

La bandera UDRE indica si el bufer de transmisión está listo para recibir nuevos datos. Si UDRE
está en 1, el bufer está vacío, y puede recibir datos para trasnmitir. La bandera UDRE puede generar
una interrupción de registro de datos vacío (UDRIE).
Práctica 3: Manejo del Temporizador

• Bit 4 – FE: Error de Trama

Este bit se pone en 1 si el siguiente carácter recibido tiene un error de trama. Este error consiste
en leer el bit de paro como un 0 en lugar de leerse como un 1. Este bit es válido hasta que es leído el
dato recibido.

• Bit 3 – DOR: Sobre-escritura de Datos

Se pone en 1 cuando el bufer de recepción está lleno y se detecta un nuevo bit de inicio en la
recepción. Este valor es válido hasta que se lee el dato recibido (UDR).

• Bit 2 – PE: Error de Paridad

Este bit se pone en 1 si el siguiente carácter recibido tiene un error de paridad, y el bit de
habilitación de paridad está activado.

• Bit 1 – U2X: Doble velocidad de transmisión del USART.

Este bit solamente tiene efecto en configuración asíncrona. Se escribe un 0 para modo síncrono.
Escribiendo un 1 en este bit, el divisor de frecuencia del generador de velocidad utiliza el valor de 8
en lugar de 16, por lo que la velocidad de transmisión puede ser el doble.

• Bit 0 – MPCM: Modo de comunicación multi-procesador

Cuando el bit MPCM es escrito a 1, todas las tramas recibidas por el USART que no contienen la
información de dirección, son ignoradas. En 0 se deshabilita el modo.

5.2.3 Registro B de Control y Estado del USART – UCSRB

Bit 7 6 5 4 3 2 1 0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RxB8 TxB8
Read/Write R/W R/W R/W R/W R/W R/W R R/W
Initial Value 0 0 0 0 0 0 0 0

• Bit 7 – RXCIE: Habilitación de Interrupción de Recepción Completa.

Se escribe un 1 para habilitar la interrupción cuando se ha terminado de recibir un dato. Con el 0


está deshabilitada.

• Bit 6 – TXCIE: Habilitación de Interrupción de Transmisión Completa.

Se escribe un 1 para habilitar la interrupción cuando se ha terminado de enviar un dato. Con el 0


está deshabilitada.

• Bit 5 – UDRIE: Habilitación de Registro de Dato Vacío.

Se escribe un 1 para habilitar la interrupción cuando el bufer de transmisión se ha quedado vacío.


Con el 0 está deshabilitado.

• Bit 4 – RXEN: Habilitación de Recepción.

Se escribe un 1 para habilitar la recepción de datos seriales. Con el 0 está deshabilitado.

• Bit 3 – TXEN: Habilitación de Transmisión.

32
Práctica 3: Manejo del Temporizador

Se escribe un 1 para habilitar la transmisión de datos seriales. Con el 0 está deshabilitado.

• Bit 2 – UCSZ2: Tamaño de bits de Transmisión.

El bit UCSZ2 se combina con los bits UCSZ1:0 para establecer el tamaño de bits de la trama de
datos de transmisión, y es el mismo para transmisión y recepción.

• Bit 1 – RXB8: Bit 8 de la Recepción de Datos.

Se utiliza como el noveno bit de datos de recepción cuando se configura un tamaño de trama de 9
bits.

• Bit 0 – TXB8: Bit 8 de la Transmisión de Datos.

Se utiliza como el noveno bit de datos de transmisión cuando se configura un tamaño de trama de
9 bits.

5.2.4 Registro C de Control y Estado del USART – UCSRC

Bit 7 6 5 4 3 2 1 0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
Read/Write R/W R/W R/W R/W R/W R/W R R/W
Initial Value 1 0 0 0 0 1 1 0

• Bit 7 – URSEL: Habilitación de Interrupción de Recepción Completa.

Se escribe un 1 para habilitar la interrupción cuando se ha terminado de recibir un dato. Con el 0


está deshabilitada.

5.2.5 Registro de Configuración de Velocidad del USART – UCSRC

Este registro se utiliza para configurar la velocidad en Baudios, de la comunicación serial. Es


importante considerar que este valor depende de la frecuencia de reloj con la que se alimenta el
microcontrolador, como se puede ver en las siguientes tablas. Por lo tanto, dependiendo del valor del
cristal, se debe determinar el valor del registro UBRR.

Baudios 1.0000 MHz 1.8432 MHz 2.0000 MHz


(bps) U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1
UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error
2400 25 0.2% 51 0.2% 47 0.0% 95 0.0% 51 0.2% 103 0.2%
4800 12 0.2% 25 0.2% 23 0.0% 47 0.0% 25 0.2% 51 0.2%
9600 6 -7.0% 12 0.2% 11 0.0% 23 0.0% 12 0.2% 25 0.2%
14.4K 3 8.5% 8 -3.5% 7 0.0% 15 0.0% 8 -3.5% 16 2.1%
19.2K 2 8.5% 6 -7.0% 5 0.0% 11 0.0% 6 -7.0% 12 0.2%
28.8K 1 8.5% 3 8.5% 3 0.0% 7 0.0% 3 8.5% 8 -3.5%
38.4K 1 -18.6% 2 8.5% 2 0.0% 5 0.0% 2 8.5% 6 -7.0%
57.6K 0 8.5% 1 8.5% 1 0.0% 3 0.0% 1 8.5% 3 8.5%
76.8K - - 1 -18.6% 1 -25.0% 2 0.0% 1 -18.6% 2 8.5%
115.2K - - 0 8.5% 0 0.0% 1 0.0% 0 8.5% 1 8.5%
230.4K - - - - - - 0 0.0% - - - -
250K - - - - - - - - - - 0 0.0%

33
Práctica 3: Manejo del Temporizador

Baudios 3.6864 MHz 4.0000 MHz 7.3728 MHz


(bps) U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1
UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error
2400 95 0.0% 191 0.0% 103 0.2% 207 0.2% 191 0.0% 383 0.0%
4800 47 0.0% 95 0.0% 51 0.2% 103 0.2% 95 0.0% 191 0.0%
9600 23 0.0% 47 0.0% 25 0.2% 51 0.2% 47 0.0% 95 0.0%
14.4K 15 0.0% 31 0.0% 16 2.1% 34 -0.8% 31 0.0% 63 0.0%
19.2K 11 0.0% 23 0.0% 12 0.2% 25 0.2% 23 0.0% 47 0.0%
28.8K 7 0.0% 15 0.0% 8 -3.5% 16 2.1% 15 0.0% 31 0.0%
38.4K 5 0.0% 11 0.0% 6 -7.0% 12 0.2% 11 0.0% 23 0.0%
57.6K 3 0.0% 7 0.0% 3 8.5% 8 -3.5% 7 0.0% 15 0.0%
76.8K 2 0.0% 5 0.0% 2 8.5% 6 -7.0% 5 0.0% 11 0.0%
115.2K 1 0.0% 3 0.0% 1 8.5% 3 8.5% 3 0.0% 7 0.0%
230.4K 0 0.0% 1 0.0% 0 8.5% 1 8.5% 1 0.0% 3 0.0%
250K 0 -7.8% 1 -7.8% 0 0.0% 1 0.0% 1 -7.8% 3 -7.8%
0.5M - - 0 -7.8% - - 0 0.0% 0 -7.8% 1 -7.8%
1M - - - - - - - - - - 0 -7.8%

Baudios 8.0000 MHz 11.0592 MHz 14.7456 MHz


(bps) U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1
UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error
2400 207 0.2% 416 -0.1% 287 0.0% 575 0.0% 383 0.0% 767 0.0%
4800 103 0.2% 207 0.2% 143 0.0% 287 0.0% 191 0.0% 383 0.0%
9600 51 0.2% 103 0.2% 71 0.0% 143 0.0% 95 0.0% 191 0.0%
14.4K 34 -0.8% 68 0.6% 47 0.0% 95 0.0% 63 0.0% 127 0.0%
19.2K 25 0.2% 51 0.2% 35 0.0% 71 0.0% 47 0.0% 95 0.0%
28.8K 16 2.1% 34 -0.8% 23 0.0% 47 0.0% 31 0.0% 63 0.0%
38.4K 12 0.2% 25 0.2% 17 0.0% 35 0.0% 23 0.0% 47 0.0%
57.6K 8 -3.5% 16 2.1% 11 0.0% 23 0.0% 15 0.0% 31 0.0%
76.8K 6 -7.0% 12 0.2% 8 0.0% 17 0.0% 11 0.0% 23 0.0%
115.2K 3 8.5% 8 -3.5% 5 0.0% 11 0.0% 7 0.0% 15 0.0%
230.4K 1 8.5% 3 8.5% 2 0.0% 5 0.0% 3 0.0% 7 0.0%
250K 1 0.0% 3 0.0% 2 -7.8% 5 -7.8% 3 -7.8% 6 5.3%
0.5M 0 0.0% 1 0.0% - - 2 -7.8% 1 -7.8% 3 -7.8%
1M - - 0 0.0% - - - - 0 -7.8% 1 -7.8%

Baudios 16.0000 MHz 18.4320 MHz 20.0000 MHz


(bps) U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1 U2Xn=0 U2Xn=1
UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error
2400 416 -0.1% 832 0.0% 479 0.0% 959 0.0% 520 0.0% 1041 0.0%
4800 207 0.2% 416 -0.1% 239 0.0% 479 0.0% 259 0.2% 520 0.0%
9600 103 0.2% 207 0.2% 119 0.0% 239 0.0% 129 0.2% 259 0.2%
14.4K 68 0.6% 138 -0.1% 79 0.0% 159 0.0% 86 -0.2% 173 -0.2%
19.2K 51 0.2% 103 0.2% 59 0.0% 119 0.0% 64 0.2% 129 0.2%
28.8K 34 -0.8% 68 0.6% 39 0.0% 79 0.0% 42 0.9% 86 -0.2%
38.4K 25 0.2% 51 0.2% 29 0.0% 59 0.0% 32 -1.4% 64 0.2%
57.6K 16 2.1% 34 -0.8% 19 0.0% 39 0.0% 21 -1.4% 42 0.9%
76.8K 12 0.2% 25 0.2% 14 0.0% 29 0.0% 15 1.7% 32 -1.4%
115.2K 8 -3.5% 16 2.1% 9 0.0% 19 0.0% 10 -1.4% 21 -1.4%
230.4K 3 8.5% 8 -3.5% 4 0.0% 9 0.0% 4 8.5% 10 -1.4%
250K 3 0.0% 7 0.0% 4 -7.8% 8 2.4% 4 0.0% 9 0.0%
0.5M 1 0.0% 3 0.0% - - 4 -7.8% - - 4 0.0%
1M 0 0.0% 1 0.0% - - - - - - - -

5.3 DESARROLLO.

5.3.1 Escriba y analice el siguiente código, el cual es para recibir datos de manera serial.

/*
* UART_en_C.c
*
* Created: 20/05/2014 17:24:33
34
Práctica 3: Manejo del Temporizador

* Author: SolaceLabsHardware
*/
#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 11059200

void Ports_Setup();
void USART_Init();

void Ports_Setup() //Configuración de los puertos


{

DDRD = 0x02; //Especificamos Tx como salida y Rx como entrada


DDRC = 0xFF; //Especificamos el Puerto C como Salida

void USART_Init() //Se configura USART


{
UCSR0A=(0<<TXC0)|(0<<U2X0)|(0<<MPCM0);
UCSR0B=(1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<
UCSZ02)|(0<<TXB80);
UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<
<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0);
UBRR0=0x47;
}

ISR(USART_RX_vect,ISR_NAKED)
{
char temp;
temp = UDR0;

switch(temp)
{
case 'A': PORTC=0x01;
break; //Al mandar una "A" se obtiene un 1 en el puerto C
case 'B': PORTC=0x02;
break; //Al mandar una "B" se obtiene un 2 en el puerto C
case 'C': PORTC=0x04;
break; //Al mandar una "C" se obtiene un 4 en el puerto C
case 'D': PORTC=0x08;
break; //Al mandar una "D" se obtiene un 8 en el puerto C
case 'E': PORTC=0x10;
break; //Al mandar una "E" se obtiene un 16 en el puerto C
case 'F': PORTC=0x20;
break; //Al mandar una "F" se obtiene un 32 en el puerto C
default: PORTC = 0x3F;
break; //Al mandar un "caracter no especificado"
}
reti();
}

int main(void)
35
Práctica 3: Manejo del Temporizador

{
Ports_Setup();
USART_Init();
sei();

while(1)
{
}
}

5.3.2 Arme el siguiente circuito para probar la comunicación serial.

5.3.3 Para la comunicación serial requierer de un módulo interfaz de USB a serial, y se conecta
como se muestra a continuación.

5.3.4 El siguiente código es para transmitir un dato por comunicación serial. Pruebe el código.

36
Práctica 3: Manejo del Temporizador

// Cristal a 14.7456MHz o 11.0592MHz

#include <avr/io.h>

void Ports_Setup();
void USART0_Setup();

void Ports_Setup()
{
DDRC = 0x00;
DDRD = 0x02;
}

void USART0_Setup()
{
UCSR0A = (0<<TXC0)|(0<<U2X0)|(0<<MPCM0); // UCSR0 = 0x00
UCSR0B = (0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|
(0<<UCSZ02)|(0<<TXB80);
UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|
(1<<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0);
UBRR0H = 0;
UBRR0L = 71; // Para indicar el valor del cristal
}

int main(void)
{
Ports_Setup();
USART0_Setup();

while(1)
{
while((UCSR0A & (1<<UDRE0))==0); // Dentro de una condición,
// (1<<UDRE0) verifica si en el registro
// existe un '1'. un '1' enb UDRE0 indica
// que el registro de transmisión está vacío
UDR0 = PINC;
}
}

5.3.5 Haga un programa que envíe y reciba datos por el puerto de comunicación serial, y que se
comunique con una computadora.
5.3.6 Utilice el programa del motor a pasos, para que programe la velocidad del motor desde la
computadora.
5.3.7 Adquiera la señal de un sensor de temperatura, de un sensor infrarrojo, y una señal senoidal
de un generador de funciones. Transmita los valores a la computadora vía serial, y muestre la
forma de onda en la interfaz gráfica de usuario. El programa de la computadora debe permitir
configurar que canal o calaes se desea muestrear.
5.3.8 Revise los videos de las siguientes ligas.
https://www.youtube.com/watch?v=uQv7py84REs;
https://www.youtube.com/watch?v=zbJfcWparP0;
https://www.youtube.com/watch?v=JTLOx0C4Qhk; https://www.youtube.com/watch?v=wL-
kFomRMsU; https://www.youtube.com/watch?v=JTLOx0C4Qhk

37
PRÁCTICA 6. Comunicación serial con un módulo Bluetooth

6.1 OBJETIVO.

Aprender a utilizar la comunicación serial para comunicarse con un módulo bluetooth, para tener
comunicación con sistemas que utilicen este tipo de interfaz de comunicación.

6.2 DESARROLLO.

6.2.1 Implemente el siguiente circuito, el cual se utiliza para comunicarse con un módulo bluetooth.

6.2.2 Programe el microcontrolador con el siguiente código para recibir datos de manera serial, y
compruebe que funciona. Requiere utilizar el terminal en la computadora, así como un
adaptador de USB a serial, para poder realizar el intercambio de datos. Debe cuidar que la
salida de la interfaz no sea RS232, de lo contrario, requiere un circuito adicional MAX-RS232
para adaptarlo a 5V.

#define F_CPU 11059200

#include <avr/io.h>
#include <avr/interrupt.h>

void Ports_Setup();
void USART_Init();

void Ports_Setup() //Configuración de los puertos


{
DDRD = 0x02; //Especificamos Tx como salida y Rx como entrada
DDRC = 0xFF; //Especificamos el Puerto C como Salida
}

void USART_Init() //Se configura USART


{
UCSR0A=(0<<TXC0)|(0<<U2X0)|(0<<MPCM0);
UCSR0B=(1<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|
(1<<TXEN0)|(0<<UCSZ02)|(0<<TXB80);
UCSR0C=(0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|
Práctica 3: Manejo del Temporizador

(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0);
UBRR0=0x47;
}

ISR(USART_RX_vect,ISR_NAKED)
{
char temp;
temp = UDR0;

switch(temp)
{
case 'A': PORTC=0x01; break; //Con una "A", puerto C = 0x01
case 'B': PORTC=0x02; break; //Con una "B", puerto C = 0x02
case 'C': PORTC=0x04; break; //Con una "C", puerto C = 0x04
case 'D': PORTC=0x08; break; //Con una "D", puerto C = 0x08
case 'E': PORTC=0x10; break; //Con una "E", puerto C = 0x10
case 'F': PORTC=0x20; break; //Con una "F", puerto C = 0x20
default: PORTC = 0x3F; break;//Con otra cosa, puerto C = 0x3F
}
reti();
}

int main(void)
{
Ports_Setup();
USART_Init();
sei();

while(1)
{
}
}

6.2.3 Programe el microcontrolador con el siguiente código para enviar datos de manera serial, y
compruebe que funciona. Requiere utilizar el terminal en la computadora, así como un
adaptador de USB a serial, para poder realizar el intercambio de datos. Debe cuidar que la
salida de la interfaz no sea RS232, de lo contrario, requiere un circuito adicional MAX-RS232
para adaptarlo a 5V.

// Cristal a 14.7456MHz o 11.0592MHz

#include <avr/io.h>

void Ports_Setup();
void USART0_Setup();

void Ports_Setup()
{
DDRC = 0x00;
DDRD = 0x02;
}

void USART0_Setup()
39
Práctica 3: Manejo del Temporizador

{
UCSR0A = (0<<TXC0)|(0<<U2X0)|(0<<MPCM0); // UCSR0 = 0x00
UCSR0B = (0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|
(0<<UCSZ02)|(0<<TXB80);
UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|
(1<<UCSZ01)|(1<<UCSZ00)|(0<<UCPOL0);
UBRR0H = 0;
UBRR0L = 71; // Para indicar el valor del cristal
}

int main(void)
{
Ports_Setup();
USART0_Setup();

while(1)
{
while((UCSR0A & (1<<UDRE0))==0); // Dentro de una condición,
// (1<<UDRE0) verifica si en el registro
// existe un '1'. Un '1' en UDRE0 indica
// registro de transmisión vacío
UDR0 = PINC;
}
}

6.2.4 Investigue cuales son los registros relacionados con el UART, y describa brevemente el uso
de cada uno de ellos, así como de los bit que se utilizan.
6.2.5 Modifique el programa para que se maneje la transmisión y la recepción. Utilice dos
microcontroladores para probar la comunicación, mostrando en leds el valor recibido, y
utilizando interruptores para establecer el valor a transmitir. El valor recibido se muestra en los
leds y debe corresponder al dato introducido con los interruptores.
6.2.6 Pruebe la comunicación utilizando dos microcontroladores.
6.2.7 Implemente el siguiente circuito, el cual será utilizado para comunicarse con un módulo
Bluetooth. Debe conseguir las hojas de datos del módulo, para saber cuáles son los
comandos que debe utilizar.

40
Práctica 3: Manejo del Temporizador

6.2.8 Investigue cuales son los comandos del módulo Bluetooth, repórtelos y describa brevemente
el uso de cada uno de ellos.
6.2.9 Modifique el código del punto 2, para transmitir comandos al módulo bluetooth y establecer
una comunicación serial. Se recomienda probar primero los comandos del módulo utilizando la
computadora a través del terminal o algún software equivalente.
6.2.10 Pruebe la comunicación serial utilizando dos microcontroladores y dos módulos Bluetooth para
comunicarse entre ellos.

41
PRÁCTICA 7. Desarrollo de proyecto

7.1 OBJETIVO.

Desarrollar un proyecto donde se aplique los conocimientos estudiados a lo largo del semestre, para
garantizar el aprendizaje del estudiante, obteniendo un producto que funcione y pueda resolver
problemas reales.

7.2 DESARROLLO.

7.2.1 El proyecto debe ser registrado con el profesor de la asignatura, entregando la propuesta de
proyecto que cumpla con las siguientes condiciones. La evaluación del proyecto es realizada
de manera colegiada por un grupo de docentes ajenos al profesor de la asignatura.

Formato para la pre-propuesta de proyectos de los estudiantes de la asignatura de Programación


Avanzada, de la carrera de Ingeniería en Automatización. No se aceptarán propuestas de proyectos
de domótica, ni de invernaderos. La propuesta debe de atender cada uno de los siguientes puntos, en
una cuartilla.

1. Título del proyecto.


2. Nombres de los integrantes del equipo. Máximo 3.
3. Descripción del problema a resolver.
4. Objetivo del proyecto.
5. Descripción de la solución incluyendo un bosquejo del proyecto.
6. Debe incluir los siguientes lineamientos:
a. La propuesta debe incluir el monitorear al menos dos variables analógicas externas
al microcontrolador.
b. Se debe graficar el comportamiento de las señales analógicas.
c. Almacenar en archivo las señales monitoreadas.
d. Indicar los entregables en forma general (¿A qué se comprometen como equipo?) y
particulares (que actividad del proyecto se compromete desarrollar cada integrante)
e. ¿Por qué es buen proyecto de programación avanzada? Justificar y defender la
propuesta.
f. Los proyectos se deben enfocar a procesos que incluyan automatización,
especialmente el manejo de motores. En caso de ser algo diferente, queda
pendiente de aprobación la propuesta.
7. Debe incluir un apartado para la firma de los integrantes del equipo y del profesor.
8. Cada proyecto será revisado por los docentes que imparten la asignatura, para su
aprobación.
9. Para tener derecho a ser evaluados, el proyecto debe estar terminado al 100%. En caso
de tener derecho a evaluación, la calificación la determinará el comité evaluador, quienes
harán llegar la calificación al docente titular.

7.2.2 Al final, los puntos a evaluar son los siguientes.

• Presentación del proyecto.


El proyecto debe estar funcionando al 100% para tener derecho a la evaluación.
Si éste presenta fallas, el equipo no tendrá derecho a calificación. Si el proyecto no
presenta fallas se tomará como calificación inicial el 10, esto antes del examen oral.
Práctica 3: Manejo del Temporizador

• Examen oral.
Teniendo como base el funcionamiento total del proyecto se procederá a una sesión
de preguntas individuales (3 preguntas); la respuesta incorrecta a una de ellas
tendrá la penalización de un punto total sobre la calificación final.

7.2.3 Los requerimientos de entrega son los siguientes.

• Proyecto funcionando en su totalidad.


• Reporte digital del proyecto (según formato).

7.2.4 El contenido del reporte debe ser el siguiente, y se debe entregar antes de presentar el
proyecto.

- Portada.
1. Datos generales (Universidad, Facultad, Carrera, Profesor y Materia).
2. Nombre del proyecto.
3. Integrantes del equipo (con Expedientes).
4. Fecha de entrega.
- Índice de contenido.
- Índice de figuras.
- Índice de tablas.
- Introducción.
1. Objetivo general.
2. Objetivos particulares.
- Marco teórico.
- Metodología.
- Resultados.
1. Resultados obtenidos.
2. Conclusión.
- Referencias.
- Anexos.
1. Anexo A. Código C (de todos los componentes).
2. Anexo B. Interfaz de monitoreo y control en Visual C.
3. Anexo C. Memoria fotográfica.
4. Anexo D. Hojas de datos de todos los componentes eléctricos y
electrónicos utilizados.
5. Anexo E. Esquemáticos electrónicos.
6. Anexo F. Imagen 3D de la tarjeta electrónica.
7. Anexo G. Video.
8. Anexo H. Costos.

*Los datos enumerados es información mínima requerida, pero no toda la correspondiente a los
puntos del reporte.

7.2.5 La entrega del reporte debe realizarse de la siguiente manera.

• En formato PDF.
• Grabado en un disco (junto con los códigos y aquella información que crean pertinente).
43
Práctica 3: Manejo del Temporizador

• El disco debe presentar la portada con estampa adherida al disco con el escudo de la
Facultad de Ingeniería, nombre del proyecto, nombre de los integrantes, grupo, período 2017-1.

44

Você também pode gostar