PIC'i Uyutmak

Başlatan oongit, 07 Mart 2011, 17:51:28

oongit

Merhaba Arkadaşlar...

16F877 için konuşmak gerekirse; şöyle bir şey yapmak istiyorum. Ama ne şekilde olabileceği konusunda emin değilim. Yapmak istediğim tam olarak şu:

D0 pinine bağlı bir buton var. Bu butona basınca D1 pini HIGH olacak... Buraya kadar tamam. Ama butona tekrar basıldığında D1 pini LOW olacak ve PIC uyku moduna girecek. Daha sonra butona tekrar basılırsa D1'i HIGH yapacak ve uyku modundan çıkacak. Bu kodu nasıl oluşturmalıyım?

Teşekkürler...

Tagli

Uykudan uyanabilmek için kesme oluşması gerekli. D0 bacağından harici kesme alamayacağın için bu bacaktaki bir düğme ile PIC'i uyandırman mümkün değil. B0'ı kullanman gerekiyor. RB7:RB4 kesmesini de kullanabilirsin belki ama işler karışabilir.
Gökçe Tağlıoğlu

t2

Alıntı Yapharici kesme alamayacağın için bu bacaktaki bir düğme ile PIC'i uyandırman mümkün değil.
Şöyle yapılır:

uyu:
  sleep 100
  if pin=1 then gosub The_Job
goto uyu

Burada if satırı sleep 100 satırına nazaran çok az bir zaman harcar. akım sarfiyatı sıfıra yakındır. Pic periyodik olarak uyanır ve bakar. Neredeyse sürekli uyumuş gibi olur. istenirse 100ms uzatılabilir. fakat o zaman butona reaksiyon gecikmeli olacaktır.

t2

#3
The_Job:
  HIGH D1 
  while pin=1  ;bırakılana kadar bekle
  sleep 100
  wend
   
  repeat   ;basılana kadar bekle
   sleep 100
  until pin=1
  low D1 

return

Tagli

#4
Ah evet WDT'yi unutmuşum, özür dilerim.  :-[

Ama yine de bu periyodik bir uyanma sağlar. t2'nin önerdiği gibi uyandıktan sonra D0'a bakıp şart sağlanmıyorsa tekrar uyuyabilirsin. Ama, D0'daki değişime fazla gecikme olmadan tepki verebilmen için WDT prescaler'in düşük olması gerekir. 1:1 yapsan bile galiba 18 ms'de bir taşma yapar. Yani düğme basılmasını anlamanda 18 ms gecikebilirsin, bu sorun olur mu bunu bilemem. Ayrıca kodun normal çalışması sırasında da uygun yerlerde WDT'yi sıfırlaman gerekir, yoksa PIC resetlenir.

t2 "sleep 100" tam olarak ne yapıyor ve nasıl çalışıyor? WDT prescaler'i mi ayarlıyor?
Gökçe Tağlıoğlu

t2

Sleep çözünürlüğü milisaniye değil, saniye imiş.

bunun yerine picbasicpro'da  NAP kullanılabilir.

Nap 0 = 18mS
Nap 1 = 36mS
Nap 2 = 72mS
...

Alıntı YapNAP

Places the microcontroller into low power mode for short periods of time. During this NAP, power consumption is reduced to minimum. The listed periods are only approximate because the timing is derived from the Watchdog Timer which is R/C driven and can vary greatly from chip to chip and over temperature. Since NAP uses the Watchdog Timer, its timing is independent of the oscillator frequency.


Alıntı YapSLEEP

Place microcontroller into low power mode for Period seconds. Period is 16-bits, so delays can be up to 65,535 seconds (just over 18 hours). SLEEP uses the Watchdog Timer so it is independent of the actual oscillator frequency. The granularity is about 2.3 seconds and may vary based on device specifics and temperature. This variance is unlike the BASIC Stamp. The change was necessitated because when the PICmicro executes a Watchdog Timer reset, it resets many of the internal registers to predefined values. These values may differ greatly from what your program may expect. By running the SLEEP command uncalibrated, this issue is sidestepped.

Example

SLEEP 60 ' Sleep for about 1 minute



oongit

Eklemeyi unutmuşum, kusuruma bakmayın... Bu işlemi cihaza On-Off yaptırmak için kullanacağım. Bunun için Off konumunda uykuda olmalı ve minimum güç harcamalı ve aküyü bitirmemeli.

Bu arada B0 pinini de kullanabilirim, sorun olmaz.

picmanya

ne bu 433 MHz. alıcı verici devresimi
UDA nın sitesindeki örneği gördünmü?

oongit

Alıntı yapılan: picmanya - 08 Mart 2011, 10:01:52
ne bu 433 MHz. alıcı verici devresimi
UDA nın sitesindeki örneği gördünmü?
Hayır arkadaşım, en ufak bir alakası bile yok...

mcn

Timer ları sayıcı olarak kullanıp tek pals de kesmeye giderek de yapılabilir mi bu acaba,illa B0 gibi pin değişim kesmesi olması gerekmiyor değil mi?
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

Tagli

B0'ın kullanılacağını varsayarsak durum şöyle çözülebilir: B0 kesmesini uygun kenarda kesme oluşturacak şekilde ayarlarsın. B0 kesmesinin izin bitini 1 yaparsın, ama GIE 0 kalmaya devam eder. Program döngünde ilgili şart sağlanınca sleep komutu ile uykuya girersin (assembly'deki sleep'ten bahsediyorum, kullandığın derleyicide karşılığı nedir bilemem). Kesme şartı sağlandığında PIC uykudan uyanır ama GIE 0 olduğundan kesme vektörüne gitmez.

mcn, dediğin gibi asenkron sayıcı modunda çalışan bir timer ile (mesela TMR1) yapılabilir belki. Önceden yüklenmiş 0xFFFF değeri, dışarıdan gelen ilk darbede timer'ı taşırır ve kesme oluşturur (daha doğrusu uyanma şartı, kesmeye gitmek zorunda değil). Ama bence bu tür bir kullanım hem karmaşık olur, hem de TMR1'i harcamış olursun :) Ayrıca bu sefer de C0 (modele göre değişebilir) bacağını kullanmak zorundasın, yani yine çok bir şey değişmediği halde boşuna uğraşmış olacaksın.
Gökçe Tağlıoğlu

mcn

Teşekkürler hocam,ben genel kullanım için sormuştum yani sadece bu proje için değil.Ama sonuçta uykudan çıkmak için illaki bir kesme şart ve bunuda yukarda arkadaşımızın istediği şekilde yapacaksa artık bir pin kullanmak şart sanırım.Kolay gelsin.
www.teknikyazi.com --üşenme,erteleme,vazgeçme...

mdemir

Merhaba,
http://www.romanblack.com/self_swi.htm adresinde biraz farklı bir çözüm var.

Butona basınca PIC çalışmaya başlıyor. PIC 5mA üzerinde akım kullandığı sürece SCR ON durumda. PIC'i uyku moduna aldığınız zaman SCR'yi tutan akım olmayınca her şey kapanıyor.

oongit

Yazılımla halledemezsem analog bir devre ile denemeliyim belki de... Verdiğiniz bu devre denemeye değer... Yanıt veren herkese teşekkürler...

Tagli

Yalnız bunu donanımla yaptığın zaman elde ettiğin şey "reset" oluyor. Bu uyku ile aynı şey değil, bunu göz önünde bulundur.

Donanımsal uyku yapılabilir mi peki? Aklıma bir fikir geldi ama işe yarar mı veya sağlıklı olur mu bilmiyorum: PIC'in clock'u dışarıdan 555 veya benzeri bir kaynaktan alınır. PIC'e giden clock hattı donanımsal olarak kesilirse belki uyku sağlanabilir. Ama bu yöntemde PIC'in enerji tüketimi azalır mı bilmiyorum. Belki de hiç değişmez, o zaman da bu yöntem anlamsızlaşır.
Gökçe Tağlıoğlu