Microcontrolador Pic
Microcontrolador Pic
Microcontrolador Pic
INTERRUPCIONES
Una interrupcin es un recurso del cual disponen la mayora de los
microcontroladores en el mercado hoy en da .Permiten cambiar la
continuidad de ejecucin de un programa, para atender una
necesidad, ya sea externa o interna.
Como ejemplo, un botn de RESET puede ser visto como una
fuente de interrupcin, ya que detiene todos los procesos y reinicia
sistema por completo sin importar la accin que est realizando el
microcontrolador.
el
Salva el valor actual del contador de programa (PC), guardando su contenido en la pila
El PC se carga con el valor 004H para el caso de los PIC16 ya que tenemos un solo vector
de interrupcin, para los PIC18 tenemos 2 vectores de interrupcin uno de alta prioridad y
otro de baja prioridad ubicados en la posicin 0008H y
0018H respectivamente.
Comienza a ejecutarse el programa de atencin a la
interrupcin que se encuentra partir de la direccin 004H.
Interrupciones en el
PIC16F84A
Interrupciones en el
PIC18F4550
Interrupciones en el
Interrupciones en el
PIC16F877A
PIC18F4550
Interrupciones en el
PIC18FXX2
Hay un nico vector de interrupcin en la direccin 004H para el caso de los PIC16. Sea cual sea
la interrupcin el contador de programa se carga con la direccin 004H, para este caso. Por otro
lado para la familia de los PIC18 existen dos vectores de interrupcin de alta y baja prioridad ya
mencionados anteriormente, el contador de programa se cargar dependiendo de cmo definamos
la interrupcin. Dentro de la subrutina de atencin a la interrupcin, el programa deber identificar
la causa de la interrupcin .Para ello, debe testear el estado de los flags de interrupcin de cada
una de las fuentes habilitadas, para deducir cual fue la que caus la interrupcin y as decidir que
accin tomar.
En XC8 para el caso de los PIC18 la interrupcin la podemos definir de la siguiente manera:
__delay_ms(100);
// Antirebote
if(INTF){
PORTA=PORTA+1;
//Incrementa el puertoA en 1
__delay_ms(100); } }
INTCONbits.INTF=0; }
Nota es importante volver a poner la bandera a 0 (INTCONbits.INTF=0) dentro de la subrutina de interrupcin, sino lo hacemos entonc
// Programa principal
void main(void) {
TRISB=0b00000001;
TRISA=0xF0;
PORTB=0x00;
PORTA=0x00;
INTCONbits.INTE=1;
INTCONbits.GIE=1;
//Bucle infinito
SLEEP();
}
}
TRISD=0b00000000;
PORTB=0x00;
PORTD=0x00;
INTCONbits.INTE=1;
OPTION_REGbits.INTEDG=1;
INTCONbits.INTF=0;
INTCONbits.GIE=1;
while (1){
SLEEP(); } }
INTERRUPCIN RBI
Para activar la interrupcin por cambio de nivel en los pines <RB7:RB4> los bits RBIE y GIE del
registro INTCON deben estar a 1 para el caso de un PIC16F84A y un PIC16F877A , en estas
condiciones cuando se produce un cambio de nivel en cualquiera de las lneas RB7 a RB4 se
activa el flag RBIF del registro INTCON. Ahora veamos un ejemplo :
#include <xc.h>
#define _XTAL_FREQ 20000000
#pragma config FOSC =
HS,WDTE=OFF,PWRTE=ON,BOREN=OFF,LVP=OFF,CPD=OFF,WRT=OFF,CP=OFF
INTCONbits.GIE=0;
if (RBIF) {
__delay_ms(100);
if(RBIF){
__delay_ms(100);
PORTD=PORTD+1;
}}
INTCONbits.RBIF=0;
}
void main(void) {
TRISB=0b11110000;
TRISD=0x00;
PORTB=0x00;
PORTD=0x00;
INTCONbits.RBIE=1;
INTCONbits.RBIF=0;
INTCONbits.GIE=1;
while (1){
SLEEP();
}
}
#include <xc.h>
#define _XTAL_FREQ 20000000
#pragma config FOSC = HS,WDTE=OFF,PWRTE=ON,CP=OFF
INTCONbits.GIE=0;
if (RBIF) {
__delay_ms(100);
if(RBIF){
__delay_ms(100);
PORTA=PORTA+1;
}}
INTCONbits.RBIF=0;
}
void main(void) {
TRISB=0b11110000;
TRISA=0x00;
PORTB=0x00;
PORTA=0x00;
INTCONbits.RBIE=1;
INTCONbits.RBIF=0;
INTCONbits.GIE=1;
while (1){
SLEEP();
}
}
EL TIMER0
El Timer 0 es un contador / temporizador de 8 bits. El registro principal de este mdulo es TMR0.
Este registro se incrementa continuamente a una frecuencia seleccionable manejada por un
preescalador y el reloj interno Fosc/4 (modo temporizador) o bien, por un preescalador y una
seal externa (modo contador), su contenido se incrementa con cada impulso de entrada hasta
llegar a su valor mximo (TMR0=255).
Contador Ascendente
Fin de contaje
Impulsos de entrada
La configuracin como temporizador o contador se realiza mediante el bit T0CS del registro
OPTION.
(T0IF)
ciclo mquina=1us
WATCHDOG (perro guardin), que vigila que el programa no se cuelgue, para ello cada
cierto tiempo Comprueba que el programa est ejecutndose normalmente de no ser as
reinicializa todo el sistema.
{ contador++;
if(contador>4){
PORTDbits.RD0=!PORTDbits.RD0;
contador=0;
}
INTCONbits.T0IF=0;
TMR0=99;}
void main(void) {
TRISD=0;
PORTD=0;
INTCON=0;
OPTION_REGbits.PS0=1;
OPTION_REGbits.PS1=1;
OPTION_REGbits.PS2=1;
OPTION_REGbits.PSA=0;
OPTION_REGbits.T0CS=0;
OPTION_REGbits.T0SE=0;
INTCONbits.T0IE=1;
INTCONbits.T0IF=0;
INTCONbits.GIE=1;
TMR0=99;
while(1);
}