Vous êtes sur la page 1sur 8

Datele problemei: Se dau doua transcievere NRF 24L01 comandate de doua uC PIC 1 F!

""#$ Sa se reali%e%e one&iunea RF intre cele doua transcievere' veri(icarea (acandu)se prin a(isarea datelor pe portul serial$ Cone&iuni (i%ice: 1$ *+D,L NRF 24L01

2$ CIRC,I- .L.C-R+NIC

In -abelul 1 sunt repre%entate le/aturile (i%ice intre NRF si PIC:

NRF 24L01 NR$ PIN 1 2 1 4 5 " ! S.*NIFIC#-I. 0ND 2CC 31$124 C. CSN SC7 *+SI *IS+ IR9 NR$ PIN 12'11 ) 15 14 1! 24 21 11

PIC1 F!""# S.*NIFIC#-I. 2SS ) R62 R61 RC18SC78SCL RC58SD+ RC48SDI8SD# R608IN-

-abelul 1 : Conectarea transciever)ului cu uC

1$ S.-#RI F#C,-. PIC),L,I: a4 b4 c4 d4 e4 (4 /4 @4 i4 A4 a4 b4 c4 d4 e4 (4 /4 @4 i4 A4 setare directie P+R-6 )); -RIS6<0b00000001 adica R60 intrare si R61:R6" iesiri= se setea%a >I0> R61 3CSN4= de%activare totala #DC= de%activare comparatoare= setare modul SPI in *+D0 )); C7P < 0' C7. < 1' ca master 'cu o rata e/ala cu 1:4 = setare protocol RS212 la ? 00 baud= activare intreruperi /lobale= activare intrerupere e&terioara pe R60= setare intrerupere pe R6+ de la > la L= pentru si/uranta se ster/e (la/ul de intrerupere $ S.-B-RISB630b000000014= outputB@i/@3CSN4= setupBadc3#DCB+FF4= setupBcomparator3NCBNCBNCBNC4= setupBspi3SPIB*#S-.RCSPIBLB-+B>CSPIBD*I-BLB-+B>CSPIBCL7BDI2B44= setupBuart3? 004= enableBinterrupts30L+6#L4= enableBinterrupts3IN-B.D-4= e&tBintBed/e3>B-+BL4= clearBinterrupt3IN-B.D-4=

#cum ca au (ost reali%ate setarile interne ale PIC)ului trebuie (acute setarile transciever)ului$ 2om lua (iecare re/istru in parte si il vom con(i/ura iar apoi vom e&plica (unctiile utili%ate pentru aceasta operatiune$ NOTA: PROGRAMAREA A FOST FACUTA IN "CCS C" IAR PENTRU USURINTA A FOST UTILIZAT FISIERUL 24L01.h PUS LA DISPOZITIE DE CATRE STEFAN ENGELKE <mbo !"#$%&'$'($)*$.+$,

00h . REGISTRUL CONFIG In acest re/istru ne interesa%a doar 2 biti: 6I-0 si 6I-1 deoarece restul bitilor se re(era la mascarea intreruperilor lucru pe care nu il dorim$ Pentru a (ace setarile in NRF trebuie mai intai sa il pornim$ #cest lucru se reali%ea%a setand 6I-1 3PERB,P4$ Functia asociata pornirii transciever)ului este urmatoarea: void power_up() { int8 CONFIG_VAL=read_reg_1_B(CONFIG !)" i#($%it_te&t(CONFIG_VAL '()_*')){ %it_&et(CONFIG_VAL '()_*')" write_reg_1_B(CONFIG CONFIG_VAL)" + + Se observa ca in (unctia poFerBup34 se (ace trimitere la alte doua (unctii:

-$&+.-$(.1./0CONFIG102 si 3-4#$.-$(.1./0CONFIG1CONFIG.5AL2. Prima (unctie dupa cum incearca sa su/ere%e si numele citeste valoarea stocata intr)un re/istru intern al transciever)ului care are o latime de ! biti 3sau un 6G-.4 iar cea de)a doua scrie un bHte in interiorul unii ast(el de re/istru$
int8 read_reg_1_B(int8 reg int1 print){ int read_add =)_),GI-.,)/reg" int va0" int du112" output_0ow(C-N)" de0a2_u&(3)" &pi_write(read_add)" du112=&pi_read()" &pi_write(NO')" va0=&pi_read()" i#(print==1){ &eria0_out(! va0 reg)" + output_4ig4(C-N)" de0a2_u&(3)" return va0" + Functia pentru citirea re/istrului ia ca parametrii doua variabile: prima dintre ele I int8 reg 5 este o variabila de tip bHte iar cea de)a doua I int1 print I este de tip boolean$ Functia intoarce valoarea re/istrului citit repre%entat de parametrul I int8 reg 5 si daca parametrul Iprint I este I1I adica -R,. apelea%a (unctia I &eria0_out(! va0 reg) I care are rolul de a a(isa re/istrul citit si valoarea acestuia$ Despre aceasta (unctie vom vorbi ceva mai tar%iu$ Pentru a citii valoarea unui re/istru trebuie e&ecutata instructiunea I)_),GI-.,)5 $ Formatul acestei instructiuni este )_),GI-.,)/reg6 Re%ultatul adunarii este stocat in variabila Iread_add I$ *ai departe se de(ineste o variabila numita I du112 I care are rolul de a stoca ceea ce ne trimite inapoi NRF cand Iii spunemI ca dorim sa citim valoarea unui re/istru$ Ca o simpla observatie' atunci cand ii trimitem o instructiune de citire sau scriere NRF)ului acesta ne trimite inapoi intotdeuna valoarea re/istrului I-.A.*- I$ #l/oritmul este urmatorul: pinul CSN prin R61 se setea%a L+E : conditia de ba%a pentru putea trimite sau primi ceva din partea transciever)ului= se asteapta un interval de 5 uS pentru stabili%area pinului CSN= se trimite prin SPI instructiunea de citire a adresei= desi nu pre%inta importanta citim ceea ce ne trimite inapoi= se trimite prin SPI instructiunea N+P= citim valoarea adresei pe care o stocam in variabila I va0 I= daca parametrul I print I este -R,. atunci valoarea adresei se printea%a pe RS212= se setea%a inapoi >I0> CSN= se asteapta 5us pentru stabili%area pinului= se intoarce inapoi valoarea (unctiei prin variabila I va0 I$

Revenind la (unctia I power_up() I' acum avem stocata in variabila I CONFIG_VAL I

valoarea re/istrului C+NFI0$ #cest lucru ne aAuta sa veri(icam daca bitul '()_*' este setat utili%and urmatoarea (unctie: 5 $%it_te&t(CONFIG_VAL '()_*') 56 Daca nu este setat atunci se setea%a mai intai in variabila I CONFIG_VAL I si mai apoi cu aAutorul (unctiei Iwrite_reg_1_B(CONFIG CONFIG_VAL)5 in re/istrul (i%ic al transciever)ului : void write_reg_1_B (int8 adre&a int8 va0oare){ int8 write_add=(_),GI-.,)/adre&a" output_0ow(C-N)" de0a2_u&(3)" &pi_write(write_add)" int du112=&pi_read()" &pi_write(va0oare)" du112=&pi_read()" output_4ig4(C-N)" + Functia de scriere intr)un re/istru cu latimea de 1bHte este oarecum similara cu cea de citire din acest motiv nu voi insista asupra ei$ #cum ca avem transciever)ul pornit putem trece la con(i/urarea urmatorilor re/istrii$ 01h . REGISTRUL EN.AA 0EN6ANCED S6OCK/URST2 #ici se setea%a #,-+B#C7 pentru data pipes pe care dorim sa le (olosim$ Cum comunicarea se reali%ea%a numai intre doua transcievere atunci se va (olosii numai o sin/ura data pipe si anume data pipe 0$ ,rmatoarea linie de cod setea%a #,-+B#C7 pentru data pipe 0 : write_reg_1_B(,N_AA !%!!!!!!!1) 02h . REGISTRUL EN.R7ADDR In acest re/istru activam utili%area data pipe 0 ast(el : write_reg_1_B(,N_)7A88) !%!!!!!!!1) 08h . REGISTRUL SETUP.A9 #ici setam latimea adresei atat pentru RD cat si pentru -D$ Se ale/e o valoare a latimii adresei de 5 bHtes: write_reg_1_B(-,.*'_A( !%!!!!!!11)

04h . REGISTRUL SETUP.RETR In acest re/istru se setea%a numarul de retransmiteri si intervalul de timp dintre acestea: write_reg_1_B(-,.*'_),.) !%!!!!1111) Se setea%a ast(el un numar ma&im de 15 retransmisii la un interval de timp de 250 us$ 05h . REGISTRUL RF_CH Frecventa de operare' care se (i&ea%a in acest re/istru a (ost aleasa de 2$41 0@%$ write_reg_1_B()F_C9 !%!!!!1!1!) 0:h . REGISTRUL RF.SETUP In acest re/istru se setea%a rata de transmisie a datelor de 1*bps la putere ma&ima$ write_reg_1_B()F_-,.*' !%!!!!!111) 0;h . REGISTRUL STATUS #cest re/istru contine (la/)urile care semnali%ea%a intreruperile$ Dupa ce pe R60 a (ost semnali%ata o intrerupere trebuie veri(icata cau%a$ #cest lucru se (ace veri(icand pe rand starea bitilor din interiorul acestui re/istru$ Pentru bitii 4: 3*#DBR-' -DBDS' RDBDR4 sunt necesare doua (unctii: una pentru veri(icare si alta pentru ster/ere$ Pentru bitii 0:1 3-DBF,LL' RDBPBN+4 sunt necesare doar (unctii de citire dar tinand cont de speci(icul pre%entului proiect ele nu sunt necesare$ 6I- 4 : *#DBR- semanli%ea%a daca a (ost depasit numarul ma&im de retransmisii 3aici a (ost setat 154 (unctia de citire si scriere este:

int1 read_&tatu&_1a:_rt(){ int1 #0ag_1a:_rt=!" int8 -.A.*-_VAL=read_reg_1_B(-.A.*- 1)" i#(%it_te&t(-.A.*-_VAL ;A7_).)){ #0ag_1a:_rt=1" + return #0ag_1a:_rt" + void &et_&tatu&_1a:_rt(){ int8 -.A.*-_VAL=read_reg_1_B(-.A.*- 1)" i#(%it_te&t(-.A.*-_VAL ;A7_).)){ %it_&et(-.A.*-_VAL ;A7_).)" write_reg_1_B(-.A.*- -.A.*-_VAL)" <<int8 du112=read_reg_1_B(-.A.*- 1)" + +

6I- 5 : -DBDS semnali%ea%a daca a (ost transmis cu scucces un pac@et de date$ Functiile pentru citire si scriere sunt urmatoarele:

void &et_&tatu&_t:_d&(){ int8 -.A.*-_VAL=read_reg_1_B(-.A.*- 1)" i#(%it_te&t(-.A.*-_VAL .7_8-)){ %it_&et(-.A.*-_VAL .7_8-)" write_reg_1_B(-.A.*- -.A.*-_VAL)" <<int8 du112=read_reg_1_B(-.A.*- 1)" + + int1 read_&tatu&_t:_d&(){ int1 #0ag_t:_d&=!" int8 -.A.*-_VAL=read_reg_1_B(-.A.*- 1)" i#(%it_te&t(-.A.*-_VAL .7_8-)){ #0ag_t:_d&=1" + return #0ag_t:_d&" + 6I- : RDBDR semnali%ea%a daca un pac@et a (ost primit cu scucces$ Functiile asociate sunt urmatoarele:

void &et_&tatu&_r:_dr(){ int8 -.A.*-_VAL=read_reg_1_B(-.A.*- 1)" i#(%it_te&t(-.A.*-_VAL )7_8))){ %it_&et(-.A.*-_VAL )7_8))" write_reg_1_B(-.A.*- -.A.*-_VAL)" <<int8 du112=read_reg_1_B(-.A.*- 1)" + J int1 read_&tatu&_r:_dr(){ int1 #0ag_r:_dr=!" int8 -.A.*-_VAL=read_reg_1_B(-.A.*- 1)" i#(%it_te&t(-.A.*-_VAL )7_8))){ #0ag_r:_dr=1" + return #0ag_r:_dr" +

0Ah . REGISTRUL R7.ADDR.P0 In acest re/istru (om seta adresa sin/urei data pipe (olosite si anume data pipe 0$ #dresa va avea 5 bHtes latime asa cum a (ost setata in re/istrul S.-,PB#E iar valoarea ei va (i 0&."."."."."$ Se observa ca este necesara o noua (unctie care sa scrie 5 bHtes la o anumita adresa: void write_reg_3_B(adre&a int8 va0oare! int8 va0oare1 int8 va0oare= int8 va0oare> int8 va0oare? ){ int8 i" int8 du112" int8 write_add=(_),GI-.,)/adre&a" int8 %u##@3A" #or(i=!"iB3"i//){ &witC4(i){ Ca&e !D%u##@!A=va0oare!" %reaE" Ca&e 1D%u##@1A=va0oare1" %reaE" Ca&e =D%u##@=A=va0oare=" %reaE" Ca&e >D%u##@>A=va0oare>" %reaE" Ca&e ?D%u##@?A=va0oare?" %reaE" + + output_0ow(C-N)" de0a2_u&(3)" &pi_write(write_add)" du112=&pi_read()" #or(i=!"iB3"i//){ &pi_write(%u##@iA)" du112=&pi_read()" + output_4ig4(C-N)" +

Vous aimerez peut-être aussi