Code assembleur pour RFM12B 4mmMhz

Bonjour

Je cherche à tester un module RFM12B 433 Mhz. J'ai fait un montage avec un PIC 16F628A. Pour l'instant la sortie SDO reste désespérément à 0. Quelqu?un aurait-il une expérience dans ce domaine? Ou un bout de code qui fonctionne? Merci.

Reply to
jpwitz
Loading thread data ...

On 8 juin, 22:54, jpwitz :

Je ne vois pas de SDO sur le 16F628A, ce ne serait pas le TX de l'USART ?

Reply to
Jean-Christophe

Le 08/06/2012 23:25, Jean-Christophe a écrit :

SDO est la broche de sortie des données du RFM12B (

formatting link
J'ai connecté les 4 broches Sdo , Nsel, Sck et Sdi (et GND et VDD +5v) selon les affectation suivantes: Nsel ---> PORTB,4 Sdi ---> PORTB,5 Sdo ---> PORTB,6 Sck ---> PORTB,7

Reply to
jpwitz

On 9 juin, 08:51, jpwitz

Ah ok, donc c'est la sortie de donn=E9es du RFM12B qui n'envoie rien ? Et comment tu v=E9rifies ca : par code depuis le PIC ou avec un scope sur le signal DSO ?

Il manque beaucoup d'information pour t'aider.

D=E9ja, programme le PIC pour g=E9n=E9rer les signaux ad=E9quats vers SCK/SDI pour r=E9cup=E9rer des donn=E9es, mais sans connecter la sortie SDO du RFM12B (en la laissant en l'air) pour v=E9rifier au scope si tu as bien un signal sur SDO.

Si tu as un signal alors c'est le code qui g=E8re PORTB,6 qui est en cause, si tu n'as pas de signal alors ce sont les signaux SCK/SDI qui sont incorrects. (init des I/O du PIC, protocole de com avec le RFM12B, etc...)

Pour clarifier tu pourrais poster un schema de la partie com entre le PIC et le RFM12B et le code d'init et de com.

Reply to
Jean-Christophe

Le blocage se situe dans la la boucle d'attente que SDO est à 1 pour signaler la disponibilité de l'émetteur. Au scope, les signaux se figent (normal, le PIC attend dans la boucle) car SDO reste (désespérément) à 0. Le RFM12B est peut-être mal initialisé, mais où????

Voici ci-dessous le code utilisé.

**************************** RFM12B********************** #define Nsel PORTB,4 #define Sck PORTB,7 #define Sdi PORTB,5 #define Sdo PORTB,6

CBLOCK 0x20 ; Début de la zone RAM Drf :1 DataRF :1 CptRF :1

** initialisation du PIC 16F628A***

;** Initialisation du module RFM12 bsf Nsel bsf Sdi bcf Sck

initialisationRFM12 ;** 1 ** movlw 0x80 ; 10000000 call Spi8 movlw 0xD8 ; 11011000 ; -el, ef,bande 433 Mhz , 12,5pf call Spi8 ;** 2 ** movlw 0x82 ; 10000010 call Spi8 movlw 0xD9 ; 11011001 ;!er,!ebb,Et,Es,Ex,!eb,!ew,dc ; D9 ; 11011001 call Spi8 ;** 3 ** movlw 0xA6 ; 10100110 call Spi8 movlw 0x40 ; 01000000 call Spi8 ;** 4 ** movlw 0xC6 ; 11000110 call Spi8 movlw 0x47 ; 01000111 call Spi8 ;** 4 ** movlw 0xCC ; 11001100 call Spi8 movlw 0x77 ; 01110111 call Spi8 ;** 5 ** movlw 0x94 ; 10010100 call Spi8 movlw 0xA0 ; 10100000 call Spi8 ;** 6 ** movlw 0xC2 ; 11000010 call Spi8 movlw 0xAC ; 10101100 call Spi8 ;** 7 ** movlw 0xCA ; 11001010 call Spi8 movlw 0x80 ;10000000 call Spi8 ;** 7 ** movlw 0xCA ; 11001010 call Spi8 movlw 0x83 ;10000000 call Spi8 ;** 8 ** movlw 0xC4 ; 11000100 call Spi8 movlw 0x9B ;10011011 call Spi8 ;** 9 ** movlw 0x98 ; 10011000 call Spi8 movlw 0x50 ;01010000 call Spi8 ;** 10 ** movlw 0xE0 ; 11100000 call Spi8 movlw 0x00 ; 00000000 call Spi8 ;** 11 ** movlw 0xC8 ; 11001000 call Spi8 movlw 0x00 ; 00000000 call Spi8 ;** 12 ** movlw 0xC0 ; 11000000 call Spi8 movlw 0x00 ; 00000000 call Spi8

Test2 ;mise en marche de l'émetteur movlw 0x82 ; 10000010 call Spi8 movlw 0x38 ; 00111000 call Spi8

;boucle de transmission de la donnée test call Wait_rfm12 movlw 0xB8 ; 10111000 call Spi8 movlw 0xAA ; 10101010 call Spi8 call tempotest goto $-6

; sous-programme d'envoi d'un octet 8 bits Spi8 bcf Sck ; clock à 0 movwf Drf movlw d'8' movwf CptRF bcf Nsel ; Nsel = 0 call tempotest retourSp8 rlf Drf btfsc STATUS,C goto $+3 bcf Sdi goto $+2 bsf Sdi call tempotest bsf Sck ; clock à 1 call tempotest ; movwf Status_W ; sauvegarde STATUS btfss Sdo ; utile pour la commande de lecture des données 0xB000 goto $+3 bsf STATUS,C goto $+2 bcf STATUS,C rlf DataRF bcf Sck ; clock à 0 call tempotest decfsz CptRF goto retourSp8 bsf Nsel ; Nsel = 1 rlf Drf return

Wait_rfm12 ; attente de la disponibilité du module bcf Nsel btfss Sdo ; c'est ici que le pic tourne en boucle

-Sdo ne passe pas à un goto $-1 bsf Nsel return

tempotest nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop return

Reply to
jpwitz

On 15 juin, 15:51, jpwitz :

V=E9rifie au scope que le SDO du RFM12B change d'=E9tat, en le mesurant directement lorsqu'il est d=E9branch=E9 du PIC. ( ca n=E9c=E9ssite peut-=EAtre une r=E9sistance de pull-up | pull-down )

V=E9rifie que PORTB,6 soit bien initalis=E9 en entr=E9e, et que tu lis bien la valeur de la broche et non pas un latch interm=E9diaire qui ne serait pas rafraichi.

V=E9rifie que tu sors bien de la boucle de test de SDO, en appliquant du +Vcc sur SDO (avec RFM12B d=E9connect=E9)

V=E9rifie aussi les bits de config du PIC.

Reply to
Jean-Christophe

SDO change d'état avec Sck : sck=1 => sdo=1

Lorsque sdo est déconnecté du portB6, on sort de la boucle sans pb . Le PIC (semble) fonctionner komilfo.

Le 15/06/2012 18:34, Jean-Christophe a écrit :

Reply to
jpwitz

On 15 juin, 23:16, jpwitz :

Ah ! :o)

Un truc que tu pourrais ajouter dans la boucle d'attente de changement d'=E9tat de SDO, c'est un time-out qui permettrait de sortir de la boucle m=EAme si SDO reste fixe. (en positionnant un flag pour signaler qu'il n'y a pas de com avec le RFM12B) ou peut-=EAtre allumer une LED avec des clignotements diff=E9rents suivant l'=E9tat de la com.

)
Reply to
Jean-Christophe

Euréka

Le pb se situe au niveau de l?algorithme: Envoyer deux octets de 8 bits n'est pas égal à un mot de 16 bits: Nsel est positionné à 0 au début et remonte à 1 à la fin des 16 bits. Dans la routine Spi8 Nsel = 1 après 8 bits d'envoyé!

Le 15/06/2012 15:51, jpwitz a écrit :

Reply to
jpwitz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.