Autor Tema: Codigo .ASM encoder/decoder manchester  (Leído 5152 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ralcesar

  • PIC10
  • *
  • Mensajes: 16
    • Ayuda Electronica
Codigo .ASM encoder/decoder manchester
« en: 21 de Julio de 2009, 19:36:40 »
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.

Citar
;**********************************************************************
;
; 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  :?


Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Codigo .ASM encoder/decoder manchester
« Respuesta #1 en: 21 de Julio de 2009, 20:01:46 »
si usas el c, podrias implementar una USART por soft,,no?
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ralcesar

  • PIC10
  • *
  • Mensajes: 16
    • Ayuda Electronica
Re: Codigo .ASM encoder/decoder manchester
« Respuesta #2 en: 22 de Julio de 2009, 10:11:40 »
Creo que si, estoy recien en mi primer programa en C. Seria con el #use RS232() ?  en ese caso cuales serian los registros virtuales de esa USART implementada? me refiero por ej  al buffer donde llega y se ponen los datos a enviar.

Gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Codigo .ASM encoder/decoder manchester
« Respuesta #3 en: 22 de Julio de 2009, 11:06:48 »
Hola.

Revisa el ejemplo EX_ENCRY.C, ahi esta la combinacion de 2 USART, una por soft y una por hard.

Saludos
El papel lo aguanta todo

Desconectado soluciones_electronicas

  • PIC10
  • *
  • Mensajes: 1
Re: Codigo .ASM encoder/decoder manchester
« Respuesta #4 en: 20 de Enero de 2011, 12:11:37 »
saludos amigo,

tendrias la amabilidad de publicar el codogo para el receptor, pues me intereza mucho este proyecto.

gracias