keypadla zamanlayıcı

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

ete

Ne oldu sonuç alabildinmi?

Ben bir iki deneme yaptım. Yazdığın programın tamamına hakim değilim maalesef.
Mesela ZAMAN adlı etikette;
IF OB=1 THEN şeklinde bir satırla başlıyorsun. Bakıyorum OB yalnızca RES isimli etiket altında set ediliyor. Bu durumda program bir kere RES etiketine gitmeliki bastığın tuşların toplanıp A değişkenine iki haneli bir değer verilebilsin. Aksi halde bu mümkün olmuyor maalesef. Bende BASLA satırından evvel OB=1 komutunu verdim. Böylece ilk başta program basılan tuşları algılayıp A hesabını yapabiliyor.
ZAMAN etiketin,n başlangıç kısmını şöyle değiştirdim.
     IF OB=1 THEN
     A=A*10+TUS
     if a>9 then
       bb=1
       ob=0
     endif
Böylece en azından 2 hane dolmadan sistem OB değerini set etmeyecek demektir.
iki haneden sonra OB=0 yapıyorumki yanlışlıkla girilen değerler A değerini aşırı yükseltmesin.
Sonuçta bir gönderme yaptığın zaman RES etiketi altında OB değeri yeniden set edilmektedir.
Bu şekilde çalışıyor sistem.

Ete


hakıkat

Hocam,
Farklı farklı şekillerde de zaman gönderme biçimlerinde de uğraştım ama yinede sorunu gideremedim bu son
gönderdiğiniz biçimde de denedim.Ne çift basamaklı nede Tek basamaklı olmuyor.

ete

Bunu benim yapabilmem için programın bütün mantığını bilmem gerekir. Aksi halde bir şey yapmam mümkün değil. Kendin çözmen gerekiyor.

İşe veri yollama işini bağlamış olduğun şartları elimine etmekle başla.
İçinden çıkamaz isen kısmi olarak birlikte ilerleyelim. Yolladığım kısım mükemmel şekilde 2 haneli rakam oluşturuyor.
Bunu isisten takip edebiliyorum. Sonra oluşan bu A bilgisini yollamak için koyduğun şartlara bakarsak;
ikinci rakamı girdiğin zaman A>9 olduğu için BB=1 oluyor ve OB=0 oluyor.
Bu durumda hemen altta yer alan ;
IF BB=1  THEN
       B=TUS
       TOPLAM=A+B
     ENDIF
satırları çalışıp TOPLAM=A+B oluyor. ANcak B değerine bir yerde rastlayamadım. Nedir bu B bilmiyhorum. Her neyse TOPLAM=A oldu.
Şimdi  "#" tuşuna basman gerekiyor. BU tuşa basınca program GONDER isimli etikete gidip,

TOPLAM sıfıra eşit değil ise (ki değil) ve G=1 ise altında yer alan satırları işletiyor.
G=1 zaten diyez tuşuna basınca orada G=1 yapıyorsun. O halde altta yer alan satırlarda çalışıyor demektir.
Bu durumda dediğim sırayı takip edersen, girdiğin zaman iki basamaklı olarak kesinlikle gönderilmektedir.
Bütün dava alıcıda bunun değerlendirilmesine kalıyor. Birazda oraya kafa yor istersen.

Ete



hakıkat

Merhaba Hocam,
Sonunda iki basamaklı olarak zamanı göndere bildim sorun ise zaman kısmındaki birinci basamak için düşündüğüm işlemdi halbuki
A=A*10+TUS bu ifade herşeyi tamamlıyordu ama ben tam anlayamamıştım programı gözden geçirince farkettim yani
birinci basamak için yaptığım sadece pic in kafasını karıştırmaktan başka bir şey yapmıyormuş. Şimdilik bunları
belirtiyorum şimdiye kadar programı hep ısıste deniyordum
artık   pıratik devre üzeri çalışacağım daha sonra çalışmanın gidişatını bildiririm.saygılar..

hakıkat

Merhabalar
Belki cevap vermek için uzun bir süre oldu kusura bakmayın devreyi pratik olarak denedim. Verici kısmı çalışıyor.
ama alıcı kısmında sorun var.Gelen bilgiyi okumuyor.Sorunun tam olarak nerden kaynaklı olduğunu anlayamadım.Son olarak alıcı kısmı alttadır.
alıcı
@ 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_ON 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC   'Dahili osilator kullanilacak
@ DEVICE pic16F628A, BOD_OFF
@ DEVICE pic16F628A, LVP_OFF

define OSC 4

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
OPTION_REG=%10000101
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
A     VAR BYTE
US    VAR BIT
K     VAR WORD
ARA   VAR WORD   

SYMBOL ROLE=PORTA.3
SYMBOL LED=PORTB.4
CLEAR
RCIE=1:PEIE=1:T0IE=0:GIE=1
PAUSE 200 
BASLA:
        TUS=AL1:LED=0:ROLE=0
        IF US=1 THEN
          IF TUS=255 THEN
            LED=1:ROLE=0
            FOR I=0 to 5000
              PAUSEUS 5
            Next
            LED=0:DAK=0:SN=0:SAYAC=0:SURE=0
            AL1=0:TMR0=0:TUS=0:T0IE=0:T0IF=0
         endif
IF TUS<>255 AND tus=al1 THEN
SURE=tus
GOSUB DELAY
TUS=0:T0IE=1:AL1=0:TMR0=0:DAK=0:SN=0:SAYAC=0
ENDIF
ENDIF

GOTO BASLA 
DELAY:
LED=1
      FOR I=0 TO 5000
      PAUSEUS 5
      NEXT
      LED=0
      RETURN
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             
           
    IF  SN=0 AND  DAK=0 THEN  BAK
    IF SURE<>0 AND DAK=SURE THEN
      INTCON.5=0:ROLE=1:LED=1
       FOR I=0 TO 10000
      PAUSEUS 5
      NEXT
      SURE=0:DAK=0:SN=0:DAK=0:SAYAC=0 :ROLE=0:LED=0
    endif
    ENDIF
    ENDIF   
BAK:               
    T0IF=0 'kesme bayragi sifirlanacak                           
    GOTO CIK       
ENDIF
HSERIN 5,BIR,[WAIT("BUL"),AL1]
TEMP=RCREG
US=1
GOTO CIK
BIR:US=0
CIK:
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
RESUME
ENABLE
END

ete

Göz kontrolünde programda bir aksaklık gözükmüyor. Ancak çalışınca varsa bir şey görülebilir.
Bu nedenle simulasyon dahil tüm dosyaları buraya koyman lazımki bakabileyim.

Ete

hakıkat

#21
Hocam
Bütün dosya aşağıdadır.

ete

Verici gayet güzel veriyor alıcıda gayet güzl alıyor. Bunu simulasyonda izleyebiliyorum. Aşağıda verdiğim dosyaları kullanırsan İsis de watch window (izleme penceresi açtım). Bütün değişkenlere her iki tarafta da adres verdim ve onları isisde izlemeye aldım.
Tuş takımından mesela 12 giriyorum ve "*" tuşuna basınca alıcı bu değeir alıyor ve Sure=12 yapıyor aynı zamanda saat de çalışmaya başlıyor. Programda sorun gözükmüyor. Var ise bir sorun süre sayımında olabilir yada karşılaştırmada olbailir. Oralara henüz bulaşmadım.Mantığı iyice kavramayınca müdahale etmek zorlaşıyor. Bu nedenle en iyisi kendin verdiğim dosyaları kullanarak halletmeye çalış.

İsis dosyasını benim verdiğimi kullanman gerek yoksa izleme penceresini göremezsin.

Ete

hakıkat

Hocam
Sorunun
Alıntı Yapsüre sayımında olabilir yada karşılaştırmada olbailir
gibi bir görüşte bulundunuz.Ama hocam alıcı devresi pratik devre üzeri hiçbir şekilde cevap vermiyor.
Devreyi reset yaptığımda bile  alıcı devrenin leddi yanmamakta.Bu arada alıcı programının reset kısmını
kesme kısmının dışında çalışıp çalışmadığını görebilmek için   
IF US=1 THEN    kısmının dışına aldım ama yinede devrede tık yok devreyi kontrul ettim bir bağlantı hatası
yada bozulmuş bir eleman varmı diye ama yinede herhangi bir sorun bulamadım.Tam bu durumu anlayamadım
görüşünüzü merak ediyorum.

ete

Daha öncede söyledim. Programın bütününe hakim olmadan sorularına doğru cevap vermem çok zor.

Bana bir örnek ver. Mesela şöyle yap (ben bunu simulasyonda yapıyorum ve alıcının girilenleri aldığını görebiliyorum.)
- Tuş takımından 12 sayısını gir sonra "*" tuşuna bas.
- Alıcı 12 rakamını aldı (Al1=12 ve ardından Sure=12 oldu)
- Geri saymaya başlayacak
- sonrasında ne olacak?
Yada ne olması gerek.

Değişik varyasyonlar var ise onları da anlat bakalım.

Ete

hakıkat

Hocam
Devrenin kendisi vericide reset tuşuna yani # kare tuşuna basıldığı zaman program hem resetleniyor hemde OB=1
yaparak programın başlamasını sağlıyor bu işlemin gerçekleşmesi # kare tuşuna basıldığında alıcıdaki ledin yanması ve
alıcıdaki bilgilerin hepsinin sıfırlanmasıyla gerçekleşmektedir.Ayrıca * yıldız tuşuyla vericide gönderilen zaman bilgisiyle alıcıdaki ledin yanması gerçekleşecek ve zaman kısmının sayması gerçekleşmesi gerekmektedir. Zaman dolduktan sonra hem leddin yanması hemde rölenin çekmesi gerekmektedir.Yani bu anlattıklarım aslında ISIS te gerçekleşen durumun aynısıdır.
Farklı bir durum yok. 

ete

Vericide # tuşuna basılınca alıcıdaki led yanıyor ve sönüyor. Daha sonra saat çalışmaya başlıyor. Sure sıfır göstermesine rağmen saat çalışıyor. Halbuki bu konumda çalışmaması gerekir diye düşünüyorum.

Sonra süre değeri girip * tuşuna basınca alıcıdaki led yine yanıyor ve süre çalışmaya başlıyor.
Senin dediklerinin tamamını yapıyor program. Ama reset sonunda saatin çalışmaması gerekir diye düşünüyorum.
Ete

hakıkat

 Hocam herşey için teşekkürler sorun çözüldü sorun alıcı devresindeki kıristale bağlı kondasatörden kaynaklanmıştı.
Onu düzeltince devre ve program çalıştı.Anlayacağınız sorun teknikiydi.Tabi bu denemeleri yaparken alıcı ve verici
kısmını kablulu sistemle çalıştırdım.Modül kullanınca ve belirttiğiniz durumuda düzeltmeye
çalışınca sonucu bildiririm.

hakıkat

Merhaba hocam
Programda olan sorunu giderdim.Bunun için alıcı kısımındaki
IF TUS<>255 AND tus<>0 THEN tanımlamayla sorun giderildi ama esas sorun modül devreye takıldıktan sonra
vericinin gönderme veya reset tuşuna basıltıktan sonra alıcıdaki led sürekli yanmaktadır.Yani anlayacağınız modülle devre
çalışmamaktadır.Buna ilişkin bir fikriniz var mı?

ete

Bu sorduğun soruya ancak programa hakim birisi doğru cevap verebilir. Ben fazla hakim değilim. Kod olarak takip edebiliyorum ama mantık oalrak pek fazla bir şey gelmiyor elimden. Anlamak için epeyce incelemek gerekir.
Yanlış anlama mantık derken programın amacının dışında her bir satırın belirli bir anlamı olması gerekir. Satırlar birleşince genel bir anlam oluşturur hepsi birleşince programın mantığı ortaya çıkar. Bunu kastediyorum.

Alıcı Programa bakarsak pek çok noktada led set edilmektedir. Kiminde Toggle ile kiminde ise Led=1 şeklinde yapılmaktadır.
Bunlardanbirisi buna sebep olur. Ben genelde bunları sırası ile kapatarak kimin sorunu yarattığını bulurum. Sonrada orada mantık değiştirerek sorunu gideririm.
Sen öyle yap en iyisi.

Ete

Powered by EzPortal