Şimdi Ara

Pic'le ilgili karşılaştığım en ilginç sorun:16F877 ile EEPROM'a yazarken 5. bitte problem oluşuyor

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
9
Cevap
0
Favori
1.116
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Selam Arkadaşlar,

    Ş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

    WRITE KayitAdresi, duty.byte0
    pause 1000
    read KayitAdresi, validation.byte0
    lcdout cmd, cls, "d:",#duty.byte0," v:",#validation.byte0
    lcdout cmd, row2, "Adres: ",#kayitadresi
    pause 1500

    KayitAdresi = KayitAdresi + 1

    WRITE KayitAdresi, 128 'duty.byte1
    pause 1000
    read KayitAdresi, validation.byte1
    lcdout cmd, cls, "d:",#duty.byte1," v:",#validation.byte1
    lcdout cmd, row2, "Adres: ",#kayitadresi
    pause 1500

    KayitAdresi = KayitAdresi + 1

    enable
    RETURN

    .........

    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.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • 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.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.