16F887 sleep modu

Başlatan blueboard, 02 Ocak 2015, 19:11:19

blueboard

Ete Hocam , 16F887 'de enerji tasarrufu sağlamak için uyku moduna almak istiyorum.Tabi gerektiğinde de uykudan çıkması lazım. Bunu nasıl yapabilirim.Program aşağıdaki gibidir.

TRISB=%11111111       
TRISC=%00000000   
TRISA=%00000000
porta=0
portc=0           


SYMBOL BUTON0=PORTB.0
SYMBOL BUTON1=PORTB.1
SYMBOL BUTON3=PORTB.3
SYMBOL BUTON4=PORTB.4
SYMBOL BUTON5=PORTB.5
SYMBOL BUTON6=PORTB.6


anadongu:
IF BUTON0=0 then  portc.1=1
IF BUTON1=0 then   portc.2=1
IF BUTON3=0 then   portc.3=1
IF BUTON4=0 then   portc.4=1
IF BUTON5=0 then   portc.5=1
IF BUTON6=0 then   portc.6=1
PORTC=%00000000
GOTO anadongu

ete

Uyku modu basıc de iki şekilde aktive edilebiliyor, birincisi sabit süreli uyku kod. Bu sistemde işlemciyi belirli bir süre uykuya sokabiliyorsunuz. Mesela sleep 60 şeklindeki komut işlemciyi 60 sn boyunca uyku moduna alır ve süre sonunda işlemci otomatik uyanır. Sleep ve yanında saniye cinsinden verilen değer şeklinde kullanılır.

İkini sistemde ise işlemci asm komutu ile uykuya alınır ve ancak bir kesme oluşturularak uykudan uyandırılır. Bu sistemde kesme oluşuncaya kadar işlemci uykuda kalır.
Kesme , zaman kesmesi (Tmr0 veya Tmr1 kesmeler) , prob.0 kesmesi, porb değişiklik kesmesi, adc kesmesi gibi kesmeler işlemciyi uykudan uyandıracaktır.
Uyku moduna sokmak için ,
@ sleep
Şeklinde komut satırı kullanmak yeterlidir. Uyanma kesme içinde olur.

Ete

blueboard

#2
Ete Hocam , 1. yöntem bana uygun değil. Çünkü pic'i 100 sn liğine uykuya aldığımı düşünelim.Bu 100 sn içinde butona basılmış ta olsa pic bir şey yapmayacaktır.Bundan dolayı 2. yöntem uygun geldi.Belirttiklerinizden yola çıkarak ve ASM kullanarak sleep kodunu şu şekilde yazdım ;doğru mudur?

TRISB=%11111111       
TRISC=%00000000   
TRISA=%00000000
porta=0
portc=0           


SYMBOL BUTON0=PORTB.0
SYMBOL BUTON1=PORTB.1
SYMBOL BUTON3=PORTB.3
SYMBOL BUTON4=PORTB.4
SYMBOL BUTON5=PORTB.5
SYMBOL BUTON6=PORTB.6


anadongu:
IF BUTON0=0 then  portc.1=1
IF BUTON1=0 then   portc.2=1
IF BUTON3=0 then   portc.3=1
IF BUTON4=0 then   portc.4=1
IF BUTON5=0 then   portc.5=1
IF BUTON6=0 then   portc.6=1
PORTC=%00000000
INTCON.0 = 0
ASM
@ sleep
ENDASM
GOTO anadongu

Ete Hocam,son bir şey daha sormak istiyorum. Sleep komutunun yazılışı doğruysa bu durumda pic butona basılmadığı an hemen uykuya giriyor gibi geldi.Bu durum normal midir? Yoksa belli bir süre sonunda butona basılmadığı takdirde mi uykuya almak gerekir?Tteşekkürler.

ete

İkinci metod da uykudan kesme oluşunca uyanacağını üzerine basa basa belirtmiştim.
Yazdığın kodda uykuya alma işi tamam. Ancak o hali ile işlemci uykuda kalır ve kesinlikle uyanmaz. Çünki hiç bir kesme aktive edilmemiş gözüküyor.

İşlemciyi gecikmeli uykuya sokmanın ne gibi bir avantajı var daha doğrusu varmı sence ? Bence yok neyi bekleyecek beklenen bir şey var ise o beklenen oluştuktan sonra sokulması uygun olur. Ama yoksa hemen uykuya sokmak daha avantajlıdır. Zira uyku düşük akım anlamına geliyor ve boşuna beklemeninde bir anlamı yok  bence.

Programında kesmelerden birini aktif hale getir.

Ete

blueboard

Ete Hocam, benim düşündüğüm portb.0 ile portb.6 tuşlarından herhangi birine bağlı butona basılmadığı sürece uykuda kalması, bu butonlardan herhangi birine basıldığında ise uyanması şeklinde olacaktır. Bu durumda en uygun kesme yöntemi hangisi olacaktır? Teşekkür ederim.

ete

Hem PORTB.0 kesmesini açacaksın hemde PORTB 4-7 değişiklik kesmesini açacaksın. Başka yolu yok.

Ete

blueboard

#6
Ete Hocam, anlatıklarınız ve kesme dersinde verdiğiniz bilgilere göre bir şeyler yapmaya çalıştım.Bunları ekteki dosyada görebilirsiniz. PORTB.0 kesmesinde sorun yok gibime geliyor.Ancak PORTB 4-7 değişiklik kesmesinde tıkandım ve tereddüt ettiğim yerler oldu. Şöyle ki:
B0 kesmesinin aktif olabilmesi için INTCON=%10010000 yazdım.Burada sorun olmadığını düşünüyorum( Bu arada INTCON yazmacı 16F883'te bu şekilde mi yazılıyor bilmiyorum. Bu konuda datasheet'ine baktım ama bir şey anlamadım. Bu bilgileri sizin kesme dersinizde kullandığınız 16F628 kodlarından aldım)

Sıra PORTB 4-7 değişiklik kesmesine gelince yaşadığım tereddütler şunlar oldu:
PORTB 4-7 kesmesinin aktif olması için gereken şartlardan biri " Intcon yazmaçının 3 biti bu kesme için ayrılmıştır. Bu bit 1 yapılarak kesme aktif edilir.   INTCON=%10001000   değeri verilerek kesme aktif hale getirilecek." idi.

Ben B0 kesmesinde INTCON yazmacını "INTCON=%10010000" olarak belirlemiştim. Ama PORTB 4-7 kesmesi için de INTCON yazmacının "INTCON=%10001000" yapılması gerekiyor. Bu durumda iki yazmacı birleştirip   INTCON=%10011000 olarak mı yazmalıyım?

Bir başka husu da şu: BO kesmesinde "INTCON.1=0"  yazarak RB0/INT Bayrağını (flag) siliyoruz.
Ama RB 4-7 kesmesinde ise "INTCON.0=0 " yazarak  kesmeden dolayı 1 olan bayrağı tekrar sıfırlamamız gerekiyor. Bu iki değeri uygun olarak nasıl yazmalıyım?

Bir de basla döngüsünde direkt olarak asm de sleep komutunu yazarak asıl döngünün burada kalmasını sağladım. Bu kısımda da hatam var mı?

Yazdığım kodla BO  pinine bağlı butona basıldığında pic uykudan çıkıyor ve ilgili ledi yakıyor. Ama diğer pinler uykudan çıkmıyor.

Teşekkür ederim.

onurinci

Pic projede aradım fakat bulamadım,herhalde kayboldu

o yıllarda bir arkadaş port'un diğer Nible'sine 4 adet 4148 diyod atıp,bunları portB.0 kesmesine bağlayıp hardware olarak halletmişti.

blueboard

#8
Ete Hocam benim programı inceleyip hatalarımı bildirecektir. Böylece forumda da kesme ile ilgili değişik bir örnek olacaktır.

ete

Hata bildirmeyeceğim. Ne olması gerekiyorsa onu söyleyeceğim.
Birden fazla kesme aktive edilecek ise o kesmelere ait bitler set edilir.
Bu durumda INTCON.7 global kesmeleri açıyor set edilecek
INTCON.4 , PortB.0 kesmesini açıyor set edilmesi gerekiyor.
INTCON.3 , PORTB değişiklik kesmesini açıyor oda set edilecek. Bu durumda INTCON registerine INTCON=%10011000
şeklinde değer vermek gerekecektir.

BASLA satırından evvel ON INTERRUPT GOTO KESME komutunu vermek gerekiyor.
Geriye Kesme bayraklarının kontrolü kalıyor.
PORTB.0 kesme bayrağı INTCON.1
Değişiklik kesme bayrağı INTCON.0 bitleri olduğuna göre kesme sonunda hangi kesme oluşmuş ise ona ait kesme bayrağının sıfırlanması gerekiyor.
PORTB değişiklik kesmesi PORT'un önceki değeri ile anlık değeri sürekli karşılaştırılarak oluşturulur. Bu nedenle kesmeden çıkmadan önce DURUM=PORTB şeklinde portun o andaki durumu bir değişkene aktarılarak okutulmalıdır. Sonrasında DURUM değeri değişir değişmez program kesmeyi oluşturacaktır.
Hepsi bu kadar.

Ete

blueboard

Ete Hocam, son belirttiklerinize göre tekrar düzenledim. Ama Port B 4-7 kesmesinde hâla sorun var.Yeni dosyaları ekledim.

ete

Bazı işlerde işlemcinin ne kadar önemli olduğunu göstergesi bu projedir. Kullanılan işlemci 16F883. Bu işlemcide PORTB değişiklik kesmesi bütün PORTB pinlerine uygulanabiliyor. Bu durumda ayrıca birde PORTB.0 (INT0) kesmesi açmaya gerek kalmıyor. Diğer taraftan işlemcinin ekstra özellikleri de mevcut Pullup dirençleri özel bir register ile ayarlanıyor. Dahili OSC si 8 Mhz de çalışabiliyor bunlardan yararlanmak gerekiyor elbette.
Bir şey denerken fantaziden kaçınmanızı öneririm. Bu tür şeyler sıkıntı çıkartır. Mesela bu devrede ledelrin bir kısmı farklı renklerde kullanılmış Özellikle mavi renkler çalışma volatjı açısından daha yüksek voltajla çalışır. Ama akım sınırlama direnci hepsinde aynı kullanılmış. Hal böyle olunca da ledin yanıp yanmadığını anlama çok zorlaşıyor. Led ile deneme yaparken en güzeli sarı led kullanmaktır. Çok belirgin yanar ve sizde bir şey kaçırmazsnız.

Sonuçta sistemi bu anlattıklarıma göre çalıştırdım. Düzenlediğim sistem buton olarak bütün PORTB pinlerini kullanmaktadır. Karşılığında ise Bütün PORTC pinlerinde bağlı ledleri basılan tusa bağlı olarak yakmaktadır. Bunun iiçin 8 adet if komutu yazmak yerine;
PORTC=~PORTB  yani portB nin terslenmiş halini PortC ye veriyoruz. Hangi butona basmış isek ona ait pin LOW olmakta ama tersini aldığımız için o pin HIGH olarak kullanılmaktadır.
SOnra yanma gecikmesini verip ardından PORTC=0 deyip işi bitirebilirsiniz. Bende öyle yaptım.
Verdiğim deneme devresini kullanmanızı öneririm ledleri ve butonları tabii sırasında yerleştirdim Ledleri de hep sarı kullandım. Görülebilir olsunlar diye.

Ete

blueboard

Ete Hocam, teşekkür ederim. Hemen deneyeceğim.

blueboard

Ete Hocam, mükemmel çalışıyor .Teşekkür ederim.

Powered by EzPortal