Hola gente, estuve paseando y leyendo un buen rato en el sub-foro de robotica sobre comunicacion por RF pero no logre encontrar o tal vez no lo entendi.. ya tengo la cabeza quemada tanto leer y buscar sobre esto.
El tema es asi: tengo que realizar una comunicacion entre 2 PICs por medio de RF y para ello uso los simpaticos modulos
TLP-434 y RLP-434 que funcionan a 433 MHz enviando la señal modulada con ASK.
Primero ASK es la variante digital de la AM osea que voy a tener problemas debido al ruido por lo que no voy a poder mandar la informacion asi nomas, debo codificarla pero las datasheet que anduve leyendo usan integrados aparte y debido a que estoy tratando de tener un bajo costo en el proyecto me decante por usar codificación por software.
En el PIC receptor no puedo usar la USART debido a que ya la tengo ocupada, eso nomas me frena bastante porque la mayoria de la info que encontre usa ese modulo para la comunicacion inalambrica.
Por la "facilidad" voy a usar la
codificación manchester, despues de buscar y leer sobre esto encontre los tutoriales de Nigel, particularmente
uno que usa ésta codificación.
El codigo se que funciona porque en varios foros anglosajones lo recomiendan, pero no puedo entender que hace
Segun la pag esta compuesto por un header, address, dato y un checksum. El header son 20 bits en "1" seguido de un "0". La address esta compuesta de 8 bits (que al parecer tendria que ser 11100110)a los que se le agregan al final un "1" seguido de un "0" que indican la finalizacion de la cadena de la address. El dato tambien son 8 bits seguidos del "1" y del "0" y el checksum idem a el address.
Les dejo el codigo del transmisor para que alguna alma caritativa se apiade y vea si le entiende asi me lo explica.
¿pero si sabes que funciona porque no lo usas y listo? Re: porque asi no tienen sentido hacer las cosas, nunca voy a aprender, ademas al programa general que estoy haciendo está en C y me gustaria entenderlo y reescribirlo en C, para que me quede como libreria.
;**********************************************************************
;
; Tutorial 12.1T - Manchester transmit routine, one byte packets.
;
;**********************************************************************
list p=16f628
__CONFIG 0x3D18
#include <p16F628.inc>
;#define TXINV
;invert TX output so inactive is HIGH?
packet_len EQU 2 ;packet length 1 + 1 address byte
;TX pin is porta, 6
#ifndef TXINV
#define TXLOW BCF PORTA, 6
#define TXHIGH BSF PORTA, 6
#else
#define TXLOW BSF PORTA, 6
#define TXHIGH BCF PORTA, 6
#endif
;***** VARIABLE DEFINITIONS
cblock 0x20 ;start of general purpose registers
ncnt
bt
sum
mtx_buffer
mtx_buffer1
mtx_delay ; half_frame delay
count1 ;used in delay routine
count2
counta ;used in delay routine
countb ;used in delay routine
endc
org 0x0000
goto main
nop
nop
nop
retfie
main ; program starts here
movlw 0x07 ; b 0000 0111
movwf CMCON ; Registro de Control del Comparador, apagamos el comparador
bsf STATUS, RP0 ;select bank 1
movlw 0x00
movwf TRISA ; Todo el puerto A como salida
clrf TRISB
bcf STATUS,RP0 ;select bank 0
clrf PORTA
clrf PORTB
call mtx_init
Loop
movlw 0xAA ; set packet address byte to 0xAA
movwf mtx_buffer
movlw 'N'
movwf mtx_buffer1
call mtx_send
call Delay20 ; retardo 20ms
movlw 'i'
movwf mtx_buffer1
call mtx_send
call Delay20
movlw 'g'
movwf mtx_buffer1
call mtx_send
call Delay20
movlw 'e'
movwf mtx_buffer1
call mtx_send
call Delay20
movlw 'l'
movwf mtx_buffer1
call mtx_send
call Delay20
movlw ' '
movwf mtx_buffer1
call mtx_send
call Delay20
goto Loop
;Manchester subroutines
; Author: el@jap.hu
; http://jap.hu/electronic/
mtx_init movlw .115 ; 350 usec
movwf mtx_delay
return
;
mtx_send
; send out buffer
outbuf movlw 0x14 ; 20xbit1, 1xbit0
header movwf count2
head0 call bit1
decfsz count2,F
goto head0
call bit0
movlw mtx_buffer ; mtx_buffer igual a 0xAA
movwf FSR ; registro de direccionamiento indirecto, guarda la direccion a leer/escribir
movlw packet_len ; == a 2 (1 byte + address)
movwf count1
movlw 0xff
movwf sum ; sum = 1111 1111
;
outbu0 movf INDF,W ; mueve a W lo apuntado por FSR, osea lo que esta en 0xAA
call update_sum
movf INDF,W , mueve a W
call outbyte
incf FSR,F
decfsz count1,F
goto outbu0
movf sum,W
call outbyte
; buffer is sent
return
update_sum ; fast CRC-8 algorithm with poly x^8+x^5+x^4+1
; executes in 23 cycles per update
xorwf sum,f ; pareciera que al resultado de la X-OR entre W y sum lo guarda sum
clrw
btfsc sum,7
xorlw 0x7a
btfsc sum,6
xorlw 0x3d
btfsc sum,5
xorlw 0x86
btfsc sum,4
xorlw 0x43
btfsc sum,3
xorlw 0xb9
btfsc sum,2
xorlw 0xc4
btfsc sum,1
xorlw 0x62
btfsc sum,0
xorlw 0x31
movwf sum
return
outbyte movwf bt ; guarda w en bt
movlw 8
movwf count2 ; 8 a count2
outby0 rlf bt,F ; corrimiento de 1 bit hacia la izq,
btfsc STATUS,C , bandera de carry, ¿MSB en "1"?
goto outby1
call bit0
goto outby2
outby1 call bit1
outby2 decfsz count2,F ; F ???
goto outby0
;
call bit1
; and bit0 - falls through to bit0 subroutine
;send a bit0
bit0 TXHIGH ; HIGH
call mtx_bitdel ; bit time delay
TXLOW ; to LOW transition
call mtx_bitdel ; bit time delay
return
;send a bit1
bit1 TXLOW ; LOW, es un bcf del pin por donde sale la señal
call mtx_bitdel ; bit time delay
TXHIGH ; to HIGH transition, es un bsf
call mtx_bitdel ; bit time delay
return
; bit delay modified by NG
mtx_bitdel movf mtx_delay, W
movwf ncnt
ndelaya1 decfsz ncnt, F
goto ndelaya1
return
; end of Manchester routines
;Delay routines
Delay255 movlw 0xff ;delay 255 mS
goto d0
Delay100 movlw d'100' ;delay 100mS
goto d0
Delay50 movlw d'50' ;delay 50mS
goto d0
Delay20 movlw d'20' ;delay 20mS
goto d0
Delay5 movlw 0x05 ;delay 5.000 ms (4 MHz clock)
d0 movwf count1
d1 movlw 0xC7 ;delay 1mS
movwf counta
movlw 0x01
movwf countb
Delay_0
decfsz counta, f
goto $+2
decfsz countb, f
goto Delay_0
decfsz count1 ,f
goto d1
retlw 0x00
end
Se puede ver que la codificación no es de él (Nigle), sino de otro flaco y da la pagina, pero me fije y es más lio porque son circuitos de control remoto de 4 canales o más