pic16F877A EEPROM Sorunu

Başlatan degirmen, 15 Mayıs 2019, 12:06:29

degirmen

Değerli arkadaşlar
aşağıdaki kod PBP ile derlendiğinde led ve butonlar gerektiği gibi çalışıyor ama yazma ve okuma çalışmıyor.Derleme sırasında hiç bir hata vermiyor. Aynı kod microbasic pro ile yazılınca kusursuz çalışıyor. Hata yaptığım nokta neresidir.yardımlarınız için şimdiden teşekkürler.






'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Murat Degirmenci                                  *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 13.05.2019                                        *
'*  Version : 1.0                                               *
'*  Notes   : deneme2                                                  *
'*          :                                                   *
'****************************************************************
      define OSC 4


     
    ADCON1=%00000110
    TRISA = %11101111
    TRISB = %11110000
    TRISC = %11111110
    TRISD = %00011111
    TRISE.0=0
    TRISE.1=1
    TRISE.2=1
    'EECON1=%00000101
SIL var portd.0
OKU var portd.1
yaz2 var portd.2
yaz4 var portd.3   
silled var portb.0
okuled var portb.1
yaz2led var portb.2
yaz4led var portb.3
bil var byte

adr var byte
adr=0

low silled
low okuled
low yaz2led
low yaz4led
pause 500
high silled
pause 500
high okuled
pause 500
high yaz2led
pause 500
high yaz4led
pause 500
low silled
pause 500
low okuled
pause 500
low yaz2led
pause 500
low yaz4led
pause 500

   
main
       
        if (sil=1) then
        write adr,0
        pause 100
        high silled
        pause 1000
        low silled
        endif
       
        if (yaz2=1) then
        write adr,1
        pause 100
        endif
       
        if (yaz4=1) then
        write adr,2
        pause 100
        endif
       
        if (oku=1) then
        high okuled
        pause 1000
        gosub eoku
        endif
             
        goto main
       
eoku:   
        read adr,bil
        pause 100   
        if bil=1 then
        high yaz2
        low yaz4
        endif
       
        if bil=2 then
        pause 100
        high yaz4
        low yaz2
        endif
       
        if bil=0 then
       
        high yaz2
        high yaz4
        pause 1000
        low yaz2
        low yaz4   
        endif
        low okuled
        return
       
        end
       

ete

Aslında devre şemasını görmeden bu konu hakkında yorum yapmamak gerekir. Zira program da ufak tefek kusurlar olmasına rağmen epromun kullanımını direk etkilemeyecek kusurlar ve eproma kayıt yapılıp okunabilmesi gerekir.
Devre emasında donanımhataları var ise mesela pullup dirençleri eksik ise yada kullanılmamış ise bu program doğru şekilde çalışamaz.
Ben yinede eksikleri yazayım;
1. Bu programda işlemci 16F877A olduğuna göre bir defa Komparatörlerin devre dışı bırakılması gerekir. Bunun için programın başına CMCON=7 komut satırının eklenmesi gerekir. PORTA yı ilgilendiren bu konu eprom konusunu etkilemez.

2. Programda Analog kanal kullanılmıyor bu nedenle ADCON1=7 kullanılmalı. Böylece analog özellik devre dışı bırakılmış olur. Programda ADCON1=%00000110 kullanılmış bu hatalı.

3. Hiç bir sigorta ayarı görülmüyor. Bu işlemcinin çalışmasını etkileyen bir eksikliktir. PBP buna önem verir . Genelde bu eksikliği programlayıcı arayüz giderir. Ama simulasyon için en azından bir sigorta ayarı eklenmelidir programa. EKlenmesi gereken satır şöyle olabilir;
@ __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC

4. Bir programa başlarken değişken tanımlamalarından sonra registerlerin ve diğer program sisteminin yerli yerine oturabilmesi için en azından 200 ms lik bir gecikme verilip sonra programın kullanımına geçilmelidir. Bu süre içind eprogram değişkenleri adreslerine yerleştirir varsa LCD yi ayarlar ve diğer registerleri ayarlar. Bunları yapmazsanız işlemci abuk subuk çalışmaya zorlanmış olur. Bu gecikmeyi mutlaka veriniz. Bu programda da değişken tanımlamasından sonra direk çalışmaya geçilmiş. PAUSE 200 ilave edilmeli.

5. Programda anlamsız şekilde bol keseden PAUSE kullanılmış. Gerekmediği zaman Pause kullanmaktan kaçının. Program akışını sekteye uğratır. Özellikle gereken zamanlar eproma bir bilgi yazıldığı zaman en az 10 ms gecikme koyulmalı. Ekrana bir bilgi yazıldığı zaman görülebilmesi için en azından 50 ms lik bir gecikme olmalı. Bir tuş kontrolünde tuş titremesinden (tuşun basılma yada bırakılma anında kontakların yüzlerce defa açılıpkapanması olayı) kaçınmak için özellikle bırakma kontrolünde en az 70-80 ms lik bir gecikme eklenmesi gerekir. Örnekleri dahada artırabiliriz. Tabiiki led kontrolünde ışığın görülebilir olması için en azından 100 ms lik gecikme olması gerekir.

6. İŞlemcilerde genellikle PORTB dışarıdan giriş işlemleri veya buton-anahtar gibi elemanların bağlanması için ayrılmış bir Port dur. Dahili Pullup dirençleri vardır ve bir register (bu işlemcide OPTION_REG.7=0) ile aktif edilir. BU portu çıkış olarak kullanmak ve diğerlerini girişte kullanmak çok yanlış bir uygulama. Girişlerinizi PortB den yaparsanız hem PCB de size fayda sağlar hemde bu iş için ayrılmış bir portu kullanarak işinizi kolaylaştırabilirsiniz.

7. İŞlemciler beklenenden daha hızlı çalışır. Sİz bir tuşa basıp bırakıncaya kadar program o kısmı bir kaç defa kontrol edip geçebilir. Buda uygulamada bazı sorunlar yaratır.
Genelde bir tuşa basıldıktan sonra bırakılıncaya kadar programı kontrol eder ve ancak bırkılmış ise devam etmesini sağlarız.
        if (yaz2=1) then
        write adr,1
        pause 100
        endif
tuş kontrolü şöyle yazılırsa daha emniyetli olur.
        IF (YAZ2=1) THEN
          write adr,1
          WHILE YAZ2=1:WEND     
          pause 100
        ENDIF

8- Gecikmeleri kullanırken yerlerinide iyi kullanmak gerekir. Örnek olarak;
        if (oku=1) then
        high okuled
        pause 1000
        gosub eoku
        endif
Satırlarını şöyle yazabilirdik.
        if (oku=1) then
          high okuled
          gosub eoku
          pause 1000  ' bir led için 1000 ms (1 sn) yanma süresi çok fazla neden gerek duyuluyor acaba pek anlamadım.       
        endif
 
Şimdilik görebildiklerim bunlar. Bu eprom kusuru gerçek devredemi yoksa simulasyondamı ortaya çıkıyor onuda belirtirseniz belki bir iki ilave yapılabilir.

Ete

degirmen

ETE bey cevabınız için teşekkür ederim.
gördügünüz eksiklikler isabetlidir.Bu codu kısaca yazdım, yalnızca PBP nin 877A dahili epromuna yazma okuma işlemi yaptırmaya çalışıyorun devre demo bord üstünde giriş ve çıkışlar belirttiğiniz üzere düzenlenebilir.PBP nin diger fonksiyonları aynı derleyicide bu mcu üzerinde çalışıyorbir tek bu fonksiyon çalışmıyor.Belirttiğim gibi aynı entegre üzerinde microbasic pro for pic ile yazılmış benzer kısa bir kod tam olarak çalışıyor. yani entegrenin eeprom kısmı gayet sağlam.PBP de derleyip attığım kod ile işlemci kodda belirtilen silme ve oku butonunda belirtilen led çıkış işlemlerini yapıyor.(yani program koşuyor) kodda ledleri programın nerede olduğunu anlamak için yerleştirdim.bu fonkiyonu basitce gerçekleştirebilirsem başka bir kod içerisinde kullanacağım.
derlediğim MCS 4.00 versiyonu PBP ise 2.60 ve 64bit sistemde kurulu.Bu fonksiyonu etkilermi?
Acil yardımınıza ihtiyacım var şimdiden teşekkür ederim.

degirmen

ETE bey kodda aşagıdaki değişiklikleri yaptım.
kodu
-32 bit makinadada derleyip attım yine yazma/okuma olmadı
-877 mcu ya yazıp denedim yazma okuma olmadı
sigorta ayarlarını programcıda yapıyorum dosyadan almıyorum


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : Murat Degirmenci                                  *
'*  Notice  : Copyright (c) 2019 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 13.05.2019                                        *
'*  Version : 1.0                                               *
'*  Notes   : deneme2                                           *
'*          :                                                   *
'****************************************************************
'@ __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC    
      define OSC 4

 
     
    ADCON1=7
    TRISA = %11101111
    TRISB = %11110000
    TRISC = %11111110
    TRISD = %00011111
    TRISE.0=0
    TRISE.1=1
    TRISE.2=1
    'EECON1=%00000101
SIL var portd.0
OKU var portd.1
yaz2 var portd.2
yaz4 var portd.3   
silled var portb.0
okuled var portb.1
yaz2led var portb.2
yaz4led var portb.3
bil var byte

adr var byte
adr=0
  
 
low silled
low okuled
low yaz2led
low yaz4led
pause 500
high silled
pause 500
high okuled
pause 500
high yaz2led
pause 500
high yaz4led
pause 500
low silled
pause 500
low okuled
pause 500
low yaz2led
pause 500
low yaz4led
pause 500 

    
main
        
 
        if (sil=1) then
        write $10,0
        WHILE sil=1:WEND    
        pause 100
        high silled
        pause 1000
        low silled
        endif
        
        
        IF (YAZ2=1) THEN
        write $10,1
        WHILE YAZ2=1:WEND      
        pause 100
        ENDIF
        
        if (yaz4=1) then
        write $10,2
        WHILE YAZ4=2:WEND    
        pause 100
        endif 
        
        if (oku=1) then
        high okuled
        pause 500
        gosub eoku
        endif
             
        goto main 
       
eoku:   
        read $10,bil 
        pause 100    
        if bil=1 then
        high yaz2
        low yaz4
        endif
        
        if bil=2 then
        pause 100
        high yaz4
        low yaz2
        endif
        
        if bil=0 then
        high yaz2
        high yaz4
        pause 500
        low yaz2
        low yaz4    
        endif
        low okuled
        return

        
        
        end

ete

Programı derledim ve bir simulasyon devresi hazırlayıp denedim. Okuma ve yazma yapıyor.
Ya senin işlemcinin epromu bitik yada bozuk yada derlemede sorun yaşıyorsun.
İlişikte programın bas ve hex dosyalarını veriyorum. Ayrıca simulasyon devresinide veriyorum.
Eprom kontrolü için , devreyi çalıştır tuşlardan birine bas ve biraz bekle. Bekle diyorum çünki bir sürü Pause ler kullanmışsın beklemezsen tuşu görmüyor program. Beklersen görüp kayıt işini yapıyor.
Bekle derken öyle uzun değil 1 sn kadar bekleyeceksin.
Daha sonra pasue tuşuna basıp yukarıda Debug butonuna basacaksın. Ardından en altta PIC_CPU seçip açılan pencerede EEPROM u seçerek ekrana getireceksin . Bu ekranda epromun $10 adresine yeni bilgi yazıldığını kolaylıkla görebilirsin.

Ete

degirmen

ETE bey elinize emeğinize sağlık ancak göndermiş olduğunuz hex dosyasına hiç dokunmadan pic ler (4-5 taneye) Hem 877 ye hemde 877A ya attım malesef çalışmıyor.kullandığım derleyici ve programcı ile 4 senedir 1000 adet pic programladım bir çok komplex program attım hiç sorunsuz ancak bu kadar basit bir işlevde çuvalladık.PBP nin yurt dışındaki forumlardada buna çözüm yok yada ben göremedim. aşagıda ki kod microbasic pro for pic ile yazıldı ve hiçbir sorun olmadan çalışıyor.Kodun aynı olduğunun dikkatinizden kaçmıyacağını biliyorum sadece microe nin yazılış farkı var birde microbasicpro for pic derleyicinde EEPROM kütüphanesi seçilerek yazıldı.
Bu entegreyi kullanmak zorundayım çünkü 250 adet çihazda kullandım ve bu cihazların bir işlevinin sonucunu eproma kaydetmek ve sonra okumak istiyorum.

Tekrar emeğinize sağlık eğer bir çözüm bulursanız çok sevinirim.
Teşekkürler
 
program eeprom
symbol silled=portb.0
symbol okuled=portb.1
symbol say2led=portb.2
symbol say4led=portb.3
symbol sil=portd.0
symbol oku=portd.1
symbol say2but=portd.2
symbol say4but=portd.3

dim RESTB as byte
dim bil as byte

' Declarations section 

main:


     TRISA=0
     TRISB=0
     TRISC=1
     TRISD.0=1
     TRISD.1=1
     TRISD.2=1
     TRISD.3=1
     
     if (RESTB=0) then
     goto rst
     end if
     
     if (sil=1) then
     EEPROM_Write(0x00,0x00)
     Delay_ms(100)
     silled=1
     Delay_ms(500)
     silled=0
     end if
     if (say2but=1) then
     EEPROM_Write(0x00,0x10)
     Delay_ms(100)
     end if
     if (say4but=1) then
     EEPROM_Write(0x00,0x20)
     Delay_ms(100)
     end if
     
     if (oku=1) then
     okuled=1
     Delay_ms(500)
     gosub eku
     end if
     
     goto main
     
eku:
      bil=EEPROM_Read(0x00)
      
      Delay_ms(100)
      
      if bil=0x10 then
      say2led=1
      say4led=0
      end if
      
      if bil=0x20 then
      say2led=0
      say4led=1
      end if
      
      if bil=0x00 then
      say2led=1
      say4led=1
      Delay_ms(1000)
      say2led=0
      say4led=0
      Delay_ms(1000)
      say2led=1
      say4led=1
      Delay_ms(1000)
      say2led=0
      say4led=0
      end if
      okuled=0
      return
      
RST:
     silled=1
     okuled=1
     say2led=1
     say4led=1
     Delay_ms(1000)

     silled=0
     okuled=0
     say2led=0
     say4led=0
     RESTB=1
     return
      
end.

ete

#6
Binlerce eprom içeren program yazdım çalışmayanı görmedim şimdiye kadar. Bu yolladığımında çalışması gerekir. Çalışmaması için bir sebep göremiyorum. Sende, yada devrende var bir sorun.
Simulasyonda çalışıyor gerçeğinde de çalışması gerekir. Yapacak bir şey yok ancak gerçeğini benimde denemem gerekir ki onuda şu anda yapacak durumum yok seyehatteyim ancak haftaya salı yada çarşamba yapabilirim, yapacağımda.

Programın başında ledleri sırası ile yaktıran bir bölüm var. Peki ledlerin yanıyormu? İşlemci bu işi yapıyormu?
Lüzumsuz pauseleri silip biraz daha düzenli hale getirdim. Getirdim derkenbu programı ben yazsa idim bu şekilde yazardım. İlişiktedir bunu dene bakalım. İşlemciye atarken sigorta ayarlarına müdahale etme otomatik programdakileri kullanmış olsun. Değiştirme ayarları demek istiyorum.

Ete

degirmen

ETE bey cevabınız için teşekkür ederim.
ilk msajımdada belirttiğim üzere ben hem ğirişteki hemde main içerisindeki ledleri kodun koşup koşmadığını ve kodun neresinde olduğunu ve işlemi yapıp yapmadığını anlamak için yerleştirdim. ve benim yazdıklarımda ve sizin müdehale ettiğiniz kod da ledler ve butonlar koda göre düzğün çalışıyorlar. yalnızca yazma ve okuma gerçekleşmiyor.
sigorta ayarlarına gelince belki sorun buradadır.Ben kod içindeki sigorta ayarlarını, derlemede hata verdiği için kapatıyorum.MCS ayarlarında compiler PBP ve assembler MPASM SUİT ve use MPASM işaretli. kod içerisinde sigorta ayarlarını nasıl kabul ettirebilirim bilmiyorum.Daha önce denedim fakat MCS iyice çuvallamıştı ve ben yukarda belirttiğim ayarlar ile devam ediyordum şimdiye kadar.gönderdiğiniz dosyayı deneyip size döneceğim.
Teşekkürler.
 

degirmen

ETE bey.
sigorta ayarlarını şu şekilde yaparsam kabul ediyor.
@  __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC 

sizin gösterdiğiniz şekilde
#CONFIG
  __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC   
#ENDCONFIG

yaparsam
derlemede

ERROR Line 21: Syntax error. (SIL_EPROM_8772.pbp)
ERROR Line 22: Syntax error. (SIL_EPROM_8772.pbp)
ERROR Line 23: Syntax error. (SIL_EPROM_8772.pbp)

hatasını veriyor.

saygılarımla.


degirmen

ETE bet gönderdiğiniz Hex dosyayı olduğu gibi pic attım.
önceki gibi ledler gerektiği gibi çalışıyor baslangıçta be sil, oku butonlarına basılınca fakat oku dan sonra olası gereken malesef olmuyor.
eprom adresi basına konulan işaretten kaynaklı bir sorun olabilirmi yani yanlış bir formatlama yapıyor olabilirmiyim. Çünki bu işaret dataları  $ olursa  eproma farklı bir şekilde @ olduğunda farklı bir şekilde adres işaretsiz olunca daha farklı bir şekilde yerleştiriyor.
DATA x,y komutunu kullanarak denedim.
yeri gelmişken kodu DATA komutuylada denedim yani
DATA 10,2 yazdım ve açılış sonrası sil butonuna basmadan oku butonuyla okuttum
eoku rutinde olması gereken haz4 ledinin yanması yaz2 nin sönmesi hiç bir zaman gerçekleşmedi.
çipi ve epromunu kontrol etmek içim microbasic ile yazdım ve attım hiç problem yok istendiği gibi çalışıyor.Böylelikle hem programcının hemde çiplerin sağlamlığını kontrol ettim.
teşekkürler.   

ete

#10
"oku butonlarına basılınca fakat oku dan sonra olası gereken malesef olmuyor."
olmayan nedir tam olarak açıklarmısın. Ne bekliyorsunda olmuyor bilmek istiyorum.
Bu son yolladığım programın kesin olarak çalışması gerekir. Ama senin ne beklediğini anlamadım.
Programda ve read, write formatlarında hata yok. O şekilde de kullanılıyor. Fark sayı formatında zaten ister desimal adres ister hex adres kullanırsın sen hex seçmişsin. Binlerce defa kullandığım şeye olmauyor diyorsun bende inat ettim olduracağım ama ne olup ne bittiğini anlamam gerekir.
Ne yapıyorsunda olmuyor adım adım anlat bana.

Mesajına dikkatli bakınca olayın farklı bir yönü olduğunu görüyorum. Eproma yazmada muhtemelen sorun yok ama senin sorunun ;
" haz4 ledinin yanması yaz2 nin sönmesi hiç bir zaman gerçekleşmedi."
bu galiba. Programda o işe odaklanmadım ben. Eproma yazılmasını ve okunmasını sağlamaya çalıştım. Hatta özellikle bu işi iptal etmiş de olabilirim.
Yeniden bakacağım.
Ete

ete

Sorunun ne olduğunu anladım.
Led tanımlamalarında Yaz4Led demişsin ama eoku alt programında Yaz4 deyip sonuna Led yazısını eklememişsin.
Bu nedenle hata vermeden denileni yapmıyor program. Yaz4Led ve diğerinide Yaz2Led şeklinde değiştirirsen düzelecektir.

Programınıda olması gereken hale getirdim. İlişikte hem seninki (sil_eprom_1.pbp) hemde benimki (Sil_eprom_877.pbp) ve hex dosyalarını bulabilirsin.

Ete

degirmen

ETE bey
yazma/okuma kısmına okadar odaklanınca sizin GÖRDÜĞÜNÜZ hataya sadece BAKMIŞIM.
işte bakmakla görmek arasındaki fark. Çok teşekkür ederim. Anlaşılacağı üzere
gönderdiğiniz son kodlar istediğim gibi çalıştı. Burdan aldığım dersle asıl programda değişiklikler yapabilim.
Elinize gözünüze sağlık.
Saygılarımla
Murat Değirmenci.

Powered by EzPortal