Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

EEPROM KAYDETME

Başlatan Sümeyra, 05 Ekim 2017, 10:31:33

Sümeyra

Merhaba ccs c de pic16f877a ile 0-9999 arası sayıcı programında enerji kesildiğinde sayıların kaydedilmesi için eeprom yazdırmayı denedim . Fakat ekrana ilk açılışta 5286 sayısı geliyor. sayıyı resetleyip tekrar denediğimde ise bir süre sonra sayı beşbin küsürlü olarak gösteriyor. sebebini bulamadım bu konuda bir çözüm önerir misiniz?

matador

Yazdığınız kodu paylaşırsanız hatanın ne olduğu görülebilir.

Sümeyra

#include <main.h>
#include <internal_eeprom.c>

#fuses XT,NOWDT,PROTECT,BROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)         

 //***********Denetleyici konfigürasyon ayarlari************

#use fast_io(c)                  
#use fast_io(a)                  
#use fast_io(b)                  
#use fast_io(d)                   
#use fast_io(e)
 
#define   buton      pin_a4     
#define   reset      pin_a5      
 
char birler=0, onlar=0, yuzler=0, binler=0;       // char tipinde degiskenler tanimlaniyor
int a;
int16 sayi=0;

const int digit[10]={0B11000000, 0B11111001,0B10100100, 0B10110000, 0B10011001, 0B10010010, 0B10000010,  0B1111000,0B10000000,  0B10010000};  //com anade


/********* ANA PROGRAM FONKSIYONU********/

void goster(){

        
         birler=sayi%10;             // birler hanesi hesaplaniyor
         onlar=(sayi%100)/10;        // onlar hanesi hesaplaniyor
         yuzler=(sayi%1000)/100;     // yuzler hanesi hesapnaıyor
         binler=(sayi%10000)/1000;
         
         output_D(digit[birler]);   // displaye bilgi gönderiliyor
         output_C(digit[onlar]);   // displaye bilgi gönderiliyor
         output_B(digit[yuzler]);   // displaye bilgi gönderiliyor        
         output_A(digit[binler]); 
         output_E(digit[binler]); 
 }
 
void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre disi
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre disi
   setup_timer_1(T1_DISABLED);     // T1 zamanlayicisi devre disi
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayicisi devre disi
   setup_adc_ports(NO_ANALOGS);    // ANALOG giris yok
   setup_adc(ADC_OFF);             // ADC birimi devre disi
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre disi
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre disi
  

 
   set_tris_a(0b00110000);         
   set_tris_e(0x00);                
   set_tris_b(0x00);                
   set_tris_d(0x00);                
   set_tris_c(0x00);                
   
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);   
   output_d(0x00);
   output_e(0x00);
   
   sayi = read_int32_eeprom(0); 
   
              goster();
             
while(1)
   {       
         goster();  
            
         if (input(buton))
         {
            delay_ms(500);   
            sayi++;         

            if (sayi==10000) { 
            sayi=0;
            goster();
            }
         }

         if (input(reset))  
         {
            delay_ms(500);
            sayi=0; 
            goster();   
         }     
        write_int32_eeprom(0,sayi); 
   }     
            }
   


fahri-

Pic lerde eepromlara devamlı yazmak  eepromun o hücresini öldürür ve kayıt yapamazsın. Senin program 1 dk da bile eeproma binlerce kez yazıyor. Bu durumda eeprom büyük bir ihtimalle bozulmuştur. Test için eeproma bir değer yaz ve tekrar oku. Yazdığın değer ve okuduğun değer aynı mıdır kontrol et.

Sümeyra

dediğiniz şekilde denediğimde yazdığım değer ile okuduğum değer aynı oluyor. Nasıl yazmam gerekir o zaman

fahri-

sayi++;
nin altına
write_int16_eeprom(0,sayi);


yazarsanız her sayı artışında kaydedersiniz. Diğer zamanlarda kayıt işlemi yapılmaz.


Sümeyra

Yardımlarınız için teşekkür ederim öncelikle. dediğiniz şekilde yazdım. program ilk çalıştığında 5535 sayısı görünüyor daha sonrasında resetleyip arttırma işlemleri yaptığımda sorunsuz bir şekilde çalışıyor kaydetme işlemlerini yapıyor. Ama ilk açılış anında sıfır görünmesini istiyorum 5535 sayısı hiç görünmesin onu nasıl yapabilirim.