avatar_ete

PIC Basic Ders-13 (Multiplex Çalışma)

Başlatan ete, 28 Ağustos 2011, 16:25:50

ete

İsis dosyanı açamadım. Bu nedenle kendim bir tane yaptım. İlişiktedir. Çalışmasında bir sorun gözükmüyor.
Programda Delay kısmında biraz değişiklik yaptım süreyi kısalttım çünki butona basılınca uzun bekliyor idi.
Ete

Evren Kılıç

teşekkürler,
Benim elimdeki display de saçma sapan karakterler göründü tpıc595 çıkışları segmentlere  karışık bağlanmış, bu nedenle lookup tablosunu değiştirmem gerekti. Aşağıdaki şekilde normal çalıştı. Şimdi besleme kesintilerinde sayacın sıfırlanmaması için dahili hafızaya kayıt işi kaldı müsait olduğum bir zaman onuda eklemeye çalışacağım.
AL:    LOOKUP X,[231,129,214,211,177,115,119,193,255,243,99,57],SAYI :RETURN

Evren Kılıç

merhaba,
son hali ile çalışıyor hafızaya da alıyor yalnız sayı 255 olduktan sonra sıfırlanıyor. sayı değişkeni WORD olarak saklandığı halde bunu yapmasının sebebi nedir?

'32 BİT MAKİNALAR BU SİGORTA AYARLARINI KULLANSIN
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

''64 BİT MAKİNALAR BU SİGORTA AYARINI KULLANSIN VE MPASM İLE DERLEME YAPSIN
'#config
' __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'#endconfig
'-----------------------------------------------------------------
DEFINE OSC 4
'-------------------------------------------------------------------------

PORTA=0:TRISA=%11110000     
PORTB=0:TRISB=%10000000   
CMCON=7
OPTION_REG=OPTION_REG=%00000010
'OPTION_REG=%00000100  'Pull up dirençleri AÇIK (PORTB.7 için) - Bölme oranı 1/32.
'bölücü ayarlaması  000=1/2, 001=1/4  , 010=1/8  , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256
INTCON=%00100000         'Kesmeler aktif ve TMR0 kesmesi aktif

'-----------------------------------------------------------------


ZAMAN   VAR BYTE
SIRA    var BYTE
SAYI    VAR BYTE  'çevirme değişkeni
X       VAR BYTE  'ara değişken
BIRLER  VAR BYTE
ONLAR   VAR BYTE
YUZLER  VAR BYTE

I       VAR word  'döngü değişkenimiz
SAYAC   VAR WORD
POZ     VAR byte 75
Z       var byte
Y       VAR BIT

SYMBOL SH_CP=PORTA.0      ' SH_CP PİNİ
SYMBOL DS=PORTA.1      ' DATA PİNİ
SYMBOL ST_CP=PORTA.2      ' ST_CP PİNİ ÇIKIŞA GÖNDER

SYMBOL RST  =PORTB.7
SYMBOL ARTIR=PORTA.4       'Buton
SYMBOL AZALT=PORTA.5

PAUSE 100
INTCON.7=1  'tüm kesmeler açık
TMR0=169
'ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'SAYAC=000

BASLA: 
      IF ARTIR=0 THEN
        SAYAC=SAYAC+1
        WRITE $01,SAYAC
        IF SAYAC=1000 THEN SAYAC=999
        GOSUB BAK
        WHILE ARTIR=0:WEND
        GOSUB DELAY
      ENDIF
       
      IF AZALT=0 THEN
        SAYAC=SAYAC-1
        WRITE $01,SAYAC
        IF SAYAC=65535 THEN SAYAC=0
        GOSUB BAK
        WHILE AZALT=0:WEND
        GOSUB DELAY
      ENDIF
     
      IF RST=0 THEN
        SAYAC=0
        WRITE $01,SAYAC
        GOSUB BAK
        WHILE RST=0:WEND
        GOSUB DELAY
      ENDIF
     
      GOSUB BAK             
     
      GOTO BASLA
     
       
'AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
'AL:    LOOKUP X,[231,129,214,211,177,115,119,193,255,243,99,57],SAYI :RETURN
  AL:   LOOKUP X,[231,36,214,118,53,115,243,38,255,119,99,57],SAYI :RETURN

DELAY: POZ=0
      for I=0 to 1000
'         PAUSEUS 5
      Next
      RETURN
     
   
BAK:
      READ 01,SAYAC
      X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
      X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
      X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI
'       SHIFTOUT DS,SH_CP,1,[BIRLER,ONLAR,YUZLER]
         SHIFTOUT DS,SH_CP,1,[YUZLER,ONLAR,BIRLER]           
'       SHIFTOUT DS,SH_CP,1,[BIRLER]
        PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER
     
      return   
                 

'DISABLE
'KESME:

'      SHIFTOUT DS,SH_CP,1,[BIRLER,ONLAR,YUZLER]
'       SHIFTOUT DS,SH_CP,1,[BIRLER]
'        PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER                 
'       TMR0=99
'       INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
'       RESUME
'       ENABLE     

         
END

ete

Eprom kayıt ve okuması byte üzerinden yapılır. SAYAC değişkenin WORD olsa bile WRITE $01,SAYAC komutu saayc değişkeninin LOW byte kısmını eproma yazar. HIGH kısmını yazmaz.
Doğru komut, WRITE $01,SAYAC.Byte1,SAYAC.Byte0  şeklinde olmalı.
Bu gibi bir kaç yerde aynı kayıt yapılıyor ise işaret biti kullanmak akıllıca olur.
WRITE $01,SAYAC komutu yerine YAZ=1  (YAZ BIT değişkeni)  şeklinde işaret biti kullansan ve GOTO BASLA komut satırından önce;
IF YAZ=1 THEN
  WRITE $01,SAYAC.BYTE1,SAYAC.BYTE0:PAUSE 10 (veya 10 ms lik gecikme gereklidir)
  YAZ=0
ENDIF
şeklinde komut ilave etsen daha iyi olur.

Bu kayıt edilmişleri okumak için ise, READ $01,SAYAC.BYTE1,SAYAC.BYTE0 (okumada gecikme gerekmiyor)
komut satırını kullanman yeterli olacaktır.
Ete

Evren Kılıç

#49
Erol abi,
Dediğiniz gibi değişiklikleri yaptım, benim sayaç değerinin 999 a kadar olması özel bir durum gerektirir mi WRITE $01,SAYAC.BYTE1,SAYAC.BYTE0 ile üç basamaklı sayı eproma kaydedilip, READ $01,SAYAC.BYTE1,SAYAC.BYTE0 komutu ile tekrar SAYAÇ değişkenine aktarılıp okunur mu? bu kondları deneme yine bir kaç günümü alacak. Bayram tatili nedeniyle işyeri, ev, ve köy arasında gidip geliyorum bu yüzden denemlerim zaman alıyor.
'32 BİT MAKİNALAR BU SİGORTA AYARLARINI KULLANSIN
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

''64 BİT MAKİNALAR BU SİGORTA AYARINI KULLANSIN VE MPASM İLE DERLEME YAPSIN
'#config
' __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'#endconfig
'-----------------------------------------------------------------
DEFINE OSC 4
'-------------------------------------------------------------------------

PORTA=0:TRISA=%11110000     
PORTB=0:TRISB=%10000000   
CMCON=7
OPTION_REG=OPTION_REG=%00000010
'OPTION_REG=%00000100  'Pull up dirençleri AÇIK (PORTB.7 için) - Bölme oranı 1/32.
'bölücü ayarlaması  000=1/2, 001=1/4  , 010=1/8  , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256
INTCON=%00100000         'Kesmeler aktif ve TMR0 kesmesi aktif

'-----------------------------------------------------------------


ZAMAN   VAR BYTE
SIRA    var BYTE
SAYI    VAR BYTE  'çevirme değişkeni
X       VAR BYTE  'ara değişken
BIRLER  VAR BYTE
ONLAR   VAR BYTE
YUZLER  VAR BYTE

I       VAR word  'döngü değişkenimiz
SAYAC   VAR WORD
POZ     VAR byte 75
Z       var byte
Y       VAR BIT
YAZ     VAR BIT

SYMBOL SH_CP=PORTA.0      ' SH_CP PİNİ
SYMBOL DS=PORTA.1      ' DATA PİNİ
SYMBOL ST_CP=PORTA.2      ' ST_CP PİNİ ÇIKIŞA GÖNDER

SYMBOL RST  =PORTB.7
SYMBOL ARTIR=PORTA.4       'Buton
SYMBOL AZALT=PORTA.5

PAUSE 100
INTCON.7=1  'tüm kesmeler açık
TMR0=169
'ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'SAYAC=000

BASLA: 
      IF ARTIR=0 THEN
        SAYAC=SAYAC+1
        YAZ=1
        IF SAYAC=1000 THEN SAYAC=999
        GOSUB BAK
        WHILE ARTIR=0:WEND
        GOSUB DELAY
      ENDIF
       
      IF AZALT=0 THEN
        SAYAC=SAYAC-1
        YAZ=1
        IF SAYAC=65535 THEN SAYAC=0
        GOSUB BAK
        WHILE AZALT=0:WEND
        GOSUB DELAY
      ENDIF
     
      IF RST=0 THEN
        SAYAC=0
        YAZ=1
        GOSUB BAK
        WHILE RST=0:WEND
        GOSUB DELAY
      ENDIF
     
      GOSUB BAK

      IF YAZ=1 THEN
      WRITE $01,SAYAC.BYTE1,SAYAC.BYTE0:PAUSE 10
      YAZ=0
      ENDIF             
     
      GOTO BASLA
     
       

  AL:   LOOKUP X,[231,36,214,118,53,115,243,38,255,119,99,57],SAYI :RETURN

DELAY: POZ=0
      for I=0 to 1000
'         PAUSEUS 5
      Next
      RETURN
     
   
BAK:
      READ $01,SAYAC.BYTE1,SAYAC.BYTE0
      X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
      X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
      X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI

         SHIFTOUT DS,SH_CP,1,[YUZLER,ONLAR,BIRLER]           
         PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER
     
      return   
             
         
END

ete

sayac değerin 65535 e kadar olsa bile sonuç değişmiyor. Sonuçta Word değişkeni ve bu prensibe göre kayıt edilmesi zorunlu.
Temel kriter şu, sayı 0-255 arasında ise Byte dır tek byte değişkeni olarak kayıt edilebilir.
Sayı 255 den büyük değer alıyor ise Word değişkeni kullanılmalı ve böylece sayı değeri maksimum 65535 e kadar muhtemel değer alabilir demektir. Bu durumda sayı 2 byte halinde kayıt edilip okunmalıdır.
Ete

Evren Kılıç

#51
tamamdır, en iyi ihtimal ile yarın gece bu kodları derleyip denerim. Teşekkürler.

Evren Kılıç

#52
merhaba,
iki mesaj önce vermiş olduğum kodları derlemeye çalıştım ama yazma ve okuma kısmındaki kodlar hata verdi.
yazma komutu: WRITE $01,SAYAC.BYTE1,SAYAC.BYTE0:PAUSE 10
okuma komutu: READ $01,SAYAC.BYTE1,SAYAC.BYTE0


sayıyı 
yazma için WRITE $01,SAYAC.BYTE1:PAUSE 10
                          WRITE $02,SAYAC.BYTE0:PAUSE 10
okuma için :        READ $01,SAYAC.BYTE1
                         READ $02,SAYAC.BYTE0
şeklinde iki ayrı bellek de saklayıp okuyayım dedim o da olmadı.

ete

PBP kullanmıyorsun o zaman demektir. Bu iki yazılış şeklide PBP tarafından desteklenmektedir. İki byte birden yazılmış şekli versiyon 2.60 tarafından destekleniyor ama ayrı ayrı yazılmış şekli eskiden beri desteklenmektedir. Mutlaka başka bir hata vardır.
SAYAC değişkeninin Word cinsinden olduğundan eminsin değilmi. Byte iise de bu hatayı verir çünki.

Ete

elektro77

Alıntı yapılan: ete - 23 Ağustos 2018, 18:36:35
İsis dosyanı açamadım. Bu nedenle kendim bir tane yaptım. İlişiktedir. Çalışmasında bir sorun gözükmüyor.
Programda Delay kısmında biraz değişiklik yaptım süreyi kısalttım çünki butona basılınca uzun bekliyor idi.
Ete

eklediğiniz dosyayı incelemek için açmaya çalıştığımda proteus 8.7 veya üstünü istedi.
Nerden buluruz 8.7 yi yardımcı olurmusunuz.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Evren Kılıç

#55
Erol abi,
kodlar aşağıdaki gibi. derleyici olarak microcode studio kullanıyorum, sadece değiştirdiğim  yazma ve okuma kodlarında hata veriyor. sayaç değişkeni için "SAYAC   VAR WORD" şeklinde yer ayırmıştım, SAYI    VAR BYTE  'çevirme değişkeni şeklide bir satır var bu sayı degişkenini byte olması sorun yaratıyor olabilir mi acaba.
yada okuma yazma komutlarını aşağıdaki gibi yapmak sorunu çözermi acaba.

yazma için: WRITE 0,SAYAC.BYTE1,SAYAC.BYTE0:PAUSE 10
okuma için: READ 0,SAYAC.BYTE1,SAYAC.BYTE0
daha önce WRITE $01,SAYAC.BYTE1,SAYAC.BYTE0:PAUSE 10 şeklindeydi ve bilgi $01 adresine yazılıyordu.

Birde başka bir konuda register ayarlarından bahsedilmiş, acaba burada da bu bahsedilen ayarlardan kaynaklı problem olabilir mi  acaba.
ilgili konu sayfası: http://etepic.com/index.php/topic,2842.15.html

kodlar:

'32 BİT MAKİNALAR BU SİGORTA AYARLARINI KULLANSIN
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_OFF            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

''64 BİT MAKİNALAR BU SİGORTA AYARINI KULLANSIN VE MPASM İLE DERLEME YAPSIN
'#config
' __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'#endconfig
'-----------------------------------------------------------------
DEFINE OSC 4
'-------------------------------------------------------------------------

PORTA=0:TRISA=%11110000     
PORTB=0:TRISB=%10000000   
CMCON=7
OPTION_REG=OPTION_REG=%00000010
'OPTION_REG=%00000100  'Pull up dirençleri AÇIK (PORTB.7 için) - Bölme oranı 1/32.
'bölücü ayarlaması  000=1/2, 001=1/4  , 010=1/8  , 011=1/16 , 100=1/32 , 101=1/64 , 110=1/128, 111=1/256
INTCON=%00100000         'Kesmeler aktif ve TMR0 kesmesi aktif

'-----------------------------------------------------------------


ZAMAN   VAR BYTE
SIRA    var BYTE
SAYI    VAR BYTE  'çevirme değişkeni
X       VAR BYTE  'ara değişken
BIRLER  VAR BYTE
ONLAR   VAR BYTE
YUZLER  VAR BYTE

I       VAR word  'döngü değişkenimiz
SAYAC   VAR WORD
POZ     VAR byte 75
Z       var byte
Y       VAR BIT
YAZ     VAR BIT

SYMBOL SH_CP=PORTA.0      ' SH_CP PİNİ
SYMBOL DS=PORTA.1      ' DATA PİNİ
SYMBOL ST_CP=PORTA.2      ' ST_CP PİNİ ÇIKIŞA GÖNDER

SYMBOL RST  =PORTB.7
SYMBOL ARTIR=PORTA.4       'Buton
SYMBOL AZALT=PORTA.5

PAUSE 100
INTCON.7=1  'tüm kesmeler açık
TMR0=169
'ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'SAYAC=000

BASLA: 
      IF ARTIR=0 THEN
        SAYAC=SAYAC+1
        YAZ=1
        IF SAYAC=1000 THEN SAYAC=999
        GOSUB BAK
        WHILE ARTIR=0:WEND
        GOSUB DELAY
      ENDIF
       
      IF AZALT=0 THEN
        SAYAC=SAYAC-1
        YAZ=1
        IF SAYAC=65535 THEN SAYAC=0
        GOSUB BAK
        WHILE AZALT=0:WEND
        GOSUB DELAY
      ENDIF
     
      IF RST=0 THEN
        SAYAC=0
        YAZ=1
        GOSUB BAK
        WHILE RST=0:WEND
        GOSUB DELAY
      ENDIF
     
      GOSUB BAK

      IF YAZ=1 THEN
      WRITE $01,SAYAC.BYTE1,SAYAC.BYTE0:PAUSE 10
      YAZ=0
      ENDIF             
     
      GOTO BASLA
     
       

   AL:   LOOKUP X,[231,36,214,118,53,115,243,38,255,119,99,57],SAYI :RETURN
' AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN

DELAY: POZ=0
      for I=0 to 1000
'         PAUSEUS 5
      Next
      RETURN
     
   
BAK:
      READ $01,SAYAC.BYTE1,SAYAC.BYTE0
      X=SAYAC DIG 0 :GOSUB AL:BIRLER=SAYI
      X=SAYAC DIG 1 :GOSUB AL:ONLAR=SAYI
      X=SAYAC DIG 2 :GOSUB AL:YUZLER=SAYI

         SHIFTOUT DS,SH_CP,1,[YUZLER,ONLAR,BIRLER]           
         PULSOUT ST_CP,1  ' BİLGİYİ ÇIKIŞA GÖNDER
     
      return   
             
         
END

ete

Öncelikle programda bir hata yada sorun yok. Çünki verdiğin bu kodları ben deniyorum sorunsuz derliyor.
Sende ise hata çıkıyor. Bu durumda bilgisayarından kullandığın PBP sürümüğne kadar şüphelenmek gerek.
Muhtemelen kullandığın versiyonda yamaları kullanmamışsındır. Tavsiyem şöyle derleyiciyi tamamen kaldır.
Yeniden kur ama çalıştırmadan önce aşağıda verdiğim 3 adet yamayı uygula.

SAYI değişkeninin bu olayla alakası yok onu karıştırma işin içine.
Yazma ve Okuma komutlarında verilen adres formatı desimal 0 veya 1 şeklinde olabileceği gibi hex formatında $00 veya $01 şeklinde olabilir bunlardan hata mesajı çıkmaz.
Eprom Registerleri kullanılarak da eproma kayıt yapılır. Ama uzun ve zahmetli bir yolu neden tercih edesinki. Ortada Basic için yazılmış Eprom komutları varken register sistemini kullanmak bence gereksiz. Üstelik deneyip test ettiğim kodlarında bir hata yok iken. Yapılacak tek iş hataya sebep olan şeyi bulmak olur bunun içinde önderimi uygula derim.

Ete


ete

Dosya boyutu büyük olduğu için siteye yükleyemiyorum.
İnternetde araştır bulamaz isen bana özel mesaj at ve mail adresini ekle dosya olarak yollamaya çalışayım.
Ete

Evren Kılıç

#58
tamamdır, dediğiniz gibi derleyiciyi yeniden kurayım, tavsiye ettiğiniz bir sürüm varmı özellikle onu bulmaya çalışayım. Yama derken ilave yama dosyaları mı var proğramın. Birde  AL:   LOOKUP X,[231,36,214,118,53,115,243,38,255,119,99,57],SAYI :RETURN satırını aktif ederek derleyip hex dosyasını buraya yükleyebilir misiniz o şekilde deneyeyim akşam. Benim displayler bu tablo ile çalışıyor.

microcode studio programı için aşağıdaki linkde bulunan olur mu sanırım versiyonu 2,60

https://microcode-studio.apponic.com/

ete

Şu anda aktif PBP3.x sürümü mevcut onu kullansan en iyisini yapmış olursun.
Yoksa 2,60 2 serisinde en son sürüm idi yamalarda bu sürüme aittir.

Unutma MCS ücretsiz bir programdır. Son sürümü galiba V.5 idi PBP3.x sürümleri ile birlikte kullanılıyor alt sürümlerde kullanamazsın.
2.60 ve altı için aşağıdaki linkten yükleyeceğin MCS yi kullanman gerek.
http://www.mecanique.co.uk/software/mcsinstall.exe

MCS ara yüzdür derleyiciyi ayrıca göstermek gerekir.
Şu linki bir okusan fena olmayacak.
http://etepic.com/index.php/topic,300.0.html

Derlenmiş hex ilişiktedir.
Ete

Powered by EzPortal