AVR DAHILI EEPROM PROBLEMI

Başlatan alper06, 14 Ağustos 2012, 00:53:45

alper06

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...

arm-beginner

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!

alper06

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

mehmet

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...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr