Autor Tema: Problemas con int_rda  (Leído 3266 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Problemas con int_rda
« 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
   
}
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con int_rda
« Respuesta #1 en: 11 de Mayo de 2009, 21:55:42 »
Reemplaza la configuracion de esta forma y funciona bien  :wink:

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
« Última modificación: 11 de Mayo de 2009, 21:59:52 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re: Problemas con int_rda
« Respuesta #2 en: 12 de Mayo de 2009, 14:14:56 »
Ok, gracias por la respuesta y el dato.
lo estare probando.
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado javierdavid2006

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con int_rda
« Respuesta #3 en: 13 de Noviembre de 2010, 21:59:37 »
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

Desconectado javierdavid2006

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con int_rda
« Respuesta #4 en: 13 de Noviembre de 2010, 22:02:21 »
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.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problemas con int_rda
« Respuesta #5 en: 14 de Noviembre de 2010, 02:12:43 »
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.

Desconectado javierdavid2006

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con int_rda
« Respuesta #6 en: 20 de Noviembre de 2010, 18:42:29 »
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 

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problemas con int_rda
« Respuesta #7 en: 21 de Noviembre de 2010, 19:50:41 »
Hola javierdavid2006, no te muestra nada por dos cosas,

Citar
#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

Código: [Seleccionar]
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.
}
}
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.


 

anything