Io e il mio amico vogliamo progettare un telecomando di apprendimento universale, come questo , a scopo di apprendimento. Ciò che vogliamo fare sostanzialmente è archiviare e riprodurre impulsi a infrarossi.
Vogliamo rilevare segnali a 36kHz, 38kHz e 40kHz. Un segnale a 40 kHz avrà un periodo di 25 s.
Vogliamo utilizzare un microcontrollore PIC a 8 bit, per ora abbiamo selezionato PIC16F616, che funzionerà a oscillatore a cristallo ad alta velocità da 20 MHz. Abbiamo due opzioni disponibili:
- Usa il
Interrupt On Change
modulo. - Utilizzare la modalità di acquisizione del modulo CCP.
La prima opzione sarà la seguente:
Si supponga un registro è impostato come: unsigned char _10_us = 0;
. Questo registro conterrà il tempo. Il modulo TMR2 con registro periodico è impostato per creare un interrupt ogni 10 sec. Quando si verifica un interruzione, aumenterà il registro e uscirà . Ciò darà un tempo massimo di 2,55 msec. Se è necessaria una maggiore misurazione del tempo, è possibile definire e incrementare registri aggiuntivi come necessario._10_us
_1_ms
Ora, ogni volta che viene generato un interrupt da qualsiasi tipo di cambiamento (da alto a basso o da basso ad alto), il programma noterà l'ora corrente, ovvero il valore del _10_us
registro. Dopo un po ', quando viene generato l'interruzione successiva, il programma sottrarrà il valore salvato dal _10_us
registro e quindi sarà il tempo impiegato nel frattempo, con un'unità di 10 secondi.
Questa opzione mi fa grattare la testa; L'interruzione TMR2 si verificherà ogni 50 istruzioni circa. La gestione dell'interruzione richiederà circa 20 istruzioni. Mi rimangono 30 istruzioni per calcolare e salvare il periodo in un array. Questo metodo funzionerà?
La seconda opzione sarà la seguente:
Impostare la modalità di acquisizione del modulo CCP in modo che generi un interrupt quando si verifica un evento (da alto a basso) sul pin CCP1. Nella routine di interrupt, imposterà un flag in modo che un'attività nel programma possa calcolare (se necessario) e salvare il valore di CCPR1H (probabilmente non sarà necessario) e CCPR1L. Quindi cambieremo la configurazione della modalità di acquisizione in modo da attivare l'interruzione quando si verifica un fronte da basso a alto. E poi aspetterà il prossimo evento. Non riesco a stimare le prestazioni di questo metodo poiché non l'ho mai usato.
Un'altra opzione?
Possiamo usare un IC demodulatore a infrarossi come la serie TSOP17xx . Ciò risolverebbe completamente il nostro problema. Tuttavia vengono in mente alcune domande.
Il nostro requisito di distanza di lettura non è molto; 1 metro (~ 3 piedi). Se selezioniamo un TSOP1738 che dovrebbe funzionare a 38kHz, quanto funzionerà bene con i segnali a 36kHz e 40kHz?
La pagina 4 della scheda tecnica della serie TSOP17xx mostra il grafico "Dipendenza dalla frequenza della reattività". Per quanto abbiamo capito;
- 40kHz, che è ~ 1.053 di 38kHz, darà una reattività relativa di ~ 0.6.
- 36kHz, che è ~ 0,95 di 38kHz, darà una reattività relativa di ~ 0,65.
Cosa significano questi valori? Possiamo usare un TSOP1738 e stare bene?