SLEEP KOMUTU

Başlatan . Kağan, 19 Ekim 2014, 22:07:45

. Kağan

ETEPIC forumda bile birçok kez açılmış bir konu biliyorum. Ama bunların hepsini okusam da bazı soru işaretleri kalıyor.

1) SLEEP komutu WDT açık olmadan çalışmıyor. Bu doğrumu?
2) SLEEP komutu çalışırken TIMER0 saymaya devam ediyor.

Şimdi, deniyor ki bir süre sonra TMR0 de taşma oluşacak. Bu taşmanın oluşmasını nasıl engellerim. Bu SLEEP komutu datashette anlatolırken hem Timer1 den Hemde Timer0 dan bahsediliyor. Bunuda anlayamadım. :(

12F675 in datasheetinde
Alıntı YapTimer1 can only operate during Sleep when setup in
Asynchronous Counter mode. In this mode, an external
crystal or clock source can be used to increment the
counter. To setup the timer to wake the device:
• Timer1 must be on (T1CON<0>)
• TMR1IE bit (PIE1<0>) must be set
• PEIE bit (INTCON<6>) must be set
The device will wake-up on an overflow. If the GIE bit
(INTCON<7>) is set, the device will wake-up and jump
to the Interrupt Service Routine on an overflow.
diyor. Diyor da aşağıdaki ayar nasıl yapılır bilmiyorum.

Alıntı YapTimer0 Interrupt
A Timer0 interrupt is generated when the TMR0
register timer/counter overflows from FFh to 00h. This
overflow sets the T0IF bit. The interrupt can be masked
by clearing the T0IE bit (INTCON<5>). The T0IF bit
(INTCON<2>) must be cleared in software by the
Timer0 module Interrupt Service Routine before reenabling
this interrupt. The Timer0 interrupt cannot
wake the processor from Sleep since the timer is shutoff
during Sleep.

Ayrıca REGISTER 2-1: STATUS: STATUS REGISTER de ayarlanması gerekiyormuş. Ama hangi komutla ve nasıl?

Bunlardan birinin ayarlanması yetiyor mu, yoksa bir sürü REGISTER ayarı yapmam mı gerekiyor.

Ayrıca bazı kaynaklar SLEEP kullanımından önce CLRWDT komutunun kullanılmasını öneriyor. Bu doğrumu? (http://antrak.org.tr/index.php?option=com_content&view=article&id=1040:pic16c84pic16f84-zerine-bir-tez-almas&catid=16:ocak13&Itemid=28)

Ayrıca bir yerde SLEEP kullanılacaksa MCLR pininin mutlaka lojik 1 e çekilmesi gerektiği söylenmiş.

ete

Ortada biraz kavram kargaşası oluşmuş.
SLEEP komutu PBP da iki türlü kullanılıyor. Birincisi SLEEP SURE şeklinde ki bu normal PBP komutudur ve işlemci bu komutu görünce Uyku moduna (düşük akım çekme modu aslında) giriyor ve verilen süre (sn cinsinden) sonunda uykudan uyanıp normal moda geçiyor. Bu komutun çalıştırmak için işlemci geri planda WDT sayacını kullanıyor. Bu nedenle bu komut kullanılacak ise sigorta ayarlarından WDT_ON yapılmalıdır. Aksi halde komut işlev görmüyor.

İkinci komut @ SLEEP şeklinde verilen ve aslında bir Assembly komutudur. Bu komutu görünce işlemci aynı şekilde düşük akım çekme moduna giriyor ve uyanması için mutlaka bir kesme oluşması gerekiyor. Her türlü kesme bu uykudan uyanmak kullanılabiliyor.
Burada da WDT_ON olmalı. Çünki işlemci Uyku işlemlerini hep bu WDT sayacını kullanarak yapıyor.
Yukarıda 1. Timer sorusunda TMR1 sayacından bahsedilmiş. Açıklamaya bakılırsa TMR1 ancak dışarıdan puls alarak saydırıldığı zaman sayac değeri $FFFF den tekrar sıfıra dönerken kesmeyi oluşturuyor ve buda işlemcinin uykudan uyanmasını sağlıyor denilmiş. Bu durumda TMR1 sayacı dahili clk ile saydığında kesme oluşmayacak anlamınamı geliyor bunu denemedim ama araştıracağım.

AYnı şey TMR0 sayacı içine geçerli ama onu genel anlamda açıklayarak sayacın $FF den tekrar 0 konumuna geçmesi kesmeyi oluşturup işlemciyi uykudan çıkartır denilmiş.

Bunun dışında bu uyku modunda pek çok kere kullandığım PORTB.0 kesmesi de (8 pinlilerde INT kesmesi) işlemciyi uyku modundan çıkarmaktadır.
Unutmayın bu modda işlemci kendiliğinden uykudan çıkmaz. Ancak dış bir etken olursa işlemci uykudan çıkabilir.
OPTION registeri TMR0 sayacının bölme oranını ayarlar. Ayrıca sayacın dahili mi yoksa harici puls ile mi sayacağını da ayarlar. Konuyla alakası buradandır. Bu sayacı kesme için aktive etmek için;
Option registerinden bölme oranı verilerek sayacın nasıl sayacağını belirleriz.
INTCON registeri 7 ve 5 nolu bitlerini set ettinizmi sayac kesme oluşturacak şekilde ayarlanmış olur. Kesme bayrağı INTCON.2 bitindedir.

TMR1 kesmesi için ;
INTCON regsiteri 7 ve 6 nolu bitleri set edilir.
T1CON registerinden Bölme oranı ile sayacın haricimi yoksa dahili pulslarla lamı sayacağını ayarlarsınız.
Sonra PIE1 registerinin 5 nolu bitini set ettinizmi sayac kesme için ayarlanmış olur. Kesme bayrağı ise PIR1.5 nolu bitindedir.

Ete

. Kağan

#2
Alıntı YapTMR1 kesmesi için ;
INTCON regsiteri 7 ve 6 nolu bitleri set edilir.

Bu komut:

INTCON = %1010000  Şeklinde mi yazılıyor. Yani böyle yazdığımızda 7. ve 5. bitleri set etmiş oluyoruz doğrumu. Eğer bu yazdığım doğru ise bu yazılmadığında SLEEP komutunun çalışmaması gerekmez mi? Yoksa pic in içinde INTCON register ayarı verilmediğinde kullanılan standart bir ayarmı var?   

Ayrıca TIMER1 kesmesinin T1CON diye bir register ayarı var. Tımer0 kesmesinin böyle bir register ayarı yokmu?

Alıntı YapT1CON registerinden Bölme oranı ile sayacın haricimi yoksa dahili pulslarla lamı sayacağını ayarlarsınız.

Program başında T1CON ayarlaması yapılmazsa bir standart değeri varmı dır. Çünkü genelde yapmıyorum. :??
Yapmam gerekirse örneğin:

T1CON = % 00001101 şeklinde kullanabilirmiyiz. Bu tanımlamada sıfırıncı bit sıfır olursa TIMER1 durduruluyormuş. Timer1' i durdurmak niçin gerekebilir.

ete

Bir register bitini set etmek demek o biti "1" yapmak demektir. Bu durumda yazdığın doğru oluyor.
Olayları bir birine bağlamayın. Bu yazılmazsa Sleep komutu çalışmaz demek genelleme yapmak demektirki hiç alakası yok. Zira Sleep komutu 2 çeşittir dedim. PBP komutu olarak kullandığın zaman zaten hiç bir timer ile konunun alakası yoktur. Yalnızca WDT kullanır Buda bir sayıcıdır amacı işlemciyi korumak ve kurtarmaktır zaten.

@ SLEEP şeklinde kullandığın zamanda alakası yok. Ben bu komutu verip işlemciyi uykuya sokup sonra PORTB.0 kesmesi ile uyandıracak isem yine Timer larla işim yok demektir. Sonuç olark kimi kullanacak isem onu devreye sokmam gerekir.
@ SLEEP komutu kullanıp onu TMR0 kesmesi ile uyandıracak isem o zaman TMR0 ayarlamam gerekiyor. Yeri gelmiş iken T0CON diye bir register yok. Yalnızca ileri seviye işlemcilerde bulunuyor. Buna sanırım 18F seriside dahil. Sanırım diyorum çünki hepsini incelemedim. Kullandıklarımda var idi. Data sheet açıp listesinde T0CON varmı bakmak lazım.

T1CON registerine Data Sheet den bakıp hangi bit ne iş görüyor anlamak zor olmasa gerek. Ben aklımda tutmam lazım olunca açarım Data Sheet'i bakarım ve ayarlarım hepsi bu.
TMR1 sayacı kullanıcı kontrolünde olanbir sayaçtır. Bu nedenle durdurulup tekrar çalıştırılabilmesi gerekir. Sebebi açık bir zaman dilimi ölçmeniz gerekiyor. Sayac sürekli çalışırsa nasıl ölçeceksiniz. Halbuki dilim başladığında sayacı başlatır bittiğinde de durdurursunuz. TMR1 register değerleri durunca değişmeyeceği için komut gecikmelerinden de etkilenmemiş olur. İstediğiniz zaman onları alıp kullanırsınız. TMR0 durdurulamayan bir sayactır. Onu kullanırken dikkat etmek ve zaman geçirmeden değer transferi yapmak gerekir. Kısaca sayacı durdurmak iyi bir özelliktir.

T1CON standart değeri elbette vardır ama ben nedir araştırmadım. Hep kendim değer veririm lazım olunca.

Ete

Powered by EzPortal