PICMCU LAB1 pablinza@me.com
Programacion del Microcontrolador PIC16F887 LAB1, este repositorio contiene las carpetas de proyectos generados por MPLABX utilizando el compilador XC8 y el PIC16F887 durante la actividad practica de la materia Microcontroladores PIC
El software MPLABX disponible en la pagina del fabricante Microchip --> Click
El compilador XC8 puedes descargalo utilizando este enlace --> Click
Para cargar el firmware al microcontrolador necesitaras un programador ICSP, como alternativa se utiliza el software SimulIDE -->Click a efectos de verificar el funcionamiento. Cada carpeta del proyecto MPLABX tiene el nombre precedido por el numero de actividad y en su estructura encontrara el programa principal con el nombre main.c y librerias de uso local, una vez compilado el codigo fuente, se generara el firmware archivo .hex en la carpeta dist/default/production.
Utilizaremos la placa B8P40 que lleva un Cristal HS de 20MHz, un LED, Pulsador Reset y Puerto para comunicacion UART, en todos los casos la programacion del PIC16F887 sera utilizando el oscilador interno RC a 8MHz, salvo casos donde se requiera mas velocidad se usara el HS a 20MHz. En caso de utilizar un bootloader, se debe reservar el uso de memoria en MPLABX.
Descripcion de la Placa B8P40 utilizada para los ejercico de programacion en Laboratorio U.E.B Asignatura ELT
Programa base main.c para destellar un LED y que se utilizara en todas las practicas de este repositorio.
#pragma config FOSC=INTRC_NOCLKOUT, WDTE = OFF, BOREN = OFF, LVP = OFF
#include <xc.h>
#define LEDpin PORTEbits.RE2 //Led de la tarjeta
volatile __bit tickms;
void setupMCU(void); //Configuracion del PIC
void taskLED(void); //Tarea para destellar el LED
void __interrupt() isr(void) //Rutina de servicio a la Interrupcion
{
if(INTCONbits.T0IF) //Evento del temporizador 0.001s
{
INTCONbits.T0IF = 0;
TMR0 += 131; //Recarga el contador
tickms = 1;
}
}
void main(void)
{
setupMCU();
while(1)
{
if(tickms)
{
tickms = 0;
taskLED(); //Destella LED
}
}
}
void setupMCU(void)
{
OSCCONbits.IRCF = 0b111; //Oscilador Interno 8MHz
while(OSCCONbits.HTS == 0);
ANSEL = 0; //Desactiva pines ADC AN0 al AN7
ANSELH = 0;//Desactiva pines ADC AN8 al AN13
TRISEbits.TRISE2 = 0; //Salida LED
OPTION_REGbits.nRBPU = 0; //Activa las pull-ups PORTB
/* CONFIGURACION TIMER0 1MS a Fosc=8MHz*/
OPTION_REGbits.T0CS = 0;//Modo Termporizador
OPTION_REGbits.PSA = 0; //Con prescala
OPTION_REGbits.PS = 0b011; //Prescala 1:16
TMR0 = 131; //256-(time/((pre)*(4/Fosc))) time=0.001 seg
INTCONbits.T0IF = 0; //Limpia bandera
INTCONbits.T0IE = 1; //Activa interrupcion del TMR0
INTCONbits.GIE = 1; //Habilitador global ISR
}
void taskLED(void) //Destello de LED1 1Hz al 20%
{
static uint16_t cnt = 0;
if(cnt++ > 999)
{
cnt = 0;
LEDpin = 1; //Activa LED
}
if(cnt == 200) LEDpin = 0; //Apaga LED
}Adjunto el siguiente link que muestra como compilar estos ejemplos en MPLABX (http://www.youtube.com/watch?v=w-GRu89glrg)
El programa destella los leds conectados al MCU con frecuencia y ciclo de trabajo diferente, donde se utiliza la interrupcion del temporizador TMR0 de 8-bit configurado a 1ms. La rutina de interrupcion ISR para el temporizador activa la bandera [tickms] que servira para la ejecucion concurrente de dos tareas dentro del bucle while del programa principal. Se muestra un video que resume la implementacion de este ejercicio -> (https://youtu.be/rYyD9MK57Po)
El programa muestra un ejemplo de como implementar un controlador de trafico para dos fases (interseccion de calles), utilizando la interrupcion del temporizador TMR0 como base de tiempo para la ejecucion concurrente de tareas en el programa principal. Ademas se adiciona una entrada de alerta SW1 que se activa en caso de falla ocasionando que el controlador ingrese en modo de mantenimiento. En el modo mantenimiento las luces amarillas destellaran de manera intermitende. Se muestra un video que resume la implementacion de este ejercicio -> (https://youtu.be/hlDj-E___kY)
En esta practica se elabora un programa para realizar la lectura de los canales analogicos ANS0 y ANS1, y la lectura del estado que tiene el pulsador SW1. Las tareas se ejecutan de forma concurrente en el programa principal utilizando como base de tiempo la interrupcion del temporizador TMR0. Adicionalmente se envia por el puerto serie UART un mensaje con el resultado de la conversion ADC y estado del pulsador. La implementacion utiliza como fuente ADC un joystick de doble eje y como salida una interfaz con graficas en PC. Se muestra un video que resume la implementacion de este ejercicio -> (https://youtu.be/-FM--FO0nE8)
Se elabora un programa que muestra como controlar la posicion de un servomotor SG90, donde el control de movimiento o posicion del eje servomotor se realiza con escala en porcentaje de 0% a 100%. Ademas se realiza la lectura de un sensor de distancia por ultrasonido SR04 para detectar la presencia de un objeto y desplazar una barra conectada el eje del sermovotor. El programa hace uso de la interrupcion del temporizador TMR0 para la ejecucion de tareas concurrentes dentro del programa principal y el temporizador TMR2 para la modulacion PWM del servomotor. Se muestra un video que resume la implementacion de este ejercicio -> (https://youtu.be/369__Zxra0M)
Programa que muestra el uso de un teclado matricial 3x4 para la lectura de una contraseña de cuatro digitos y proceder con su validacion, mostrando el resultado en una pantalla LCD 16x2. Durante el proceso la pantalla muestra el ingreso de los datos y un mensaje indicando si la contraseña fue aceptada o rechazada, permitiendo como maximo tres intentos antes de bloquear el acceso, que unicamente se restaura reiniciando el programa. Se utiliza el TMR0 como base de tiempo para la ejecucion de tareas concurrentes. Se muestra un video que resume la implementacion de este ejercicio -> (https://youtu.be/mYJeusZr0Jg)
Este programa permite controlar la velodidad de giro y el sentido o direccion de un motor tipo DC, donde se utiliza el modulo CCP del PIC para generar una señal de control PWM con frecuencia superior a los 20Khz. La conexion del motor se llevara a cabo utilizando un puente H con el circuito integrado L293D. Para descripcion(https://youtu.be/J0C-R59uOTY) Se muestra como utilizar el modulo lector de tarjetas chip RFID RC522 a travez del puerto serie SPI del Microcontrolador, el programa realizara la lectura de una tarjeta RFID y enviara a traves del puerto serie UART, mensajes con el numero serial de la tarjeta y un valor decimal que representa los creditos asociados a la tarjeta, dependiendo de la cantidad de credito disponible, una luz roja y verde indicara si el acceso esta autorizado. Para descripcion (https://youtu.be/GMP5CGrTA_I) Este programa hace uso del protocolo I2C para la comunicacion con un RTC DS1307, el objetivo es configurar la fecha y hora del RTC mediante comandos recibidos por el puerto serie UART, asi como establecer una fecha y hora limite para la activacion de un LED. La configuracion de la fecha y hora limite se almacenara en la memoria de datos EEPROM del PIC. Para descripcion (https://youtu.be/NIsh_5g4Zro) Programa que utiliza el puerto serial UART para recibir los mensajes de un modulo GPS, los mensajes NMEA emitidos por el receptor GPS son decodificados para extraer la posicion en coordenadas Latitud, Longitud que se muestran en una pantalla LCD utilizado el modulo I2C (PCF). Para descripcion (https://youtu.be/aT-w1kmcUjA) Este programa muestra como utilizar el kit HX1838 control remoto y receptor de infrarojos Keyes-022, donde el PIC16F887 decodifica la trama de datos IR con protocolo NEC haciendo uso de interrupciones por cambio de estado. En funcion de los botones presionados desde el control remoto se activaran y desactivaran cuatro luces tipo LED. Para descripcion (https://youtu.be/r2r3zhkY5MA)Adjunto el siguiente link que muestra como compilar estos ejemplos en MPLABX
Visita mi Blog [Blog de Contenidos](https://pablinza.blogspot.com/).
Visita mi Canal [Blog de Contenidos](http://www.youtube.com/@pablozarate7524)).
Santa Cruz - Bolivia
***********************













