Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

int eeprom okuma

Başlatan taytis, 14 Mayıs 2009, 11:59:05

taytis

Arkadaşlar Selam ,16f628A kullanıyorum internal epromuna 255 kadar yazıyorum fakat 300 yazdığımda okudediğimde 45 okuyor yani 255 kadar yazıyor.Ben gereğinde 100.000 yazı okumam lazım konu hakkında yardımcı olursanız sevinirim.

#if defined(__PCM__)
#include <16F628A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#define use_portb_lcd TRUE
#define totalcounter  50  
#define counter 20
#include <LCD.C>



int32 toplam;
int32 kalip;

toplam = read_EEPROM (totalcounter);  
kalip = read_EEPROM (counter);

lcd_init();
  printf(lcd_putc,"Toplam   %Lu\n",toplam);
 printf(lcd_putc,"Kalip  %Lu",kalip);
if (!input(PIN_A0))      {

 toplam++;
 kalip++;
 lcd_init();
  printf(lcd_putc,"Toplam   %Lu\n",toplam);
  printf(lcd_putc,"Kalip  %Lu",kalip);            
  while(!input(PIN_A0));
 
 
    write_eeprom(totalcounter,toplam);
    write_eeprom(counter,kalip);
 
  }

if (!input(PIN_A1)) {      
  kalip=0;
write_eeprom(counter,kalip);
 lcd_init();
  printf(lcd_putc,"Toplam   %Lu\n",toplam);
 printf(lcd_putc,"Kalip  %Lu",kalip);            
 while(!input(PIN_A1));
 
 
  write_eeprom(totalcounter,toplam);
    write_eeprom(counter,kalip);
 
 }

Tagli

EEPROM 1 byte'lık alanlardan oluşur ve 255'ten büyük bir değer kaydedilememesi normal. Bildiğim kadarıyla EEPROM'a kayıt yapan fonksiyonlar adres ve kayıt edilecek değeri alıp ona göre işlem yapıyorlar. Derleyicinin fonksiyonlarını bir araştır, belki daha büyük sayıları kaydetmek için özel fonksiyonları vardır. Eğer yoksa bu 32 bitlik sayıyı senin 4  byte'a bölüp ayrı ayrı kaydetmen gerekecek.
Gökçe Tağlıoğlu

KAZIMUGUR

Make ( ) komutunu incelemelisin.
y1=make8(x,0)    x sayısının ilk 8 bitlik kısmını alır.

Bu şekilde sayıyı bölüp eeproma kaydedebilirsin.

Sonra geri çağırıp : make16 veya 32 ile sayıyı yeniden oluşturursun.
x=make32(y4,y3,y2,y1) gibi...

taytis

ufak bir örnek verseniz çünkü ben daha acemiyim.

KAZIMUGUR

Ben çok ustayım da... :oops:

Eski bir çalışmadan :
unsigned int16 alt,ust,alt1,ust1,x,y,puls,basinc;
 int altH,altL,ustH,ustL;
.
.

   altH=read_eeprom(10),altL=read_eeprom(11);
   ustH=read_eeprom(20),ustL=read_eeprom(21);
   alt=make16(altH,altL),ust=make16(ustH,ustL);
while(true){        
 
.
.

  if((input(pin_B0))&(input(pin_B5)))            {
    altH=make8(alt,1),altL=make8(alt,0);
    ustH=make8(ust,1),ustL=make8(ust,0);
    write_eeprom(10,altH),write_eeprom(11,altL);
    write_eeprom(20,ustH),write_eeprom(21,ustL); }
}}

taytis

Baştan alakanız ve ilginiz için çok teşekkür ederim kendi uygulamda denedim fakat farklı rakkamlar çıkıyor aşağıda kodlar var anlatarak yazıyorum hata neredeyse yardımcı olursanız sevinirim.

Not:32 Bit 8 bite ayırmaya çalışıyorum
////////////////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F628A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#define use_portb_lcd TRUE
#define totalcounter1  21  
#define totalcounter2  22
#define totalcounter3  23
#define totalcounter4  24
#define counter1 1
#define counter2 2
#define counter3 3
#define counter4 4
///////////////////////////////////////////////////////////////////////////////
//HAFIZA AYARLARI//////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#include <LCD.C>
int32 toplam;
int32 kalip;
int toplam1;
int toplam2;
int toplam3;
int toplam4;
int kalip1;
int kalip2;
int kalip3;
int kalip4;
///////////////////////////////////////////////////////////////////////////
////////////////DEĞİŞKENLER/////////////////////////////////////////
toplam1 = read_EEPROM (totalcounter1);  
toplam2 = read_EEPROM (totalcounter2);
toplam3 = read_EEPROM (totalcounter3);
toplam4 = read_EEPROM (totalcounter4);
kalip1 = read_EEPROM (counter1);
kalip2 = read_EEPROM (counter2);
kalip3 = read_EEPROM (counter3);
kalip4 = read_EEPROM (counter4);
toplam=make32(toplam1,toplam2,toplam3,toplam4);
kalip=make32(kalip1,kalip2,kalip3,kalip4);
//////////////////////////////////////////////////////////////////
/////////İlk açıldığında okuma yapıyorum
///////////////////////////////////////////////////
lcd_init();
printf(lcd_putc,"Toplam   %Lu\n",toplam);
printf(lcd_putc,"Kalip  %Lu",kalip);
//////////////////////////////////////////////////////////////
////////////Lcd 'ye yazdırıyorum (Fakat saçma sapan şeyler çıkıyor)
//////////////////////////////////////////////////////////////

if (!input(PIN_A0))      {
 toplam++;
 kalip++;
 lcd_init();
  printf(lcd_putc,"Toplam   %Lu\n",toplam);
  printf(lcd_putc,"Kalip  %Lu",kalip);            
toplam1=make8(toplam,0);
     toplam2=make8(toplam,1);
        toplam3=make8(toplam,2);
           toplam4=make8(toplam,3);            
      kalip1=make8(kalip,0);
     kalip2=make8(kalip,1);
         kalip3=make8(kalip,2);
           kalip4=make8(kalip,3);      
    write_eeprom(totalcounter1,toplam1);
    write_eeprom(totalcounter2,toplam2);
      write_eeprom(totalcounter3,toplam3);
        write_eeprom(totalcounter4,toplam4);
 
  write_eeprom(counter1,kalip1);
     write_eeprom(counter2,kalip2);
        write_eeprom(counter3,kalip3);
           write_eeprom(counter4,kalip4);
while(!input(PIN_A0));



//////////////////////////////////////////////
Butonada basıldığı zaman 32 bit 8 dönüştürüyorum sonra eproma yazdırıyorum fakat olmuyor şimdidden yardımların için sağol

KAZIMUGUR

CCS ile devam edeceksen Serdar Çiçek - CCS C ile pic programlama kitabını al.

Aşağıdaki gibi olabilir...

int32 toplam; 
int32 kalip;

int toplam1,toplam2,toplam3,toplam4;
int kalip1, kalip2,kalip3,kalip4;

void main()
 {
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

  lcd_init();

 toplam1 = read_EEPROM (11); 
 toplam2 = read_EEPROM (12); 
 toplam3 = read_EEPROM (13); 
 toplam4 = read_EEPROM (14); 

 kalip1  = read_EEPROM (21); 
 kalip2  = read_EEPROM (22); 
 kalip3  = read_EEPROM (23); 
 kalip4  = read_EEPROM (24);
 
   toplam=make32(toplam4,toplam3,toplam2,toplam1); 
   kalip=make32(kalip4,kalip3,kalip2,kalip1);

//toplam=0;  //bir seferlik yazabilirsin
//kalip =0;  //eepromda sayı kalmış olabilir

while(true)  
 {
      lcd_gotoxy(1,1);
          printf(lcd_putc,"TOPLAM %08lu",toplam); 
      lcd_gotoxy(1,2);
          printf(lcd_putc,"KALIP    %06lu",kalip);

    if (!input(PIN_A0))   
 {
  toplam++; 
  kalip++;  
 }
    
    if (!input(PIN_A2))       //her seferinde make olmasın
 {
     toplam1=make8(toplam,0); 
     toplam2=make8(toplam,1); 
     toplam3=make8(toplam,2); 
     toplam4=make8(toplam,3); 

     kalip1=make8(kalip,0); 
     kalip2=make8(kalip,1); 
     kalip3=make8(kalip,2);
     kalip4=make8(kalip,3);
 }

    if (!input(PIN_A1))   // her seferinde eeproma yazmasın
    {      
      write_eeprom(11,toplam1);      
      write_eeprom(12,toplam2);
      write_eeprom(13,toplam3); 
      write_eeprom(14,toplam4); 

      write_eeprom(21,kalip1); 
      write_eeprom(22,kalip2); 
      write_eeprom(23,kalip3); 
      write_eeprom(24,kalip4); 
     }
 }}


Mesaja kod ekleyeceğinde  # butonuna  iki kere tıkla ve arasına kodu ekle güzel olurrr.