Pic 18f46k22 Timer 1 ile uyanmıyor?

themumy_10

Üye
Katılım
20 Ağu 2013
Mesajlar
38
Puanları
1
Arkadaşlar iyi çalışmalar. 18f46k22 ile pilli uygulama yapmaya çalışıyorum. Temel mantığını 16f877a ile denedim uygun çalışıyor ama bu pic de bir eksiğim var. Amaç 16 sn de bir kez uyanıp işlem yapmak. Bunun için timer 1 ucuna 32768 lik saat sinyali uyguladım.(Proteus için). 16f877a işlemi gayet düzgün yapıyor. Şu şekilde:
(Serdar Çiçek alıntısı)
#int_timer1
void timer1_kesme ()
{ output_high(pin_b0); output_high(pin_b1);}
......
setup_timer_1(T1_EXTERNAL| T1_DIV_BY_8);
set_timer1(0); enable_interrupts(INT_timer1); enable_interrupts(GLOBAL);
while(1) { output_toggle(pin_b5); delay_ms(500); sleep();}

18f46k22 ise şöyle:
#int_timer1 // Timer1 kesmesi
void timer1_kesme () // Kesme fonksiyonu ismi
{output_toggle(pin_b0); output_toggle(pin_b1);}
....
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); set_timer1(0); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL);
while(TRUE)
{output_toggle(pin_b5); delay_ms(500); sleep();}

Hal bu iken bağlantılar da uygun çalışıyor ama sleep komutu olmadan. Yani 18f46k22 uyku modundan çıkamıyor. Uyku modunda olmaz ise kesme işlevini yerine getiriyor. Uyku komutunu yazınca 16 f877a ya gelen sinyal uyandırırken bu pic uyanmıyor. Datasheet açıkça taşma olduğunda uyanacağını yazıyor. WDT kapalı hemen herşey kapalı ama çözüm bulamadım. Bir sitede aynı bacağa bağlı diğer modüllerden falan kaynaklanabileceği yazılmış ama tam bir sebep bulamadım. CCS için Pic Wizard ile kurcaladığım ve .h dosyası ile datasheet i birleştirince bu pic için özel bir dahili RTCC yani hazır bir saat devresi barındırdığını anladım. Ama örnek kod bulamadığım gibi Pic Wizard 'da da ENABLE yapılmıyor. Sadece .h dosyasında kodlar var ama bağlantı şeması yada herhangi bir örnek göremedim. Amaç sadece yaptığı bu kesmeyi uykudan çıkmak için de kullanmak. RTCC yada diğer modül kullanmasam da olur. Zaten T1_DIV_BY_1 ile istediğim zamanlamayı yapabiliyorum. Ama uykudan uyandıracak arkadaşların tavsiye fikir,düşünce her ne olursa iki satır açıklayabilirseniz bir şeyler öğrenmiş olurum. Şimdiden işi gücü bırakıp ilgilenen tüm arkadaşlara teşekkürler.
 
Hocam cevabınız için teşekkürler öncelikle. Aynı forumu bende inceledim. Bahsedilen yorumun altındaki diğer yoruma da baktım ama tam bir sonuç yok ne yazık ki. Bende tavsiyeniz üzerine farklı versiyon yükledim. Ama genelde versiyonlar eski olduğundan derleyici 18f46k22 dosyasını yeni bir model olduğu için derleyemiyor. Yani eski sürümlerde bu pic yok. Bugün 18f45k22 ile denedim yine aynı sonucu aldım. Fakat farklı bir kesme yani RBO ile denedim pic uyanıp işlemi yapıyor. Ustalarımdan değerli yardımlarını bekliyorum. Cevabınız ve ilginiz için tekrar teşekkürler.
 
Hocam sağolun ilginiz ve düşünüp cevap verdiğiniz için. Problem kesme oluşmaması değil bahsettiğiniz kaynakta yazdığı gibi kesmeler yani Timer 1 16 bitlik bir kesme ve uçklarına 32768 lik bir saat sinyali uygulayınca taşma durumunda kesme üretiyor. Problem kesmenin datasheet'de uyanacağı yazmasına rağmen sleep komutundan sonra uyandırılamaması. Tekrar özetleyecek olursak uyku moduna girmezsek kesme çalışıp işlem yapılıyor ama kesme uykudan uyandırmayı yapmıyor. Eksik olan yeri bulamıyorum ne yazık ki. Değerli ustalarımdan yardım bekliyorum. İlginiz için çok teşekkürler.
 
Hocam sağolun ilginiz ve düşünüp cevap verdiğiniz için. Problem kesme oluşmaması değil bahsettiğiniz kaynakta yazdığı gibi kesmeler yani Timer 1 16 bitlik bir kesme ve uçklarına 32768 lik bir saat sinyali uygulayınca taşma durumunda kesme üretiyor. Problem kesmenin datasheet'de uyanacağı yazmasına rağmen sleep komutundan sonra uyandırılamaması. Tekrar özetleyecek olursak uyku moduna girmezsek kesme çalışıp işlem yapılıyor ama kesme uykudan uyandırmayı yapmıyor. Eksik olan yeri bulamıyorum ne yazık ki. Değerli ustalarımdan yardım bekliyorum. İlginiz için çok teşekkürler.
datasheetinde şöyle bir ibare var hocam buna bi yoğunlaş istersen
"When a wake event occurs in Sleep mode (by interrupt,
Reset or WDT time-out), the device will not be clocked
until the clock source selected by the SCS<1:0> bits
becomes ready" buradan anladığım kadarıyla SCS <1:0> denen bitler hazır olmadan uyanmayacağını belirtiyor. Galiba bu bitler aktif edildiğinde pice tekrar clock sinyali uygulanıp uyanıyor. Bu bitler OSCCON registerında 1 ve 0 nolu bitlermiş.
 
Yani taşma sonucunda kesme de oluşsa SCS bitleri ile osilatör (harici veya dahili) seçilip o şekilde uyandırılacak diye düşünüyorum
 
Hocam sağolun tekrar. Demek istediğiniz sanırım uyanma için yaşanacak gecikmeyi belirtmek için. Yani osilatör hazır hale gelene kadar işlem yapmayacak. O cümlenin devamını da inceledim şimdi. Devamında bahsedilen olayın şekil ile açıklaması mevcut. Yani bir iki satırlık komut gecikmesi mevcut oluyor. Bunu da bir iki satır daha yazıp tekrar denedim ama sonuç hüsran yine. Hatta daha açık belirteyim RB1 kesmesi ile uyanıp aynı işlemi yapıyor. Yani ikisi de aynı işlemi yapacak ama RB1 ile uyanıp sorunsuz işlem yapıyor ama Timer ile olmuyor. Hatta RB 1 e basılı tutunca timer kesmesi yine çalışıyor. Yani basılı iken pic çalıştığı için timer1 de kesme oluşturuyor. Ama Timer 1 uyandıramıyor.
 
Yanlış mı okudum datasheeti ama timer1 kesmesi göremedim ama timer0 kesmesi var. Acaba timer1 kesme yapmıyormu?
 
Hocam bu şekilde yazıyor ama ben yanlış anlamış olabilirim bir şeyleri :
Arkadaşlar ben uyanacağını anladım ama özel bir şey mi var:

12.9 Timer1/3/5 Operation During Sleep
Timer1/3/5 can only operate during Sleep when set up
in Asynchronous Counter mode. In this mode, an
external crystal or clock source can be used to
increment the counter. To set up the timer to wake the
device:
• TMRxON bit of the TxCON register must be set
• TMRxIE bit of the PIE1/2/5 register must be set
• PEIE/GIEL bit of the INTCON register must be set
• TxSYNC bit of the TxCON register must be set
• TMRxCS bits of the TxCON register must be
configured
• TxSOSCEN bit of the TxCON register must be
configured
The device will wake-up on an overflow and execute
the next instruction. If the GIE/GIEH bit of the INTCON
register is set, the device will call the Interrupt Service
Routine.
The secondary oscillator will continue to operate in
Sleep regardless of the TxSYNC bit setting.

Sleep komutu uygulamadığım zaman çalışıyor. Olmasa o zaman da çalışmaz.
 

Forum istatistikleri

Konular
129,783
Mesajlar
930,063
Kullanıcılar
452,558
Son üye
MrYarakin

Yeni konular

Geri
Üst