Cómo hacer un registro de datos en pic c y guardarlos en una memoria externa(USB)?

Un saludo de paz y bien para todos!
Estoy tratando de hacer un registrador de datos (con pic18F4550 en PIC C ccs) para que cumpla las siguientes funciones y se vea en una pantalla LCD16x4:
FECHA: (MOSTRAR LA FECHA ACTUAL, con DS1307)
HORA: (MOSTRAR LA HORA ACTUAL, con DS1307)
TEMPERATURA: (Muestra la temperatura con un sensor LM35)
CRONÓMETRO:
(Hice un reloj, esto es para que pueda ver el tiempo que va desde que quiero iniciar el registro de datos, no puedo poner un pulsador que solo me reinicie este cronómetro, ayudenme por favor :C )
Luego, con un boton redirigir la pantalla a los registros que quiero, por cada 5 minutos, mostrar la hora y la temperatura capturadas en ese instante y a su vez guardarlas en una memoria externa USB.
Solo he podido hacer hasta el cronómetro y he estado tratando de buscar información de cómo hacer el registro de datos por el intervalo de tiempo(5 minutos) guarde dicha información. Hace más de 4 años que no programo y me está costando adecuarme a todo, informo que mi código no está del todo bueno, espero puedan guiarme y/o darme alguna sugerencia, de ante mano muchas gracias :)
Adjunto: Código de avance y simulación en proteus
- Natalia.
CSS:
#include <18f4550.h>             
#device adc=10                         // Usa resolución de 10 bits
#use delay(clock=4M)       // Cristal a utilizar
#fuses HS,NOWDT,NOPROTECT,NOMCLR,INTRC_IO
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_ENABLE_PIN PIN_D2
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6
#include <lcd.c>
#use standard_io (A)
#use standard_io(B)
#use standard_io (C)
#use standard_io(D)
#use standard_io(E)
#include <ds1307.c>
#include <stdio.h>
#include <stdlib.h>

//#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
 
void main (void)
{
float temper,medicion;
int hour,min,sec;
int day,mth,year,dow;
int h1=0,m1=0,s1=0;   // para el cronometro.

lcd_init();       // Inicia LCD


//  PRIMERA LECTURA
lcd_gotoxy(4,1);       //linea 1 FASEEL SAC
lcd_putc("FASEEL SAC");         
lcd_gotoxy(4,2);       //linea 2 REGISTRADOR
lcd_putc("REGISTRADOR");     
lcd_gotoxy(24,1);       //linea 3 DE
lcd_putc("DE");       
lcd_gotoxy(23,2);       //linea 4 DATOS
lcd_putc("DATOS");       // Saca texto
delay_ms(1000);
lcd_putc("\f");                             // Limpia pantalla
//set_tris_b(0x00);            //puerto B como salida B7
   //disable_interrupts(GLOBAL);      //todas interrupciones desactivadas
  

//  HORA
lcd_gotoxy(1,1);       //linea 1   FECHA:
lcd_putc("FECHA: ");
lcd_gotoxy(1,2);        //linea 2  HORA:
lcd_putc("HORA : ");
                
// TEMPERATURA
lcd_gotoxy(17,1);      //linea 3   TEMP:
lcd_putc("TEMP : ");     
lcd_gotoxy(30,1);      //linea 3            °C
lcd_putc((char)223);  //PARA °
lcd_putc("C");

// TIEMPO DE SERVICIO
lcd_gotoxy(17,2);
lcd_putc("T.SERV:");

    while (1)
    {
  //LEER  HORA
 
   ds1307_get_date(day,mth,year,dow);
   ds1307_get_time(hour,min,sec);
   lcd_gotoxy(7,1);     // LINEA 1   DIA-MES-AÑO
   printf(lcd_putc," %02u-%02u-%02u",day,mth,year);
   lcd_gotoxy(8,2);     //linea 2    HR-MIN-SEG
   printf(lcd_putc,"%02u:%02u:%02u",hour,min,sec);
 
   // LEER TEMPERATURA
    lcd_gotoxy(24,1);      // LINEA 3 TEMP°C  EJM: 23.14 °C
    setup_adc (adc_clock_internal);
    setup_adc_ports (AN0_analog);
    set_adc_channel (0);                // Elige canal a medir RA0
    delay_us (10);
    medicion=read_adc ();              // Hace conversión AD
    setup_adc (adc_off);                 // Apaga ADC
    temper=medicion*(0.4887585);     // Pasa binario a °C
    printf(lcd_putc,"%02.2f",temper);   //  LEE 2 DIGITOS XX.XX °C
    delay_ms (100);   
  
    // RELOJ de servicio EN 0 LINEA 4
    // no sé como poner un pulsador que reinicie solo este reloj :(
    lcd_gotoxy(25,2);
    printf(lcd_putc,"%02u:%02u:%02u",h1,m1,s1);
    s1++;
    delay_ms(100);
    if(s1==60){                                       //cantidad de veces que cuenta la variable
     s1=00;                                            //comiensa desde 00a contar
     m1++;                                             //termina los segundos y salta a los minutos
     }
     if(m1==60){                                       //cantidad de veces que cuenta la variable
     m1=00;                                            //comienza desde 00 a contar
     h1++;                                             //salta a las horas
     }
     if(h1==24){                                       // cantidad de veces que la variable contara
     h1=00;                                            // comienza desde 00
     s1++;
     }
  
   /* // CASOS PARA CADA 5 MIN   no tengo una idea centrada de como hacerlo :(
   switch (true)
   {
   case 1: (s1=5);
   lcd_putc("\f"); 
   lcd_gotoxy(17,1);      //linea 3   TEMP:
     printf(lcd_putc,"%02u:%02u:%02u",hour,min,sec);
   lcd_gotoxy(17,2);
   printf(lcd_putc,"%02.2f oC",temper);
    delay_ms (1000);
    break;
  
   }
   */
  
  
  
  
    }
    
}
 

Adjuntos

  • REGISTRADOR DE DATOS1.txt
    3.9 KB · Visitas: 21
  • REGISTRADOR1.PNG
    REGISTRADOR1.PNG
    61.5 KB · Visitas: 27
Última edición:
no puedo poner un pulsador que solo me reinicie este cronómetro.
¿No puedes o no debes poner un pulsador?
por cada 5 minutos, mostrar la hora y la temperatura capturadas en ese instante y a su vez guardarlas en una memoria externa USB.
Puedes usar un Timer, incrementando una variable cada x milisegundos y cuando x se cumpla, activar una bandera.

Es más conveniente usar una memoria microSD, e incluso la memoria interna, que implementar el USB OTG y cambiar de micro a la serie 24F.
 
¿No puedes o no debes poner un pulsador?

Puedes usar un Timer, incrementando una variable cada x milisegundos y cuando x se cumpla, activar una bandera.

Es más conveniente usar una memoria microSD, e incluso la memoria interna, que implementar el USB OTG y cambiar de micro a la serie 24F.
No puedo poner un pulsador, intenté ponerlo pero no reinicia nada(solo quisiera poner el reseteo a 0 en ese reloj).
Gracias, entonces trataré de utilizar la memoria interna del pic.
Podrías explicarme un poco más sobre incrementar la variable por cada mS?
Gracias :)
 
¿Podrías explicarme un poco más sobre incrementar la variable por cada mS?
Algo así:
C:
#INT_TIMER1
void sdi_desborde_timer1 (void)
{
    if(++ticks_timer1 > x)    // x = Constante que determinará el tiempo deseado.
    {
        ticks_timer1 = 0;
        flag_timer1 = 1;
    }
    set_timer1(0xXXX);    // Recargar el Timer 1
}
El timer lo configuras para que desborde cada x milisegundos, por ejemplo: 1 mS, 10 mS, 100 ms, o X mS.
Durante otra parte del programa compruebas "flag_timer1" o ahí mismo actúas.
De esa forma puedes guardar los datos sin usar un pulsador.

Para reiniciar los valores a 0, también debes volver a grabarlos en el DS1307.
 
Atrás
Arriba