Descarga la aplicación para disfrutar aún más
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.
Compartir