jueves, 24 de octubre de 2019

Laboratorio 9

LABORATORIO Nº9

(Programación PIC)

(Programación básica con bucles de control)  

I. CAPACIDAD TERMINAL 
● Utilizar al microcontrolador en aplicaciones de control electrónico. 
● Desarrollar y ejecutar programas en un microcontrolador PIC 
● Programar y configurar interfaces básicas del microcontrolador. 
II. COMPETENCIA ESPECÍFICA DE LA SESIÓN  
● Manejo de puertos de forma grupal e independiente para manejo de luces. 
● Programación de sonidos mediante subrutinas. 
● Creación de subrutinas mediante funciones.
 ● Declaración de variable enteras.
III. CONTENIDOS A TRATAR 
● Control de puertos como entradas y/o salidas.
● Generación de salida pulsante.
 ● Bucles de control
IV. RESULTADOS  
Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.
V. FUNDAMENTO TEÓRICO:  
¿Qué es una estructura de control? 
En términos simples, una estructura de control le permite controlar el flujo de ejecución de código en su aplicación. Generalmente, un programa se ejecuta secuencialmente, línea por línea, y una estructura de control le permite alterar ese flujo, generalmente dependiendo de ciertas condiciones. Existen varias estructuras de control como:
  • Sentencia if:  
Si la condición es verdadera (se cumple), se ejecuta la sentencia1, de lo contrario la sentencia2. (esta estructura suena de la siguiente forma: “si la (condición) se cumple, se ejecuta la sentencia1, sino, se ejecuta la sentencia2. 
if (condición) sentencia1;
else sentencia2;
  • El bucle for:
El bucle FOR es un bucle muy flexible y a la vez muy potente ya que tiene varias formas interesantes de implementarlo, su forma más tradicional es la siguiente:
for (/* inicialización */; /* condición */; /* incremento */)
{
/* código a ejecutar */
} 
Inicialización: en esta parte se inicia la variable que controla el bucle y es la primera sentencia que ejecuta el bucle. Sólo se ejecuta una vez ya que solo se necesita al principio del bucle.Expresión condicional: al igual que en el bucle while, esta expresión determina si el bucle continuará ejecutándose o no.Incremento: es una sentencia que ejecuta al final de cada iteración del bucle. Por lo general, se utiliza para incrementar la variable con que se inicio el ciclo. Luego de ejecutar el incremento, el bucle revisa nuevamente la condición, si es verdadera tiene lugar una ejecución más del cuerpo del ciclo, si es falsa se termina el ciclo y así.Aquí se muestra el mismo ejemplo visto para el bucle while, pero implementado con un bucle for:
int i; 
for (i=0; i < 100; i = i + 1) { 
printf("%d\n", i); 
} 
Nota: En C, la sentencia i = i + 1 puede escribirse en forma más reducida como i++. Esta forma se utiliza más comúnmente en el bucle for:
int i; 
for (i=0; i < 100; i++) { 
printf("%d\n", i);  
}  
Esta sentencia nos permite repetir una o varias sentencias una cantidad de veces determinada por 3 parámetros. Forma general del for: Para una sola sentencia .
for(inicialización; condición; incremento)
sentencia;
Para un bloque de sentencias (recordemos que el bloque queda definido por las llaves.
for(inicialización; condición; incremento)
{ 
sentencias; 
}  
  • El bucle while:
El bucle while permite ejecutar una o mas sentencias en tanto se cumpla una condición. Si la condición deja de cumplirse, se dejan de ejecutar la o las instrucciones y se “sale del bloque while para continuar procesando las instrucciones que se encuentran después del mismo
while (/*condicion*/)    
{    
/* Código */  
}
La condición debe de ser una expresión lógica, similar a la de la sentencia if. Primero se evalúa la condición. Si el resultado es verdadero, se ejecuta el bloque de código. Luego se vuelve a evaluar la condición, y en caso de dar verdadero se vuelve a ejecutar el bloque. El bucle se corta cuando la condición da falso.

Ejemplo: imprimir los números de 0 a 99:
int i = 0;
while (i < 100) {
printf("%d\n", i);
i = i + 1;
}
Inicialmente se declara que la variable i tiene un valor de 0. Al iniciar el bucle, se cumple la condición i < 100, por lo que se procede a la instrucción de imprimir dicho número (cero, en el caso inicial). Posteriormente i cambiará su valor de uno en uno por la instrucción i = i + 1 y seguidamente dicho valor nuevo, será evaluado en la condición WHILE hasta que i llegue al valor 100, donde debido a la condicional, éste será un valor falso, dando fin al código.
while (condición) sentencia;
while (condición)
{sentencia1;sentencia2;sentencia3;sentencia4; ...Sentencia_n;}
VI. ACTIVIDADES EN CLASE: 

1.    Transcriba el programa mostrado, compile dicho programa, simule en Proteus y compruebe funcionamiento en Tarjeta Entrenadora.

#include <16f877a.h>             // Incluimos archivo con PIC a utilizar
#use delay (clock=20M)           // Indicamos al compilador que trabajaremos a 20Mhz
#fuses HS, NOPROTECT, NOWDT      // Configuración básica de los fusibles
int salida=1;                    // Declaramos variable "salida" como entera y valor UNO
int variable=0;
void main ()                     // FUNCION PRINCIPAL del programa, indispensable
{
   output_c(0b00000000);         // Sacamos por el puerto C el valor de salida (00000000)
                                 // Este comando se realiza por única vez
   while (true)                  // Bucle de REPETICION infinita por valer "true"
   {
      IF (!input(PIN_A5))        // SI detectamos 0 voltios en PIN A5 (presionando pulsador)
      {
         output_c(salida);       // Sacamos por el puerto C el valor de salida (00000001)
         delay_ms(500);          // "Congela el tiempo" durante 500 ms para evitar falsos disparos
      }
     
      IF (!input(PIN_D0))        // SI detectamos 0 voltios en PIN D0 (presionando pulsador)
      {
         output_high(PIN_C5);    // Pone a "1" el pin C5 (envía 5 voltios)
         output_bit(PIN_C4, 1);  // Pone a "1" el pin C4 (envía 5 voltios)
         output_toggle (PIN_C1); // Invierte el valor del PIN C1 (si estaba en 0, pasa a 1 y viceversa)
         delay_ms(500);          // "Congela el tiempo" durante 500 ms para evitar falsas pulsaciones
      }
     
      IF (!input(PIN_D1))        // SI detectamos 0 voltios en PIN A5 (presionando pulsador)
      {
         salida = salida << 1;   // Recorremos el contenido de "salida" una posición a la izquierda
         output_c(salida);       // Sacamos por el puerto C el valor de salida (00000001)
         variable = 1;           // asignamos el valor "1" a variable
         delay_ms(500);          // "Congela el tiempo" durante 500 ms para evitar falsas pulsaciones
      }
     
      IF (!input(PIN_E2) && (variable == 1))   // SI detectamos 0 voltios en PIN E2 variable vale 1....
      {
         output_bit(PIN_C5,0);    // Pone a "0" el pin C0 (envía cero voltios o GND)
         variable = 0;            // asignamos el valor "0" a variable
         delay_ms(500);          // "Congela el tiempo" durante 500 ms para evitar falsas pulsaciones
      }
     
   }
   }


Simulador proteus utilizado
VII. TAREAS EVALUADAS:
Realice las modificaciones que se sugieren al programa, experimente y responda las preguntas planteadas

1. Se tiene un sistema con 3 pulsadores (A5, D0, D1) de entrada y 8 leds de salida (Puerto C): Programar para que se comporte de la siguiente manera:
  • Al iniciar el programa todos los leds deben permanecer apagados.
  • Al presionar A5, debe encender C0, al volver a presionar, debe encender C1 y así sucesivamente.
  • Al presionar D0, los deben encender sucesivamente pero en sentido inverso.
  • La entrada D1 debe funcionar como un habilitador, es decir, por defecto el sistema está habilitado y funcionará como lo antes mencionado. Si presiono D1, el sistema quedará “congelado” y nada funcionará. Si vuelvo a presionar D1, el sistema nuevamente queda habilitado.
VIII. VIDEO:

IX. OBSERVACIONES Y CONCLUSIONES:
OBSERVACIONES:
  1. Se debe verificar que la columna "C" de los leds se encuentre activada en el entrenador de PIC, para que así se pueda analizar mejor el comportamiento de la programación realizada.
  2. Al variar los distintos tipos de bucles de control se deben tomar en cuenta sus respectivas condiciones, pues si la sintaxis de alguna de ellas se encuentra mal escrita, el programa mandará un WARRING o un ERROR.
  3. Se tuvo que cambiar las conexiones en la simulación del entrenador HFK en el simulador proteus, para que no existan confusiones al momento de simular la programación.
  4. Para utilizar bien los bucles de control es necesario respetar el valor de las variables utilizadas, pues si se declaran mal estas partes, el programa tendrá errores y precauciones. 
CONCLUSIONES: 
  1. Se diseñaron y optimizaron sistemas y procesos para cumplir con las condiciones establecidas y se gestionaron adecuadamente las sentencias y bucles de control.
  2. Se reconocieron bucles de control necesarios para realizar una determinada tarea obedeciendo condiciones requeridas.
  3. Se verificó el funcionamiento de bucles de control reproduciendo la programación optimizada en el entrenador PIC HFK.
  4. Se modificó una programación compuesta de bucles de control para encender leds utilizando botones como forma de control de direcciones, habilitación y encendido y apagado.

domingo, 13 de octubre de 2019

Laboratorio 8

LABORATORIO Nº8

(Programación PIC)

(Herramientas de Programación Hardware y Software)  

I. CAPACIDAD TERMINAL 
● Utilizar al microcontrolador en aplicaciones de control electrónico. 
● Desarrollar y ejecutar programas en un microcontrolador PIC 
● Programar y configurar interfaces básicas del microcontrolador. 
II. COMPETENCIA ESPECÍFICA DE LA SESIÓN 
● Listar las partes internas generales de un microcontrolador. 
● Identificar las funciones generales de un microcontrolador 
● Introducción a la programación en PIC C Compiler. 
● Cómo utilizar el Entrenador. 
III. CONTENIDOS A TRATAR 
Datasheet para el microcontrolador de gama media de Microchip. Estructura interna, memorias, CPU, ALU, W. 
IV. RESULTADOS  
Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.
V. MATERIALES Y EQUIPO
  •         CCS Compiler 
Entorno de programación del CCS Compiler
Es un importante compilador C que contienen operadores estándar del lenguaje C y funciones incorporados en bibliotecas que son específicas a los registros de PIC, proporcionando a los desarrolladores una herramienta poderosa para el acceso al hardware las funciones del dispositivo desde el nivel de lenguaje C.


El compilador CCS contiene más de 307 funciones integradas que simplifiquen el acceso al hardware, mientras que la producción eficiente y altamente optimizado código. 


Se incluyen funciones de hardware del dispositivo de características tales como:

* Temporizadores y módulos PWM

* Convertidores A / D

* de datos on-chip EEPROM
* LCD controladores
* Memoria externa buses
* Entre otras...
  •        Entrenador de PICS 
Tarjeta de desarrollo HFK-010U
 La tarjeta de desarrollo HFK-010U ha sido diseñada para trabajar con microcontroladores PIC de diferentes tamaños, desde 8 pines para las series PIC10F y PIC12F, hasta PICs de las series PIC18F de 40 pines, cuenta con programador en circuito mediante puerto USB, lo que facilitara y ahorrara tiempo al usuario al momento de realizar el proyecto, este programador es compatible con PICKIT2 de Microchip, pudiendo también usarse el programador desde el entorno MPLAB. Este módulo cuenta también con los periféricos más usuales, muchos de ellos no están directamente conectados a los pines de los microcontroladores, tendrá que usar jumpers para realizar dichas conexiones, lo que hará más sencillo realizar las conexiones que se necesiten, se usan algunos componentes SMD para el área del programador y otros para algunos condensadores de desacoplo y resistencias, que de usarse de tamaños en dip, nos hubieran ocupado espacio, el cual hemos aprovechado para hacer la placa de dimensiones no muy grandes e implementado algunos periféricos más.
Diagrama de bloques de ubicación de cada componente del módulo 
Simulador de programación con microcontrolador PIC

Pantalla  LCD DE CARACTERES
Estructura de LCD incorporado en la tarjeta de entrenador
El mas conocido de los LCDs de caracteres es de la fabrica Hitachi (HD44780), obviamente existen mucha variedad en cuanto a compatibles con este modelo, así que cualquiera compatible a este tipo se puede usar. El LCD se puede manejar en modo de 4 BIT u 8 BIT, siendo mas usual el primero, ya que necesita menos pines del microcontrolador. También existe la posibilidad de usar el LCD con el puerto B o puerto D, debajo del LCD existen 2 dipswitch con los cuales se hace la selección del puerto. 

    Resultado de imagen para PIC16F877A
    Pines del PIC 16F877A

PIC16F877A

El PIC 16F877 es un microcontrolador de Microchip Technology fabricado en tecnología CMOS, su consumo de potencia es muy bajo y además es completamente estático (esto quiere decir que el reloj puede detenerse y los datos de la memoria no se pierden). Tiene una memoria memoria de programa tipo FLASH, lo que representa gran facilidad en el desarrollo de prototipos y en su aprendizaje, pues permite reprogramarlo nuevamente sin ser borrado con anterioridad.
Resumen de características principales del PIC 16F877
  • Memoria de programa: FLASH de 8K de instrucciones de 14 bits
  • Memorias de datos: SRAM de 512 bytes, EEPROM de 256 bytes
  • Pines I/O (Input/Output) : 6 del puerto A, 8 del puerto B, 8 del puerto C, 8 del puerto D y 3 del puerto E, además de 8 entradas analógicas.
  • Pila (Stack): 8 niveles (14 bits)
  • Fuentes de interrupción: 14
  • Instrucciones: 35
  • Compatible modo SLEEP
  • Frecuencia máxima del oscilador de 20MHz
  • Conversor Analógico/Digital de 10 bits multicanal (8 canales de entrada)
  • Corriente máxima absorbida/suministrada (sink/source) por pin: 25 mA
  • Voltaje nominal: 3 a 5.5V DC (CMOS)
  • Power On Reset
  • Power Up Timer (PWRT) 
  • Oscilador Start Up Timer (OST)

                 VI. TAREA GUIADA DENTRO DEL LABORATORIO:

  1. Asegúrese de tener instalado en su computadora los siguientes programas: ISIS PROTEUS, PIC C COMPILER y PICKIT2.
  2. Abra el compilador CCS Compiler y transcriba el código mostrado en el link. Luego descargue dicho programa hacia el PIC utilizando PICKIT2.  

CÓDIGO A TRANSCRIBIR:
#include <16f877a.h>        // Incluimos archivo con PIC a utilizar
#use delay (clock=20M)             // Indicamos al compilador que trabajaremos a 20Mhz
#fuses HS, NOPROTECT, NOWDT   // Configuración básica de los fusibles

void main ()                // FUNCION PRINCIPAL del programa, indispensable
{                           // Si la función tiene más de una instrucción, va entre llaves
   while (true)                    // Bucle de REPETICION, si es "true", significa repetición infinita
   {
      output_high(PIN_C3);  // Pone a "1" el pin C3 (envía 5 voltios)
      delay_ms(200);        // "Congela el tiempo" durante 200 ms
      output_low(PIN_C3);   // Pone a "0" el pin C3 (envía cero voltios o GND)
      delay_ms(200);        // "Congela el tiempo" durante 200 ms
   }                        // Este proceso se repite indefinidamente por estar dentro de
                              // while(true)
}

Compile el programa y utilice los archivos generados hex y cof para realizar la simulación del proyecto anterior.
Transfiera el archivo generado HEX al entrenador utilizando el programa PICKIT2 y verifique el correcto funcionamiento del mismo.

VII. EVIDENCIA DE TRABAJO LABORATORIO
TAREA A SER EVALUADA:   
  • Simule el programa en ISIS PROTEUS utilizando el archivo COF y depure el mismo paso a paso. 2. 


Simulación en PROTEUS

  • Modifique el programa para diseñar un “semáforo” con 3 salidas (leds) de tal manera que el led ROJO encienda durante 10 segundos, luego encienda el led AMBAR durante 3 segundos y finalmente encienda el led VERDE durante 8 segundos. 
Programación utilizada


Funcionamiento en PROTEUS
  • Reemplace la instrucción output_high(PIN_C0); por output_bit(PIN_C0, 1); ¿Funciona igual?
  1. Si, ya que al escribir "output_bit(PIN_C0, 1)" estamos declarando el bit de salida "C0" en un estado "1" (ON - encendido), y al declarar un estado "0" (OFF - apagado), esto es igual a declarar "output_high(PIN_C0);" ya que en ese caso está mas fácil declarar el encendido o apagado al cambiar el "high" por el "low".
Programación utilizada
Funcionamiento en PROTEUS
  • Elimine o comente la instrucción “while(true)”; ¿qué sucede?  
  1. Al borrar la instrucción de bucle, el programa corre solo una vez y luego de esto procede a terminar con la ultima linea de programación.

Programación utilizada
Simulación en PROTEUS
  • Presione el pulsador de RESET, ¿qué sucede? 
  1.  Al presionar el botón RESET el proceso vuelve a comenzar desde la primera línea de instrucción del programa realizado (en este caso comienza desde el primer LED).

Simulación en PROTEUS

  • Ingrese la página https://www.mikroingenieria.com/producto/curso-simulando-sistemas-embebidos-con-microcontroladores-pic/ , inscríbase al curso sugerido y responda las preguntas planteadas. Capture las pantallas de las respuestas e inclúyalas en el Blog.


VIII. EVIDENCIA DE TRABAJO LABORATORIO (Video explicativo)

En este vídeo se podrán visualizar los procesos de edición del CC compiler y ademas la conexión con el PICKIT 2: 
IX: OBSERVACIONES Y CONCLUSIONES:
Observaciones:
  1. Antes de energizar el módulo del entrenador PIC, es necesario revisar si los componentes a ser energizados se encuentran  en buen estado, caso contrario se debe llamar inmediatamente al profesor.
  2. Se debe pudo observar que el entrenador de microcontrolador PIC tiene un amplio numero de componentes para poder ser controlados con este mismo.
  3. Se observó que el software de programación PIC C Compiler nos proporciona un espacio de programación cómodo para realizar distintos programas, ya que el lenguaje de programación es muy conocido.
  4.  Se observó que para realizar la comunicación con el microcontrolador PIC es necesario importar el programa realizado a un software de comunicación llamado PICkit 2.
Conclusiones:
  1. Se realizaron programaciones en el software de programación PIC C compiler para después comunicarlo con el microcontrolador PIC mediante un software de comunicación PICkit 2.
  2. Se utilizó al microcontrolador PIC para realizar programaciones de grupos de LEDs para poder controlar su encendido por tiempos predeterminados y solicitados.
  3. Se identificó el tipo de lenguaje de programación necesario para realizar programas dedicados al control de ciertos dispositivos.
  4. Se reconocieron comandos de programación en el software PIC C compiler para realizar los programas de control solicitados.