avatar_jun

Sizce nerede hata yapıyorum

Başlatan jun, 18 Mayıs 2012, 22:04:56

jun

sayın arkadaşlar ldr (karanlıkta çalışan)ile kişi sayan ve 3 kişi geçtiginde pinin birisini hıgh yapan 2sn çalıştıksan sonra low'a çekip programı başa döndüren bir program yazıp devre tasarladım simulasyonda sorunsuz çalışmasına ragmen pratikte devreyi birtürlü çalıştıramadım bi bakarmısınız nerede hata yapıyorum dosyalar aşagıdadır.

program

DEFINE OSC 4 

TRISA=0
TRISB=%00000011
PORTA=0
PORTB=0 
CMCON=7   
'----------------------------------------------------------------------------
SAYAC VAR BYTE
sayac=0
SYMBOL SNY=PORTB.0
SYMBOL LDR=PORTB.1
SYMBOL CKS=PORTB.2
'----------------------------------------------------------------------------
pause 500
LOW CKS
BASLA:
IF SNY=1 THEN
GOTO SAY
PAUSE 100
ELSE
SAYAC=0
ENDIF
GOTO BASLA
SAY:                             
IF LDR=1 THEN
SAYAC=SAYAC+1
WHILE LDR=1
WEND
endIF
IF SAYAC=>3 THEN SAYAC=3
IF SAYAC=3 THEN
HIGH CKS:PAUSE 2000:LOW CKS:SAYAC=0
ENDIF   
GOTO BASLA
END

Görüldügü gibi devre SNY pini high oldugu sürece sayma yapıyor.fakat devrede ldr li kısmı iptal edip normal buton gibi kullanmama ve while wend koruması olmasına ragmen butona basar basmaz çıkış hıgh oluyor.yardımlarınız için teşekkürler.

rexo

Devreyi bu şekilde yap bakalım olacakmı,

kolaygelsin

rexo


jun

teşekkürederim rexo yazılımda ne gibi bir değişiklik yaptın devrede sadece pull down bağlı ldr pinini pull up a çevirmişsin.

ete

16F628 ve daha pek çok pic de B portunda dahili Pullup bulunur. Devre üzerindeki bağlantıların ve malzemelerin bir kısmından kurtulmak için dahili pullup kullanımı tercih edilir. Bu durumda buton yada benzeri girişlerinizi pullup lı olarak kullanmak size avantaj sağlar. Ancak tabiiki zorunlu hallerde pulldown olarak da port pinlerini kullanabilirsiniz.

Bu nedenle sistemini mevcut düzen üzerinden çalıştırmaya gayret edelim. Programında bazı lüzumsuz satırlar var ve eksik olan sigorta ayarları mevcut. Bunarı aşağıdaki şekilde programa eklemen gerekiyor.

@ 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

Bunları koyunca gerçek devrede de sistemin  çalışması gerekir.
Aşağıdaki satırları ele alırsak;
IF SNY=1 THEN
GOTO SAY
PAUSE 100
ELSE
SAYAC=0
ENDIF
SNY=1 olunca zaten program SAY etiketine gidecek. Bu durumda hemen altında yer alan Pause 100 satırı hiç bir şekilde çalıştırılamayacak bir komuttur. SNY= 0 olursa zaten program IF satırları içine firmeyecek. O halde bu satırları şöyle yazmakta yarar vardır. SNY=1 ise SAY etiketine git değilse Sayac=0 yap ve alttan gelen GOTO BASLA komutu ile yeniden başa dön.
IF SNY=1 THEN SAY
SAYAC=0
GOTO BASLA
SAY etiketinde de bazı lüzumsuz satırlar var;
Bir if komutu kullanarak SAYAC=>3  konumunu tespit etmiş isen o komuta ait emirleri alt alta vermekte yarar vardır. Her kullandığın IF programı gecikmeye uğatır ve buna gerekte yoktur.
SAY:                             
    IF LDR=1 THEN
      SAYAC=SAYAC+1
      WHILE LDR=1:WEND
    endIF
    IF SAYAC=>3 THEN
      HIGH CKS
      PAUSE 2000
      LOW CKS
      SAYAC=0
    ENDIF   
    GOTO BASLA
END

Tek eksiklik SNY ucunun LOW olup olmadığı programda test edilmiyor. Bu ucun ne olduğunu bilmediğim için her hangi bir komut yazmadım. Sanırım aynı anda kapanan 2 ldr denbirisi bu olmalı. Diğerinin LOW olduğuna bakıldığına göre buda otomatikman LOW olacaktır şeklinde bir mantık yürütebiliriz.
Bu şekilde programı dene bakalım sonuç ne olacak.

Ete

jun

#5
Teşekkürederim ete abi hemen deneyecegim.Fakat sigorta ayarlarını girdigimde derleyici hata veriyor.gerçi sizin bu konuda bir yazınız vardı sanırım onu bi okuyayım.

'-------------------------------------------------------------------------
TRISA=0
TRISB=%00000011
PORTA=0
PORTB=0 
CMCON=7   
'----------------------------------------------------------------------------
SAYAC VAR BYTE
sayac=0
SYMBOL SNY=PORTB.0
SYMBOL LDR=PORTB.1
SYMBOL CKS=PORTB.2
'----------------------------------------------------------------------------
pause 500
LOW CKS

BASLA:
IF SNY=0 THEN say
SAYAC=0
GOTO BASLA

SAY:
IF SNY=1 THEN BASLA                             
IF LDR=0 THEN
SAYAC=SAYAC+1
PAUSE 250
goto BEKLE
endIF

IF SAYAC=>3 THEN
      HIGH CKS
      PAUSE 2000
      LOW CKS
      SAYAC=0
    ENDIF   
    GOTO BASLA
END
BEKLE:
IF LDR=0 THEN
GOTO BEKLE     
ELSE
GOTO BASLA
ENDIF
GOTO BEKLE
END
   

programı bu şekilde dediklerinize göre pull down olarak değiştirdim.Program Sny ucundan low sinyali aldıgı zaman çalışmaya başlıyor.hıgh oldugunda sayac içini sıfırlıyor.Diyelimki sny low iken iki defa butona bastık sayac=2 oldu fakat sny hıgh oldugunda basla etiketine gidip sny nin low olması bekleyip ayrıca sayacı sıfırlaması gerekiyor.fakat simulasyonda basla etiketine gitmesine rağmen sayac sıfırlanmıyor yine bir yerde yanlış yapıyorum.

(logictoogle probunun konumunu değiştirmeyi unutmuşum şimdi simulasyonda sorunsuz çalıştı.Yinede kodlara bakıp yanlışlarımı söylerseniz sevinirim...)

ete

#6
Bütün programı şöyle yazman mümkün ken neden dolambaçlı yazdın acaba.
BASLA:
IF SNY=0 THEN SAY         'SNY=0 ise SAY etiketine atla
SAYAC=0
GOTO BASLA

SAY:
IF SNY=1 THEN BASLA                     'SNY=1 olmuş ise yeniden başa dön.                       
IF LDR=0 THEN  SAYAC=SAYAC+1   'SNY=0 ve LDR=0 ise adam geçti sayac değerini bir artır
IF SAYAC=>3 THEN                         'Sayac=3 yani 3 adam geçmiş ise 
      HIGH CKS                                 'Çıkışı SET et 
      PAUSE 2000                             '2 sn bekle
      LOW CKS                                  'çıkışı restle
      SAYAC=0                                  'sayac değerinide sıfırla
ENDIF   
pause 100                                      '100 ms bekle
WHILE LDR=0 OR SNY=0:WEND     'ldr yada SNY den birisi low ise ikiside high oluncaya kadar bekle
GOTO BASLA                                   'sonra başa dön.
END


Ete

Powered by EzPortal