Pic18f4620 program içinde kesme açıp kapatmak mümkün mu ?

Başlatan M.A.A, 19 Haziran 2017, 18:55:54

M.A.A

Merhabalar
Pic18f4620 kullanıyorum. Program içinde bazen timer0 kesmesini kapatıp acmam gerekiyor. Bu mümkün mu ?

devreci22

Buton ile 1 bit set edersiniz 1 ise aktif 0 ise pasif  olur
Ana döngü de if ile de sorgularsin

ete

Başka kesme kaynakları yok ise Global kesme bitini (INTCON.7) sıfırlayarak kesmeleri kapatır gerektiği zaman aynı biti set ederek tekrar açabilirsiniz.
Başka kesmeler var ve onların kalmasını istiyorsanız sadece INTCON.5 bitini sıfırlayarak TMR0 kesmesini kapatıp gerektiği zaman aynı biti set ederek kesmeyi açabilirsiniz.

Ete

M.A.A

Projemde bir tane dip swich var. Dün epey denedim bir türlü olmadı. Bugun tekrar denedim.

DONGU=1
While DONGU=1
    If DIPSWICH=1 Then INTCON.7=1
    If DIPSWICH=0 Then INTCON.7=0
    I2CIn SDA,SCL,$D1,$00,[Str BILGIH\8] ' Read 8 bytes from DS1307
Wend

Böyle yazıyorum kesmeleri hemen açıyor kapatmayı bazen yapmıyor, bazen 10-15 sn sonra yapıyor, bir kerede hemen yaptı.

ete

Her şeyden önce bu döngü içerisinde Rtc nin arada bir gecikme olmadan us ler mertebesinde bir sıklıkla okunmadı yanlış. Şöyle düşün rtc de bilgi ne zaman yenileniyor? Her sn değişiminde. Buda her 1000 ms de yada her 1000.000 us de bir demektir. Komut gecikmelerini dikkate alırsak sen neredeyse her 100 us de bir Rtc okuyorsun. Bu işlem rtc nin çalışmasınıda engeller. Araya zaman koy. Her sn değişiminden sonra en az 1000 ms bekle ve öyle okuma yaptır.
Mesela aynı döngü içinde bir sayaç saydır. Her sayma da 1 ms beklesin 1000 saydığında git rtc yi oku sayacı sıfırla. Aynı döngüde kesmeyide kontrol et. Binary mantığında bir konum ya 1 dir yada sıfırdır başka alternatif yoktur o halde iki konumuda if ile test etmeninde bir mantığı olmaz biri değilse diğeridir mantığını kullan. Örnek veriyorum.
If dipsw=1 then
  GIE=1
Else
  GIE=0
Endif
Demek daha doğru. Hatta hiç if kullanmadan GIE=Dipsw. Desen dahada süper olur. Hiç if kullanmamış olursun.
Ete

Powered by EzPortal