Merhaba arkadaşlar.
Endüstriyel bir projede Atmega32 serisi işlemciler kullandım.
Kartlar harici Eeprom kullanmak yerine AVR' nin dahili Eeprom belleğini kullandım.
Buralara cihazlar ile ilgili Konfigurasyon Değerlerini yükledim.
Cihazları sahaya gönderdikten sonra 2-3 hafta sonra sorunlar çıkmaya başladı.
Daha sonra kontrol ettiğimde cihazlardaki Eeprom değerlerinn çok alakasız değerler ile değiştiğini gördüm.
Yazma ve okuma yaparken Interruptları kapatmadım. Bundan dolayı olabilir mi?
Yazma ve okuma işini aşağıdaki gibi AVR-GCC komutlarıyla yaptım.
//
// eeprom_busy_wait();
// eeprom_write_byte(0,1); //Language
/////////////////////////////////////////////////////////////////////////
// eeprom_busy_wait();
// SpnDisplayValue[6] =eeprom_read_word(62);
Teşekkürler...
AVR-GCC eeprom fonksiyonlarını kullanmiyorum: çünkü GCC'nin yeni versiyonlarında code boyutunu aşırı şişiriyor. Bu nedenle kendi fonksiyonlarımı kullanıyorum ve GCC'nin bu fonksiyonlarını çok iyi bilmiyorum.
Dikkatimi çekenler:
- Çoook eskilerden kalan bir alışkanlık: 0x0000 adresi kullanmam. Eski AVR'lerde bu adrsi kullanmamak bir zorunlukdu.
- Neden 2 tane eeprom_busy_wait() kullanıyorsun? Başka yerlerde eeprom_write_byte() kullanmiyorsan, ilkini silebilirsin.
- eeprom_write_byte(0,1) compiler tarafından bir uyarı tetiklemiyormu? Bence doğrusu
eeprom_write_byte((char *)0, 1) olması lazım.
- Dataseet'deki "Preventing EEPROM corruption" bölümünü okumuşundur, ama bence bir daha oku. Ben her yeni projemde o tür uyarıları tekrar okurum.
Burda tek bilmediğimiz konu: Fuse'ları nasıl ayarladın? Mutlaka 'Brown out' devrede olsun. 2. önerim: En uzun bekleme süresini seç, ve program başında hemen EEPROM'a yazıyorsan, oraya ekstradan bir bekleme koy. Çünkü EEPROM'a yazarken, voltajın önemi var.
Ben eeprom'u çok sık kullanırım ve yıllardır çalışan cihazlarım var, ve hiç birinde eeprom ile ilgili bir sorun ile karşılaşmadım.
Moralini bozma. Mutlaka problemi çözeceksin!
Alıntı yapılan: arm-beginner - 14 Ağustos 2012, 09:31:34
AVR-GCC eeprom fonksiyonlarını kullanmiyorum: çünkü GCC'nin yeni versiyonlarında code boyutunu aşırı şişiriyor. Bu nedenle kendi fonksiyonlarımı kullanıyorum ve GCC'nin bu fonksiyonlarını çok iyi bilmiyorum.
Dikkatimi çekenler:
- Çoook eskilerden kalan bir alışkanlık: 0x0000 adresi kullanmam. Eski AVR'lerde bu adrsi kullanmamak bir zorunlukdu.
- Neden 2 tane eeprom_busy_wait() kullanıyorsun? Başka yerlerde eeprom_write_byte() kullanmiyorsan, ilkini silebilirsin.
- eeprom_write_byte(0,1) compiler tarafından bir uyarı tetiklemiyormu? Bence doğrusu
eeprom_write_byte((char *)0, 1) olması lazım.
- Dataseet'deki "Preventing EEPROM corruption" bölümünü okumuşundur, ama bence bir daha oku. Ben her yeni projemde o tür uyarıları tekrar okurum.
Burda tek bilmediğimiz konu: Fuse'ları nasıl ayarladın? Mutlaka 'Brown out' devrede olsun. 2. önerim: En uzun bekleme süresini seç, ve program başında hemen EEPROM'a yazıyorsan, oraya ekstradan bir bekleme koy. Çünkü EEPROM'a yazarken, voltajın önemi var.
Ben eeprom'u çok sık kullanırım ve yıllardır çalışan cihazlarım var, ve hiç birinde eeprom ile ilgili bir sorun ile karşılaşmadım.
Moralini bozma. Mutlaka problemi çözeceksin!
eeprom_write_byte((char *)0, 1) olarak düzeltmeleri yaptım.
Bundan dolayı verdiği uyarılar kayboldu.
Umarım sorun hallolmuştur..
Teşekkürler
Eğer AVR'yi besleyen kısımda parazit varsa veya
sistem kapatıldıgında -ki güçlü besleme kaynağı
kullanıldıgında daha fazla olmakta- voltaj yavaşça
azaldığı için AVR Eepromnunda sorunla oluşabiliyor.
Bunu önlemenin bir yolu BOR sistemini kullanmak.
5v besleme yapılıyorsa 4v civarına BOR ayarını
yapmak yeterli.
Saygılar...