Acasă / Atelier / Microcontroler / PIC / Decodor IR cu PIC16F84

Decodor IR cu PIC16F84

Schema electrica PIC16F84
Schema electrica PIC16F84

Nu există nici o îndoială faptul că telecomenzile sunt extrem de populare şi a devenit foarte greu să ne imaginăm o lume fără ele. Acestea sunt utilizate pentru a controla tot felul de aparate, cum ar fi televizor, sistem, DVD, receiver de satelit etc.. Ori de câte ori un astfel de aparat ajunge la sfârşitul duratei sale de viaţă incepe sa isi piarda din functionarea corecta.

Nu ar fi frumos să le folosim din nou pentru a controla alte lucruri, ca de exemplu luminile în camera de zi sau perdele?

Toate decodoarele IR PIC  sunt foarte usor de construit.Piesele pentru acest hardware sunt uşor de obţinut în întreaga lume.Constructia nu ar trebui să ia mai mult decât într-o seară.

În centrul schemeii este procesorul PIC16F84. Acesta este însoţit de componentele sale standard cum ar fi condnesatorul cu cristal de 4.000 MHz şi circuitul de resetare.
Am folosit doua tipuri de receptoare IR în acest proiect, unul acordat la 36 kHz şi unul la 38 kHz . Acest lucru asigură o sensibilitate adecvată pentru toate protocoalele suportate. Nu este nici o problemă dacă nu poţi pune componentele exact ca acestea pe care le-am folosit eu. Exista o multime de receptoare similare care pot fi utilizate în exact acelaşi mod. Semnalele sunt suprapuse prin 2 diode înainte de a fi aplicate pe PORTA 4 a PIC-ului. Asiguraţi-vă că ati conectat un condensator de 22 μF aproape de pinii de alimentare a fiecărui receptoar.

Buton-ul care este de asemenea conectat la intrarea corespunzătoare din PIC, nu are nici o funcţie în acest moment. L-am inclus doar în cazul în care am decide crearea unui program care poate citi mai multe protocoale IR. Buton pot fi apoi folosite pentru a selecta protocolul.
Display cu LED-uri afisaza descrierea a diagramei. Este pur şi simplu un display multiplexor cu LED-uri . Am folosit unul cu 4 cifre, deoarece este mult mai uşor de folosit decat daca as folosi unul cu cu 4 cifre separate. Pentru fiecare segment curentul este limitat de o rezistenta de 180 Ω. Anozi comuni a celor 4 cifre sunt alimentate de patru tranzistorilore PNP. Dacă nu găsiţi tipul pe care le-am folosit puteţi folosi practic orice alt tranzistor PNP, care pot conduce aproximativ 200 mA .

Circuitul utilizează o sursă externă de alimentare de 5 V la aproximativ 100 mA.

 

Montaj-ul, vedere de sus.
Montaj-ul, vedere de sus.

 

Am construit dispozitivul pe o placa de proba . Montajul fiind foarte usor de realizat intr-un timp foarte scurt placa mea avand 7X4 cm .

Construirea decodorului PIC IR nu necesită abilităţi speciale. Se poate pot vedea că nu există greutati foarte mari în realizarea acestui proiect. Singurul lucru pe care trebuie să menţionez (din nou) este acela de a monta condensatori de decuplare cât mai aproape de pinii de alimentare a IC . Ambele receptoare IR sunt prea IC, să ştii!
Am folosit sârmă puţin mai groasa pentru toate liniile de putere.

 

Vedere partea cu lipituri.
Vedere partea cu lipituri.

 

 

Programarea PIC16F84

Mai întâi de toate să facem o listă cu toate sarcinile pe care software-ul trebuie să efectueze:

  • Primeste şi decodeaza mesajele IR
  • Scaneaza afişaj
  • Flash punctul central zecimal ori de câte ori un mesaj IR primit este valabil
  • Sterge ecranul 2 secunde după primirea ultimului mesaj IR

Toate aceste sarcini vor fi executate simultan, cel puţin ar trebui să par a fi. Prima sarcină este evident, avem nevoie de a primi şi a decoda mesajele IR pentru că asta facem aici. Primirea semnalelor IR este un proces critic şi nu poate fi deranjat de alte sarcini.
A doua sarcină este, de asemenea, destul de important. Toate cifre trebuie să fie prezentate la rândul lor, într-un ritm rapid şi constant, altfel putem vedea pâlpâirea ecranului. Această sarcină este, de asemenea, un moment destul de critic.
Iar ultimele două sarcini nu sunt foarte critice, dar trebuie să fie efectuate într-un mod care nu influenţează primele două sarcini.

Există doar o singură buclă principală a programului, care este un bun început pentru cele mai multe dintre programarea microprocesorului. Putem sublinia ca asta e buclă principala a programului după iniţializarea maşinii vom rămâne acolo pentru totdeauna,  ….. Până la oprirea din functiune a procesorului.

 ;-----------------------------------------------------------------------------
 ;
 ; Main program loop
 ;
 ;-----------------------------------------------------------------------------
MAIN
;-----------------------------------------CALL THE IR RECEIVER STATE MACHINE--
CALL    IR_MACHINE      Call the IR receiver state machine
;-----------------------------------------------------SCAN DISPLAY EVERY 5MS--
DECF    SCAN_DELAY,F    Decrement scan delay counter
 BTFSC   STATUS,ZERO     Only scan display if counter = 0
 CALL    SCAN_DISP
;-------------------------------------------------------SYNC MAIN WITH TIMER--
.SYNC           BTFSC   TMR0,7          Wait until bit 7 of TMR = 0
 GOTO    .SYNC           Not 0 yet!
 MOVLW   TIMER_UPDATE    Reload timer again
 ADDWF   TMR0,F
GOTO    MAIN
;-----------------------------------------------------------------------------
;
; Scan display routine
;
;-----------------------------------------------------------------------------

SCAN_DISP       MOVLW   MS5_COUNT       Reload scan delay
                MOVWF   SCAN_DELAY
                MOVLW   %1111.1111      Switch off all Anode drivers
                MOVWF   PORTA            during the switch
                MOVF    SCAN_STATE,W    Jump to next display's routine
                MOVWF   PCL
;-------------------------------------------------------------SCAN DISPLAY 1--

SCAN_DISP1      MOVF    DIGIT1,W        Get pattern of left most digit
                MOVWF   PORTB            and send it out
                MOVLW   %1111.1110      Switch left most digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP2     Next time do SCAN_DISP2
                MOVWF   SCAN_STATE
                RETURN
;-------------------------------------------------------------SCAN DISPLAY 2--

SCAN_DISP2      MOVF    DIGIT2,W        Get pattern of 2nd left digit
                MOVWF   PORTB            and send it out
                MOVLW   %1111.1101      Switch 2nd left digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP3     Next time do SCAN_DISP3
                MOVWF   SCAN_STATE

                DECF    DP_DELAY,F      Decrement DP_DELAY every 20ms
                BTFSS   STATUS,ZERO
                RETURN                  We're done if counter <> 0 !

                BSF     DIGIT2,7        Clear Digit 2's decimal point now
                RETURN
;-------------------------------------------------------------SCAN DISPLAY 4--

SCAN_DISP4      MOVF    DIGIT4,W        Get pattern of right most digit
                MOVWF   PORTB            and send it out
                MOVLW   %1111.0111      Switch right most digit on
                MOVWF   PORTA
                MOVLW   #SCAN_DISP1     Next time do SCAN_DISP1 again
                MOVWF   SCAN_STATE

                DECF    CLR_DELAY,F     Decrement CLR_DELAY every 20ms
                BTFSS   STATUS,ZERO
                RETURN                  We're done if counter <> 0 !

                MOVLW   %1011.1111      Only display 4 dashes
                MOVWF   DIGIT1
                MOVWF   DIGIT2
                MOVWF   DIGIT3
                MOVWF   DIGIT4
                RETURN

Despre Ciprian

Am dezvoltat o pasiune pentru acest domeniu de cand eram foarte mic, cred ca aveam 6-7 ani, din cate imi amintesc, am invatat sa citesc din revistele Tehnium, cam astea erau preferatele mele la varsta respectiva. In plus, aveam o atractie pentru informatica fapt ce a dus la inscrierea mea la un liceu de informatica, iar pentru a continua cu pasiunea mea m-am inscris apoi la facultatea de electrotehnica...

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *