avatar_elektro77

12f627 ve 12f675 te zaman kesmesi

Başlatan elektro77, 17 Nisan 2016, 15:14:00

elektro77

@ DEVICE pic12F675                      'işlemci 12F675                               
@ DEVICE pic12F675, WDT_Off             'Watch Dog timer açık
@ DEVICE pic12F675, PWRT_ON             'Power on timer açık
@ DEVICE pic12F675, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic12F675, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-------------------------------------------------------------------------------
DEFINE OSCCAL_1K 1  'bu komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor
'-------------------------------------------------------------------------------

GPIO=%00000000
TRISIO=%00000100
'-------------------------
on interrupt goto kesme
OPTION_REG.7=0     
INTCON=%10010000
ioc=%00000100 'Set interrupt on change to GP2
CMCON = 7
ANSEL = 0

'-------------------------------------------------------------------------------
symbol GIRIS=gpio.2
symbol LED=gpio.0
POZ VAR BYTE
SN VAR BYTE
DAK VAR BYTE
SAYAC VAR BYTE

'-------------------------------------------------------------------------------

BASLA:
           IF GIRIS=1 AND POZ=0 THEN
              SN=0:DAK=0:POZ=1
              LED=1
              ENDIF
           IF POZ=1 and GIRIS=1 THEN
             IF SN>0 or DAK>0 then
              SN=0:DAK=0
             ENDIF
           ENDIF
           GOTO BASLA
'----------------------------------------------------
DISABLE
KESME:
    if POZ=1 then
       SAYAC=SAYAC+1
       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 azalıyor
          IF SN=59 THEN 'saniye sıfırdan küçük olmuş ise 1 dakika süre geçti ohalde
            SN=0 ' saniye tekrar 59 a set ediliyor
            DAK=DAK+1 ' dakika değeri bir azalıyor
            IF DAK=1 then 'dakika 1olmuş ise
              DAK=0:POZ=0:LED=0
            ENDIF
          endif
       endif   
    endif       
         INTCON.1=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
       




END

12F675 de belli bi zaman gecikmesi ve pozisyon kesmesi yapmak istiyorum fakat yukarıdaki kodlarda led yanıyor ama sönmüyor
bi bakabilirmisiniz nerde hata yapıyorum.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#1
bu iletiyi sildim
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

onurinci

sigortalarta WDT açık bir kapatıp denernisiniz..

ete

Çok kollu hatalar zinciri hazırlamışsın. Aktif ettiğin kesme ,int kesmesi yani portb.0 kesmesi. Biryandan ideğişiklik kesmesi aktif etmişsin . Ama kesme kısmında tmr0 kesmesine yöre işlem yapmışsın. Ne yaptığnı yada yapmak istediğini anlamadım.
Ete

elektro77

bir tuş ile bir ledi 1 dakika yanık bırakmak istiyorum.
aynı zamanda led yanıkken tuşa basılırsa zamanı resetlemesini istiyorum hocam.
tuşu hareket sensörü gibi düşünün ledide hareket sensörünün ışığı olarak düşünün.
ışık yanerken hareket varsa zaman resetlenip tekrar baştan saymaya başlayacak ve 1 dakikayı doldurduğunda hareket yoksa led sönecek.
burda yaptığım hatayı farkettim INTCON.1=0 bu kodu INTCON.2=0 yapınca kısmen çalıştı.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Bir kaç şekilde yapılabilir bu. En iyi iki seçeneğin var. Her iki alternatifte ortak olan nokta buton kontrolü.
PORTB.0 pinine bir buton bağlayacaksın. PORTB.1 pininede bir led.
Buton pullup lı olarak çalışacak ve PORTB dahili pullup ları aktive ederek ayrıca pullup direnci kullanmayacaksın.
Bunun için OPTION_REG.7=0 vermen yeterli oluyor. Ancak aşağıdaki alternatiflerden birisi olan TMR0 sayacının kullanılması seçeneğinde Option Regsterine başka değerler de verileceği için dikkat etmen gerekiyor. Aslınd aikinci alternatif TMR1 sayacını kullanmaya yönelik. Bu nedenle direk Option registerine %00000111 değerini versen olabilir. (Option_Reg=%00000111)
Gelelim alternatiflere burada yalnızca TMR0 alternatifini detaylı vereceğim. Diğeri biraz daha karmaşık ama yinede açıklamasını vereceğim.
1. TMR0 sayacını kullanıp her 50 ms de bir kesme oluşturmak. Kesmeleri sayarak 20 kesmesonra ledi söndürmek. Tabiiki kesmeyi butona basıldıktan sonra aktive etmek gerekir.
Butona basıldığı zaman önce led'in önceden yakılıp yakılmadığını kontrol etmek gerekiyor. Zira aynı buton yakılmış ledi söndürecek ve sayacı resetleyecek. O halde şöyle bir buton kontrolü olması gerekir.

IF TUS=0 then
  IF LED=1 then
     LED=0         '....ledi söndürüyoruz
     INTCON=0   '....kesmeleride kapatıyoruz
     goto atla 'atla etiketine gönderiyoruz
  Endif
  LED=1
  KES=0 'kesme sayacını sıfırladık
  INTCON=%10100000  'tmr0 kesmesini aktive ettik
  TMR0=60  'önyükleme değerini verdik
Endif

Programın başında kesmeleri açmayacağız ama kesme olduğunda programın nereye gitmesi gerektiğini söyleyeceğiz.
Yani INTCON=0 ve ON INTERRUPT GOTO KESME komutları verilmeli.

Kesme kısmında ise
Disable
KESME:
            KES=KES+1
             IF KES=20 then'20 tane kesme 20x50=1000 ms yani 1 sn olacağı için
                Kes=0
                Led=0
                INTCON=0
             ENDIF
             TMR0=60
             INTCON.2=0
             RESUME
             ENABLE   

Şeklinde olacaktır.

İkinci alternatifte TMR1 sayacını her 100 ms de bir kesme oluşturacak şekilde kuracaksın. Bütün fark bu. Diğerleri aynı.

Ete

elektro77

Hocam yazdıklarıma baktım da biraz karmaşık anlatmışım galiba.Çok özür dilerim.
Led yanıkken tuşa basılırsa ledin sönmesine gerek yoktu.
led yanıkken tuşa basılırsa sadece zaman 0 dan başlayacak. led yanık kalmaya devam edecek.
piyasade satılan hareket sensörlü ışık mantığı ile aynı.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

onurinci

#7
bu kaprisli işlemci, PullUp resistörleri için WPU registerine ihtiyaç duyuyor..

OPTION_REG.7= 0 : WPU= %000001

elektro77

#8
hocam bu kesmeler hangi komutlarla nasıl ve neye göre açılıyor. Özellikle de kesme aktive etme ayarları nasıl kullanılır
birde şu kesme işini halk dilinde örnekleyerek anlatabilir misiniz.
internetteki örneklerden ve sizin sayenizde kopyala yapıştır yolu ile yapıyorum bir şeyler ama, neyi nasıl yapıp nasıl yapmadığımın farkında bile değilim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Sitede ders notları var kesme konusunu incele.
Ete

Powered by EzPortal