Autor Tema: DATA_LOGGER con pic 16f877a  (Leído 2110 veces)

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

Desconectado junox00

  • PIC10
  • *
  • Mensajes: 1
DATA_LOGGER con pic 16f877a
« en: 14 de Diciembre de 2018, 02:37:31 »
Buen dia amigos traigo un problema con una programacion en ccs y un pic16f877a el programa consiste en grabar datos de temperatura simulados en el Proteus en memorias de la eeprom sin enbargo al parecer mi programa no logra hacer que estos valores se escriban o se graben en las memorias de la eeprom lo se porque al querer visualizar los datos en el Hyperterminal solo salen 255 o FF me gustaria si alguien puede identificar que estoy haciendo mal les agradeceria su ayuda  :-) aqui aporto la programacion.


#include <16f877a.h>
#device adc=10

#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
#use rs232(baud=9600, xmit=pin_c6,rcv=pin_c7,bits=8,parity=N)
#include <lcd.c>
#define EEPROM_ADDRESS long int
#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3


float temp=0,dato;
int16 posicion=0;
int edit=0,f,reset=0,contador=0,segundos=1;
char opt,r,seg,sel=1;
float temp2=0;

void serial_print(){
   printf("\f");
   puts(" |=============================================|\n");
   puts(" |----------REGISTRO DE TEMPERATURA------------|\n");
   puts(" |-----a.Lectura de los registros de temp------|\n");
   puts(" |--------b.Cambiar tiempo de muestreo---------|\n");
   puts(" |-------c.Reiniciar registro de datos---------|\n");
   puts(" |=============================================|\n\n");
}

void write_ext_eeprom(long int address,BYTE data){
short int status;
i2c_start();
i2c_write(0xA0);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
}

BYTE leer_eeprom(long int address){
BYTE data;
i2c_start();
i2c_write(0xA0);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}

#int_rda
void serial(){
   opt=getc();
   switch (opt){
   case 'a':
      printf("\f");
      puts(" |==============DATOS REGISTRADOS==============|\n");
      for(f=0;f<posicion;f++){
         dato=leer_eeprom(f);     
         printf("\r         %d.     %.1f*C\n",f+1,dato);
         }
      delay_ms(5000);
      serial_print();
      break;
   case 'b':
      printf("\f");
      puts(" |=============================================|\n");
      puts(" |--------Seleccion de tiempo de muestreo------|\n");
      puts(" |-------(Ingrese la cantidad en segundos)-----|\n");
      puts(" |--------Valores válidos de 1seg a 5 seg------|\n");
      puts(" |=============================================|\n");
      while(sel==1){
      seg=getc();
      segundos=seg-48;
      if(segundos>0 && segundos<=5){
      printf("Se han seleccionado %d segundos.",segundos);
      sel=0;
      }else{
      printf("Seleccion erronea.");
      sel=1;
      }
      }
      serial_print();
      break;
   case 'c':
      printf("\f");
      puts(" |=============================================|\n");
      puts(" |-¿Seguro que desea reiniciar los registros?--|\n");
      puts(" |----------(Presione 1 para continuar)--------|\n");
      puts(" |-----(Cualquier otra tecla para cancelar)----|\n");
      puts(" |=============================================|\n");
      r=getc();
      reset=atoi(r);
      if(r=='1'){
         posicion=0;
         puts(" |--------------Reinicio exitoso---------------|\n");
      }else{
         puts(" |------------Operacion cancelada--------------|\n");
      }
      puts(" |=============================================|\n");
      delay_ms(5000);
      serial_print();
      break;
   }
   }

#INT_TIMER1
void lec1(){
   if(edit==0){
      if (contador==segundos){
      write_ext_eeprom(posicion,temp2);
     
      posicion++;
      contador=-1;
      }
   contador++;
   }
   set_timer1(90000);
}



void main() {
   setup_adc(ADC_CLOCK_INTERNAL);      // FUENTE DEL RELOJ RC
   setup_adc_ports(AN0);                //Canal 0 analogico
   set_adc_channel(0);              //Habilitación canal 0
   lcd_init();
   setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
   set_timer1(70000);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(int_rda);
   enable_interrupts(global);
   serial_print();
   while(TRUE) {
      temp=read_adc();
      temp=(temp/1024.0)*5000.0;
      temp2=temp/10;
      lcd_gotoxy(1,1);
      printf(lcd_putc, "    Temp: %.1f*C  ", temp);
      lcd_gotoxy(1,2);
      printf(lcd_putc, "Registros:   %ld     ", posicion);
      printf("\rTemperatura: %2.1f      Registros:   %3ld    Tiempo de muestreo:%d     ",temp2 ,posicion,segundos);
     
   }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DATA_LOGGER con pic 16f877a
« Respuesta #1 en: 14 de Diciembre de 2018, 11:31:23 »
Lo primero que haría, aunque esto seguramente no resuelva tu problema, es sacar esos puts, delays y escrituras/lecturas de la EEPROM de las interrupciones, Las interrupciones deben ser rapidas, aunque te parezca rapido a la vista para el micro eso es eterno.

Código: [Seleccionar]
   set_timer1(70000);
 set_timer1(90000);

Complicado cuando el Timer1 que es de 16 bits solo puede almacenar un numero hasta 65535.




 

anything