El querido Vszener ha tenido la gentileza de cederme este codigo para una aplicacion que tengo que calza como un guante sin mencionar que el codigo esta muy bien explicado y se entiende pero tengo el problema que no lo puedo compilar ya que al hacerlo el puntero del mouse se detiene al comienzo de la rutina "main" y me dice "...A numeric value must appear here" .... y me volvi loco para quitarlo sin ningun éxito.
Yo estoy usando el CCS version 4.033 y él uso el V3.236.¿Sera ese el problema o hay algun fallo semantico por ahi?.
Lo he copiado exactamente como esta en el post y lo revise dos veces.
Lo he tratado de ubicar a Vszener pero no he tenido suerte para que me de una mano con este codigo que reitero esta excelente.
¿Me pueden ayudar entre todos?.
Muchas gracias a Vszener y todos los demas colisteros.
Kilopondio
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);
}
}