- Gömülü Elektronikte TIMER nedir?
- Arduino Zamanlayıcı Kayıtları
- Arduino Zamanlayıcı Kesintileri
- Gerekli Bileşenler
- Devre şeması
- Arduino UNO Zamanlayıcılarını Programlama
Arduino Geliştirme Platformu, 2005 yılında sanat tasarım projeleri için kullanımı kolay programlanabilir bir cihaz olarak geliştirilmiştir. Amacı, mühendis olmayanların çok fazla programlama bilgisi olmadan temel elektronik ve mikro denetleyicilerle çalışmasına yardımcı olmaktı. Ancak daha sonra, kullanımı kolay doğası nedeniyle kısa sürede dünya çapında elektronik cihazlarına yeni başlayanlar ve hobiler tarafından uyarlandı ve bugün prototip geliştirme ve POC geliştirmeleri için bile tercih ediliyor.
Arduino ile başlamak uygun olsa da, AVR, ARM, PIC, STM vb. Gibi çekirdek mikro denetleyicilere yavaşça geçmek ve yerel uygulamalarını kullanarak programlamak önemlidir. Bunun nedeni, işin çoğu digitalWrite (), AnalogWrite (), Delay () vb. Gibi önceden oluşturulmuş işlevler tarafından yapıldığı için Arduino Programlama dilinin anlaşılması çok kolaydır ve düşük seviyeli makine dili arkalarında gizlidir. Arduino programları, yazmaç bitleri ile uğraştığımız ve programımızın mantığına göre bunları yüksek veya düşük yaptığımız diğer Gömülü C kodlamalarına benzemez.
Gecikmesiz Arduino Zamanlayıcıları:
Bu nedenle, önceden oluşturulmuş işlevlerin içinde neler olduğunu anlamak için bu terimlerin arkasına bakmamız gerekir. Örneğin bir delay () fonksiyonu kullanıldığında, ATmega mikrodenetleyicisinin Timer ve Counter Register bitlerini gerçek olarak ayarlar.
Bu arduino zamanlayıcı eğitiminde bu delay () fonksiyonunun kullanımından kaçınacağız ve bunun yerine aslında Kayıtların kendileri ile ilgileneceğiz. İyi olan şey, bunun için aynı Arduino IDE'yi kullanabilmenizdir. Zamanlayıcı kayıt bitlerimizi ayarlayacağız ve kesme meydana geldiğinde bir LED'i değiştirmek için Zamanlayıcı Taşma Kesintisini kullanacağız. Zamanlayıcı bitinin ön yükleyici değeri, kesintinin meydana geldiği süreyi kontrol etmek için basma düğmeleri kullanılarak da ayarlanabilir.
Gömülü Elektronikte TIMER nedir?
Zamanlayıcı bir tür kesintidir. Bir olayın zaman aralığını ölçebilen basit bir saat gibidir. Her mikrodenetleyicinin bir saati (osilatör) vardır, diyelim ki Arduino Uno'da 16Mhz'dir. Bu hızdan sorumludur. Saat frekansı ne kadar yüksek olursa işlem hızı o kadar yüksek olur. Bir zamanlayıcı, saat frekansına bağlı olarak belirli hızlarda sayan sayaç kullanır. Arduino Uno'da tek bir sayım yapmak 1/16000000 saniye veya 62nano saniye sürer. Anlamı Arduino, her 62 nano saniyede bir talimattan diğerine geçer.
Arduino UNO'daki zamanlayıcılar:
Arduino UNO'da farklı işlevler için kullanılan üç zamanlayıcı vardır.
Zamanlayıcı0:
8 Bitlik bir zamanlayıcıdır ve delay (), millis () gibi timer fonksiyonlarında kullanılır.
Zamanlayıcı1:
16 Bitlik bir zamanlayıcıdır ve servo kitaplığında kullanılır.
Zamanlayıcı2:
8 Bitlik bir Zamanlayıcıdır ve ton () işlevinde kullanılır.
Arduino Zamanlayıcı Kayıtları
Zamanlayıcıların konfigürasyonunu değiştirmek için zamanlayıcı kayıtları kullanılır.
1. Zamanlayıcı / Sayaç Kontrol Kayıtları (TCCRnA / B):
Bu kayıt, zamanlayıcının ana kontrol bitlerini tutar ve zamanlayıcının ön ölçekleyicilerini kontrol etmek için kullanılır. Ayrıca WGM bitlerini kullanarak zamanlayıcı modunu kontrol etmeye izin verir.
Çerçeve Formatı:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Ön ölçekleyici:
TCCR1B'deki CS12, CS11, CS10 bitleri ön ölçekleyici değerini ayarlar. Zamanlayıcının saat hızını ayarlamak için bir ön ölçekleyici kullanılır. Arduino Uno'nun 1, 8, 64, 256, 1024 ön ölçekleyicileri vardır.
CS12 | CS11 | CS10 | KULLANIM |
0 | 0 | 0 | Saat Zamanlayıcı Yok DUR |
0 | 0 | 1 | CLCK i / o / 1 Ön Ölçeklendirme Yok |
0 | 1 | 0 | CLK i / o / 8 (Ön Ölçeklendiriciden) |
0 | 1 | 1 | CLK i / o / 64 (Ön Ölçeklendiriciden) |
1 | 0 | 0 | CLK i / o / 256 (Ön Ölçeklendiriciden) |
1 | 0 | 1 | CLK i / o / 1024 (Ön Ölçeklendiriciden) |
1 | 1 | 0 | T1 Pininde harici saat kaynağı. Düşen kenarda saat |
1 | 1 | 1 | T1 pininde harici Saat kaynağı. Yükselen kenarda saat. |
2. Zamanlayıcı / Sayaç Kaydı (TCNTn)
Bu Kayıt, sayaç değerini kontrol etmek ve bir ön yükleyici değeri ayarlamak için kullanılır.
Saniyede gerekli süre için ön yükleyici değeri için formül:
TCNTn = 65535 - (16x10 10 xTime in sec / Prescaler Value)
2 Saniyelik zamanlayıcı1 için ön yükleyici değerini hesaplamak için:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino Zamanlayıcı Kesintileri
Daha önce Arduino Kesintilerini öğrendik ve Zamanlayıcı kesintilerinin bir tür yazılım kesintisi olduğunu gördük. Arduino'da aşağıda açıklanan çeşitli zamanlayıcı kesintileri vardır.Zamanlayıcı Taşma Kesintisi:
Zamanlayıcı maksimum değerine ulaştığında, örneğin (16 Bit-65535) Zamanlayıcı Taşma Kesmesi meydana gelir. Bu nedenle, bir ISR kesinti servis rutini, TOIEx'te etkinleştirilen Zamanlayıcı Taşma Kesme biti, zamanlayıcı kesinti maskesi kaydı TIMSKx'te mevcut olduğunda çağrılır.
ISR Biçimi:
ISR (TIMERx_OVF_vect) { }
Çıktı Karşılaştırma Kaydı (OCRnA / B):
Burada Çıktı Karşılaştırma Eşleştirme Kesmesi oluştuğunda, kesme hizmeti ISR (TIMERx_COMPy_vect) çağrılır ve ayrıca OCFxy bayrak biti TIFRx yazmacında ayarlanır. Bu ISR, TIMSKx kaydında bulunan OCIExy'de etkinleştirme biti ayarlanarak etkinleştirilir. TIMSKx, Zamanlayıcı Kesme Maskesi Kaydıdır.
Zamanlayıcı Giriş Yakalama:
Daha sonra zamanlayıcı Giriş Yakalama Kesmesi meydana geldiğinde, kesinti hizmeti ISR (TIMERx_CAPT_vect) çağrılır ve ayrıca ICFx bayrak biti TIFRx (Zamanlayıcı Kesinti Bayrak Kaydı) içinde ayarlanır. Bu ISR, TIMSKx kaydında bulunan ICIEx'teki etkinleştirme bitini ayarlayarak etkinleştirilir.
Gerekli Bileşenler
- Arduino UNO
- Basmalı Düğmeler (2)
- LED (Herhangi Bir Renk)
- 10k Direnç (2), 2.2k (1)
- 16x2 LCD Ekran
Devre şeması
Arduino UNO ve 16x2 LCD ekran arasındaki Devre Bağlantıları:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
LCD'nin kontrast kontrolü için potansiyometre merkez pimine |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
Bir |
+ 5V |
K |
GND |
10K çekme dirençli iki Push buton Arduino'nun 2 ve 4 pinlerine bağlanır ve bir 2.2K direnç üzerinden Arduino'nun PIN 7'sine bir LED bağlanır.
Kurulum aşağıdaki resimdeki gibi görünecektir.
Arduino UNO Zamanlayıcılarını Programlama
Bu eğitimde, ZAMANLAYICI AŞIRI AKIŞ KESİNTİSİNİ kullanacağız ve düğmeyi kullanarak ön yükleyici değerini (TCNT1) ayarlayarak LED'i belirli bir süre AÇIK ve KAPALI olarak yanıp sönmek için kullanacağız. Arduino Timer için tam kod sonunda verilmiştir. Burada kodu satır satır açıklıyoruz:
Projede ön yükleyici değerini görüntülemek için 16x2 LCD kullanıldığından likit kristal kitaplık kullanılmaktadır.
#Dahil etmek
Arduino pin 7 ile bağlanan led anot pini ledPin olarak tanımlanır.
#define ledPin 7
Daha sonra, Arduino UNO'ya bağlanan LCD pinleri (RS, E, D4, D5, D6, D7) ile Liquid Crystal sınıfına erişim nesnesi ilan edilir.
LiquidCrystal lcd (8,9,10,11,12,13);
Ardından ön yükleyici değeri 3035'i 4 saniye için ayarlayın. Ön yükleyici değerini hesaplamak için yukarıdaki formülü kontrol edin.
kayan değer = 3035;
Bir Sonraki geçersiz kurulum (), ilk 16x2 modunda LCD ayarlayabilir ve birkaç saniye için bir karşılama mesajı görüntüler.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); gecikme (2000); lcd.clear ();
Daha sonra LED pinini OUTPUT pin olarak ayarlayın ve Push butonları INPUT pinleri olarak ayarlanır.
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Ardından tüm kesintileri devre dışı bırakın:
noInterrupts ();
Daha sonra Timer1 başlatılır.
TCCR1A = 0; TCCR1B = 0;
Ön yükleyici zamanlayıcı değeri ayarlanmıştır (Başlangıçta 3035 olarak).
TCNT1 = değer;
Ardından Ön ölçekleyici değeri 1024, TCCR1B kaydında ayarlanır.
TCCR1B - = (1 << CS10) - (1 << CS12);
ISR'nin kullanılabilmesi için Timer Interrupt Mask kaydında Timer overflow interrupt'ı etkinleştirilir.
TIMSK1 - = (1 << TOIE1);
Sonunda tüm kesintiler etkinleştirildi.
interrupts ();
Şimdi, digitalWrite kullanarak LED'i AÇIK ve KAPALI konuma getirmekten sorumlu Zamanlayıcı Taşma Kesintisi için ISR'yi yazın . Durum, zamanlayıcı taşma kesintisi meydana geldiğinde değişir.
ISR (TIMER1_OVF_vect) { TCNT1 = değer; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Gelen void döngü () ilişkin ön değeri artırılır ya da değeri 16x2 LCD ekran üzerinde görüntülenir basma düğmesi giriş ve kullanılarak azaltılır.
eğer (digitalRead (2) == HIGH) { değer = değer + 10; // Incement preload value } if (digitalRead (4) == HIGH) { value = value-10; // Ön yükleme değerini azaltın } lcd.setCursor (0,0); lcd.print (değer); }
Bu nedenle, Arduino programında gecikme üretmek için bir zamanlayıcı bu şekilde kullanılabilir. Push butonlarını kullanarak ön yükleyici değerini artırıp azaltarak gecikmedeki değişikliği gösterdiğimiz aşağıdaki videoyu kontrol edin.