Arkadaşım ve ben , öğrenme amacıyla bu gibi evrensel bir uzaktan kumanda tasarlamak istiyoruz . Temel olarak yapmak istediğimiz şey kızılötesi darbeleri depolamak ve tekrar oynatmak.
36kHz, 38kHz ve 40kHz sinyalleri tespit etmek istiyoruz. 40kHz'lik bir sinyal 25 s'lik bir süreye sahip olacaktır .
8-bit PIC mikrodenetleyici kullanmak istiyoruz, şimdilik 20MHz yüksek hızlı kristal osilatörde çalışacak PIC16F616'yı seçtik. İki seçeneğimiz var:
Interrupt On Change
Modülü kullanın .- CCP modülünün yakalama modunu kullanın.
İlk seçenek aşağıdaki gibi olacaktır:
Bir kayıt olarak ayarlanır varsayalım: unsigned char _10_us = 0;
. Bu kayıt zamanı tutacaktır. Dönem kaydına sahip TMR2 modülü, her 10 s saniyede bir kesinti oluşturacak şekilde ayarlanmıştır . Bir kesinti meydana geldiğinde, kaydı artırır ve çıkar. Bu en fazla 2,55 ms sürecektir. Daha fazla zaman ölçümü gerekiyorsa, gerektiği gibi ek kayıtlar tanımlanabilir ve artırılabilir._10_us
_1_ms
Şimdi, her kesme değişikliğiyle (yüksekten düşüğe veya alçaktan yükseğe) her kesinti gerçekleştiğinde, program geçerli saati, yani _10_us
kaydın değerini not edecektir . Bir süre sonra, bir sonraki kesme üretildiğinde, program kaydedilen değeri _10_us
kayıt defterinden çıkarır ve böylece 10 bir birim ile bu arada alınan süreyi gösterir .
Bu seçenek kafamı çizmemi sağlıyor; Her 50 talimat için TMR2 kesilmesi gerçekleşir. Kesme işlemi yaklaşık 20 talimat alacaktır. Süreyi hesaplamak ve bir diziye kaydetmek için 30 komutla kaldım. Bu yöntem işe yarayacak mı?
İkinci seçenek aşağıdaki gibi olacaktır:
CCP modülünün yakalama modunu, CCP1 pininde bir olay (yüksekten düşüğe) meydana geldiğinde bir kesinti oluşturacak şekilde ayarlayın. Kesme yordamında, programdaki bir görevin (gerekirse) hesaplayabilmesi ve CCPR1H (muhtemelen gerekmeyecek) ve CCPR1L değerini kaydedebilmesi için bir bayrak ayarlayacaktır. Ardından, yakalama modunun yapılandırmasını değiştireceğiz, böylece alçaktan yükseğe bir kenar oluştuğunda kesmeyi tetikleyecektir. Ve sonra bir sonraki etkinliği bekleyecek. Daha önce hiç kullanmadığım için bu yöntemin performansını tahmin edemiyorum.
Başka seçenek?
TSOP17xx serisi gibi bir kızılötesi demodülatör IC'yi kullanabiliriz . Bu, sorunumuzu tamamen çözecektir. Ancak bazı sorular akla geliyor.
Okuma mesafesi gereksinimimiz fazla değil; 1 metre (~ 3 fit). 38 kHz'de çalışması gereken bir TSOP1738 seçersek, bu 36 kHz ve 40 kHz sinyallerle ne kadar iyi çalışır?
TSOP17xx serisinin veri sayfasının 4. sayfasında "Duyarlılığın Frekans Bağımlılığı" grafiği gösterilmektedir. Anladığımız kadarıyla;
- 38kHz'in ~ 1.053'ü olan 40kHz, ~ 0.6'lık nispi bir cevap verecektir.
- 38kHz ~ 0.95 olan 36kHz, ~ 0.65 nispi bir cevap verecektir.
Bu değerler ne anlama geliyor? TSOP1738 kullanabilir ve iyi olabilir miyiz?