interrupciones en PIC16F876A

Hola, estoy programando un PIC16F876 para que al detectar una interrupcion y conicida con un caracter determinado haga una cosa diferente con cada uno. El caso es que no consigo hacerlo funcionar, este es el código:

#include <CfgEntradaSalida.h>// No borrar
//DECLARACION DE CONSTANTES

//DECLARACIÓN DE VARIABLES
int actual1,anterior1,actual2,anterior2;
//INTERRUPCIÓn que se ejecutará al recibir un dato (caracter) por el puerto serie
//podemos utilizar como salidas las que nos quedan en O3 y O4, nos basta con dos para cambiar el color
//del diodo LED, YA CONECTAÍS VOSOTROS COMO MEJOR LO VEAÍS. En el caso que os pongo como ejemplo
// supongo que el ánodo del diodo led lo llevaís a la salida del pic directa y el cátodo a través de
// una Resistencia. No olvidar configurar en el panel los pines IO3 y IO4 como salidas (S), antes de compilar
// el programa.
#INT_RDA
void detect_dato_recibido()
{
char caracter;
caracter=getc();
switch (caracter)
{
case 'r': prinf("rojo");
break;
case 'v': printf("verde");
break;
case 'n': printf("naranja");
break;
case 'a': printf("apagar");
break;
}
}
main()
{
ConfiguraIOA(); //NO BORRAR
ConfiguraIO(); //NO BORRAR
enable_interrupts(INT_RDA);// habilitamos las interrupciones del puerto serie, recepción
enable_interrupts(global);// habilitamos de forma global todas las inte. Este es el mecanismo general para
// utilizar las interrupciones.

}
}

Por otro lado he cambiado el código, utilizando la funcion "kbhit", que detecta entradas por tecladoy esta todo el rato pintando eso "probando", me explico, le cambio el código para que pinte "probando" cuando haya una pyulsacion de teclado y no para de pintarla todo el rato sin pulsar una tecla:


#include <CfgEntradaSalida.h>// No borrar
//DECLARACION DE CONSTANTES

//DECLARACIÓN DE VARIABLES
int actual1,anterior1,actual2,anterior2;
//INTERRUPCIÓn que se ejecutará al recibir un dato (caracter) por el puerto serie
//podemos utilizar como salidas las que nos quedan en O3 y O4, nos basta con dos para cambiar el color
//del diodo LED, YA CONECTAÍS VOSOTROS COMO MEJOR LO VEAÍS. En el caso que os pongo como ejemplo
// supongo que el ánodo del diodo led lo llevaís a la salida del pic directa y el cátodo a través de
// una Resistencia. No olvidar configurar en el panel los pines IO3 y IO4 como salidas (S), antes de compilar
// el programa.

}
main()
{
ConfiguraIOA(); //NO BORRAR
ConfiguraIO(); //NO BORRAR
if (kbhit())
{
printf("probando");
}
}
}

¿alguien sabe por qué no me funciona y por qué pasa esto?
¿alguien sabe como deberia hacerlo?

Muchisimas gracias.
 
Bueno, ni siquiera entiendo que rayos quieres hacer pero de inicio pregunto, como se supone que actua el archivo CfgEntradaSalida.h ?? seria mas facil si lo incluyes.
segundo.- Si vas a uasr Kbhit y estas programando en CCS deberias incluir el fichero keyboard.h tampoco veo que incluyas el fichero stdio.h para activar la comunicacion serial, en fin creo que tu programa esta bastante incompleto.

Saludos
 
el archivo CfgEntradaSalida.h es solo el archivo de configuracion ke incluye esto:

//****************************************************
#include <16f876A.h>
#device adc=8
#fuses XT,NOWDT,NOPROTECT
#org 0x1F00, 0x1FFF {} //PARA PROTEGER EL PROGRAMA CARGADOR (BOTLOADER)
#use delay(clock=4000000)//escribir en hercios la frecuencia del cristal
#USE STANDARD_IO (B)
//#CASE //Hace que el código sea sensible a las minusculas y mayusculas
#use RS232(Baud=19200,Xmit=PIN_C6,Rcv=PIN_C7)// COMUNICACIONES PUERTO SERIE A 19200 BAUDIOS
#include <STDLIB.H>
#include <definiciones.c>
#include <movil.c>//carga libreria servos trucados
#include <sensores.c>
// DECLARACION DE FUNCIONES
void ConfiguraIOA(void);
void ConfiguraIO(void);
// DEFINICIÓN DE LAS FUNCIONES
void ConfiguraIOA(void)
{
SETUP_ADC_PORTS(NO_ANALOGS);
SET_TRIS_A(0b00000000);
SETUP_ADC(ADC_OFF);
}
void ConfiguraIO(void)
{
SET_TRIS_C(0b00001001);
}

y lo que quiero hacer basicamente es mandarle desde un programa hecho en C# una letra y me active una salida u otra, para encender un led.
No se si tengo que usar las interrupciones o seria suficietne con el "kbhit", por eso pido ayuda, para que me digais que es mejor y que necesito para hacerlo.

Perdó si no me he explicado bien.

Muchisimas gracias
 
Última edición:
Por favor, un diagrama de cómo está todo conectado...

También al final de tu main() añade:

while(1) ;

Ya que como lo tienes hecho, el main() "termina" su ejecución, añadiendo lo anterior no "termina" y se queda el PIC a la espera de interrupciones. No sé si me expliqué bien...

Lo del kbhit() no lo sé ya que nunca usé esta función.
 
Es correcta la aseveración de Ferny, y con la instrucción kbhit bastaría, solo que debes declarar cual valor de tecla deseas reconocer, de modo tal que si es para una tecla en especial pues debes declararlo y si es para que al oprimir cualquier tecla te imprima en pantalla "probando" también debieras declarar cual es la excepción.
 
Perdón pero se me olvidó poner el while, eso si lo tengo , el problema es ke con el kbhit nada más conectar el pic con el hyperterminal es como si estuviera todo el tiempo pulsando una tecla, porque no para de escribir.

De todas formas como harian ustedes para crear un programa que hiciera lo de los leds como dije en el ultimo post?
y lo que quiero hacer basicamente es mandarle desde un programa hecho en C# una letra y me active una salida u otra, para encender un led.

muchas gracias
 
Bueno, ni siquiera entiendo que rayos quieres hacer pero de inicio pregunto, como se supone que actua el archivo CfgEntradaSalida.h ?? seria mas facil si lo incluyes.
segundo.- Si vas a uasr Kbhit y estas programando en CCS deberias incluir el fichero keyboard.h tampoco veo que incluyas el fichero stdio.h para activar la comunicacion serial, en fin creo que tu programa esta bastante incompleto.

Saludos

¿de donde descargo el keyboard.h y stdio.h?

nadie puede ayudarme?
 
Bueno si estas usando CCS para programar, deben estar incluidas esas librerias y solo es cuestion de incluirlas en tu programa mediante la directiva #include
 
CCS es un software compilador para programación de pics en lenguaje C, si estas usando ese pues ahí deben estar incluidas las librerías, desconozco si en algún otro compilador C las tenga, yo supondría que si pues son parte del C ANSI.
 
Atrás
Arriba