Autor Tema: Retraso en el envio de trama de datos UART 18F25K50  (Leído 2476 veces)

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

Desconectado victooritho

  • PIC10
  • *
  • Mensajes: 3
Retraso en el envio de trama de datos UART 18F25K50
« en: 14 de Agosto de 2017, 13:17:51 »
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: [Seleccionar]
#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);
}
}
« Última modificación: 14 de Agosto de 2017, 13:19:52 por victooritho »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Retraso en el envio de trama de datos UART 18F25K50
« Respuesta #1 en: 14 de Agosto de 2017, 15:11:18 »
Para mi los problemas son:

- delays
- recepcion en el ciclo while en ves de una interrupcion
- escritura en EEPROM demasiado seguido, acordate que posee cierta cantidad de lectura/escrituras. Si vas a estar cambiandolas cada 1 segundo, tal ves lo mejor sea usar la RAM.

Desconectado victooritho

  • PIC10
  • *
  • Mensajes: 3
Re:Retraso en el envio de trama de datos UART 18F25K50
« Respuesta #2 en: 15 de Agosto de 2017, 10:36:48 »
Para mi los problemas son:

- delays
- recepcion en el ciclo while en ves de una interrupcion
- escritura en EEPROM demasiado seguido, acordate que posee cierta cantidad de lectura/escrituras. Si vas a estar cambiandolas cada 1 segundo, tal ves lo mejor sea usar la RAM.

Que tal colega, muchas gracias por la información, como me recomiendas que use la RAM ?
utilizo de esa forma la EEPROM debido a que necesito estar guardando los datos cada segundo
que interrupción debo utilizar en vez de mi proceso de recepción ?

Muchas gracias por la información, saludos.
 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Retraso en el envio de trama de datos UART 18F25K50
« Respuesta #3 en: 15 de Agosto de 2017, 15:13:46 »
El tema esta en que la EEPROM tiene una cantidad limitada de ciclos de escritura, que usualmente se encuentra entre 100 mil a 1 millon de escrituras. Supongamos 100 mil, en el que el fabricante asegura que funciona hasta esa cantidad.

Si grabas segundo a segundo, eso quiere decir que  en una hora grabaste la posicion de los segundos 3600 veces. En 27.7 horas esa posicion de la EEPROM empezaria a fallar. Lo mismo ocurre con los datos del hora y minuto si los grabas continuamente. El DS1307 mantiene la hora, entonces no es necesario estar grabando de forma continua la misma en el PIC.

De ultima si queres saber cuando es que se corto la alimentacion, podes grabar esa hora en la NVRAM del DS1307. Si aun asi lo queres tener en el PIC, deberias tener un sistema de alimentacion que pueda proveerle al PIC corriente mientras graba en la EEPROM esos 3 valores. De esa forma unicamente grabas en la EEPROM cuando se corta la alimentacion al PIC, esto requiere que tengas un pin de sensado de la alimentacion y una capacidad suficiente como para mantenerlo alimentado unicamente al PIC hasta que grabe todo.

Lo que me refiero de la RAM es guardarlo en un int8 a los segundos,minutos y horas, en ves de la EEPROM

Código: C
  1. que interrupción debo utilizar en vez de mi proceso de recepción ?

La interrupcion de la UART, o que en CCS le llama INT_RDA


 

anything