Buenas!!!!bien, el programa de hoy se basa en las interrupciones producidas al cambio de estado por uno de los pines del portb dedicados a dicha tarea, los pines que generan interrupcion son <4:7>. El programa en si realiza la secuencia de luces del coche fantastico con 4 led"s hasta que uno de los pines <4:7> cambia de estado del port b, entonces genera una interrupcion y realiza una secuencia de iluminacion de los led"s distinta, aparte cada vez que estemos en una interrupcion se iluminara el led conectado al pin b0....bueno aqui el codigo!:
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 15/Noviembre/05
//
// Programa: Interrupcion debido a cambio de estado del portb <4:7>
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.236
// Entorno IDE: MPLAB IDE v7.22 Simulador: Proteus 6.7sp3
//
// Notas: Este programa muestra como funciona la interrupcion de cambio de estado de
// algunos de los pines <4:7> del portb. Mientras no se pulse ningun boton,
// ilumina 4 led"s de forma consecutiva y viceversa, cuando se produce un
// cambio de estado en algunos de los pines del port b <4:7> genera interrupcion.
// Se ha programado de tal forma que sepa diferenciar que pin genera la interrupcion.
// Interrupcion:
// B4 -> Se produce la secuencia de iluminacion 1 vez
// B5 -> Se produce la secuencia de iluminacion 2 veces
// B6 -> Se produce la secuencia de iluminacion 3 veces
// B7 -> Se produce la secuencia de iluminacion 4 veces
// Conexiones: A0 -> led
// A1 -> led
// A2 -> led
// A3 -> led
// B0 -> led
// B4 -> boton
// B5 -> boton
// B6 -> boton
// B7 -> boton
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#fuses INTRC //oscilador interno
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(a)
#use fast_io(b)
#byte port_b=0x06 //declaracion del puerto b
///DECLARACION DE FUNCIONES GLOBALES
void led(void); //funcion que ejecuta la iluminacion del porta dada la interrupcion
///DECLARACION DE VARIABLES GLOBALES
int last_b; //variable de almacenar el estado del portb
///LLAMADA FUNCION INTERRUPCION
#INT_RB
void IntPortB4_7( )
{
char cont=0; //contador para la iluminacion de la interrupcion
byte changes; //variable que almacena que pin a realizado la interrupcion
output_high(PIN_B0); //indicador interrupcion on
changes = last_b ^ port_b; //changes<-pin que genera la interrupcion
last_b = port_b; //last_b=como estaba el portb antes de interrupcion
if (bit_test(changes,4 )&& !bit_test(last_b,4)) //¿PIN_B4 genera interrupcion?
led( ); //SI -> ejecuta 1 vez funcion led()
if (bit_test(changes,5)&& !bit_test (last_b,5)){ //¿PIN_B5 genera interrupcion?
do{ //SI -> ejecuta 2 veces funcion led()
led( );
cont++;
}while(cont<2);
}
if (bit_test(changes,6)&& !bit_test (last_b,6)){ //¿PIN_B6 genera interrupcion?
do{ //SI -> ejecuta 3 veces funcion led()
led( );
cont++;
}while(cont<3);
}
if (bit_test(changes,7)&& !bit_test (last_b,7)){ //¿PIN_B7 genera interrupcion?
do{ //SI -> ejecuta 4 veces funcion led()
led( );
cont++;
}while(cont<4);
}
cont=0; //reset variable cont
output_low(PIN_B0); //indicador interrupcion off
}
///PROGRAMA
void main(void)
{
char led_on=0b0001; //led a iluminar
set_tris_b (0b11111110); //portb entrada menos pin B0 es salida
enable_interrupts(int_rb); //activar interrupcion rb4:7
enable_interrupts(GLOBAL); //activar interrupciones
do{ //bucle...
do{ //iluminacion hacia izquierda
output_a(led_on);
rotate_left(&led_on,1);
delay_ms(300);
}while(bit_test(led_on,3)==0);
do{ //iluminacion hacia derecha
output_a(led_on);
rotate_right(&led_on,1);
delay_ms(300);
}while(bit_test(led_on,0)==0);
last_b = input_b( );
}while(TRUE); //...infinito
}
///FUNCION QUE EJECUTA LA SECUENCIA DE ILUMINACION DEBIDO A INTERRUPCION POR EL PORTB4:7
void led(void)
{
signed char i; //variable indice
int leds[2]={0b1001,0b0110}; //led"s
for(i=0;i<2;i++){ //led"s on fuera-dentro
output_a(leds[ i ]); //ilumino led"s correspondientes
delay_ms(150);
}
for(i=1;i>-1;i--){ //led"s on dentro-fuera
output_a(leds[ i ]); //ilumino led"s correspondientes
delay_ms(150);
}
}
Decir, que en este ejemplo se ha programado de tal manera que podamos saber que pin genero la interrupcion, segun sea el pin la secuencia de luces de interrupcion se repetira mas o menos veces hasta terminar y volver al programa principal. La parte del codigo para averiguar el pin que genero la interrupcion esta en la ayuda del compilador(CCS) asi no se pierde tiempo en crear otro....bueno hasta la proxima!!!