keypadla zamanlayıcı

Başlatan hakıkat, 10 Ocak 2013, 18:38:50

hakıkat

  Merhabalar,

Bir süredir 16f628 ile keypat üzerine çalışıyorum keypad yardımıyla uzaktan zaman ayarlayıp göndermek ve
zaman tamamlandıktan sonra alıcıda röle çektirmek istiyorum.Programı bitirdim ama verici kısmını tam
çalıştıramadım.Sorun nerden kaynaklanıyor tam anlayamadım çünkü ısıs te de tam sonuç vermedi.Yardımcı olursanız
sevinirim.teşekkürler.
verici kısmı
@ DEVICE pic16F628A 'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilator kullanilacak
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 yuksek hiz
DEFINE HSER_SPBRG 25  '9600 baud @ 4mhz
DEFINE HSER_CLROERR 1
       
TRISB=%00000000
PORTB=0
TRISA =%00000111
PORTA=0
OPTION_REG=%10000000   
CMCON=7

SYMBOL LED=PORTB.6
SYMBOL UYANDIRMA=PORTB.7
SYMBOL SATIR1=PORTB.0
SYMBOL SATIR2=PORTB.3
SYMBOL SATIR3=PORTB.4
SYMBOL SATIR4=PORTB.5
SYMBOL SUTUN1=PORTA.0
SYMBOL SUTUN2=PORTA.1
SYMBOL SUTUN3=PORTA.2

TUS    VAR WORD
VER    VAR WORD
TOPLAM VAR BYTE
OB     VAR BYTE
BB     VAR BYTE
A      VAR BYTE
B      VAR BYTE
R      VAR BYTE
G      VAR BYTE
CLEAR
PAUSE 200

  BASLA:
  LED=0
    HIGH SATIR1
         IF SUTUN1=1 THEN:TUS=1:GOSUB ZAMAN
         IF SUTUN2=1 THEN:TUS=2:GOSUB ZAMAN
         IF SUTUN3=1 THEN:TUS=3:GOSUB ZAMAN
    LOW SATIR1
   
    HIGH SATIR2
         IF SUTUN1=1 THEN:TUS=4:GOSUB ZAMAN
         IF SUTUN2=1 THEN:TUS=5:GOSUB ZAMAN
         IF SUTUN3=1 THEN:TUS=6:GOSUB ZAMAN
    LOW SATIR2
   
    HIGH SATIR3
         IF SUTUN1=1 THEN:TUS=7:GOSUB ZAMAN
         IF SUTUN2=1 THEN:TUS=8:GOSUB ZAMAN
         IF SUTUN3=1 THEN:TUS=9:GOSUB ZAMAN
    LOW SATIR3
   
    HIGH SATIR4
         IF SUTUN1=1 THEN:TUS=10:G=1 :GOSUB GONDER
         IF SUTUN2=1 THEN:TUS=0 :GOSUB ZAMAN'
         IF SUTUN3=1 THEN:TUS=12:R=1 :GOSUB RES
    LOW SATIR4
   
  GOTO BASLA
ZAMAN:
IF OB=1 THEN
A=TUS
A=A*10:BB=1:OB=0
LED=1:pause 300:LED=0
ENDIF
IF BB=1  THEN
B=TUS
TOPLAM=A+B
  ENDIF
RETURN
'*******************************************************************************
RES:
IF R=1 THEN
  UYANDIRMA=0:TUS=0:TOPLAM=0:R=0:G=0:LED=0:B=0:A=0:BB=0:OB=1
  VER=255
  UYANDIRMA=1
GOSUB GIT
UYANDIRMA=0:LED=1:pause 300:LED=0:TUS=0:TOPLAM=0:VER=0
ENDIF
RETURN
'*******************************************************************************
GONDER:
  IF TOPLAM<>0 AND G=1 THEN   
VER=TOPLAM
UYANDIRMA=1
GOSUB GIT
UYANDIRMA=0:LED=1:pause 300:LED=0:TUS=0:TOPLAM=0:VER=0
ENDIF
    RETURN
GIT:
    HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
    HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
    HSEROUT ["B","U","L",VER]
    HSEROUT ["B","U","L",VER]
    HSEROUT ["B","U","L",VER]
 
RETURN
END

alıcı kısmı
@ DEVICE pic16F628A 'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilator kullanilacak
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF

  TRISB=%00000010
PORTB=0
TRISA =%00000000
PORTA=0
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 yuksek hiz
DEFINE HSER_SPBRG 25  '9600 baud @ 4mhz
DEFINE HSER_CLROERR 1

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheral interruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
SYMBOL T0IE =INTCON.5    'TMR0  interrupt enable bit
SYMBOL T0IF =INTCON.2    'TMR0  interrupt flag bit
RCIE=1
PEIE=1
T0IE=0
GIE=1
OPTION_REG=%10000000   
CMCON=7 

ON INTERRUPT GOTO KESME
AL1   VAR BYTE
SURE  VAR BYTE
DAK   VAR BYTE
TUS   VAR BYTE
SN    VAR BYTE
SAYAC VAR BYTE
TEMP  VAR BYTE
I     VAR WORD
US    VAR BIT
K     VAR WORD
ARA   VAR WORD   

SYMBOL ROLE=PORTB.0
SYMBOL LED=PORTB.4
CLEAR
PAUSE 200
BASLA:
TUS=AL1:LED=0:ROLE=0
IF US=1 THEN
IF TUS=255 THEN
    LED=1:ROLE=0:PAUSE 200:LED=0:DAK=0:SN=0:SAYAC=0:SURE=0
    AL1=0:TMR0=0:TUS=0:T0IE=0:T0IF=0:PAUSE 100
ENDIF
ENDIF
IF US=1 THEN
IF TUS<>255 AND tus=al1 THEN
FOR I=0 TO 6
    LED=1:PAUSE 200:LED=0:PAUSE 100
     NEXT I
SURE=tus:TUS=0:T0IE=1:AL1=0:TMR0=0:DAK=0:SN=0:SAYAC=0
ENDIF
ENDIF

GOTO BASLA 
DISABLE
KESME:
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
IF T0IF=1 THEN
      SAYAC=SAYAC+1      'kesme sayac?  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then      '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0             'sayaç s?f?rlan?yor
         SN=SN+1            'saniye de?eri bir art?r?l?yor
            IF SN=60 THEN     'saniye 60 olmu? ise 1 dakika süre geçti o halde
               SN=0           ' saniye s?f?rlan?yor
               DAK=DAK+1       ' dakika de?eri bir art?r?l?yor
             
            ENDIF
       ENDIF
       IF  SN=0 AND  DAK=0 THEN  BAK
       IF SURE<>0 AND DAK=SURE THEN
INTCON.5=0:ROLE=1:LED=1
PAUSE 2000
ROLE=0:SURE=0:LED=0:DAK=0:SN=0:DAK=0:SAYAC=0         
ENDIF
BAK:               
T0IF=0 'kesme bayragi sifirlanacak                           
GOTO CIK
ENDIF
HSERIN 1,BIR,[WAIT("BUL"),AL1]
TEMP=RCREG
TEMP=0
RCREG=0
US=1
GOTO CIK
BIR:US=0
CIK:
RCIF=0
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
RESUME
ENABLE
END[code]

mustafa

kesme kısmında hataların var. Bunlardan biri 2000 ms lik bir gecikme koymuşsun bu süre çok fazla kesme kullanacaksan bu şekilde uzun zamanlar koymamalısın programa .Bunun yerine bir zaman etiketi oluşturup ;
for I=0 to 255
delayms 1
next I
şeklinde bir dongu oluşturup bekleme koyman gerekirse bu etikete gitmelisin.
Ayrıca program kesme de bak etiketine gidince orada goto çık ı görüp kesmeden çıkacaktır , yani o şekilde veri alamazsın , program hserın komutunu bile görmüyor çünkü.

ete

Verici kısımda sorun yok kabul ediyorum. Ancak çalıştırarak bir sorun varmı görülebilir.
Yalnızca GIT etiketi altında neden bir çokkere aynı şeyi yollama ihtiyacı duyuyorsunuz bunu anlamıyorum.
Almaya niyeti varsa alıcının bir kere de yollasan alır zaten. Fazlalıkları oradan sil.

Alıcı kısımda kesme kullanıyorsun. Artık dilimde tüy bitti!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Kesme kullanılan programlarda bol keseden PAUSE kullanmayınız. Yokse program sekteye uğrar diyorum ama yinede herkes bol keseden kullanıyor.
Alıcı programdaki gecikmelerin hepsini kaldır. Çok gereken yerlere Döngü şeklinde gecikme alt programı yaz ve en büyük pause değeri 5 us olsun Örnek veriyorum;
FOR I=0 to 255
  PAUSEUS 5
Next
RETURN
şeklinde.

Diğer bir sıkıntıda Kesme kısmında HSERIN komutunda kullandığın 1 ms lik timeout değeri. Bu yeterli olmaz. Oraya 1 yerine en azından 5 yazmalısın.
Aynı yerde  şunlarda gereksiz.
TEMP=0
RCREG=0
RCREG zaten direk ulaşabileceğin bir register değildir. O nedenle TEMP=RCREG yazıyorsun. Bu sayede RCREG sıfırlanıyor.
Ama sen RCREG=0 yazında sıfırlanamıyor maalesef.
Bunları bir düzelt bakalım başka ne sorun çıkacak.
Ete

hakıkat

Hocam belirtiğiniz noktaları düzelttim eskiye oranla pek bir şey değişmedi devreyi çalıştırır çalıştırmaz
vericinin ledi sürekli yanıp sönüyor aynı zamanda alıcının leddide normal olarak vericiye cevap veriyor.
Hocam anladığım kadarıyla alıcı kısmı normal çalışıyor ama verici kısmında sorun var.Yani verici verilecek
komutu beklemeden çalışıyor acaba sorun kesme kısmındamıdır?

ete

Programın son halleri ile simulasyon dosyasını yola bana bakayım.
Ete

İlyas KAYA

Merhabalar

Sanıyorum proteus'un kendi keypadini kullanıyorsunuz ve henüz devreyi kurmadınız.
Proteus'un kendi keypad'i bazen high seviyesinde takılı kalıyor.
Keypad yerine buton koyarak deneme yapın. Aşağıda resimde örnek gösterdim.
Ben devrenizi bu şekilde denediğimde herhangi bir sorun görülmemektedir.
# tuşuna bastığımızda sadece veriyi göndermektedir.Bıraktığımızda ise  veri durmakta ve led sönmektedir.



Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Devrede sorun var. Pull-up yapılmış dikey hatlarda  yatay hatta tersi verilerek tuşlar test edilir. Yada pullup yerine puldown yapmak lazım dikey hatları. Kayatec in yaptığı gibi.
Ete

hakıkat

Yatay satırları direnç bağlayarak pull-down  ve dikey hata direnç bağlayarak Pullup yaparak verici kısmı
tekniki sorun giderildi.Devre şimdi çalışıyor.Fakat verici kısmında belirlenen zaman gönderildikten sonra
alıcının tam saydırıp röle çektirmesi lazım ama alıcıya gönderdiğim 1 dakkikalık zaman tam olarak
dolmuyor bu 20 saniye gibi bir zaman sonra röle çekiyor.Sanırım sorun kesme ayarındadır sayac kısmını iki katına çıkarmak istemiyorum ama bunun dışında nasıl olacağına ilişkin tüm uğraşlarıma rağmen sorunu gideremedim.Sanırım küçük bir ayrıntıdır ama Bu konuda fikri olan var mı.

ete

Kesme kullanarak yaptığını zsaat sisteminin doğru çalışması için TMR0 sayacına ait bölme oranının 1/64 olması gerekir. Bunuda Optiona registerine
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
şeklinde değer vererek yapabilirsiniz. Sizin verdiğiniz değer yanlış ve saat kısmı muhtemelen bu sebepten dolyaı düzgün çalışmıyor.

Ete

hakıkat

Hocam,
Alıntı YapOPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
Bu ayarı düzeltmiştim ama programı yeni baştan aşama aşama gözden geçirdikten sonra sorunun
aslında iki basamaklı olarak belirtmeye çalıştığım ZAMAN: kısmında kaynaklanmaktadır.Çünkü tek basamaklı
olduğunda sayac sorunu ortadan kalkmaktadır yani 1 dk.lık yada 2dk.lık zaman göndersen sorun olmuyor .tam zamannında röle çekmekte.
Tek basamaklı olarak program şöyle:
ZAMAN:
     IF OB=1 THEN
     A=TUS
     A=A
    LED=1
   pause 250
    LED=0
     ENDIF
    RETURN


ama iki basamaklı
oluşturmaya çalıştığım zaman sorun çıkmaktadır..Acaba iki basamaklı sayı nasıl oluştura bilirim yada daha
önce gönderdiğim programın sorunu nedir.

ete

Sormak istediğin şeyi anlayamadım. Sayı byte cinsinden ise 3 basamağa kadar otomatik gider zaten (255). Bir basamak, iki basamak kısıtlaması nerede yapılıyorki?. Yada hangi sayıdan bahsediyoruz.?
Programın son halini buraya bir koy ve asıl sorunuda bir kez daha açıklada yeniden bakalım kodlara.
Verdiğin kod parçasında da anlamsız yer var.
A=A eşitliği gereksiz. Birşeyi yine kendisine eşitlemek anlamsız. Orada umutulan bir şey var sanırım. Önceki yolladığında A=A*10 gibi bir eşitlik var idi.

Ete

hakıkat

Hocam,
Ben bu devreyle iki basamaklı zaman ayarı yaparak röle çektirmek istiyorum.Mesela 12 dakkikalık zamanla röle çektirmek
istiyorum.programda tek basamaklı zaman sadece belirtiğimde yani 1 dakikalık program düzenli çalışmakta fakat şimdi
gönderdiğim program vericide belirtiğim iki basamaklı programdır.Fakat program bu şekilde tek basamaklı bile
çalışmamaktadır.
@ DEVICE pic16F628A 'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628A, MCLR_OFF 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilator kullanilacak
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF

define OSC 4

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 yuksek hiz
DEFINE HSER_SPBRG 25  '9600 baud @ 4mhz
DEFINE HSER_CLROERR 1
       
TRISB=%00000000
PORTB=0
TRISA =%00000111
PORTA=0
OPTION_REG=%10000101   
CMCON=7

SYMBOL LED=PORTB.6
SYMBOL UYANDIRMA=PORTB.7
SYMBOL SATIR1=PORTB.0
SYMBOL SATIR2=PORTB.3
SYMBOL SATIR3=PORTB.4
SYMBOL SATIR4=PORTB.5
SYMBOL SUTUN1=PORTA.0
SYMBOL SUTUN2=PORTA.1
SYMBOL SUTUN3=PORTA.2
SAYI   VAR WORD
TUS    VAR BYTE
VER    VAR byte
TOPLAM VAR BYTE
OB     VAR BYTE
BB     VAR BYTE
A      VAR BYTE
B      VAR BYTE
L      VAR BYTE
R      VAR BYTE
G      VAR BYTE
I     VAR BYTE
CLEAR
PAUSE 200

  BASLA:
  LED=0
    LOW SATIR1
         IF SUTUN1=0 THEN:TUS=1:GOSUB ZAMAN
         IF SUTUN2=0 THEN:TUS=2:GOSUB ZAMAN
         IF SUTUN3=0 THEN:TUS=3:GOSUB ZAMAN
    HIGH SATIR1
   
    LOW SATIR2
         IF SUTUN1=0 THEN:TUS=4:GOSUB ZAMAN
         IF SUTUN2=0 THEN:TUS=5:GOSUB ZAMAN
         IF SUTUN3=0 THEN:TUS=6:GOSUB ZAMAN
    HIGH SATIR2
   
    LOW SATIR3
         IF SUTUN1=0 THEN:TUS=7:GOSUB ZAMAN
         IF SUTUN2=0 THEN:TUS=8:GOSUB ZAMAN
         IF SUTUN3=0 THEN:TUS=9:GOSUB ZAMAN
    HIGH SATIR3
   
    LOW SATIR4
         IF SUTUN1=0 THEN:TUS=10:G=1 :GOSUB GONDER
         IF SUTUN2=0 THEN:TUS=0 :GOSUB ZAMAN'
         IF SUTUN3=0 THEN:TUS=12:R=1 :GOSUB RES
    HIGH SATIR4
    pause 50
  GOTO BASLA

ZAMAN:
IF OB=1 THEN
A=TUS:BB=1
A=A*10:OB=0
LED=1:pause 250:LED=0
ENDIF
IF BB=1  THEN                       
B=TUS                                   
TOPLAM=A+B
LED=1:pause 250:LED=0
ENDIF

RETURN
'*******************************************************************************
RES:
     IF R=1 THEN
      TUS=0:TOPLAM=0:R=0:G=0:LED=0:B=0:A=0:BB=0:OB=1
      VER=255
      UYANDIRMA=1
     GOSUB GIT
     UYANDIRMA=0
LED=1:pause 200:LED=0:TUS=0:TOPLAM=0:VER=0
     ENDIF
RETURN
'*******************************************************************************
GONDER:
  IF tus<>0 AND G=1 THEN   
    VER=TOPLAM
    UYANDIRMA=1
    GOSUB GIT
    UYANDIRMA=0
      FOR I=0 TO 6
     toggle LED
     PAUSE 200
      NEXT
       LED=0:TUS=0:TOPLAM=0:VER=0
ENDIF
    RETURN
GIT:
    HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
    HSEROUT ["B","U","L",VER,10,13]
 
RETURN
END

ete

Yine çok açık değil anlatmak istediğin. Çift basamaklı zaman mı oluşturamıyorsun acaba.
Öyle hissediyorum. Şayet durum öyle ise on tabanına göre sayı kuralını kullanabilirsin.
A=0 olsun başlangıçta. Diyelimki 12 sayısını oluşturacağız.
Önce 1 nolu tuşa basacağız. TUS=1 oldu , program Zaman etiketine gitti ve orada A=A*10+TUS formülü ile
A=0*10+1 şeklinde A=1 elde edildi.
SOnra 2 nolu tuşa basıldı. TUS=2 oldu Program zaman etiketine gitti ve orada A=A*10+TUS formülü ile
A=1*10+2=12 bulunmuş olacaktır.

Umarım aradığın budur.

Ete


hakıkat

#13
Hocam,
Doğru hissetiğiniz gibi Çift basamaklı zaman oluşturamıyorum. :)belirttiğiniz gibi yapmaya çalıştım
şimdi tek basamaklı olarak program çalışıyor ama halen iki basamaklı olmamaktadır.Son biçim şöyledir.
ZAMAN:
IF OB=1 THEN
A=0:BB=1    '****************BURADAKİ A=0 Sİlinecek!!!!!!!!!!!!!!!!!!!!!!!!!!
A=A*10+TUS:OB=0
LED=1:pause 250:LED=0
ENDIF
IF BB=1  THEN                       
B=TUS                                   
TOPLAM=A+B
LED=1:pause 250:LED=0
ENDIF

ete

#14
A=A*10+Tus. İfadesinden önce A=0 yazarsan olmaz elbette. Tus kontrolünden her bir basamak için bir kez zaman etiketine gelmeli programın ve ilk geldiğinde A nın aldığı değer ikinci kez silinmemiş olması gerekir. Bu nedenle A=0 ifadesini ordan sil. Yada şöyle yaz IF A>99 then A=0 veya IF (A DIG 2)>0 then A=0
Ete

Powered by EzPortal