RTC ALARM OLUŞTURMA

                    RTC ALARM OLUŞTURMA

Bu yazımda denetleyici içerisinde bulunan RTC birimini kullanarak nasıl alarm oluşturulacağını anlatacağım. Uygulamada RTC clock kaynağı olarak LSI osiltör kullanılmıştır. LSI osilatörün doğruğu çok yüksek olmadığı için oluşan alarmlarda ufak zaman kaymaları oluşmaktadır. Daha doğru bir alarm uygulaması için osilatör kaynağı olarak LSE osilatör kullanmak daha uygun olacaktır. Yapılan uygulamada RTC birimi kullanılarak saniyede bir kez alarm oluşmakta ve her alarm oluştuğunda 8. pine bağlı ledin durumu değiştirilmektedir. Uygulamanın kodları aşağıda aşama aşama anlatılmıştır.

<

<a href="https://fatihdursunn.wordpress.com/wp-content/uploads/2017/07/kod_ilk.png"&gt;

 

İlk olarak değişkenler ve kullanılan fonksiyonların prototipleri tanımlanmıştır. Main fonksiyonu içerisinde ilk olarak mavi ledin bağlı olduğu pin çıkış olarak ayarlanmıştır. Daha sonra şimdiki zamanın ve alarm zamanın belirlendiği konfigürasyon fonksiyonları çağrılmıştır. Konfigürasyonlar yapıldıktan sonra RTC clock sinyali ve Alarm A aktif edilmiştir.

Main fonksiyonu içerisinde bir while döngüsü ile alarm kesmesi meydana geldiğinde değeri set edilen ALARM_Occured değişkenine göre ledin durumunun sürekli olarak değiştirilmesi sağlanmıştır.

Yukarıdaki kod ile RTC’ nin başlangıç zamanı ve clock ayarları yapılmıştır. İlk olarak RTC erişime açılmış ve clock kaynağı olarak LSI osilatör seçilmiştir. Bu aşamadan sonra RTC registerlarının değerleri ayarlanmıştır. RTC asenkron ve senkron prediv registerlarının değerleri 1Hz frekansı sağlayacak şekilde ayarlanmıştır. Clock kaynağı olarak seçilen LSI osilatör 40kHz’ dir ve register değerleri bu frekansa göre aşağıdaki gibi belirlenmiştir.

ck_spre(1Hz) = RTCCLK(40kHz) /(AsynchPrediv(99) + 1)*(SynchPrediv(399) + 1)

Görüldüğü gibi asenkron bölme oranı 99, senkron bölme oranı 399 olarak belirlenmiş ve sonuçta frekansın 1Hz olması sağlanmıştır. Bu işlemden sonra RTC başlangıç zamanı tüm değerleri sıfır olacak şekilde ayarlanmıştır.

RTC zamanı ayarlandıktan sonra Alarm A için konfigürasyonlar gerçekleştirilmiştir. İlk olarak denetleyici içerisinde RTC birimi için ayrılmış olan EXT_17 kesme kanalının ayarları yapılmış ve kesme önceliği belirlenmiştir. Daha sonra RTC alarmının oluşacağı zaman bilgisi registerlara yazılmış ve oluşacak alarmın hangi zamanbirimlerini(gün,saat,dakika,saniye) dikkate alıp almayacağını belirleyen maskeleme işlemi gerçekleştirilmiştir. Uygulamada alarm her saniye meydana geleceği için maskeleme tüm zaman alanlarına uygulanmıştır. Alarm her saniye meydana geleceği için alarm oluşma zamanı için girilen değerler dikkate alınmayacaktır. Yani her saniye oluşturulacak olan alarm için girilen alarm zamanı önemli değildir. Eğer saniye altı zamanlarda alarm oluşturulmak istenir ise alt saniye registerı ayarı da yapılmalıdır.

RTC_AlarmSubSecondConfig(RTC_Alarm_A, 399, RTC_AlarmSubSecondMask_All);

Yukarıdaki fonksiyonda 399 olarak alınan değer her zaman senkron prediv registerı içerisindeki değer ile aynı olmalıdır. Saniyenin ne kadarı bir sürede kesme meydana geleceğini belirlemek için fonksiyon içerisindeki maskeleme tipi isteğe uygun olarak değiştirilmelidir.

Registerlerın ayarlamaları yapıldıktan sonra Alarm A aktif edilmiştir ve bu andan itibaren program her saniyede RTC kesme fonksiyonuna dallanmaktadır.

Kodun son kısmında ise RTC kesmesi meydana geldiğinde gidilen fonksiyon içerisinde ALARM_Occured değişkeni set edilmiş ve kesme bayrakları kesme fonksiyonu içerisinde sürekli kalmamak için resetlenmiştir.

Yorum bırakın