Está en la página 1de 15

16F876 & nRF24L01 Este proyecto est realizado exclusivamente

Si no ves el esquema completo haz clic en la

Para acilitarnos la programaci!n vamos a usar una li"rer#a llamada $lib_rf2gh4_10.h$. Se enca trav,s del SPI por hard-are del PIC. Esta li"rer#a pertenece a la empresa Bizintek Innova, S .Open Source. por lo que se puede distri"uir y modi icar "a/o los t,rminos de la licencia !". E Personalmente llegu, a ella gracias a una estupenda -e" $#$u% ha& apunte'$0 donde se hace un ampliar in ormaci!n desde el oro de esa misma -e" haciendo clic a$u%.

5s adelante vers un enlace de descarga de todo el proyecto0 donde he modi icado la li"rer#a p +1&23170 tal como ves en el esquema0 aunque este e/ercicio es totalmente compati"le con cualq conservan las mismas direcciones.

4enemos cinco patillas para controlar el SPI del n%&'()*+0 ms una de interrupci!n qu de orma inmediata. El emisor enviar datos y el receptor los procesar. Esto quiere d

que nos interesa es ver c!mo uncionan exclusivamente en modo emisor y modo recep comunicaciones "idireccionales0 modi icando los programas seg8n tus necesidades.

Como vamos a controlar el S(I del 1)*+,) por har-.are con el n/*24L010 has de sa lugar y son6

Se han de corresponder con hard-are del PIC que est,s usando0 en es

Existen dos patillas del SPI que s# puedes modi icar de lugar y son 01 y 0S!. Esas patil 4odo cam"io que hagas en el hard-are has de tenerlo presente en la li"rer#a0 pero aq la segunda secci!n (esta es la primera). 2ea3o' el c4-igo -el e3i'or5
#include <16F876A.h> #fuses NOWDT, XT, PUT, NOPROT !T, NOD "U#, NO"ROWNOUT, NO$%P, NO!PD, NOWRT #use del&'(cl)c*+,------. #include /li012f34h,11-.h/ #0'5e 6)25&+-7-8 #0'5e 6)250+-7-6 #in51e75 <)id in51R"-(.

99 s5& 2u5in& es5: 6&2& un fu5u2) si h&ces c);unic&ci)nes 99 N) 5iene efec5) en el 62)42&;& 62inci6&l, '& =ue s>l) e;

? in58 2e51B

99 @e enc&24&2A& de l& 2ece6ci>n de d&5)s. 2e51 + RF1R ! C% (.B if ( (2e51 ++ -. DD (2e51 ++ 1. . ? d) ? 2e51 + RF1R ! C% (.B E Fhile ( (2e51 ++ -. DD (2e51 ++ 1. .B E

E <)id ;&in(. ? in58 2e53B RF1CNT1 N(.B RF1!ONFC#1@PC(.B RF1!ONFC#(-7,-,-7-1.B RF1ON(.B del&'1;s(8.B se5152is1&(-0111111.B Fhile(52ue. ? RF1DATAH-I+6)25&B RF1DCR+-7-8B 2e53+RF1@ ND(.B 99 99 99 99

G&0ili5&2 in5e22u6ci>n R"-9CNT. !)nfi4u2&2 ;>dul) @PC del PC!. !)nfi4u2&2 ;>dul) RF c&n&l ' di2ecci>n de 2ece6ci>n. P&2 Ac5i<&2 el ;>dul) RF.

99 $e d&;)s un ;Ani;) de 3.8 ;ilise4und)s 6&2& =ue se 6)n4 99 T)d) el 6ue25) A c);) en52&d&s. 99 "ucle infini5). 99 !&24&;)s el d&5) en

RF1DATAH-I.

E E

99 Di2ecci>n del 2ece65)2. 99 n<i&2 d&5)s.

Partes importantes del programa e

9 )a interrupci!n 6int_e7t en realidad no llega a usarse0 s!lo la he puesto en el programa para

adems de emitir. Si le llegara alg8n dato0 tal y como est en el programa0 lo 8nico que har#a se programa principal.

9 /*_I!8_1!9:; Ese comando ha"ilita la recepci!n de datos por interrupci!n de la %;*<I=40 per
uturos proyectos en el que s# haya recepci!n de datos.

9 /*_0O!*I

_S(I9:; Con igura el SPI entre el PIC y el n%&'()*+0 de iniendo los pines0 4%IS e in li"rer#a $lib_rf2gh4_10.h$.

9 /*_0O!*I

90740,0701:; Se re iere $0740$ al canal de comunicaci!n: este siempre ha de ser e $0701$ es la direcci!n de recepci!n. 7unque en este e/ercicio no va a reci"ir datos0 de todas orm

9 /*_O!9:; 7ctiva el m!dulo %&. >espu,s de este comando conviene que transcurra unos '.? mi
e/ercicio es ms que su iciente.

9 'et_tri'_a90b111111:; 4odo el puerto 7 lo convertimos en entradas de datos. S!lo tie 9 /*_<#8#=0>?porta; Carga lo que hay en el puerto 7 en el "u

er %&@>747A*B. Cay 2 "ytes6 de

ancho de "anda que da el n%&'()*+ tendr#as que usar los 2 "ytes disponi"les para env posi"ilidad de enviar 2 "ytes de un golpe.

9 /*_<I/?070+; Este comando le est diciendo a qu, direcci!n ha de ir la in ormaci!n que quie
(+'3 te!ricos y D' prcticos)0 pues ir al PIC que tenga con igurado como recepci!n la direcci!n

9 ret2?/*_S1!<9:; Env#a la in ormaci!n. $ret'$ nos sirve para sa"er qu, ha sucedido al intentar

(con irmaci!n de recepci!n): E+E si ha enviado pero no ha reci"ido el 7CF: y E'E si no ha podido ser poner $/*_S1!<9:;$ a secas para enviar0 pero ortodoxamente lo correcto es hacerlo tal como lo h

9 )a carga de datos en /*_<#8#=> y la direcci!n de env#o /*_<I/ y /*_S1!<9:0 han de estar de


2ea3o' ahora el c4-igo -el receptor5
#include <16F876A.h> #FU@ @ NOWDT, XT, PUT, NOPROT !T, NOD "U#, NO"ROWNOUT, NO$%P, NO!PD, NOWRT #use del&'(cl)c*+,------. #include /li012f34h,11-.h/ #0'5e 6)25&+-7-8 #in51e75 <)id in51R"-(. ? in58 2e51B 99 Di2ecci>n del 6ue25) A. 99 Cn5e22u6ci>n del ;>dul) RF.

porque/*_<#8# y /*_<I/ no contendrn valores constantes todo el tiempo0 sino que puede vari env#o de datos.

2e51 + RF1R ! C% (.B if ( (2e51 ++ -. DD (2e51 ++ 1. . ? d) ? 6)25&+RF1DATAH-IB 2e51 + RF1R ! C% (.B E Fhile ( (2e51 ++ -. DD (2e51 E

99 T&n5) si h&' 2ece6ci>n si;6le ) ;Jl5i6le, lee2 d

99 l 6ue25) A c)n5end2: el <&l)2 =ue le lle4ue del 99 /2e51/ n)s di2: si h&' 2ece6ci>n si;6le, ;Jl5i6 ++ 1. .B 99 Lien52&s h&'& d&5)s 6&2& lee2, se4ui2 l

<)id ;&in(. ? se5152is1&(-0------.B 6)25&+-B RF1CNT1 N(.B RF1!ONFC#1@PC(.B RF1!ONFC#(-7,-,-7-8.B RF1ON(.B Fhile(52ue.B E

99 P2)42&;& 62inci6&l. 99 T)d) el 6ue25) A c);) s&lid&. 99 Cnici&l;en5e l) 6)ne;)s & ce2). 99 99 99 99 G&0ili5&2 in5e22u6ci>n R"-9CNT. !)nfi4u2&2 ;>dul)s @PC del PC!. !)nfi4u2&2 ;>dul) RF (c&n&l ' di2ecci>n.. Ac5i<&2 el ;>dul) RF.

99 "ucle infini5).

(arte' i3portante' -el progra3a re

9 )a interrupci!n 6int_e7t se encargar de reci"ir los datos.

9 =o de"emos de con undir $ret'$ (del emisor) con $ret+$ (del receptor)0 porque en es

4ienen signi icados distintos para emitir que para reci"ir. En el receptor0 cuando vem que0 si el valor es E*E hay entrada simple de datos (una sola recepci!n0 o dicho de otra para ser le#dos): si nos da E+E signi ica que hay ms de una entrada (cada entrada es de tanda0 y no soporta ms de tres niveles0 el resto se perder#an. Cuando $ret+$ nos d, el no ha ha"ido entrada nueva de datos. En el programa0 tanto si hay entrada simple com "u er (compuesto de 2 "ytes por D niveles) queda vac#o una vez que sale d el $.hile 9 9

sea un poco ms lento que el receptor para evitar saturar al receptor y eso puede suceder cuand

9 /*_I!8_1!9:; Este comando ha"ilita la recepci!n de datos por interrupci!n de la %;


inmediatamente0 en la misma interrupci!n0 en el e/emplo propuesto lo hacemos de esta orma.

9 /*_0O!*I

_S(I9:; Con igura el SPI entre el PIC y el n%&'()*+0 de iniendo los patill li"rer#a $lib_rf2gh4_10.h$ y las puedes modi icar si tu hard-are es di erente.

9 /*_0O!*I

90740,070+:; Se re iere $0740$ al canal de comunicaci!n0 este siempre ha de ser e s#. $070+$ es la direcci!n de recepci!n. %ecuerda que en el emisor pusimos6 /*_<I/?070+; co

con igurado con esa direcci!n podr reci"ir esos datos0 si no uese esa direcci!n el PIC tanto no atender#a a esos datos.

9 /*_O!9:; 7ctiva el m!dulo %&. >espu,s de este comando conviene que transcurra unos '.? mi

9 'et_tri'_a90b000000:; 4odo el puerto 7 lo convertimos en salidas de datos. S!lo tiene

e/ercicio es ms que su iciente. Esas salidas son a trav,s de )E>s. %ecuerda que /#4 e resistencia a positivo para poder alimentar ese )E>: en el esquema est detallado.

9 En la recepci!n de datos0 si esos datos no son tratados inmediatamente los puedes p

receptor has de cargarlos en una varia"le o matriz (seg8n el caso) antes de que pase a recepci!n no hace alta porque en la misma recepci!n (dentro de la interrupci!n) hag

"n -etalle 'obre el har-.

En nuestro proyecto tenemos siempre a los PICs como maestros S(I y los transceptores como esc voltios y los n%&'()*+ uncionan con un rango de D.D voltios puede ha"er una descompensaci!n d l!gico y cundo un * en una entrada del PICH Esto puede suceder en la 8nica entrada SPI que tien una resistencia a positivo de ? voltios en dicha patilla (tal como est en el esquema0 al comienzo un + l!gico al PIC lo lea como real. 4ener este simple gesto nos ahorrar muchos que"raderos de

nRF24L01 & 18F4550

Este proyecto est realizado exclusi a!ente en "

Si no ves el esquema completo haz clic en la im

En este proyecto vamos a usar el PIC 18F455 como emisor y el PIC 1!F8"! como receptor. Se trata #e que centrar en la !odi)icaci*n de la li+rer,a ori-inal (li+.r)2-/4.10(/( para a#aptarla al PIC 18F4550. )ecue

hagas por tu cuenta luego has #e tenerlo presente mo#i+ic,n#olo tam%i-n en la li%rer$a.

Si quieres saberlo todo sobre la librera, has de descargarte un estupendo manual que profundiza en l pa cosas que e"plico en esta secci#n es gracias al manual que puedes descargarte haciendo clic a0u,! $a librera la puedes descargar, junto a todo el pro ecto, al final de esta p%gina!

Como vamos a controlar el S(I del 1+*4AA0 por har-.are con el n/*24L010 recuerd lugar y son6

Se han de corresponder con hard-are del PIC que uses0 en este c

Existen dos patillas del SPI que s# puedes modi icar de lugar y son 01 y 0S!. Esas pat
en las de iniciones de pines I<I0 4%IS y la con iguraci!n de %;' como interrupci!n externa. Esto son los cam"ios6
#define #define #define #define #define #define #define #define #define #define #define #define RF1!@ RF1! @!M @DC @DO RF1CRN RF1!@1TRC@ RF1! 1TRC@ @!M1TRC@ @DC1TRC@ @DO1TRC@ RF1CRN1TRC@

7hora vamos a modi icar la li"rer#a (li+.r)2-/4.10(/( que us, en el aparta-o anterior para

PCN1!1 99 Definici>n de l)s 6ines del PC! 6&2& c)n52)l&2 el nRF3,$ PCN1!3 PCN1"1 PCN1"PCN1!7 PCN1"3 TRC@!,1 99 Definici>n de l)s 6ines TRC@ del PC!. TRC@!,3 TRC@",1 TRC@",TRC@!,7 TRC@",3

99OOOOOOOOOOOOOOOOO 99O %ARCA"$ @ O 99OOOOOOOOOOOOOOOOO


#"PT TRC@A +

#"PT #"PT

TRC@" TRC@!

+ +

-7FQ3 99 Di2ecci>n de l)s TRIS A, ", !, D '

-7FQR -7FQ,

#"PT #"PT #"PT

TRC@D TRC@ CNT!ON

+ + +

-7FQ8 -7FQ6 -7FF3 99 Re4is52) de in5e22u6ci)nes. @>l) n)s in5e2es&2: el 0i5 7 de

En la parte #e la li%rer$a que con+igura la interrupci.n e/terna0 como estamos usan#o )1 y )11 para el SPI #e que el PIC 18F455 tiene tres interrupciones e/ternas0 as$ que po#emos coger la 2ltima0 es #ecir en )1&.
<)id RF1CNT1 N(. ? 99G&0ili5&2 in5e22u6ci>n e75e2n& R"3 6)2 fl&nc) de 0&T&d&. dis&0le1in5e22u65s(4l)0&l.B en&0le1in5e22u65s(in51e753.B e751in51ed4e(3, G1TO1$ .B 0i51se5(RF1CRN1TRC@.B en&0le1in5e22u65s(4l)0&l.B E

5tro #etalle que se pue#e tocar en la li%rer$a es la veloci#a# #e transmisi.n0 #on#e po#emos con+igurar 1'% >> La distancia que quieras alcanzar depender de la velocidad de transmisin. En el peor de los casos podrs 2 bps!" # en el me$or de los casos hasta %& metros (configurando a ' bps! con el n()2%L&' ms barato (e mismas que usa los -.ifis-" es decir unos 2.%/+z! si encuentra una pared" un muro o un pasillo" la se0al se 11

En la li%rer$a hay una parte que con+igura la potencia #e sali#a 8en #eci%elios90 la ganancia #e entra#a 83:;9 valores a tope0 es #ecir4 m,/ima potencia #e sali#a0 m,/ima ganancia y m,/ima veloci#a# #e trans+erencia. <ay un registro llama#o RF.#E12%0 #el cual s.lo son 2tiles los %its

al =0 el resto no se usan> aunque el %i

El +it 03 Si se pone a 1 activas el 3:;0 es #ecir0 que ten#r,s la m,/ima ganancia 8sensi%ili#a#9. Si lo pones Los +its 1 y 23 ?en#r$amos 4 com%inaciones que van #el 8m$nima potencia #e sali#a y m$nimo consumo9 El +it 43 @eloci#a# #e tras+erencia. Puesto a 1 la tras+erencia es #e &'%ps0 y a ser$a #e 1'%ps. Aentro #e la li%rer$a0 %uscan#o un poco0 encontraremos esto4
99RF1@ TUP 99!)nfi4u2&ci>n &s6ec5)s RF. 99#&n&nci& ;:7i;& de $NA, -d"; 6)5enci& de s&lid& ' 3L06s de <el)cid&d. )u56u51l)F(RF1!@.B s6i1F2i5e(-736.B s6i1F2i5e(-7-F.B )u56u51hi4h(RF1!@.B

:os interesa la parte que pone (s6i1F2i5e(-7-F.B(

Es / F porque los %its al = est,n a 10 es #ecir4 11110 que miran#o los %its antes e/plica#os te con+igura po m,/ima trans+erencia por la m$nima0 es #ecir0 pasar #e &'%ps a 1'%ps0 as$ o%ten#remos la posi%ili#a# #e po signi+ica poner el %it = a cero. :os que#ar$a 1110 por tanto es ". ;s$ que s.lo hemos #e cam%iar esa parte y

99RF1@ TUP 99!)nfi4u2&ci>n &s6ec5)s RF. 99#&n&nci& ;:7i;& de $NA, -d"; 6)5enci& de s&lid& ' 1L06s de <el)cid&d. )u56u51l)F(RF1!@.B s6i1F2i5e(-736.B s6i1F2i5e(-7-7.B 99 <UUUUUUUUUUUUUUU Aqu!!! )u56u51hi4h(RF1!@.B

5ea!os el c*di-o en ""# para el %&" 18F45506

#include <18F,88-.h> #fuses XTP$$,P$$1,!PUDC%1,PUT,NO"ROWNOUT,NO%R # N,NOWDT,NOP"AD N,L!$R,NO$%P,NOD "U#,NOP #use del&'(cl)c*+,8------.

#include /li012f34h,11-1,88-.h/ 99 $i02e2A& ;)dific&d& 6&2& el nRF3,$-1 c)n el PC! 18F,8 #0'5e #0'5e #0'5e #0'5e #0'5e 6)25&+-7F86)250+-7F81 6)25c+-7F83 6)25d+-7F8R 6)25e+-7F8, 99 Di2ecci>n de l)s 6ue25)s A, ", !, D ' .

#in51e753 <)id in51R"3(. ? in58 2e51B

99 s5& 2u5in& es5: 6&2& un fu5u2) si h&ces c);unic&ci)nes 99 N) 5iene efec5) en el 62)42&;& 62inci6&l, '& =ue s>l) e 99 @e enc&24&2A& de l& 2ece6ci>n de d&5)s.

2e51 + RF1R ! C% (.B if ( (2e51 ++ -. DD (2e51 ++ 1. . ? d) ? 2e51 + RF1R ! C% (.B E Fhile ( (2e51 ++ -. DD (2e51 ++ 1. .B E

<)id ;&in(. ? RF1CNT1 N(.B RF1!ONFC#1@PC(.B RF1!ONFC#(-7,-,-7-1.B RF1ON(.B del&'1;s(8.B se5152is1&(-0-11111.B in58 c)n5+-, 2e53B

99 99 99 99

G&0ili5&2 in5e22u6ci>n R"39CNT3 en es5e PC!. !)nfi4u2&2 ;>dul) @PC del PC!. !)nfi4u2&2 ;>dul) RF c&n&l ' di2ecci>n de 2ece6ci>n de d Ac5i<&2 el ;>dul) RF.

99 DeT&;)s c);) ;Ani;) 3.8;s &n5es de c);enV&2 & en<i&2.

99 DeT) RA8 c);) s&lid& 6&2& e<i5&2 6)ne2 l& 2esis5enci& de 99 Decl&2&;)s l&s <&2i&0les & u5iliV&2.

Fhile(52ue. ? RF1DATAH-I + c)n5B RF1DCR+-7-8B 2e53+RF1@ ND(.B c)n5WWB del&'1;s(8-.B E

99 "ucle infini5). 99 99 99 99 99

l c)n5enid) del c)n5&d)2 l) c&24) en RF1DATAH-I 6&2& se Di2ecci>n de en<A) 6&2& el 2ece65)2. n<A& el d&5). Cnc2e;en5& el c)n5&d)2. Un& 6&us& en c&d& inc2e;en5).

B 3a con+iguraci.n #e los C+uses est, para un cristal #e 4'<z y prepara#o para po#er usar el DS10 aunque a

B 3a interrupci.n 7int.ext2 en reali#a# no llega a utilizarse0 s.lo la he puesto para +uturos proyectos en el q B 5%serva la parte que pone4 7include 8li+.r)2-/4.10.4550(/8 ; la li%rer$a le ponemos otro nom%re para
en el que s$ haya recepci.n #e #atos.

#ato0 tal y como est, en el programa0 lo 2nico que har$a ser$a vaciar el %u++er #e recepci.n0 na#a m,s> no a+ec

B RF.&91.E9$': Ese coman#o ha%ilita la recepci.n #e #atos por interrupci.n #e la )1&EI:?&0 pero como B /*_0O!*I

_S(I9:; Con igura el SPI entre el PIC y el n%&'()*+0 de iniendo los pines0 4%IS e in li"rer#a 8li+.r)2-/4.10.4550(/8.

B RF.";9F&<$0x4060x01': Se re+iere (0x40( al canal #e comunicaci.n0 este siempre ha #e ser el mismo

#irecci.n #e recepci.n. ;unque en este e7ercicio no va a reci%ir #atos0 #e to#as +ormas hay que poner una #ir

B RF.;9$': ;ctiva el m.#ulo )F. Aespu-s #e este coman#o conviene que transcurra unos &.5 milisegun#o

B set.tris.a$0+011111': ?o#o el puerto ; lo convertimos en entra#as #e #atos a e/cepci.n #e );

entra#a porque no se usa0 pero lo he #e7a#o como sali#a por si se te olvi#a poner en esa patilla un

di erente a este has de sa"er que /#A 9BSS: #el PIC 18F455 0 si est como entrada y al aire ha de como en la imagen de a"a/o. =o de"e de quedar $al aire$. Creo que el compilador CCS C

como receptor act8an como $maestros$ (SPI) en am"os casos0 sin em"argo estn a ect %ecuerda (y lo repito a prop!sito) que para otro monta/e o proyecto no puede estar c

B RF.=>1>?0@Acont: Carga el conteni#o #e la varia%le (cont( en )FFA;?;G H. ?ienes 8 %ytes0 #e )FFA

#e %an#a que #a el n)F&43 1 ten#r$as que usar los 8 %ytes #isponi%les para enviar 8y reci%ir9 in+ 8 %ytes #e un golpe aunque aqu$ s.lo usamos uno porque no necesitamos m,s.

B RF.=&RA0x08: Este coman#o le est, #icien#o a qu- #irecci.n ha #e ir la in+ormaci.n que quieras enviar
pr,cticos90 pues ir, al PIC que tenga con+igura#o como recepci.n la #irecci.n / 8.

B ret2ARF.#E9=$': Env$a la in+ormaci.n. (ret&( nos sirve para sa%er qu- ha suce#i#o al intentar enviar. S

recepci.n9> I1I si ha envia#o pero no ha reci%i#o el ;CJ> y I&I si no ha po#i#o ser envia#o 8+allo #el har#*are orto#o/amente lo correcto es hacerlo tal como lo he puesto.

%asa!os a er el c*di-o del receptor( Recuerda 0ue a/or


#include <16F876A.h> #FU@ @ NOWDT, XT, PUT, NOPROT !T, NOD "U#, NO"ROWNOUT, NO$%P, NO!PD, NOWRT #use del&'(cl)c*+,------. #include /li012f34h,11-.h/ 99 $i02e2A& 6&2& ;&neT&2 el ;>dul) @PC c)n el nRF3,$-1. #0'5e 6)25&+-7-8 #0'5e 6)250+-7-6 #0i5 &-+6)25&.in58 2e51, d&5&B #0i5 0-+d&5&.99 Di2ecci>n del 6ue25) A. 99 Di2ecci>n del 6ue25) ". 99 Un 52uc) 6&2& ;:s 5&2de h&ce2 in5e2c&;0i)s de 0i5s.

99 Un 52uc) 6&2& ;:s 5&2de h&ce2 in5e2c&;0i)s de 0i5s.

#in51e75 99 Cn5e22u6ci>n R"-9CNT 6&2& el ;>dul) RF. <)id in51R"-(. ? 2e51 + RF1R ! C% (.B if ( (2e51 ++ -. DD (2e51 ++ 1. . ? d) ? d&5&+RF1DATAH-IB 99 D&5& c)n5end2: el <&l)2 =ue le lle4e del e;is)2, & 52&<Ks 6)250+d&5&B 99 $) =ue h&'& en d&5& l) 2efleT& en l)s $ Ds. &-+0-B 99 Un 52uc) 6&2& =ue R"- si2<& de in5e22u6ci>n ' RA- 6&2& 6) 2e51 + RF1R ! C% (.B E Fhile ( (2e51 ++ -. DD (2e51 ++ 1. .B 99 T&n5) si e7is5e en52&d& ;Jl5i6le ) si;6 E E <)id ;&in(. ? se5152is1&(-011111-.B se5152is10(-0-------1.B 6)250+-B RF1CNT1 N(.B RF1!ONFC#1@PC(.B RF1!ONFC#(-7,-,-7-8.B RF1ON(.B Fhile(52ue.B E 99P2)42&;& 62inci6&l. 99 RA- sus5i5u'e & R"- ' se 6)ne un $ D en RA-. 99 R"- es 6&2& l& in5e22u6ci>n, el 2es5) s)n $ Ds. 99 99 99 99 G&0ili5&2 in5e22u6ci>n R"-9CNT. !)nfi4u2&2 ;>dul)s @PC del PC!. !)nfi4u2&2 ;>dul) RF (c&n&l ' di2ecci>n.. Ac5i<&2 el ;>dul) RF.

99 "ucle infini5).

9 )a interrupci!n 6int_e7t se encargar de reci"ir los datos. 9 =o de"emos de con undir $ret'$ (del emisor) con $ret+$ (del receptor)0 porque en es

4ienen signi icados distintos para emitir que para reci"ir. En el receptor0 cuando vem que0 si el valor es E*E hay entrada simple de datos (una sola recepci!n0 o dicho de otra para ser le#dos): si nos da E+E signi ica que hay ms de una entrada (cada entrada es de tanda0 y no soporta ms de tres niveles0 el resto se perder#an. Cuando $ret+$ nos d, el no ha ha"ido entrada nueva de datos. En el programa0 tanto si hay entrada simple com "u er (compuesto de 2 "ytes por D niveles) queda vac#o una vez que sale d el $.hile 9 9

sea un poco ms lento que el receptor para evitar saturar al receptor y eso puede suceder cuand

9 /*_I!8_1!9:; Este comando ha"ilita la recepci!n de datos por interrupci!n de la %;


inmediatamente0 en la misma interrupci!n0 en el e/emplo propuesto lo hacemos de esta orma.

9 /*_0O!*I

_S(I9:; Con igura el SPI entre el PIC y el n%&'()*+0 de iniendo los patill

estn en la li"rer#a $lib_rf2gh4_10.h$ y las puedes modi icar si tu hard-are es di eren

9 /*_0O!*I

90740,070+:; Se re iere $0740$ al canal de comunicaci!n0 este siempre ha de ser e s#. $070+$ es la direcci!n de recepci!n. %ecuerda que en el emisor pusimos6 /*_<I/?070+; co

con igurado con esa direcci!n podr reci"ir esos datos0 si no uese esa direcci!n el PIC tanto no atender#a a esos datos.

9 /*_O!9:; 7ctiva el m!dulo %&. >espu,s de este comando conviene que transcurra unos '.? mi
programa0 en el que %7* tomar el valor que hu"iese ido en %;*.

9 'et_tri'_b90b00000001:; Casi todo el puerto ; lo convertimos en salidas de datos0 exc

en el esquema sustituyo %;* por /#0 en el PIC receptor. Jtilizo un truco de intercam"ios de

9 En la recepci!n de datos0 si esos datos no son tratados inmediatamente los puedes p

receptor has de cargarlos en una varia"le o matriz (seg8n el caso) antes de que pase a sirve para poder tratar el ;I4 * de esa varia"le para extraerlo por %7*.

"n -etalle 'obre el har-.

En nuestro proyecto tenemos siempre a los PICs como maestros S(I y los transceptores como esc voltios y los n%&'()*+ uncionan con un rango de D.D voltios puede ha"er una descompensaci!n d l!gico y cundo un * en una entrada del PICH Esto puede suceder en la 8nica entrada SPI que tien una resistencia a positivo de ? voltios en dicha patilla (tal como est en el esquema0 al comienzo un + l!gico al PIC lo lea como real. 4ener este simple gesto nos ahorrar muchos que"raderos de
7s# lo entend# yo6 /*_S1!<9: -evuelve lo' valore'5 4eniendo presente que en realidad siempre env#as 2 "ytes a la vez aunque s!lo uses uno0 es decir0 siempre env#as un array compuesto de 2 "ytes. * KL Env#o del array realizado y recepci!n con irmada (7CF). + KL Env#o del array realizado pero sin con irmaci!n por parte del receptor (sin 7CF). Es decir0 ha ha"ido pro"lemas por parte del receptor. ' KL Env#o no realizado. &allo del hard-are0 es decir0 allo del n%&'()*+.

Cuando da *0 todo "ien. Cuando da + ! '0 ha ha"ido pro"lemas. /*_/101I219: -evuelve lo' valore'5 %ecuerda que la recepci!n es tam"i,n un array de 2 "ytes aunque s!lo uses un s!lo "yte de dicho array. * KL %ecepci!n del array correcta. + KL %ecepci!n del array correcta y hay otro array en la cola para ser le#do. (Explico ms a"a/o este detalle.) ' ! D KL =o hay recepci!n de datos. =o es err!neo0 es que no hay datos reci"idos. Cuando da 0 signi ica que se ha reci"ido un array. )o procesas o lo cargas en otro array y listo. Cuando da 1 signi ica que se ha reci"ido varios arrays0 el mximo son D arrays0 el resto se perder#a si no le da tiempo a procesarlo0 o cargarlo en una matriz aparte (para que no se pierdan)0 o meter esa in ormaci!n en varia"les aparte (tam"i,n para que no se pierda). Cuando da 2 4 C signi ica simplemente que no se han reci"ido datos. Como normalmente se usa la interrupci!n %;* para provocar la interrupci!n y posterior lectura de los datos reci"idos0 %&@%ECEIME() normalmente te dar * ! +. 4e puede dar ' ! D si no usas la interrupci!n. >e todas ormas y por si las moscas0 en el programa la parte de la interrupci!n se le dice que si %&@%ECEIME() es + ! '0 entonces cargarlo en otro array o "ien procesar esa in o ah# mismo0 en cualquier otro modo no hacer nada. Cuando hay recepci!n m8ltiple (cuando da +) hay que volver a leer el array reci"ido mientras %&@%ECEIME() sea * ! + porque te ir dando los array que estn en cola. Cay como mximo D arrays (de 2 "its) de cola. Si reci"iese ms los perder#as0 pero esto es suponiendo que no le da tiempo a leerlos. Nue suceda esto me parece extraOo. P si sucede puede ser que el emisor env#e ms rpido de lo que el receptor puede asumir0 "ien porque el PIC receptor sea ms lento0 "ien porque adems de reci"ir los datos en ese momento quieras t" procesarlos o hacerles algo y eso demore la siguiente lectura. Personalmente no me he encontrado con ese pro"lema. 4odo lo que he comentado es de memoria y espero ha"erlo contando correctamente0 y si no que me corri/an. )a in ormaci!n de este tema est en el manual y lo puedes descargar haciendo clic en el siguiente enlace6 http6<<tinyurl.com<aDQe1y-

También podría gustarte