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=%00000000TRISIO=%00000100'-------------------------on interrupt goto kesmeOPTION_REG.7=0      INTCON=%10010000ioc=%00000100 'Set interrupt on change to GP2CMCON = 7ANSEL = 0 '-------------------------------------------------------------------------------symbol GIRIS=gpio.2symbol LED=gpio.0POZ VAR BYTESN VAR BYTEDAK VAR BYTESAYAC 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'----------------------------------------------------DISABLEKESME:    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
DisableKESME:            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