Logo Studenta

PRÁCTICA DE LABORATORIO 2 Juego de Luces 2022 - Brigith Lojan

¡Este material tiene más páginas!

Vista previa del material en texto

PRACTICA # 2
ASIGNATURA: SISTEMAS DIGITALES
RESULTADO DE APRENDIZAJE DE LA PRÁCTICA: (VER SÍLABO)
TIEMPO PLANIFICADO EN EL SÍLABO: 3 HORAS
TIEMPO DE LA PRÁCTICA POR GRUPO: 1
NÚMERO DE ESTUDIANTES POR GRUPO: 3 ESTUDIANTES
INTEGRANTES: BRIGITH LOJAN, GERARDO QUIZHPE, CECILIA
TRUEBA.
1. TEMA: “JUEGO DE LUCES”
OBJETIVOS:
● Emplear lenguaje de programación C para el manejo de
microcontroladores AVR.
● Experimentar con los puertos de entrada y salida del microcontrolador.
● Utilizar herramientas de software para simular la operación del
microcontrolador.
● Implementar el juego de luces con la placa Arduino Uno.
2. Materiales y Reactivos – Por
Grupo
3. Equipos y herramientas – Por
Grupo
● 1 Arduino Uno
● 1 Switch
● 8 LED
● 8 Resistencias 330 Ω
● 1 Fuente de corriente continua de 5V
● 1 Multímetro
● 1 Osciloscopio
● 1 Protoboard
● 1 Computadora
● 2 Jaks
● 2 Puntas de prueba para multímetro
● 2 Sondas para osciloscopio
● Conectores caimán
● Cable para conexión en protoboard
● Pinzas, alicates, corta cables, pela
cables
4. INSTRUCCIONES:
● Colocar las mochilas en los casilleros
● Prohibido consumo de alimentos
● Prohibido equipo de diversión, celulares etc.
● Prohibido jugar
● Prohibido mover o intercambiar los equipos de las estaciones de trabajo
● Prohibido sacar los equipos del laboratorio sin autorización.
● Ubicar los equipos y accesorios en el lugar dispuesto por el responsable
del laboratorio, luego de terminar las prácticas.
● Uso adecuado de equipos
● Uso obligatorio del mandil
● Presentar el preparatorio al docente a cargo de la materia al inicio de la
jornada.
● Contestar las preguntas de control después de realizarse la práctica.
● Realizar el informe con todos los ítems destallados en la guía.
5. ACTIVIDADES POR DESARROLLAR:
1. Cree un nuevo proyecto en C usando Atmel Studio.
2. Realice un programa en C que cumpla con las características descritas a
continuación:
2.1. Usar el microcontrolador ATmega328p.
2.2. Tener en cuenta que el oscilador externo a emplear sea de 16 MHz
(cristal de cuarzo).
2.3. Usar el puerto PC0 como entrada, con resistencia de Pull-Up.
2.4. Usar el puerto D como salida para conectar los LEDs.
2.5. Cuando el puerto PC0 tenga 1 en su entrada, los LEDs del puerto D
deben encender en secuencia, de la siguiente forma:
PD0 y PD7
Encendido 400ms
PD1 y PD6
Encendido 400ms
PD2 y PD5
Encendido 400ms
PD3 y PD4
Encendido 400ms
2.6. Cuando el puerto PC0 tenga 0 en su entrada, los LEDs del puerto D
deben encender en secuencia, de la siguiente forma:
PD3 y PD4
Encendido 400ms
PD2 y PD5
Encendido 400ms
PD1 y PD6
Encendido 400ms
PD0 y PD7
Encendido 400ms
2.7. Usar funciones en la programación.
2.6. Colocar comentarios dentro del código.
3. Compile el código y simule el mismo en Proteus, como lo muestra la Figura 1.
4. Arme el circuito con Arduino Uno y protoboard.
Figura 1: Simulación en Proteus de Juego de Luces.
6. MARCO TEÓRICO:
Registros para el manejo de puertos de E/S de
microcontroladores AVR
Básicamente la programación de microcontroladores se basa en la
configuración de los registros que dispone junto con sus bits, y en la
implementación de algoritmos y rutinas que interactúen con estos
registros.. El tamaño de los registros suele estar relacionada con el ancho
de bus de cada arquitectura, para el caso de los AVR de 8 bits, la mayoría
de sus registros son de 8 bits.Volviendo a los AVR, por cada puerto de
E/S existen 3 registros que lo controlan: DDRx, PORTx y PINx (la x
hace referencia al nombre del puerto seleccionado: A, B, C.. etc.). Cada
bit de estos registros hace referencia a un pin físico del puerto en el chip.
DDRx: Data Direction Register
Este registro es el Registro de Dirección de datos, y como su nombre lo
indica establece la dirección de datos de cada pin del puerto, quiere decir
que con este registro se programan los pines del puerto como entrada o
como salida.Cada pin en un puerto es independiente y por lo tanto la
totalidad del puerto no tiene que ser configurado totalmente como un
puerto de entrada o salida. Escribiendo un 1 en la posición del pin en el
DDRx configurará ese pin como un pin de salida y escribiendo un 0
configura el pin como un pin de entrada.
PORTx: Port Output Register
Se trata un registro con una doble funcionalidad dependiendo de si el pin
del puerto es de entrada o de salida.Si el puerto está configurado como
salida (DDRx = 1), el valor escrito en cualquiera de los bits de este
registro será reflejado en el pin del microcontrolador, es decir un 1 pone
la salida en Alto y un 0 pone la salida en Bajo.Por el contrario, si el
puerto se configura como entrada (DDRx = 0), escribir un 1 en cualquier
bit del registro habilitará la resistencia PULL-UP en el pin
correspondiente al puerto. Si se escribe un 0 la resistencia PULL-UP
queda desconectada.
PINx: Port Input Register
Este registro es de solo lectura y sirve para leer el estado de los pines del
puerto configurados como entrada. A vece se cae en el error de que si
leemos el registro PORTx obtendremos el valor de los pines, y así es,
pero solo leeremos el valor actual de los pines configurados como salida,
para lectura de puertos se utiliza este registro.En algunos modelos de
AVR el registro PINx también es de escritura, con lo cual al escribir un 1
en cualquiera de sus bits,el estado del pin correspondiente siempre y
cuando el pin sea de salida.
ANSI C para microcontroladores: Funciones, librerías de
retardo.
La primera estandarización del lenguaje C fue en ANSI, con el
estándar X3.159-1989. El lenguaje que define este estándar fue
conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue
ratificado como estándar ISO (ISO/IEC 9899:1990). La adopción de
este estándar es muy amplia por lo que, si los programas creados lo
siguen, el código es portátil entre plataformas y/o arquitecturas.
FUNCIONES
Un programa escrito en C está conformado por pequeños módulos de
código llamados funciones.El módulo principal o función principal está
conformado por la función que denominamos:
void main(void){
}
Su objetivo es proveer un mecanismo que permita invocar una
secuencia de código, que pueda ser llamada varias veces dentro del
programa. Esto no sólo facilita el entendimiento del código, sino
que genera código reutilizable.
El PROTOTIPO de una función es la línea de código que la declara
indicado: que devuelve la función al programa (después de ser
invocada) - su nombre – sus argumentos (datos que necesita que la
transfiera el programa).
<tipo_de_dato_que_retorna>nombre(<tipo_de_dato_que_r
ecibe) {
}
Si la función no retorna valores y/o no necesita argumento, se puede
definir:
<tipo_de_dato_que_retorna> nombre (void){
}
Si el prototipo se declara sin retorno y sin argumentos explícitos, el
compilador asume que tanto el retorno como el argumento son del tipo
int (esta situación suele generar un warning) Ejemplos de definición de
funciones:
int nombre (int dato1, int dato2){
}
void nombre (char dato){
}
Tener en cuenta que una función puede retornar uno y solo un valor y por
supuesto este prototipo debe encontrarse antes del llamado a la función.
Cuando la función retorna un valor, lo hace a través de la palabra clave
return seguido por el valor.
int Suma (int dato1, int dato2){
int Resultado=0;
Resultado=dato1+dato2;
return (Resultado);}
Dentro de los () de la palabra clave return podemos incluir operaciones
directamente:
int Suma (int dato1, int dato2){
return (dato1+dato2);
}
Cuando en un programa llamamos a una función, debemos entregarle
los valores con los que va a realizar las operaciones, le pasamos los
argumentos a la función.
Estos argumentos pueden pasarse:
Por valor, este método copia el valor del argumento en la posición
esperada por la función
void main (void){
int Resultado;
Resultado = Suma (24,3); // dato1=24 – dato2=3
// Retorna 27 en Resultado
}
Por Referencia, este método copia el valor del argumento en la
posición esperada por la función
void Suma (int *dato1,int *dato2, int *res){
*res=*dato1+*dato2;
}
void main (void){
int d1=24, d2=3, res=0;
Suma (&d1,&d2,&res);
}
Librerías
Archivos de Cabecera (Header .h)
Ahora que sabemos lo que es una función, podemos expandir un poco
más el concepto de librerías.
Todo proyecto deberá estar conformado por varios módulos; cada uno
de estos módulos tiene asociado un archivo con extensión .c y otro
con extensión .h.
El archivo con extensión .h contiene las funciones, las variables y los
macros globales que serán utilizados por otros módulos:
El archivo con extensión .c que necesite referenciar las declaraciones
de otro módulo, puede incluirlas usando la directiva #include.
Resistencia de Pull-Up
Como su nombre indica esta resistencia tiene la función de “jalar” hacia
“arriba”, lo que significa que polariza el voltaje hacia el voltaje de fuente
(VDD) que puede ser +5V o +3.3V. De esta forma cuando el pulsador
está abierto o en reposo, el voltaje en la entrada del Arduino siempre será
de +5V. Las entradas del Arduino son de alta impedancia lo que significa
que la corriente que circulará por esa línea sea mínima en el orden de los
microamperios, por lo que el voltaje que “cae” en la resistencia pull-up
es mínimo y tenemos casi el mismo voltaje de fuente en la entrada del
Arduino.Cuando el pulsador es presionado, la corriente circula por la
resistencia y luego por el pulsador, de esta forma tenemos que el voltaje
en la entrada del Arduino es Tierra o 0V.Entonces en la configuración
pull-up cuando el pulsador está en reposo el Arduino lee 1 y cuando
presionamos leerá 0.
Hay que destacar que cuanto mayor sea la resistencia para el pull-up, más
lento es el pin en responder a los cambios de voltaje. Esto es debido a
que el sistema que alimenta el pin de entrada es esencialmente un
condensador junto con la resistencia pull-up, formando de esta manera un
filtro RC, y filtros RC tardan tiempo para cargarse y descargarse. Si
tienes una señal de cambio muy rápida (como USB), un alto valor de
resistencia de pull-up puede limitar la velocidad a la que el pin puede
cambiar de estado. Por lo que es más común encontrar valores de pull-up
entre 1KΩ y 4.7KΩ
7. RESULTADOS OBTENIDOS
Codigo en C
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
/* Replace with your application code */
DDRD=0XFF; //Puerto D
como salida
DDRC &= ~(1<<0); //Puerto PC0 como entrada
PORTC |= (1<<PC0); //Puerto PC0 habilitado en
modo pull up
while (1)
{
if((PINC&(1<<0)) == 1){ //Leemos el PinC en la
posicion 0
PORTD &= (0<<PD0);
PORTD &= (0<<PD7);
PORTD |= (1<<PD3);
PORTD |= (1<<PD4);
_delay_ms(400);
PORTD &= (0<<PD3);
PORTD &= (0<<PD4);
PORTD |= (1<<PD2);
PORTD |= (1<<PD5);
_delay_ms(400);
PORTD &= (0<<PD2);
PORTD &= (0<<PD5);
PORTD |= (1<<PD1);
PORTD |= (1<<PD6);
_delay_ms(400);
PORTD &= (0<<PD1);
PORTD &= (0<<PD6);
PORTD |= (1<<PD0);
PORTD |= (1<<PD7);
_delay_ms(400);
}else{
PORTD &= (0<<PD3);
PORTD &= (0<<PD4);
PORTD |= (1<<PD0);
PORTD |= (1<<PD7);
_delay_ms(400);
PORTD &= (0<<PD0);
PORTD &= (0<<PD7);
PORTD |= (1<<PD1);
PORTD |= (1<<PD6);
_delay_ms(400);
PORTD &= (0<<PD1);
PORTD &= (0<<PD6);
PORTD |= (1<<PD2);
PORTD |= (1<<PD5);
_delay_ms(400);
PORTD &= (0<<PD2);
PORTD &= (0<<PD5);
PORTD |= (1<<PD3);
PORTD |= (1<<PD4);
_delay_ms(400);
}
}
}
Simulacion en proteus
Medición del tiempo encendido en el led 7, por lo que se obtiene que dura un
tiempo de 400ms, ya que en el osciloscopio está en un rango de 200 ms.
Medición del led 0, también 400ms que se mantiene prendido.
Medición física en el osciloscopio, se verificó que el tiempo que se
mantienen encendidos los leds es de 400ms.
Circuito en físico
8. DISCUSIÓN
Para el desarrollo del juego de luces se hizo uso de los puertos D y de los puertos
C, los cuales nos sirven para las entradas y salidas. Además se configuró la
resistencia pull up, es decir que cuando el circuito esté en reposo va a estar a
+5v. También se hace uso de funciones para las secuencias de leds, donde cada
led debe estar encendido 400ms. En el caso de que se encuentre en 1 se
empezará por los leds de las esquinas hacia adentro y si está 0 empezará por los
del medio hacia afuera. Por último se verificó la simulación en Proteus para
luego, implementarlo en físico y se evidenció que en físico también fue un éxito
ya que se cumplió con todos los requisitos solicitados, y también se aprende a
configurara los puertos que nos sirven para las entradas y salidas.
9. CONCLUSIONES
● Podemos concluir que el registro DDRx establece el puerto como entrada
o salida, el registro PORTx sirve para enviar datos a los pines de salida o
activar PULL-UPS en pines de entrada y el registro PINx sirve para leer
puertos de entrada y en algunos micros para conmutar el estado de un pin
de salida.
● La resistencia pull up evita que se hagan lecturas erróneas si el puerto ya
no tiene nada conectado o no está recibiendo una señal, cabe destacar que
muchos microcontroladores incluyen resistencias pull-up internas, las
cuales se pueden activar mediante instrucciones en el programa.
● La práctica se implementó con éxito, así evidenciado las secuencias de
leds, esto gracias a un switch o un pulsador lo cual sirve para hacer el
cambio de la secuencia.
10. RECOMENDACIONES
● Configurar el puerto pull up para ya no usar la resistencia de 10k que se
necesita, y ahorrar el uso de resistencias en el circuito.
● Tener en cuenta que el arduino uno ya cuenta con un cristal de cuarzo
integrado, así que ya no será necesario implementarlo en el arduino.
● Mantener desconectado el arduino uno de la fuente de poder mientras se
arman el circuito, con el fin de evitar cortocircuitos por mala conexión.
● Hacer uso del datasheet ya que este nos da toda la información acerca del
arduino, para realizar un buen armado y así evitar errores comunes que se
comenten al implementar un circuito en físico.
11. PREGUNTAS DE CONTROL
1) ¿Qué cambios se deben hacer en el hardware si quiero cambiar los
tiempos de encendido del juego de luces, sin modificar el código?
Habría que hacer un cambio en el oscilador del cristal en este caso de 16Mhz por
uno menor, ya que el mismo se usa como reloj externo en el montaje del
Arduino, o también el tamaño de la resistencia ya que esta limita el flujo de
electricidad en un circuito, con lo que se reduce el voltaje y la corriente.
2) ¿Puedo usar el Switch del circuito conectado a +5V en vez de tierra?
Si pero no se podría usar las 2 secuencias de los leds ya que siempre se
encontrará en 1, es decir solo se ejecutará una secuencia ya que la tierra ayuda
pone en el estado de 0.
BIBLIOGRAFÍA:
Ali, M., Naimi, Sarmad, Naimi Sepehr. 2011. The AVR Microcontroller and
Embedded System using Assembly and C. United States : Pearson Education,
2011. 978-0-13-800331-9.
Barrett, S. 2010. Embedded Systems Desing with the Amtel AVR
Microcontroller. 2010. 9781608451272.
Mitescu, M., Susnea, I. 2005. Springer Series in advanced microelectronics.
s.l. : Springer, 2005. 978-3-540-25301-3.
Ruiz Zamarreño, Carlos. 2021. Programación de microcontroladores paso a
paso : Ejemplos prácticos desarrollos en la nube. s.l. : Marcombo, 2021.
9788426732200.
Santiago, F. 2012. Los Microcontroladores AVR de Atmel. Mexico : Universidad
Tecnológica de Mixteca, 2012. 978-607-95222-7-8.

Continuar navegando

Otros materiales