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