Retraso en el envio de trama de datos UART 18F25K50

#1
Hola muy buenos días colegas,

Estoy realizando un contador con un microcontrolador 18F25K50 el cual se activa al enviar un pulso a la entrada C0; este programa también realiza un envío de trama vía RS232 a un ordenador en el cual lo comunico a un programa de LABVIEW, este programa manda un caracter tipo string "G" cada 250ms y el microncontrolador una vez que recibe mediante el comando GETC() ese carácter envía una trama que contiene fecha y hora obtenida del ds1307 y el contador; el aumento del contador se realiza cada segundo.

El problema que se tiene es que el contador se retrasa cada que envía un trama incompleta y eso hace que el contador se retrase segundos; tengo duda si es mi programa de labview o si es el código en mi microcontrolador.

Saludos colegas.

Código:
#include <18F25K50.h>
#fuses NOIESO,NOFCMEN,NOBROWNOUT,NOPUT,NOPBADEN,NOMCLR
#use delay (INTERNAL=10,000,000)
#define RTC_SDA PIN_B0
#define RTC_SCL PIN_B1
#include <DS1307.c> 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC, timeout=250)
#include "stdlib.h"
#include <input.c>
#include "limits.h"
#rom int 0xf00000={1,2,3,4} 

void main()
{
 
 int css=0, cmm=0, chh=0, cdd=0, cmeses=0;
 int x;
 BYTE sec, min, hrs, day, month, yr, dow;
 ds1307_init();    
// ds1307_set_date_time(14,8,17,1,8,53,30);  //(day,mth,year,dow,hour,min,sec)     // Configuracion de Hora
  
  long long v = read_eeprom( 7 );      //lectura y almacenamiento en variable de la localidad 7 de memoria eeprom(segundos)
  long long v1= read_eeprom( 6 );      //lectura y almacenamiento en variable de la localidad 6 de memoria eeprom(minutos)
  long long v2= read_eeprom( 5 );      //lectura y almacenamiento en variable de la localidad 5 de memoria eeprom(horas)
  long long v3= read_eeprom( 4 );      //lectura y almacenamiento en variable de la localidad 4 de memoria eeprom(dias)
  long long v4= read_eeprom( 3 );      //lectura y almacenamiento en variable de la localidad 6 de memoria eeprom(meses)
  long long v12= v1*60;                //Conversión de minutos a segundos
  long long v13= v2*3600;              //Conversión de horas a segundos
  long long v14= v3*86400;             //Conversión de dias a segundos
  long long v15= v4*2592000;           //Conversión de meses a segundos
  long long vt=v+v12+v13+v14+v15;
  printf( "%lu  %lu  %lu  %lu  %lu  %lu     ",v, v1, v2, v3, v4, vt);
  delay_ms(1000);
  long long  contador=vt; 
 
while(TRUE)
{
  ds1307_get_date(day,month,yr,dow); 
  ds1307_get_time(hrs,min,sec); 
  output_low(PIN_A6);            //RECEPCIÓN
  output_low(PIN_A7);
  output_low(PIN_A0);

   for (x = 0; x < 3; x ++) 
   {
   if(getc()==\'G\')
           {
            output_high(PIN_A0);
            output_HIGH(PIN_A6);            //Envio de Datos
            output_HIGH(PIN_A7);
            delay_ms(25);
            printf("I%Lu %02u%02u%u%02u%02u%02uF %u ",contador,day,month,yr,hrs,min,sec, x); //Trama Almancenando datos
            delay_ms(225);
           }  
   }
   if(INPUT(PIN_C0)==1)       //Optoacoplador
         {          
            contador++;  
            css++;
            if((css+v)<=59)      //Segundos
            {
             write_eeprom(7,css+v);      
            }  
            else
            {
            css=0;
            v=0;
            cmm++;
            }
            if((cmm+v1)<=59)      //Minutos
           {
             write_eeprom(6,cmm+v1); 
           }
            else
           {
            cmm=0;
            v1=0;
            chh++;
           }
            if((chh+v2)<=24)       //Horas
           {
             write_eeprom(5,chh+v2); 
           }
            else
           {
            (chh)=0;
            v2=0;
            cdd++;
           
           } 
            if((cdd+v3)<=30)        //Dias
           {
             write_eeprom(4,cdd+v3);
           }
            else                    //Meses
           {
            cdd=0;
            v3=0;
            cmeses++;
            write_eeprom(3,cmeses+v4);
           }    
           }    
         delay_ms(250);
}
}
...

Saludos amigos y colegas
 

Adjuntos

Última edición:
#2
Lo primero de todo es que eso no envía cada 500ms, no se si eso es crítico, envía cada bastante mas tiempo.
Como poco 525+las instrucciones que no tengo ni idea de cuanto tardan en ejecutarse, pero así a bulto, con escritura en eeprom etc andará por los 600ms.

Si el tiempo de 500ms es crítico, usa un timer y borra todos los delays. Si no es crítico, lo puedes dejar así.
 
#3
Lo primero de todo es que eso no envía cada 500ms, no se si eso es crítico, envía cada bastante mas tiempo.
Como poco 525+las instrucciones que no tengo ni idea de cuanto tardan en ejecutarse, pero así a bulto, con escritura en eeprom etc andará por los 600ms.

Si el tiempo de 500ms es crítico, usa un timer y borra todos los delays. Si no es crítico, lo puedes dejar así.
Hola amigo primero que nada muchas gracias por ayudarme a contestar mi pregunta.

Mira necesito que mi contador se realice cada segundo, lo tengo que cronometrar pero al paso de los segundos se comienza a atrasar, como tu dices mi sistema es critico y necesito que se realice a la perfección.

Que timer debo utilizar y no se si me puedas proporcionar algo de información con respecto a eso.

Saludos.
 
#4
Pues lee tu código. Se ve claro que tarda más de lo que pretendes. Las instrucciones no son instantáneas y hay mil if que tardarán algo hasta que se cumpla.

Usa un timer.
 
Última edición:
#6
Lo sé en todos los micros que yo he usado. En los que uses tu, lo normal es que lo sepas tu.
Lee el datasheet. Te sorprenderás de las cosas que salen allí.

 

Temas similares


Arriba