TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kidpic en 11 de Mayo de 2009, 21:53:19
-
Muchachos tengo este programita y no se en que puedo estar fallando. Muestro en pamtalla un menu y elijo una opcion, resulat que lo primero lo have bien, está fallando la interrupcion. Por favor si le echan un vistazo, Os dejo el programa Muchas Gracias !!!!!!!!!!
///Uso de la interrupcion por el puerto RS232 mediante menú
//////////////////////////////////////////////////////////////////////////////////
#include <16f887.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(B)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, FORCE_SW) //manejo del RS232
#include <24256.c> //libreria eeprom 24LC256
///DECLARACION DE VARIABLES GLOBALES
boolean menu; //si menu=0 se muestra el menu de inicio...
void rs232 (void); //...si opcion=1 estamos en modo direccion
// opcion=0 estamos en modo dato
///LLAMADA FUNCION INTERRUPCION
#int_rda
void rs232()
{
char digito; //...variables
disable_interrupts(global); //apago interrupcion
digito=getc( ); //almaceno dato serial(rs232) en digito
puts("****************************************************" );
switch(digito){
case '0':
menu=!menu; //muestra menu
break;
case '1': puts("Configurando Reloj" ); //llena memoria 0xff
puts(" Configurado!" );
break;
case '2': puts("Realizando Lectura..." ); //opcion que realiza la lectura modo hex
puts("00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" );
puts("==============================================" );
puts("Lectura finalizada!");
break;
case '3': puts("Realizaando escritura");
puts(" Escritura finalizada!" );
break;
case '4': puts("Hora min: " ); //opcion que realiza la lectura modo texto
puts("UB:" );
puts("Temperatura:" );
puts("salir!:" );
break;
}
enable_interrupts(global); //activamos de nuevo la interrupcion serial rs-232
}
void main(void)
{
disable_interrupts (global);
enable_interrupts(int_rda); //activo interrupcion serial rs-232
enable_interrupts(global); //habilito la interrupcion
// init_ext_eeprom( );
do{ //bucle...
puts(" ");
puts("Lectura/Escritura de EEPROM 24LC256");
puts("==============================================" );
puts("Seleccione opcion:" );
puts("-------------------------------------" );
puts(" 0->Ver opciones" );
puts(" 1->Configurar reloj" );
puts(" 2->Lectura EEPROM" );
puts(" 3->Escritura EEPROM" );
puts(" 4->Pantalla principal " ); //...principal
menu=1; //muestra menu solamente una vez
while(menu==1){ } //espera tecla pulsada por teclado(rs-232)
} while(TRUE); //...infinito
}
-
Reemplaza la configuracion de esta forma y funciona bien :wink:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
-
Ok, gracias por la respuesta y el dato.
lo estare probando.
-
Hola me podrias ayudar con este programa, leo serialmente un lector de tarjetas id12, pero solo consigo 2 de los 10 digitos que debo obtener y creo que el error esta en la forma que pido el codigo,
#include <16F877a.h>
#fuses XT,NOWDT
#use delay(clock= 4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)
#include <lcd.c>
char cadena[];
int i=0;
#int_rda
rda_isr()
{
for(i=0;i<14;i++){
cadena=getchar();
}
}
void main(){
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"\f%02X",cadena);
}
y me sale el Warning: Function not void and does not return a value rda_isr, que creo ese el motivo del problema
-
o me podrias pasar la libreria de comunicacion serial que usas, aunque la que tengo la saque de un libro y el los ejemplos, funciona bien.
-
Has metido el bucle de lectura dentro de la interrupción, y así no te funcionará.
En la interrupción sólo debes leer un carácter, o a lo sumo, hacer un bucle mientras haya algún carácter esperando (con kbhit).
Te aconsejo que el carácter leído lo metas en un buffer y desde el bucle principal de tu programa ya haces el tratamiento de ese buffer.
-
Hola nocturno, ya corregi lo que me dijiste, y ya logre leer numeros, pero ahora sucede lo siguiente:
El sensor funciona asi, al pasar la terjeta, el sensor me manda un 0x02 de cabecero y un 0x03 al final de la cadena, pero el 0x02 y el 0x03 no son parte del codigo de la tarjeta, lo que sucede es que igual se envia y se muestra en el lcd, como rayas (4 en un segmento) y en el hipertermial como si fueran corazoncitos y cara feliz, probe poniendo una lazo if como lo muestro acontinuacion:
#int_rda
rda_isr(){
if ((valor=getchar())==0x02){ // Pienso que con este lazo if, esperaria al 0x02 y despues procederia a la lectura del buffer
Buffer[PunteroDatos]=getchar();
PunteroDatos=0;
PunteroDatos+=1;
if(PunteroDatos==12){
Buffer[12]='\0';
Kbhit_Data=1;
}
}
}
pero el lcd no me muestra nada al pasar la tarjeta, pienso que se queda esperando a que pase un 0x02 y nada, el 0x03 tampoco lo debo de procesar,ya que hace que el lcd se me salte a la otra linea.
ayudame
-
Hola javierdavid2006, no te muestra nada por dos cosas,
#int_rda
rda_isr(){
if ((valor=getchar())==0x02){ //1->aquí cada vez que hay una interrupción, lee un byte y lo compara con 0x02 si es así continua con el bucle, después vuelta a empezar
// esto no es correcto cada vez que recibes algo lo compara y como no es igual el resto no existe :D
Buffer[PunteroDatos]=getchar();
PunteroDatos=0;//2-> :shock: si cada vez que inicia-lizas pones a cero , jamas valdrá 12 , otra vez error ;-)
PunteroDatos+=1;
if(PunteroDatos==12){
Buffer[12]='\0';
Kbhit_Data=1;
}
}
}
prueba con esto
PunteroDatos=0;//inicia liza el contador en otro sitio;
#int_rda
rda_isr(){
Buffer[PunteroDatos]=getchar();
if(PunteroDatos==0 && Buffer[PunteroDatos]==0x02)// si es el primer dato y es 0x02 ,por si después se reciben otros
{ // lo eliminamos
Bufer[PunteroDatos]='/0';// igual a null
}
else
{
PunteroDatos++; // si no ,avanzamos contador, así guardaremos los siguientes datos.
}
if(PunteroDatos==12){// si hemos recibido 12, aunque deberían ser 11, pues dices que solo has de recibir 10 datos...
Buffer[12]='\0';// eliminamos el ultimo carácter y convertimos en cadena.
Kbhit_Data=1;
PunteroDatos=0;// reinicializamos el contador.
}
}