Şimdiye kadar pic'de karşılaştığım en ilginç sorun ile karşı karşıyayım.
PicBasic Pro ile programladigim 877'nin eepromuna WRITE komutu ile veri yaziyorum. Doğrulama için veriyi okuduğumda yazdığım bazen yazdığım değerden farklı bir değer görebiliyorum. Nedenini anlamak için gönderdiğim ve gelen verileri binary'ye çevirdim ve 5. bitteki 0'ların 1 olduğunu gördüm. Yani 236 yazdığımda 252 okuyorum. 128 yazdığım 144 okuyorum. 1 yazdığımda 17 okuyorum.
Program ana döngüye gelmeden önce eepromun kullandığım bölümüne "0" değerini yazan küçük bir döngü çalıştırıyorum. Pic'i çıkarıp programlama kartıyla okuttuğumda 0 yazdığım adreslerdeki 0 değerini görüyorum. Yani bir setli kalma durumu yok.
Şuanda yazıya ara verip denediğimde 128 yazıp 128 okumaya başladım ilginç şekilde ama hala 236'yı 252 olarak okuyorum.
Konuyla ilgili yardım edebilirseniz çok sevinirim.
Bu arada programın ilgili bölümlerini de eklesem iyi olur:
.... Duty=500 .... KayitAdresi = 0 ..... gosub CleanEEPROM PreMain: Hserout ["Program Calisiyor "] LCDOUT cmd, row1, "Calisiyor..." Main: toggle led pause 50 IF portd.0 = 1 THEN GOSUB Button1 IF portd.1 = 1 THEN GOSUB Button2 IF portd.2 = 1 THEN GOSUB kaydet If portd.3 = 1 THEN GOSUB Git goto main ......
Kaydet: disable bekle:if portd.2 = 1 then goto bekle
CleanEEPROM: for adres = 1 to adres= 30 lcdout cmd,right, "." write adres, 0 pause 50 next adres return
etkin duty değeri(d) ve eeprom'dan okunan değer(v) yan yana lcd'de görüntüleniyor. Eepromu bilgisayara okutup gördüğüm değer de READ ile okuduğum değer ile aynı.
compiler write komutunu icra ederken neler yapıyor user manualinde bir yerlerde yazıyor olmalı. eğer bu rutin 877 nin datasında verilen rutunden farklı ise bu soruna neden olabilir. datasında eeproma yazmak için gereken rutini aşağıya kopyalıyorum
The steps to write to EEPROM data memory are: 1. If step 10 is not implemented, check the WR bit to see if a write is in progress. 2. Write the address to EEADR. Make sure that the address is not larger than the memory size of the PIC16F87X device. 3. Write the 8-bit data value to be programmed in the EEDATA register. 4. Clear the EEPGD bit to point to EEPROM data memory. 5. Set the WREN bit to enable program operations. 6. Disable interrupts (if enabled). 7. Execute the special five instruction sequence: • Write 55h to EECON2 in two steps (first to W, then to EECON2) • Write AAh to EECON2 in two steps (first to W, then to EECON2) • Set the WR bit 8. Enable interrupts (if using interrupts). 9. Clear the WREN bit to disable program operations. 10. At the completion of the write cycle, the WR bit is cleared and the EEIF interrupt flag bit is set. (EEIF must be cleared by firmware.) If step 1 is not implemented, then firmware should check for EEIF to be set, or WR to clear, to indicate the end of the program cycle.
isterseniz bir de write fonksiyonunu çağırmadan yukarıda yer alan adımları deneyin. sonuç farklı olmuyorsa üzerinde düşünelim...
Bir de dikkatimi çeken bişey var. Pic'i bilgisayardan okuttuğumda EEPROM'un kullanılmayan tüm değerlerinde EF yazılı olduğunu gördüm. Bu da 11101111 ediyor. 5.bit diğerlerinden farklı ve"0". Nedenini merak ettim oldukça doğrusu. Emin olmamakla birlikte FF yazması gerektiğini hatırlıyorum.
FF olarak görünmesi gerekiyor. write komutu tüm eeprom a bişeyler yazmış olmasın...
Daha önce de bu write fonksiyonunu aynı mikroişlemci üzerinde aynı dille (PBP) kullanmıştım ama hiç sorun çıkmamıştı. Anlayamıyorum şuandaki problemi. Bir de şuan Bootloader kullanıyorum. Aceba bi etkisi olur mu. TinyBlootloader ile programlıyorum.
bootloader programını değiştirdim. tamamen farkı bir program kurdum ve hata hala devam ediyor.
Bu 16f877 ler ya sorunlu bir pic yada körün taşı bir bana geliyor. Bir tanesi programlarken bozulmuştu. Hafızasına hala okuma-yazma yapabiliyorum ama program çalışmıyor. 5v veriyorum 3,3e düşürecek kadar çok akım çekiyor. Bir diğeri yine programlama sırasında bozuldu. Bununda hafızası silinmiyor. Okuyorsun, içindeki verilerin üzerine yazıyorsun ama silemiyorsun. Sildiğinizde normalde her wordun 3FFF olması gerekirken eski değerini koruyor. O wordün üstüne yazarsanız değeri değişiyor yoksa yok. Hiçbir worde 3FFF yazdıramıyorumda hafızasını sildiremiyorumda.
Mesela ben de bir örnek vereyim, bazı nadir durumlarda program çalışıyor ama hafızasına hiçbir şekilde erişilemiyor. Kopmuş gitmiş bişeyler. Yani ezcümle eepromda ya da eeprom kontrol devrelerinde arıza olmayacak diye birşey yok. Bu ihtimal çok az değil.
yeni mesaja git
Yeni mesajları sizin için sürekli kontrol ediyoruz, bir mesaj yazılırsa otomatik yükleyeceğiz.Bir Daha Gösterme