ccs c eeprom

hocam biraz geç cevap yazdım ama kusura bakmayın, eeprom sorunumu çözdüm sorun mikroişlemcinin eeprom birimindeymişti başka bir işlemciyi taktım sorn çözüldü fakat ne yaptıysam d portu ilk program yükledikten sonra sıfırlanmış bir şekilde başlamıyor, ilk açılış için portları kendim sıfırlamam gerekiyor.
 
S.A.
Sn. Kardeşim hex kodlarını ilk yüklerken eeprom adres değerlerini hex dosyasından ya elle sıfırlayacaksın yada değerler yükleyeceksin yada ilk default değeri yani fabrika ayarı gibi düşün, ilk çalışma değerleri yükleyeceksin.

bu kodda pice ilk yüklenen hex de eeprom 0 adresin değeri 1 den farklı ise ilk çalımada 0 dan 20 ye kadar eprom değerlerini 0 yapıyor ve 0. cı adresi 1 yapıyor.

Kod:
#include <18F45K22.h>
#device ADC=10
#use delay(internal=64000000)

unsigned int role;
int i=0,kontr=0;

void role_on(int kontak)
{

bit_set(role,kontak);
write_eeprom(1,role);
output_d(role);
}

void role_off(int kontak)
{

bit_clear(role,kontak);
write_eeprom(1,role);
output_d(role);
}
void ilk_deger()/// Fabrika değerleri gibi düşün :)))
{
   for(i=0;i<20;i++){ write_eeprom(i,0);}///0-20 adres eeprom degeri 0 olur
   write_eeprom(0,1);
}


void main()
{
kontr=read_eeprom(0);/// ilk default değer için
if(kontr!=1){ ilk_deger();}
role=read_eeprom(1);
output_d(role);
delay_ms(100);

while(TRUE)
{
role_on(0);
delay_ms(500);
role_on(1);
delay_ms(500);
role_on(2);
delay_ms(500);
role_on(4);
delay_ms(500);

role_off(1);
delay_ms(500);
role_off(2);
delay_ms(500);
role_off(4);
delay_ms(500);
role_off(7);
delay_ms(500);

}

}


Buradaki kodda önceden belirlenmiş değerler pice hexi yüklediğinde ilk çalışmada eproma yüklenir ve yüklenen ilk default ayarlarıyla istenen çalışmada başlar.

Kod:
#include <18F45K22.h>
#device ADC=10
#use delay(internal=64000000)

unsigned int role;
int i=0,kontr=0;
int deger[15]={1,10,221,132,12,2,3,3,4,5,6,7,8,9,11};

void role_on(int kontak)
{

bit_set(role,kontak);
write_eeprom(1,role);
output_d(role);
}

void role_off(int kontak)
{

bit_clear(role,kontak);
write_eeprom(1,role);
output_d(role);
}
void ilk_deger()/// Fabrika değerleri gibi düşün :)))
{
   for(i=0;i<15;i++){ write_eeprom(deger[i],0);}///0-15 adres eeprom degerlerine önceden ayarlanmış sayısal veriler yüklenir

}


void main()
{
kontr=read_eeprom(0);/// ilk default değer için
if(kontr!=1){ ilk_deger();}
role=read_eeprom(1);
output_d(role);
delay_ms(100);

while(TRUE)
{
role_on(0);
delay_ms(500);
role_on(1);
delay_ms(500);
role_on(2);
delay_ms(500);
role_on(4);
delay_ms(500);

role_off(1);
delay_ms(500);
role_off(2);
delay_ms(500);
role_off(4);
delay_ms(500);
role_off(7);
delay_ms(500);

}

}
 
Son düzenleme:
A.s hocam çok çok teşekkürler sayenizde çok önemli bilhiler öğrendim :) ,bu programlama işinde daha yeni sayılırım şöyle bir sorumda olacaktı benim unsigned int x=0,y=0,z=0; diye 3 tane değişkenim var bunları eeproma yazdırıp geri okutuyorum ve okuttuğumda bazen degerlerden biri yada 2si farklı bir deger de geliyor - li degerlerde oluyor, bir forum sitesinde kullandıım işlemci 16f877a nın eepromlarında sıkıntı olduğu yazıyor tam olarak sorun ne olabilir ?
 
S.A.
Sn. Kardeşim rica ederim. Yardımcı olabildiysem ne ala.
Sorun için değeri int olarak denediğin zaman ne oluyor.
Lcd de gösteriyorsan örneğin:
printf(LCD_putc"değer=%d", sayi);
yazarsan değer 128 üstünde LCD de değerin otomatikmen "-" değer alır o yüzden:
printf(LCD_putc"değer=%ud", sayi);
olarak yazacaksın
 
as hocam yukarıdaki değerleri örnek olarak yazdım ben aslında açık olarak rtc li zamanlayıcı yapıyorum, mesela rtc ile saat değeri işliyor ve gerçekte 5 tane değişkenim var zamansaat, zamandakika, zamansaat2, zamandakika2, ve secilenrole diye değişkenlerim var zamansaat ve zaman dakika rölenin açma zamanını belirtiyor, diyorumki eğer (zamansaat eşitse saate ce zamandakika eşitse dakikaya ve secilenrole eşitse (4 tane rolem var hangisini seciyosam ) ) diye ve istediğim roleti kontrol ediyom, zamansaat2, zamandakika2, kapanma zamanını belirtiyor, şimdi bu değerler saat cinsinden en fazla 23 e dakika olarakta 59 a ayarlanabiliyor yani dediğiniz gibi 128 in üstüne çıkmıyor, bu değerleri eeproma yazdırıp okuttuğumda değerlerde değişme oluyor bazen eksili değerler oluyor bazen ise büyük değerlere çıkıyor .
 
S.A.
Sn. Arkadaşım ya işlemcide yada programında hata olabilir. İncelemek lazım.
 
sorunu hallettim ustam çok teşekkürler :)
 
Neymiş problem. :)
 
eeprom_write(x,0); mesela bunu while döngüsünün en sonuna yazıyordum oradan kaldırıp röleyi açıp kapatan if döngülerinin içine yazdım şu an stabil çalışıyor :) sanırsam while sonsuz döngüsü olduğu için eeproma veriler devamlı yazıldığı için sapıtıyordu :)
 
Sapıtmamış olsaydı dahi eeprom a yazma sayısı yaklaşık belirlidir - sınırlıdır !
Bu yüzden sonsuz döngü içinde yazma makul değil.
 

Forum istatistikleri

Konular
129,810
Mesajlar
930,322
Kullanıcılar
452,618
Son üye
mberber

Yeni konular

Geri
Üst