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? |