Emitator-receptor serial cu PIC16F628 ( PIC16F627) sau PIC16F84

           Faza initiala demararii orcarui proiect cu PIC, este cea in care sedem jos si gandim bine ce vrem sa facem. Un creion pentru mestecat in coltul gurii, eventual un program CAD ( Eagle de exemplu, pentru ca e gratis ) deschis pe calculator, in fata ochilor nostri. Editarea corecta a schemei este esentiala. Daca nu stim electronica, rasfoim cele 50 de carti (pe rand...) cu specific, pe care le avem in biblioteca. Rolul facultatii (daca ati absolvit vreuna) este doar acela de a te invata cum si unde sa cauti atunci cand ai nevoie. Nu faceti o facultate anume, daca nu simtiti pasiune pentru domeniul respectiv. Puteti ajunge milionar doar cu un liceu terminat si chiar fara...
           Fiind vorba de un emitator-receptor, inseamna ca este compus din doua module electronice, un emitator si un receptor, conectate intre ele fie printr-o sarma, fie prin radiatie Infra-Rosie. Radiatia IR nu este vizibila ochiului uman, fiindca lungimea ei de unda incepe undeva la 900nm si continua pina la vreo 15um. Un ochi antrenat poate vedea inspre IR, maxim 730...750nm iar inspre UV, maxim 420...450nm si este cel mai bun senzor pentru radiatia vizibila ! LED-urile IR din telecomanda TV-ului emit de obicei pe la 960nm. 



Schema emitatorului este prezentat in figura urmatoare:
Este utilizat un PIC16F84 cu oscilator extern cu cuartz de 4MHz. Daca dispuneti de rezonator cu trei terminale, ca cel prezentat in atunci el se va monta in locul C3, C4, Q1, cu pinul median la masa si oricare din pinii exteriori capsulei la intrarile/iesirile OSC1/OSC2 ale PIC-ului. Daca folosti un PIC16F628, urmatoarele componente nu mai sunt necesare: C3,C4,Q1,R4,C5. Butoanele S1-S8 pot fi conectate direct la masa, fiinca portul B dispune de rezistente interne de pull-up, setarea acestora fiind posibila din registrul OPTION. Pull-up inseamna "trage sus", adica o rezistenta ce asigura un curent de polarizare dinspre VDD. Portul A contine un set de 4 jumperi (ca cei folositi in mother-board-urile vechi de calculator, pentru setarea diverselor functii). Deoarece portulA nu dispune de rezistente de pull-up, acestea vor fi montate in exterior, RN1 este o retea de 4 rezistente, conectate cu terminalul comun la VDD si terminalele libere la intrarile portuluiA. Bineinteles ca se pot utiliza 4 rezistente clasice de 4k7...10k in locul acestei retele. Rolul acestor jumperi este de a asigura o adresa unica transmitatorului, adresa formata din 4 biti (16 valori zecimale). Receptorul va avea si el aceeasi adresa, astfel incat nu vor putea fi utilizate decat anumite perechi unice de transmitatoare-receptoare. In mod normal pinul SER_OUT se conecteaza cu baza tranzistorului T1. pinul RA4 al PIC-ului este open colector, de aceea este obligatorie prezenta rezistentei R1. Noi il vom pastra deconectat, fiinca vom realiza in prima faza, conexiunea transmitator-receptor prin doua sirme: un semnal SER_OUT/SER_IN si o linie de masa. La momentul conectarii finale cu circuitul de emisie IR, vom utiliza in serie cu LED-ul D1, un LED rosu D2, pentru ca sa putem vedea daca emitatorul functioneaza la apasarea orcarui buton S1...S8. 


Schema receptorului este la fel de simpla:

 Daca emitatorul este mobil (se alimenteaza din baterii), receptorul are o destinatie fixa, fiind alimentat de la retea prin intermediul unui stabilizator de 5V. Pentru experimentele in care modulele se conecteaza intre ele cu doua fire, se poate folosi la fel de bine un set de baterii de 4.5V. Bateriile trebuie sa fie in stare buna de functionare deoarece, pe dioda antiprost D3 cade aproximativ 0.6V, deci tensiunea de alimentare a PIC-ului va fi Ubaterie-Uantiprost = 3,9V. Dioda D3 poate lipsi daca veti fi atent sa nu incurcati polaritatea bateriilor la alimentare, atat la transmitator cat si la receptor. O solutie care nu produce cadere de tensiune parazita, este montarea unei diode zenner DZ5V6 in paralel cu alimentarea PIC-ului. Astfel, daca tensiunea de alimentare are polaritatea buna, dar depaseste 5.6V, dioda se va deschide si va prelua o parte din curentul generat de sursa. Daca tensiunea va fi foarte mare, dioda se va arde bineiteles, in lipsa unei rezistente de balast. Daca tensiunea va avea polaritate opusa, dioda zenner va functiona ca o dioda normala, tensiunea de alimentare pe PIC limitandu-se la cca -0.7V. Raspunsul functionarii ansamblului transmitator-receptor se va vedea pe cele 8 LED-uri conectate pe portulB al receptorului. LED-urile au o singura rezistenta de balast R1, deoarece in exemplul considerat doar una din cele 8 va fi aprinsa la un moment dat. In locul LED-urilor se pot utiliza relee sau tiristoare care sa comande ceva cu adevarat util. Receptorul de infrarosu XR1, este un modul standardizat utilizat in receptoare TV sau videorecordere. El contine o fotodioda cu carcasa din plastic negru (pentru ca orice fotodioda semiconductoare este sensibila si la radiatie vizibila), un amplificator specializat (cel mai cunoscut este CX20106A de la Sony) cu iesire open-colector. Majoritatea acestor receptoare necesita tensiune de alimentare mai mare de 9V.


Etapele realizarii proiectului:
  • taiati cu traforajul sau bomfaierul doua bucati de circuit imprimat de 50x30mm din bucata de eurocard cumparata. Verificati la cumparare ca placa sa fie din pertinax si nu din sticlotextolit, altfel veti avea ceva batai de cap, deoarece sticlotextolitul se taie greu (necesita o ghilotina manuala pentru taiere).
  • pozitionati convenabil pe placa componentele electronice. Va trebui sa va folositi propria imaginatie pentru ca n-am sa va arat exact cum sa o faceti ! Trebuie sa tineti cont de faptul ca aceasta etapa este ca si o reproducere dupa un tablou celebru, desi originalul este acelasi, copiile realizate de alti pictori nu seamana una cu alta. Desi schemele functionale sunt cele din figurile de mai sus, exista o infinitate de moduri de a pozitiona piesele pe cablaj. Regula este insa doar una: urmariti ca traseele pe care veti fi obligat sa le realizati cu fire, sa aiba lungime minima. Pentru firele de conexiune aveti nevoie de cca 1m...1.5m de sarma pentru wrapping, pe care o sa o cositoriti pe pad-urile crespunzatoare pinilor in cauza, pentru a realiza conexiunea conform schemei. Cu un creion marcati clar pe schema, circuitele pe care le-ati realizat deja, pentru a nu va incurca in propriile conexiuni.
  • dupa ce placutele sunt realizate si ati mai verificat inca o data corectitudinea montajului, alimentati circuitul fara ca microcontrolerul sa fie in soclu, si verificati corectitudinea tensiunilor de alimentare. LED-ul D2 al emitatorului trebuie sa lumineze. LED-urile D1-D8 ale receptorului trebuie fireste, sa fie toate stinse. NU TREBUIE SA IASA FUM DIN NIMIC !
  • conectati cele doua module cu un cablu torsadat ( sau o simpla panglica) format din doua fire de culoare diferita, de lungime maxima 2...3m si conectati pinii SER_IN cu SER_OUT, respectiv masele celor doua module.
  • in acest moment va trageti sufletul si incepeti sa scrieti programele software pentru emitator si receptor
  • dupa ce microcontrolere sunt programate, le introduceti in socluri (si nu pe dos! pinul 1 inspre cheia soclului) numai dupa ce sunteti siguri ca ati oprit alimentarea montajelor.


Programul emitatorului, pentru PIC16F628:
; fila se numeste ir_tx628.jal
include f628_4i
include jpic628
include txp
include seriali

pragma target fuses 0b_0011_1111_0001_0000
; cp off, lvp off, boden off, mclr internal, pwrte on, intrc_io, wdt off

cmcon = 0x_07
var volatile byte hw_trisa at 0x85
bank_1
hw_trisa = 0b_0000_1111
bank_0

var byte adata
var byte buttons is port_b
port_b_direction = all_input
var bit but1 is pin_b0
var bit but2 is pin_b1
var bit but3 is pin_b2
var bit but4 is pin_b3
var bit but5 is pin_b4
var bit but6 is pin_b5
var bit but7 is pin_b6
var bit but8 is pin_b7

option = 0

forever loop
adata = port_a & 0b_0000_1111
 if (! but1) | (! but2 ) | (! but3 ) | (! but4 ) | 
    (! but5 ) | (! but6 ) | (! but7 ) | (! but8 )  then
   delay_1mS ( 8 )
     if (! but1) | (! but2 ) | (! but3 ) | ( ! but4 ) | 
       ( ! but5 ) | ( ! but6 ) | ( ! but7 ) | ( ! but8 )  then
     asynch_send ( adata )
     asynch_send ( buttons )
     end if
 end if
end loop

si biblioteca txp.jal corespunzatoare:
; fila txp.jal
const bit  active_high  = true
const bit  active_low   = false
const byte parity_none  = 2
const asynch_baudrate = 600
const asynch_polarity = active_high
const asynch_parity   = parity_none
const asynch_stopbits = 2
var volatile bit asynch_out_pin       is pin_a4
var volatile bit asynch_out_direction is pin_a4_direction
var volatile bit asynch_in_pin 
var volatile bit asynch_in_direction 



Programul emitatorului, pentru PIC16F84:
; fila se numeste ir_tx84.jal
include 16f84_4
include jpic
include txp
include seriali

var volatile byte hw_trisa at 0x85
bank_1
hw_trisa = 0b_0000_1111
bank_0

var byte adata
var byte buttons is port_b
port_b_direction = all_input
var bit but1 is pin_b0
var bit but2 is pin_b1
var bit but3 is pin_b2
var bit but4 is pin_b3
var bit but5 is pin_b4
var bit but6 is pin_b5
var bit but7 is pin_b6
var bit but8 is pin_b7

option = 0

forever loop
adata = port_a & 0b_0000_1111
 if (! but1) | (! but2 ) | (! but3 ) | (! but4 ) | 
    (! but5 ) | (! but6 ) | (! but7 ) | (! but8 )  then
   delay_1mS ( 8 )
     if (! but1) | (! but2 ) | (! but3 ) | ( ! but4 ) | 
       ( ! but5 ) | ( ! but6 ) | ( ! but7 ) | ( ! but8 )  then
     asynch_send ( adata )
     asynch_send ( buttons )
     end if
 end if
end loop

Observatie: biblioteca txp.jal este comuna pentru PIC16F84 si PIC16F628



Programul receptorului, pentru PIC16F628:
; fila se numeste ir_rx628.jal
include f628_4i
include jpic628
include jdelay
include rxp
include seriali

pragma target fuses 0b_0011_1111_0001_0000
; cp off, lvp off, boden off, mclr internal, pwrte on, intrc_io, wdt off

cmcon = 0x_07
var volatile byte hw_trisa at 0x85
bank_1
hw_trisa = 0b_0001_1111
bank_0

var byte local_address 
var byte leds is port_b
port_b_direction = all_output
leds = 0
var byte buttons

forever loop 
 local_address = port_a & 0b_0000_1111
    asynch_receive ( data )
    if data == local_address then
     asynch_receive ( buttons )
     leds = ! buttons
    end if
end loop

si bilioteca rxp.jal corespunzatoare:

; fila rxp.jal
const bit  active_high  = true
const bit  active_low   = false
const byte parity_none  = 2
const asynch_baudrate = 600
const asynch_polarity = active_high
const asynch_parity   = parity_none
const asynch_stopbits = 2
var volatile bit asynch_out_pin 
var volatile bit asynch_out_direction 
var volatile bit asynch_in_pin        is pin_a4
var volatile bit asynch_in_direction  is pin_a4_direction



Programul receptorului, pentru PIC16F84:
; fila se numeste ir_rx84.jal
include 16f84_4
include jpic
include jdelay
include rxp
include seriali

var volatile byte hw_trisa at 0x85
bank_1
hw_trisa = 0b_0001_1111
bank_0

var byte local_address 
var byte leds is port_b
port_b_direction = all_output
leds = 0
var byte buttons

forever loop 
 local_address = port_a & 0b_0000_1111
    asynch_receive ( data )
    if data == local_address then
     asynch_receive ( buttons )
     leds = ! buttons
    end if
end loop

Observatie: biblioteca rxp.jal este comuna pentru PIC16F84 si PIC16F628



 Compilarea
Pentru compilare trebuie sa aveti deja compilatorul dezarhivat, presupunem in directoarea C:\jal50
Trebuie sa creati o directoare pentru proiectul dvs, fie acesta  C:\proiecte\ir. In aceasta directoare salvati filele:
ir_tx84.jal 
ir_tx628.jal
ir_rx84.jal
ir_rx628.jal
txp.jal
rxp.jal

Verificati ca directorul c:\jal50\lib sa contina intr-adevar si filele:
16f84_4.jal
f628_4i.jal
jdelay.jal
interval.jal
seriali.jal
jpic.jal
jpic628.jal
pentru ca acestea sunt utilizate de programele noastre

In directoarea C:\proiecte\IR\, copiati fila jal.exe din directorul C:\jal50\bin si o fila batch pe care o creati dvs. si a carei continut este:
jal -s\proiecte\ -s\jal50\lib c:\proiecte\ir\%1.jal 
Salvati aceasta fila, cu denumirea j.bat

In acest moment sunteti gata de compilare, dintr-o fereastra DOS in directorul C:\proiecte\ir dati comanda:
j ir_tx84 ; daca totul este ok, in directoarea C:\proiecte\ir se vor genera filele ir_tx84.asm si ir_tx84.hex, apoi:
j ir_rx84; se vor genera filele ir_rx84.asm si ir_tx84.hex
Compilarea este insotita intotdeauna de un mesaj de succes sau de eroare.

Aceste doua file *.hex sunt cele care le programati in cele doua PIC-uri in emitator si receptor. Aveti grija sa nu incurcati PIC-urile intre ele. Aveti mesaje de eroare la compilare? Ca de exemplu mesaje care va spun ca aveti definitii duplicate ? Acestea vor apare mai des la compilarea filei *628.jal deoarece foarte multe biblioteci (interval, jdelay,jseriali, f628_4i) utilizeaza biblioteca jpic.jal implicit. Inseamna ca va trebui sa editati aceste biblioteci si sa comentati manual linia ; include jpic din fiecare. De asemenea biblioteca jpic contine definitii ale portului IO pentru biblioteca seriala, care sunt dublate in mod particular in acest exemplu de bibliotecile txp.jal si rxp.jal. Si aceste linii trebuiesc comentate in biblioteca jpic, ele se gasesc la sfarsitul acesteia:

-- constants used in serialp.jal
; const bit  active_high  = true
; const bit  active_low   = false
; const byte parity_even  = 0 
; const byte parity_odd   = 1
; const byte parity_none  = 2

Toate bibliotecile modificate de dvs. pentru acest proiect, se salveaza in directoarea C:\proiecte\ir. Comanda j.bat va sti sa le caute aici !

De ce n-am facut eu acest lucru si sa va ofer o fila *.zip care sa contina toate aceste file corecte ? Scriam si mai putin si nu va oboseam cu atatea detalii... Pentru ca n-ati fi invatat nimic. De aceea nu va pun la dispozitie nici filele hexagesimale, doar contra cost. Poate-poate, va mobilizati si le obtineti singuri!

NOTA: Acesta nu este cel mai simplu mod de utilizare al compilatorului, dar daca reusiti sa-l utilizati in acest mod, veti reusi si din Jalcc sau din PFE.



Modificari din serial in IR
Avem un exemplu functional de comunicatie seriala, la 600 de biti pe secunda, dar care merge printr-o sarma. Si noi vroiam sa mearga prin aer! Modificarile ce trebuie facute sunt minime. Se deconecteaza firele dintre module, se refac circuitele local, intre PIC si tranzistorul de comanda al LED-ului in emitator si intre PIC si modulul de receptie IR in receptor. ATENTIE! Deoarece receptorul IR este de obicei inversor, fila sursa a receptorului trebuie recompilata cu optiunea: const asynch_polarity = active_low in biblioteca rxp.jal
Exista de asemenea module de receptie IR care nu pot functiona la 600bps sau necesita modulatie in emitator. Daca ati pus mana pe un asemenea modul, sistemul prezentat aici nu va functiona de nici un fel !

 Intrebare: Este exemplul de mai sus, ceva mai mult decat ati invatat la lucrarile de laborator din scoala sau facultate?