En este ejemplo veremos como cambiar el estado de un LED conectado al puerto RC7 del PIC18F25K22, dicho cambio se realizara por medio de una interrupción con el desbordamiento del TIMER 0.
Circuito:
El circuito utilizado es muy sencillo, como utilizamos el oscilador interno del MCU, solo basta con conectar un LED con su debida resistencia a RC7, claro esta el microcontrolador debe de estar alimentado en sus respectivas terminales, el pin MCLR, debe estar con su debida resistencia a VCC.
Código:
Configuramos el MCU, desbordamos el timer a 1ms, hacemos un conteo en la interrupción y cambiamos el estado del LED, borramos la flag y el contador para que se quede indeterminadamente, se deja libre el while en main para otras actividades.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* LED intermitente mediante interrupción | |
* | |
******************************************************************************* | |
* FileName: main.c | |
* Processor: PIC18F25K22 | |
* Complier: XC8 v1.42 & MPLAB X IDE v3.61 | |
* Author: Pedro Sánchez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: Atendemos la interrupcion del TMR0 cada milisegundo, y | |
* realizamos un conteo, al sobrepasar 1000 cambiamos el estado | |
* del LED, por lo tanto el LED cambia su estado cada 1 segundo | |
******************************************************************************* | |
* Rev. Date Comment | |
* v0.01 28/06/2017 Creación del ejemplo | |
******************************************************************************/ | |
#include <pic18f25k22.h> | |
#include <xc.h> | |
#include "FUSES_Config.h" | |
#define _XTAL_FREQ 16000000 | |
#define ledStatus PORTCbits.RC7 | |
unsigned int Count = 0; | |
void MCU_Init(void); | |
void TMR0_Init(void); | |
void interrupt high_priority ISR(void){ | |
if(INTCONbits.TMR0IF){ | |
++Count; | |
if (Count >= 1000){ | |
ledStatus ^= 1; //Blink LED | |
Count = 0; | |
} | |
TMR0H = 0xF8; | |
TMR0L = 0x30; | |
INTCONbits.TMR0IF = 0; | |
return; | |
} | |
} | |
void main(void) { | |
MCU_Init(); | |
while(1){ | |
} | |
} | |
void MCU_Init(void){ | |
//Puertos digitales | |
ANSELA = 0; | |
ANSELB = 0; | |
ANSELC = 0; | |
//Configura oscilador interno a 16MHz | |
OSCCONbits.IRCF=0b111; //El ciclo de instruccion es de 0.25 us | |
//Puertos como salida | |
TRISB = 0x00; | |
TRISC = 0x00; | |
//Limpiamos puertos | |
PORTB = 0x00; | |
PORTC = 0x00; | |
TMR0_Init(); | |
} | |
void TMR0_Init(void){ | |
//Configuración del TMR0 = 1mS | |
T0CONbits.TMR0ON = 1; //TMR0 On | |
T0CONbits.T08BIT = 0; //16 bits | |
T0CONbits.T0CS = 0; | |
T0CONbits.T0SE = 0; | |
T0CONbits.PSA = 0; | |
T0CONbits.T0PS = 0b000; // Prescaler = 2 | |
TMR0H = 0xF8; | |
TMR0L = 0x30; | |
INTCONbits.TMR0IF = 0; | |
INTCONbits.TMR0IE = 1; | |
INTCON2bits.TMR0IP = 1; | |
RCONbits.IPEN = 1; | |
INTCONbits.GIEH = 1; | |
} |
A continuación un pequeño vídeo del código en funcionamiento.
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
0 Comentarios