Autor Tema: Problema Recepcion INT_RDA 16f876  (Leído 2379 veces)

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

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Problema Recepcion INT_RDA 16f876
« en: 09 de Diciembre de 2009, 18:57:56 »
Hola estoy realizanzo una comuniacion serie entre pics, y he adaptado el protocolo NMEA de los GPS, mandando los datos en una cadena, desde el emisor, y descomponiendola en el receptor, he hecho un programa sencillito en visual basic, para mandar la cadena con diferentes valores, el caso es que tengo el programa, hecho con el compilador CCS 4.057, uso la INT_RDA, en el proteus funciona perfectamente el codigo, ya se que esto no es determinante, pero me extraña que al grabarlo en el PIC, no haya manera, he echo pruebas mandando mensajes a la LCD, por el puerto serie y recibo todo. He llegado a la conclusion que el fallo es de la INT_RDA, pero no se como solucionarlo, os adjunto el codigo para que le hecheis un vistazo y me ayudeis lo antes posible gracias.

Código: [Seleccionar]
#include <16f876.h>
#fuses HS,WDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
//LIBRERIAS
#include <lcd2.c>
#include <string.h>
#include <stdlib.h>
char pers;
int16 dist_pers;
char sen;
int16 cod_sen;
int16 dist_sen;
int16 dist_v1;
int16 dist_v2;
char veh;
int16 cod_veh;
char buffer[2];
int comaCount;
int posCount;
char headerBuffer[6];
int i;

#byte PIR1  = 0x0c
#byte SPBRG = 0x99
#byte RCSTA = 0x18
#byte TXREG = 0x19
#byte RCREG = 0x1A
#byte TXSTA = 0x98

#bit TXIF = PIR1.4
#bit RCIF = PIR1.5
#bit CREN = RCSTA.4

#int_rda
   void serial_isr() {

   char rxData;
   char s[6];

   rxDATA=0x00;
      if(kbhit()){
         rxData=getc();
         if(rxData!=0x00){     
            if (comaCount == 0) {
               if (posCount == 0) {
                  if (rxData == '$') {
                     headerBuffer[0] = '$';
                     posCount++;
                  }
               }
               else {
                  if (rxData == ',') {
                     comaCount++;
                     posCount = 0;
                  }
                  else {
                     headerBuffer[posCount] = rxData;
                     posCount++;
                  }
            }
         }
         else {
            strcpy(s, "$ARGOS");
            if (strncmp(headerBuffer, s, 6) == 0) {
               if (rxData == ',') {
                  comaCount++;
                  posCount = 0;
                  if (comaCount > 9) {
                     comaCount = 0;
                  }
               }
               else {
                  switch (comaCount) {
                 
                     case 1: pers = rxData;
                        posCount++;
                     break;
                     
                     case 2: buffer[posCount] = rxData;
                        dist_pers = atoi(buffer);
                        posCount++;
                     break;
                     
                     case 3: sen = rxData;
                        posCount++;
                     break;
                     
                     case 4: buffer[posCount] = rxData;
                        cod_sen = atoi(buffer);
                        posCount++;
                     break;
                     
                     case 5: buffer[posCount] = rxData;
                        dist_sen = atoi(buffer);
                        posCount++;
                     break;
                     
                     case 6: buffer[posCount] = rxData;
                        dist_v1 = atoi(buffer);
                        posCount++;
                     break;
                     
                     case 7: buffer[posCount] = rxData;
                        dist_v2 = atoi(buffer);
                        posCount++;
                     break;
                     
                     case 8: veh = rxData;
                        posCount++;
                     break;
                     
                     case 9: buffer[posCount] = rxData;
                        cod_veh = atoi(buffer);
                        posCount++;
                     break;
                     
                     default: posCount = 0;
                        comaCount = 0;
                     break;
               for (i=0;i<2;i++)
                  buffer[i] = 0x00;
                  }
               }
            }     
      rxData=0x00;
}}}}


void main() {

  enable_interrupts(global);
  enable_interrupts(int_rda);
  lcd_init();

   do{
      if (pers == 'N'&&sen == 'N'&&veh == 'N'){
         lcd_putc("\f");
      }
      if (pers == 'P'){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"P:%C DP:%lu",pers,dist_pers);
      }
      if (sen == 'S'){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"S:%C CS:%lu DS:%lu",sen,cod_sen,dist_sen);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"DTV1:%lu DTV2:%lu",dist_v1,dist_v2);
      }
      if (veh == 'V'){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"V:%C CV:%lu"veh,cod_veh);
      }
   } while (TRUE);
}


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #1 en: 09 de Diciembre de 2009, 20:41:56 »
El problema puede ser que estas realizando demasiadas tareas en la interrupción, lo mejor es recibir el dato, indicarlo con un flag y tratarlo en el programa principal.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #2 en: 09 de Diciembre de 2009, 21:46:44 »
No se si veo mal pero tienes habilitado el Watch Dog timer pero no veo que lo borres en ningún momento. Tal vez se esté reseteando el pic

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #3 en: 10 de Diciembre de 2009, 04:35:51 »
Hola cierto es que tengo activado el WDT, pero no se en que partes del codigo ni como deberia resetearlo, podrias indicarme como realizar estas tareas. gracias

Desconectado erdanieee

  • PIC10
  • *
  • Mensajes: 44
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #4 en: 10 de Diciembre de 2009, 06:43:05 »
hola, si configuras tu WDT para que se resetee cada 20 ms tienes que asegurarte de que en tu código se ejecute un "clear_WDT" antes de que se alcance el timeout, o de lo contrario tu pic se reseteará.
saludos

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #5 en: 10 de Diciembre de 2009, 08:29:30 »
como configuro el WDT para que se ejecute cada 20ms, y donde tengo que poner el clear_WDT?. Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #6 en: 10 de Diciembre de 2009, 09:24:58 »
Para configurar el periodo de reset del WDT tienes un pre-escaler, leyendo el datasheet en la sección de timers0 y con la frecuencia del cristal lo puedes determinar.

Ahora 20ms me parece demasiado poco para la aplicación, o aumentas el periodo y colocas un clrwdt en el bucle del main o creas una temporización con un timer y mediante interrupción reseteas el watchdog cada 19ms.


Y has más eficiente el tratamiento de la interrupción  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #7 en: 10 de Diciembre de 2009, 09:37:39 »
He estado mirando en la seccion del datasheet del 16f876 la parte que me has dicho, pero no he sabido aprovechar nada, que directiva tengo que poner el ccs para configurar el WDT, y que consejo me darías para mejorar la interrupcion.Gracias

Desconectado warriorfenix@hotmail.com

  • PIC10
  • *
  • Mensajes: 23
Re: Problema Recepcion INT_RDA 16f876
« Respuesta #8 en: 10 de Diciembre de 2009, 16:32:12 »
Llevo toda la tarde haciendo pruebas, solo con la interrupcion con el ejemplo de REDPIC, y en cuanto pongo la lcd, puff se acabo, no encuentro manera de solucionarlo. alguna idea?


 

anything