Facebook RSS Feed
 

.NET Micro Framework: Hibernate Modu

Gömülü sistemler genellikle sürekli elektriğe yada pile bağlı bulunurlar ve işlem yapmadıkları anlarda elektrik tasarrufu moduna geçmeleri gerekir. (TV kumandaları gibi.) Tasarruf moduna geçen cihazlar, belirli interrupt'lar ile yada istenilen bir saatte uyandırılabilir. Geliştireceğimiz uygulamada Micro Framework kullanarak bir cihazı uyku moduna geçirmeyi ve uyandırmayı inceleyeceğiz.

Üzerinde durduğumuz uyku modu donanımsal bir fonksiyon olduğu için kullandığınız mikrodenetleyicinin SDK'sına göre kod yazmanız gereklidir. Örneğimizde GHI Electronics SDK'sı üzerinden gideceğiz.

Uyku Modu Kodları

Herhangi bir Micro Framework projesinin referanslarına "GHIElectronics.Hardware.dll" kütüphanesini ekleyelim. Uygulama namespace'lerimiz arasında GHIElectronics.NETMF.Hardware ve GHIElectronics.NETMF.Hardware.LowLevel referanslarının bulunduğundan emin olun.

Sistemi uyku moduna almak istediğinizde "Power.Hibernate()" komutunu kullanmanız yeterli olacaktır. Hangi durumda yada durumlarda uykudan uyanılacağı da Hibernate metodunun parametresi olarak belirtilir.

Sistemi uyandırabilecek olaylar: (Mikrodenetleyici modeline göre farklılık gösterir.)
- Voltaj düşüklüğü
- CAN haberleşmesi
- External Interrupt pininin seviye değişikliği
- Interrupt Port olarak ayarlanan pinlerin seviye değişikliği
- Belirtilen tarih / saatte oluşacak alarm

Bu olaylardan ihtiyacımıza göre birinin yada birkaçının oluşumunda sistem uyanacak ve kaldığı satırdan işlemeye devam edecektir. Örnek uygulama kodlarına göz atalım:

using System;
using System.Threading;
using Microsoft.SPOT;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.Hardware.LowLevel;
 
namespace MFHibernateUygulamasi
{
    public class Program
    {
        public static void Main()
        {
            //Diğer uygulama kodlarınız.
 
            //Sistemi uyutalım ve hangi olay(lar) sonucu uyanacağını belirleyelim:
            Power.Hibernate(Power.WakeUpInterrupt.BrownOutDetect //Voltaj düşümünde,
                | Power.WakeUpInterrupt.CAN //CAN üzerinden mesaj gelmesi durumunda,
                | Power.WakeUpInterrupt.EINT0 //IO0 (USBizi) yada IO23 (EMX) pini değişiminde,
                | Power.WakeUpInterrupt.InterruptInputs //InterrputPort pin değişiminde,
                | Power.WakeUpInterrupt.RTCAlarm); //Belirtilen tarih / saatte sistemi uyandır.
 
            //Sistem uyandığında uygulama bu satırdan devam eder.
 
            Thread.Sleep(Timeout.Infinite); //Main Thread'i uyutalım.
        }
    }
}

Sistem uyuduğunda USB bağlantısı (dolayısıyla da debug hattı) kesilmiş olur. Aynı zamanda, sistem uyurken seri port ve SPI gibi yollardan gelecek veriler de yakalanmayacaktır. SPI cihazın interrupt çıkışı, mikrodenetleyicinin interrupt girişine bağlanarak veri gelmeden önce sistemin uyandırılması gibi senaryolar düşünülebilir.

Belirtilen tarih ve saatte uyanacak bir uygulamanın kodları da aşağıdaki gibi olacaktır:

using System;
using System.Threading;
using Microsoft.SPOT;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.Hardware.LowLevel;
 
namespace MFHibernateUygulamasi
{
    public class Program
    {
        public static void Main()
        {
            //Diğer uygulama kodlarınız.
 
            //Sistem saatini ayarlayalım:
            RealTimeClock.SetTime(new DateTime(2010, 10, 26, 20, 00, 00));
 
            //Sistemi uyandıracak alarmı kuralım:
            RealTimeClock.SetAlarm(new DateTime(2010, 10, 26, 20, 01, 00));
 
            //Sistemi alarm anına kadar uyutalım:
            Power.Hibernate(Power.WakeUpInterrupt.RTCAlarm);
 
            //Alarm sonucu sistem uyandığında uygulama bu satırdan devam eder.
 
            Thread.Sleep(Timeout.Infinite); //Main Thread'i uyutalım.
        }
    }
}

Interrupt port olarak belirlediğiniz bir butona basıldığında cihazın uyanmasını istiyorsanız yazmanız gereken kodu inceleyelim:

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.Hardware.LowLevel;
 
namespace MFHibernateUygulamasi
{
    public class Program
    {
        public static void Main()
        {
            //Diğer uygulama kodlarınız.
 
            //0. Pin üzerinde bir interrupt port oluşturalım:
            InterruptPort uyandirmaButonu = new InterruptPort(Cpu.Pin.GPIO_Pin0, true,
                Port.ResistorMode.PullDown, Port.InterruptMode.InterruptEdgeHigh);
            uyandirmaButonu.OnInterrupt += new NativeEventHandler(uyandirmaButonu_OnInterrupt);
 
            //Sistemi interrupt oluşana kadar uyutalım:
            Power.Hibernate(Power.WakeUpInterrupt.InterruptInputs);
 
            //Interrupt sonucu sistem uyandığında uygulama bu satırdan devam eder.
 
            Thread.Sleep(Timeout.Infinite); //Main Thread'i uyutalım.
        }
 
        static void uyandirmaButonu_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            //Buton eventi.
        }
    }
}

Interrupt port ile cihazın uyandırılabilmesi için, InterruptPort oluştururken glitch filter parametresinin true olması ve içi boş da olsa bir OnInterrupt eventi belirlenmesi gereklidir.

Bu yöntemlerle cihazınızın güç tüketimine bağlı olarak 150mA kadar elektrik tasarrufu yapabilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi