12f675 uyku modu

Başlatan muyat, 25 Ocak 2024, 23:40:37

muyat

Aşagıdaki programda bir butona 4 saniye içinde 2 kez basınca çıkıştaki lamba 1 saniye yanıp sönüyor.
Bu şekilde pic yaklaşık 10 miliamper gibi akım çekiyor.
Pici uyku moduna sokarak çekilen akımı biraz daha nasıl düşürebilirim?
Anlatarak düzenleyebilir misiniz kodları..Örnegin lamba sönünce pic uyku moduna geçecek,ama kapı açma butonuna basınca da tekrar uyku modundan çıkacak

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON &_MCLRE_OFF & _BODEN_ON & _CP_ON
DEFINE OSCCAL_1K 1
DEFINE OSC 4
CMCON =7 ' Comparators off
ANSEL =0
trisio = %00011000
GPIO=0
SYMBOL KAPIACMA=GPIO.3
SYMBOL LAMBA= GPIO.2
SYMBOL YESIL=GPIO.4
PARAZIT VAR WORD
I VAR WORD
HAM var WORD
SURE VAR WORD
PARONAY VAR BIT
SAYIM VAR WORD
SAYAC VAR BYTE
BOR VAR BIT
ONAY VAR BIT
KONTROL VAR BIT
PARONAYC VAR BIT
YOL VAR BIT
PAUSE 100
CLEAR
BASLA:
BOR=0
LOW LAMBA
GIT:
IF KAPIACMA=0 then
GOSUB PARAZITSAY
IF PARONAY=1 THEN
PARONAY=0
WHILE KAPIACMA=0:WEND
PAUSE 25
IF KAPIACMA=1 THEN GOSUB PARAZIT2
IF PARONAYC=1 THEN
PARONAYC=0
SAYAC=SAYAC+1
ENDIF
ENDIF
IF SAYAC=2 THEN
GOSUB ANM1   
IF BOR=1 THEN CIK
ENDIF 'SAYAC=2 SONU
FOR SURE=0 TO 4000                   'TETIKTEN SONRA IKINCI TETIK GELMEZSE SIFIRLA
IF KAPIACMA=0 THEN GIT
PAUSE 1
NEXT
M4:
SAYAC=0
ENDIF
 
CIK:
BOR=0
GOTO BASLA
 
ANM1:
                      'Aynalar kapanıyor
HIGH LAMBA
PAUSE 1000
LOW LAMBA
pause 500
SAYAC=0
BOR=1
RETURN
PARAZITSAY:
SAYIM=SAYIM+1               'sayım yap
PAUSE 5                 
IF SAYIM>=7 THEN          '59 ye kadar saydı ise
PARONAY=1                      'parazit değil onayla
GOTO SON                     
ELSE
PARONAY=0
ENDIF
IF KAPIACMA=0 THEN GOTO PARAZITSAY ' beyaz veya buton veya mor'a artı geliyorsa geri dön
SON:
SAYIM=0
RETURN
PARAZIT2:
SAYIM=SAYIM+1               'sayım yap
PAUSE 5               
IF SAYIM>=15 THEN          '59 ye kadar saydı ise
PARONAYC=1                     'parazit değil onayla
GOTO SON8                     
ELSE
PARONAYC=0
ENDIF
IF KAPIACMA=1 THEN GOTO PARAZIT2' beyaz veya buton veya mor'a artı geliyorsa geri dön
SON8:
SAYIM=0
RETURN
END

ete

#1
Uyku durumu özel bir durumdur ve ancak bir harici giriş kesmesi (INT veya Port değişiklik kesmelerinden birisi) işlemciyi bu uyku durumundan çıkartabilir.
Ancak programın şu anda bu işe pek uygun değil gibi.
İşlemci uyku moduna girince zaman sayamaz. Bu durumda belkide en akıllıca olanı süreli uykuya sokmak. Zira iki türlü uyku moduna giriş var.
1. cisi @Sleep  yani asm kodu ile uykuya sokmak ki bu durumda ancak dış kesmeler işlemciyi uykudan çıkartır.
2. İkincisi Sleep 240 gibi bir komut ile işlemci 240 sn boyunca uykuda kalır ve sonunda kendiliğinden uyku modundan çıkar.

Uyku modunda bu işlemci nano amper seviyelerinde bir akımçeker. Ancak devrede bağlı çevre birimlerin çekebileceği akımlara dikkat etmek gerekir. Uykuya girmeden önce belkide onları kapatmak uyanınca açık olanları açmak akıllıca olabilir.

İşine pek yaramasa da INT kesmesi ile uyku moduna giriş çıkış işlemini anlatayım yinede.
Kurulum işlemlerinde INT kesmesini aktif edeceksin (veya port değişiklik kesmesini) sonra kesme kısmına istersen kod eklersin istersen bir şey eklemeden sadece bayrağı sıfırlayıp kesmeden çıkarsın. Olayların yürüme şekli şöyledir.
Programın uygun bir yerinde işlemciyi ;
@ SLEEP komutunu vererek uykuya sokarsın.
Bir kesme oluştuğunda önce işlemci uyanır sonra kesme etiketine gider oradaki yapılacakları yapıp Sleep komutundan bir sonraki komuta yada satıra geri gelir işlere kaldığı yerden devam eder.
Süreli uyku modunda kesme aktivasyonu gerekmez. Komutu verdiğin noktada işlemci uykuya girer ve Süre sonunda uykudan uyanır. Kaldığı yerden işlemlerne devam eder. Bu modda uykudaki zaman sayma işlemini WDT yapar bu nedenle Config ayarlarında bu sayac WDT_ON şeklinde aktif yapılmalıdır.
Aslında he riki modda da WDT_ON olmalıdır.
Hepsi bu kadar anlaşılmayan yer olursa tekrar anlatayım.

Ete

Powered by EzPortal