Autor Tema: problema al recibir datos rs232  (Leído 6278 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: problema al recibir datos rs232
« Respuesta #15 en: 28 de Octubre de 2008, 17:02:46 »
Prueba con esto

Código: [Seleccionar]
#include <16F877.h> // Se añade la libreria del PIC a utilizar
#FUSES NOWDT,HS,NOPUT,PROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=20000000)      //Velocidad del reloj

#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,errors) //enable=PIN_C5 hace que el C maneje el pin de habilitación


#include <24512.c> // Se añade la libreria de la EEPROM 24LC512
#include <external_eeprom.c> // Se añade la libreria para controlar una EPROM externa

#int_rda
void serial_isr(){


      int dato=0,dir2=0,i=0,f=0,g=0,h=0,j=0,k=0;
      float dato2=0;
      char answer;
     disable_interrupts(int_rda);//Aqui deshabilito la interrupción
     answer=getch();
     if(answer='Y'){
     printf(" Interrupcion ");
     
   //Leo datos de eeprom y envio al PC
   
   }
}


void main(void) // Inicio del programa principal
{

   float irra[]    = {1, 2, 3, 6};
   float tempa[]    = {6, 3, 2, 1};
   float tempm[]    = {2, 4, 5, 6};
   float vel[]    = {2, 4, 5, 6};
   float volt[]    = {2, 4, 5, 6};
   float inte[]    = {2, 4, 5, 6};

//Variables int que contienten el valor de la fecha
   int min,sec,hr;

//Inicialización de las variables necesarias para movernos por la EEPROM
   int dir=0;

//Iniciaización variables para necesarias para moverse dentro de los datos
   int f=0,g=0,h=0,i=0,j=0,k=0;

   min=0;
   sec=0;
   hr=0;

   init_ext_eeprom(); // Inicializamos EEPROM EXTERNA
   
   delay_ms(200);// retraso 200 milisegundos para no colapsar PIC
   
   
   
   // Escribimos datos en la eeprom

   do{

            enable_interrupts(int_rda);
            enable_interrupts(global);

   delay_ms(500);                  // espera por ejemplo 0,5 seg para enviar nuevamente el dato,
   output_HIGH(PIN_B1);        // por ejemplo conectas un led entre el pin B1 y masa y este debe prender
   delay_ms(250);                  // espera por ejemplo 0,25 seg
   output_LOW(PIN_B1);         // se apaga el led
   delay_ms(250);                  // esperas otros 0,25 seg para enviar nuevamente el dato,
   }while(TRUE);

}

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema al recibir datos rs232
« Respuesta #16 en: 29 de Octubre de 2008, 09:05:40 »
Gracias ema por la opción, pero ahora el programa hace, que la interrupción se ejecute constantemente,  El programa lo que ahce es graba los datos en la memoria y luego ejecuta el while y constantemente envia datos al PC sin encesidad de que este le envie ninguna señal, alguien puede decirme como solucionar esto?

Muchas gracias amigos

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema al recibir datos rs232
« Respuesta #17 en: 31 de Octubre de 2008, 09:04:31 »
Mirando la pagina de RedRaven, he visto que al utilizar la transmision de datos por rs232 hace una interrupcion tal que asi:
char Keypress=' ';

#int_rda
void serial_isr() {

  Keypress=0x00;
  if(kbhit()){
    Keypress=getc();
    if(Keypress!=0x00){
      putchar(keypress);
      keypress=0x00;
         ###3 codigo a ejecutar
    }
  }
}

Entiendo que  si yo pongo mi codigo debajo de keypress=0x00;  tansolo se ejecutara lo que hay debajo cuando a putchar le llegue algo que no es 00 pero como constantemente en mi programa esta en estado de recibir, saltara la interrupcion constantemente, alguien me puede ayudar porfavor.

Un saludo

Desconectado Giovanny

  • PIC12
  • **
  • Mensajes: 97
    • Supercomponentes
Re: problema al recibir datos rs232
« Respuesta #18 en: 31 de Octubre de 2008, 17:20:29 »
 :shock: :? el problema no es que la interrupcion se este ejecutando constantemente, eso es normal(siempre y cuando no la desactives) ... el problema que veo es que tienes todo el codigo dentro de la interrupcion y no en el main.
y no solo eso. tambien veo que dentro de la interrupcion pones printf("%u",dato); y delay_ms(200); varias veces...  :mrgreen:

preguntate ¿cuantos datos transmitidos por puerto serie, podrias recibir durante ese tiempo?... seguramente vas a resultar perdiendo informacion.

... he hecho un pequeño programa que funciona asi.
 + dentro de la interrupcion almacena lo que recibe en un buffer siempre y cuando no llegue un enter(\n \r)
 + cuando llega un enter(\n \r)pone null en el buffer y sube una bandera de recepcion de mensaje.
 + tiene una rutina para comparar el buffer de datos recibidos con 3 buffers almacenados en el pic, usando la funcion
    strcmp de la librea string.h
 + en el main, pregunta por la bandera de recepcion de mensaje. cuando esta activa,
    1. desactiva temporalmente la interrupcion rda.
    2. llama la rutina de comparacion.
    3. de acuerdo al resultado de la misma, cambia la salida del puerto a
    4. baja la bandera de recepcion de mensaje
    5. activa nuevamente la interrupcion rda
 :-/  :-/
Cheapekt, espero te sirva como guia para usar 'mejor' (a mi modo de ver) la interrupcion.

Código: [Seleccionar]
///////////////////////////////////////////////////////
//   Prueba de Recepcion de Cadenas Por puerto Serial
//   usando interrupcion #int_rda y un buffer[]
//   Hecho por Giovanny para Todopic
///////////////////////////////////////////////////////
#include   <16f627A.h>
#fuses INTRC,NOWDT,NOPROTECT,NOLVP,NOMCLR
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)

#include <string.h>

typedef unsigned char uchar;

#define BUFFER_MAX_LENGHT 20

unsigned char cont=0;
unsigned char data;
unsigned char buffer[BUFFER_MAX_LENGHT];
unsigned char *s1 = "OK";
unsigned char *s2 = "HOLA";
unsigned char *s3 = "MUNDO";

int1 smsOk = FALSE;

unsigned char cmp_result;

#int_rda
void serialInterrupt (){

   data=getc();
   if (data!=0X0D && data!=0X0A){//datos diferentes de ("\n" y "\r") enter
       buffer[cont]=data;
   }
   else if (data==0X0D) {
       buffer[cont]='\0';
   }
   else { // \r   if (data==0X0A)
      smsOk=TRUE;
      cont=-1;
      disable_interrupts(int_rda);
   }
   cont++;
}//
uchar compare_buffer(){
   if(strcmp(s1,&buffer[0])==0)return 1;
   else if(strcmp(s2,&buffer[0])==0)return 2;
   else if(strcmp(s3,&buffer[0])==0)return 3;
   
}//
void main ( ) {

   enable_interrupts(int_rda);
   enable_interrupts(global);
   for(;;){
      if(smsOk==TRUE){
         disable_interrupts(int_rda);
         cmp_result = compare_buffer();
         switch(cmp_result){
            case 1:
               output_a(0b00000001);
            break;
            case 2:
               output_a(0b00000010);
            break;
            case 3:
               output_a(0b00000100);
            break;
            default:
               output_a(0b00010000);
            break;
         }
         smsOk=FALSE;
         enable_interrupts(int_rda);
      }
   }

}
Saludos a todos. :mrgreen:  :mrgreen:
        Saludos desde Colombia! Que hermoso país....


 

anything