Puls varsa HIGH LED

Başlatan devreci22, 18 Mart 2015, 21:24:07

devreci22

w1 değişkeninde değer varsa ledi devamlı yakmak için program yazdım ama devamı led lanmıyor filip filop yaparak yanı yo derede hatam var bakabilir misiniz ?
    TRISA=0
    TRISB=0
    TRISC=0
    TRISD=0
    PORTA=0
    PORTB=0
    PORTC=0
    PORTD=0
    ADCON1=7
'------------------------------------------------------------------
     W1 VAR WORD
     SYMBOL LED1=PORTC.0
ANA:   
     COUNT PORTA.0, 200, W1
        IF W1>=1 THEN GOSUB USTLED
        IF W1=0 THEN GOSUB SONDUR
     
     GOTO ANA
'---------------------------------------------------------------------   
    USTLED:
     IF W1>=1 THEN portc=%00100011
     RETURN
    SONDUR:
     PORTC=0
     RETURN   
           
     END 

er-da

#1
bunu dene..
hangi işlemci?  port digital  çıkış olarak ayarlanmış mı?   


     W1 VAR WORD
     SYMBOL led = PORTC.0

ana:
COUNT PORTA.0, 200, W1
if w1>=  high led
  else
  low led
endif
goto ana

devreci22

#2
16F877A kullanıyorum ADCON1=7 dijitale çevirdim tek1 satırda count komutunu kullandım mı led hep yanıyor
count satırları alt alta geldiğinde 2 portu biden okumaya çalıştığımda hangi değişken sıfırdan büyükse hıgh olması gerekiyor,
yine aynı led kesik kesik yanıp sönüyor yapmak istediğim puls varsa led devamlı yanması puls yoksa low led
 W1 VAR WORD
     W2 var word
     SYMBOL led = PORTC.0
     symbol led1 = PORTC.1

ana:
COUNT PORTA.0, 200, W1
if w1>=1 THEN high led
if w1=0 THEN low led
COUNT PORTA.1, 200, W2
if w2>=1 THEN high led1
if w2=0 THEN low led1
goto ana

ete

Programları usulüne uygun yazmıyorsunuz. Nerede sigorta ayarları ?. Programın hangi işlemci için yazıldığı kaç Mhz de çalıştığı bile belli değil. Bu Count hangi parametreye göre çalışacak?
Açılış gecikmesi yok. ALıştırın kendinizi düzgün yazmaya hep kestirmeden gidiliyor ne hikmetse.

Conut komutu karşılığında ne açıklama verilmiş birlikte bakalım;

"COUNT checks the state of Pin in a tight loop and counts the low to high transitions. With a 4MHz oscillator it checks the pin state every 20us. With a 20MHz oscillator it checks the pin state every 4us. From this, it can be determined that the highest frequency of pulses that can be counted is 25KHz with a 4MHz oscillator and 125KHz with a 20MHz oscillator if the frequency has a 50% duty cycle (the high time is the same as the low time)."

İlgili pini sıkı bir şekilde takip edip Low dan High konumuna geçişleri sayar diyor. 4Mhz OSC frekansında her 20us de bir pin kontrol edilir, 20 Mhz de ise her 4us de bir kontrol edilir diyor. Bu durumda ölçülebilecek en yüksek frekans 4 Mhz OSC ile 25Khz , 20 Mhz OSC ile ise 125Khz denilmiş.

Şimdi bu açıklamalara göre sen programına şu frekansta çalışıyorum dememişsin (DEFINE OSC 4 yada DEFINE OSC 20 gibi)

İkincisi sayma süreni 200ms almışsın. Bu şu demek olur. Şayet saymaya çalıştığın frekansın peryodu 200ms den fazla ise hiç bir şey sayamayacaksın demektir.

Belliki ara saymalarda sonuç sıfırda çıkabiliyor. O zaman frekansta bir terslik var demektir. Ya duty değeri %50 den farklı yada frekans çok düşük.
Ben olsam sonuç sıfır çıktığı zaman yeniden sayar yine sıfır çıkıyorsa sıfır kabul ederim değilse yeni değeri esas alırım.

Ete

devreci22

#4
1HZ ile 20hz arasındaki frekansları okumaya çalışıyorum DEFINE OSC 20
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, HS_OSC
   
    DEFINE HS_OSC 20
    ADCON1=7
    TRISA=1
    TRISB=0
    TRISC=0
    TRISD=0
    TRISE=0
    PORTA=1
    PORTB=0
    PORTC=0
    PORTD=0
    PORTE=0
         
     W1 VAR WORD
     W2 var word
     SYMBOL led = PORTC.0
     symbol led1 = PORTC.1

ana:
COUNT PORTA.0, 200, W1
if w1>=1 THEN high led
if w1=0 THEN low led
COUNT PORTA.1, 200, W2
if w2>=1 THEN high led1
if w2=0 THEN low led1
goto ana

ete

1000/200=5 Hz lik sinyalden aşağısını zaten okuyamazsın. Çünki süre olarak 200 ms vermişsin.
5 Hz lik sinyalin peryodu 200 ms dir ki bunuda okuyabilceğin konusunda endişem var.
Komutu , COUNT PORTA.0, 1000, W1 şeklnde kullan daha rantabl çalıştığını göreceksin.

Ete

devreci22

bu şekilde bu sorunu çözdüm hocam teşekkür ederim
COUNT PORTA.0, 200, W1
        IF W1>=1 THEN portc=%00000001
        IF W1=0 THEN LOW LED1

w1ve w2 değişkenlerini  tımer0 a nasıl baktıra bilirim ? puls varmı yok mu diye

ete

Sorunu çözmüş falan değilsin çünki bu son yazdığınla ilk yazdıkların farklı şeyler değil.
Çözdüm diyorsan zaten sorunun yok idi demektir.

Tmr0 ile konunun ne alakası var onu bağdaştıramadım. Tmr0 değeri istediğin zaman alınıp bir başka değişkene aktarılabilir yada anında test edilebilir.

Ete


devreci22

#8
W1 W2 anında tımer0 test edip  ana program o satır a işlem  yapmasıni kurmak için nasil planliyabilirim osc 20 Mhz

ete

Timer0 sayacını PORTA.4 pininden giriş yaparak gelen pulsları geri planda sayacak şekilde kurabilirsin.
Bunun için OPTION_REGisterine %10100000  değerini vermek yeterli olacaktır.
Öncelikle bir belirli bir zaman tutman gerekiyor. En ideali 1000ms zaman tutup sonra sayac değerini başka bir değişkene aktarmak gerekir. Zaman tutmadan önce TMR0=0 verilerek sayac sıfırlanır sonra zaman tutularak o süre sonunda o süre zarfında gelmiş pulslerin sayısı SAYAC=TMR0 şeklinde sayac isimli değişkene aktarılabilir.

Elbette , sayaç sayarken sen başka işlerle uğraşacak isen TMR1 sayacına zaman tutturup işlerini yapabilirsin.
Örneğin aşağıdaki program parçası 20 Mhz kristal frekansında TMR1 sayacını kullanarak 1000 ms lik br bekleme yaratır ve bu süre esnasında da TMR0 sayacı haricen PORTA.4 pinine giren pulsları sayar. Süre sonunda sayılan Puls sayısı W1 değişkenine aktarılır.
BASLA:
T1CON=%00111101:SURE=0:OPTION_REG=%10100000
SAY:
TMR1L=100:TMR1H=0:PIR1.0=0 'ilk kesme oluştuğunda 250 ms geçmiş olacaktır. Kesme bayrağını kullanacağız ama kesmeleri aktif etmeyeceğiz.
WHILE PIR1.0=0
'bu aralığa yapacağın diğer işleri yerleştirebilirsin. İşlerin süresi 250 ms yi geçmemesi gerekir.
WEND
'program bu satıra geçince TMR1 kesmesi oluşmuş demektir.
SURE=SURE+1 if SURE<4 then SAY
'Program bu satıra gelince 1000 ms geçmiş olur.
T1con=0:W1=TMR0
Burada W1 değişkeni 1 sn içinde gelen puls sayısını taşıyacaktır. Gerisi artık IF satırlarına kalıyor.

Ete

devreci22

verdiğiniz bilgiler neticesinde çalışmaya başladım bile ETE hocam çok sağolun teşekkür ediyorum; iyi ki varsınız başımız da

Powered by EzPortal