IAR ile STM8S – Beeper ve Timer

STM8S serisine kaldığımız yerden devam edecek olursak öncelikle hoşuma giden bir özelliği inceleyeceğiz. Sanırım sesi geldi bile BEEEP ! 🙂 Beeper modülü işlemci içerisinde bulunan bir buzzer kontrolcüsü gibi düşünülebilir. 3 farklı frekans da sinyal üreterek farklı ses ihtiyaçlarınızı oldukça hızlı bir şekilde karşılar. Normalde bu işi yapmak için bir tane Timer harcamak küçük işlemcilerde biraz fazla olabilir. Beeper 1, 2 ve 4kHz’lik çıkış sinyalleri mevcuttur. Kullanımı oldukça basit olan bu modül sadece kalibrasyon fonksiyonunu ihtiyaç duyar. Kalibrasyon işlemini bir kere yaptıktan sonra frekans’ı seçip modülü çalıştırabilirsiniz. Beeper kalibrasyon için bir tane Timer’a ihtiyaç duyar.
Kalibrasyon işlemi bitince Timer’ı kapatır ve siz daha sonra bu Timer’ı kullanabilirsiniz.

1 ) Beeper

Clock ayarlarını yaptığınızı varsayarak başlayalım. Öncelikle projemize şu kütüphaneleri ekleyelim.

  • stm8s_clk.c
  • stm8s_beep.c
  • stm8s_tim1.c
  • stm8s_tim3.c
  • stm8s_tim4.c

Diğer modüllerde olduğu gibi beeper DeInit() işlemini yapıyoruz. Ardından kalibrasyonu yaptıktan sonra frekansı seçip Disable konumunda tutuyoruz.

Burada kalibrasyon için gerekli olan fonksiyon LSI_Measurement() aşağıda mevcut. Bu standart fonksiyonun detaylarına girmeyeceğim. Yapısı oldukça basit. Boş bir vakitte incelenebilir.

Beeper için kalibrasyonu yaptıktan sonra yapmamız gereken tek şey BEEP_Cmd() Enable yada Disable değerini vererek kullanmak. Farklı frekans değerleri için tanımlanan değerler şunlar.

Ve beeper işte bu kadar. Bir buton ile Beeper’ı kontol edelim.

2) Timer
Timerlara genel olarak bakacak olursak. Standart olarak bildiğimiz periyodik kesmelerinin yanı sıra, çeşitli PWM modlarıda mevcut. STM8S de bulunan Timerlar 8 ve 16 bitliktir. Biz bu yazıda 8 bitlik olan TIM4’ü ele alacağız.

Daha önce MCU ile çalıştıysanız bilirsiniz. Oldukça basit bir formülü var.

  1. F_Timer =  F_Master / Prescaler
  2. T_Timer = (Period + 1 ) / F_Timer

Burada 1 mS kesme elde etmek için Bölücü değerini 128 seçip periyot değerine 124 verirsek tam olarak 1 mS elde ederiz.

Timer kesmesi kullanmak için DeInit() yaptık dan sonra Precaler ve Period değerimizi init edelim.

Timer bayrağını temizleyip “Update” kesmesini aktif ediyoruz. Genel kesmeleride aktif ettikten sonra TIM4’ü çalıştırabiliriz.

Kesme fonksiyonu şu şekilde tanımlanıyor.

Kesmeye girdiğimizde mutlaka bayrağı temizleyelim. Bunu yapmaz ise yeni kesme gelmez. Şimdi statik bir değişken oluşturup 500 kere tekrarlayarak 500 mS’lik bir kesme elde ettim. Bunu LED çıkışı ile gözlemleyebiliriz.

Kodların tamamını şurada paylaşalım.

Bu kodda 500 mS’de bir yanıp sönen LED butona basıldığında 1 kHz frekansında öten bir buzzer mevcut. Unutamadan buton ve LED Bağlantısını program içerisinde görüp değiştirebilirsiniz. Ben sadece buton bağlantısı yaptım kartın üzerinde bir adet LED mevcut. Buzzer için ise mutlaka bir transistör kullanın yoksa işlemciye yüklenebilir. Bir sonraki yazıda PWM’i ele alacağım. Şimdilik bu kadar.

Esen kalın !

You may also like...

5 Responses

  1. Fırat DEVECİ dedi ki:

    Bu bölüm özellikle keypad uygulamalarında ya da butonlu davranışlarda, beyaz eşya bölümünde çok yararlı olabiliyor. Bunun yanında ucuz buzzerları kullanmak için de gerekli bir yapı.

    Güzel anlatım!

  2. Yusuf Efeoğlu dedi ki:

    Merhaba hocam stm8s0003f3 işlemci kullanıyorum yapmak istediğim işlem tam olarak şu akış sensöründen gelen dalgaları okuyup bu dalgalara göre röleyi aç kapa yapmasıdır.ADC ile denedim değeri alıyorum fakat röle açma kapama işlemi olmuyor acaba tımerlamı yapacağım bilemiyorum Yardımcı olabilir misiniz ?

  3. Berkcan dedi ki:

    Merhabalar bende stm8s103f3p ile çalışmaya başladım ucuz mavi olanlardan 😀
    timer4 ile mikro ve mili saniye cinsinden delay fonksiyonlarını yazarken bir şey fark ettim sinir bozucuydu ilk başlarda, kesme bayrağını handler fonksiyonunun en sonunda sıfırlamanızı öneririm özellikle mikrosaniye cinsinden olan fonksiyonda handler’ın en başında reset ediyordum bu bayrağı ve fonksiyon içerisinde yapılan tek şey flag reset ve delay +=1; idi.Oluşan problem ise daha handler fonksiyonundan çıkmadan tekrar keseme geliyordu ve program sanki handler içinde sonsuz bir döngü yaratıyordu ama döngü delay+=1 e gelmeden tekrar dönüyordu yani sürekli handler içerisinde bayrak sıfırlanıyor gibi bir şey oluyordu belki geç olsa bile sadece deneyimimi paylaşmak istedim.

Baran EKREM için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir