TMRO KESME

Başlatan eprom_20, 04 Haziran 2014, 10:39:08

eprom_20

@ DEVICE pic16F877A, HS_OSC

'------
define OSC 20

SAYAC VAR WORD
SURE VAR WORD

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101       'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000         'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
.
.
.
.

DISABLE
KESME:
PORTD.1=1
SURE=SURE+1
IF SURE=61 THEN
PORTD.1=0
SAYAC=SAYAC+1
IF SAYAC=61 THEN
PORTD.1=0
SURE=0
SAYAC=0
ENDIF
ENDIF


INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE       

Hocam,TMRO kesme bayrağında portd.1'e bağlı yükün (örneğin 1 dakika) çalışıp durması ve 1 dakika daha beklemesi sonra döngüye girmesi için yukarıda yazdığım kodda eksiğim nedir acaba yardım edebilirmisiniz? OSC=20MHZ

Teşekkür ederim

ete

Kesme içinde sure değişkeni yanlış yerde sıfırlanıyor. Yeniden incele.
Sure=61 olunca sayac artırılmadan bir defa sureyi sıfırlaman gerekmezmi?
Ete

eprom_20

Hocam dediğinizi yaptım ancak yinede  portd.1'e bağlı olan yük çalıştığı kadar beklemede kalmıyor

sanki sure değişkeninden sayac değişkenine geçmeden başa dönüyor hocam, dolayısıyla sure'de çalıştığı zaman kadar sayac değişkeninde verdiğim  bekleme süresini görmüyor

KESME:
PORTD.1=1
SURE=SURE+1
IF SURE=61 THEN
PORTD.1=0
SURE=0
SAYAC=SAYAC+1
IF SAYAC=61 THEN
PORTD.1=0
SAYAC=0
ENDIF
ENDIF   
   
     
INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE

ete

#3
Bu programda kesme her 16.384 ms de bir meydana geliyor. Sen her kesme oluştuğunda PORTD.1=1 diyorsun bu yanlış.
Madem 1 dak bekleyecek o halde;
-61 kesme yaklaşık 1 sn ediyor. Her 1 sn de bir sayac değişkenini saydırdığına göre sayac=60 olduğunda 1 dakika geçmiş olacak. O halde komutu buraya koyman gerekiyor.
Şimdi şunu dene bakalım.
Kesmenin başında yer alan PORTD.1=1 satırını sil.
Aşağıda PORTD.1=0 satırı yerine,     TOGGLE PORTD.1    yaz. Böylece her 1 dakikada bir sistem açılır 1 dakika açık kalır sonra kapanır . 1 dak. kapalı kalır sonra tekrar açılır. İstediğin budur umarım.

Bu arada bir konuya daha dikkatini çekmek isterim. Ana program kısmını vermemişsin. Şayet orada PAUSE komutları kullandın ise bunlarda programın çalışmasını süre açısından etkileyecektir. Zira TMR0 kesmesi oluştuğu esnada program şayet bir pause komutunu işliyorsa hemen kesmeye gitmesi gerekirken pause süresi bittikten sonra kesmeye gidecektir. Buda saniye hesabının pause süresi kadar uzayacağının bir göstergesidir. Bunu şayet program sıklıkla yapıyorsa 1 sn lik süre seninprogramda 2 hatta 3 saniyeye kadar çıkabilir. Bu nedenle hep söylerim kesme kullanılan programlarda pause komutunu kullanmayın. Geickme illaki gerekiyor ise döngüsel gecikmeler sağlayın. pause 100 programın 100 ms sonra kesmeye gitemsine sebep olur.  Pause 1 ise 1 ms sonra kesmeye gitmesine sebep olur. Pauseus 5 ise 5 mikro saniye sonra kesmeye gitmesine sebep olurki bu ihmal edilebilecek bir süredir. Bu nedenle döngüsel gecikme yaratırken pauseus 5 veya daha az bir değer kullanıp döngü sayesinde bunun miktarını artırın. 100 lik bir döngüde 100*5=500 us lik bir gecikme yaratırsınız. Bunu 1000 lik yaparsanız 5000us lik bir gecikme olurki bu 5 ms ye eşdeğerdir. Aslında gerçek gecikme biraz daha fazladır. Çünki komut gecikmeleride döngü ile birlikte artar.


Ete

eprom_20

teşekkür ederim Hocam,istediğim buydu emeğinize sağlık,,

programda diğer gecikmeleri şu şekilde yaptım Hocam

LOOP1:
        portd.0=1
        PAUSE 10                     
        T=T+1
        If T<60 Then
        GoTo LOOP1
        Else
        T=0
        GoTo LOOP2       
        EndIf
birkaç saniyelik gecikmeler sorun olmayacak 

Powered by EzPortal