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?
Yazdığınız kodu paylaşırsanız hatanın ne olduğu görülebilir.
#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);
}
}
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.
dediğiniz şekilde denediğimde yazdığım değer ile okuduğum değer aynı oluyor. Nasıl yazmam gerekir o zaman
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.
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.