Autor Tema: Ayuda para calcular un CRC (DOW) en un ibutton  (Leído 7255 veces)

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

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Ayuda para calcular un CRC (DOW) en un ibutton
« en: 30 de Octubre de 2008, 10:11:36 »
Hola a todos, amables foristas de esta pagina.

Llevo un tiempo trabajando en la comunicación entre un botón "ibutton" de Maxim y un pic. Hasta ahora todo me había marchado muy bien , y ya he logrado implementar la comunicación entre el botón y el pic. Se que ya he leído bien el botón , por que cuando comparo los resultados que captura el ICD2 con los que me da un lector para la pc , ambos coinciden. 

Publicare mi programa al final de este mensaje , para los que anden buscando un ejemplo de como lograr esto.

Mi problema es a la hora de tratar de implementar el calculo del DOW(CRC).

El DOW(CRC) Se utiliza para verificar si los datos del ROM quedaron bien en el PIC.  Para calcularlo se usa el siguiente diagrama:




De ahí creo entiendo lo siguiente:

Primero que nada el diagrama es la representación a nivel hardware y creo que el polinomio de arriba es la representación matemática , pero según entiendo se usa una u otra manera para explicarlo. No las 2 juntas.

Hablando del polinomio encontré una pagina  http://www.employees.org/~surendra/asic/crc.html
donde explica los cálculos de CRC como una división , donde el polinomio es interpretado  como el  el lugar que ocupan los bits 1 en el numero binario.
Ejemplo

Si el polinomio fuera  = (x^3 + x^2 + x^0)
El numero binario seria 1101
mas adelante explica que el CRC es una división con este numero como el divisor y los datos a chekar como el dividendo y  al final lo que queda de residuo es el CRC.  (No he conseguido que eso funcione). En el caso del polinomio de la imagen entiendo que quedaría un numero de 10bits  :shock: 1001100001

Poniendo atención al diagrama intente lo siguiente:
El diagrama mas bien me da a entender que lo que se necesita es una serie de operaciones para cada bit a revisar. Empezando por una operacion XOR entre el bit de entrada y X8 . Lo cual asumi que era el bit de salida. Despues entendi que cada etapa era un shift del shift register , y las operaciones XOR despues de X4 y X5  entendi que eran entre el resultado del primer XOR y el bit donde estubiera en ese momento el LSB del shift register. Denuevo al final quedan bits de mas ya que son 9 etapas .


Bueno ojala que alguien me pueda dar una mano con esto. Estoy realmente muy atorado desde hace tiempo.
De antemano muchas gracias .






"P3" ESTE ES UN BUEN PROGRAMA DE EJEMPLO EN ENSAMBLADOR PARA IMPLEMENTAR COMUNICACIONES ENTRE UN IBUTTON DE DALLAS SEMICONDUCTORS Y UN PIC .
Código: [Seleccionar]
;P3.ASM********************************************************************************
;
;**************************************************************************************
;ENCABEZADO
#INCLUDE <P16F88.INC>
LIST P = 16F88
ERRORLEVEL - 302
ERRORLEVEL - 305
;**************************************************************************************
;VARIABLES
    cblock  0x20
            IOBYTE
            TMPO                               
            COUNT                             
TEMP
    TEMP1
    TEMP2
    PDBYTE
    DATO1
    DATO2
    DATO3
    DATO4
    DATO5
    DATO6
    DATO7
    DATO8                             
    endc
;**************************************************************************************
;CONSTANTES
;CONSTANTES DE PROGRAMA
constant DQ=.0
;CONSTANTES DE 1 WIRE
constant RDROM=0x33
constant CONVERT=0x44
constant SKPROM=0xCC
;**************************************************************************************
;VECTORES
ORG 0X00
GOTO INICIO
;ORG 0X04
;GOTO INTERRUPCION
;*************************************************************************************
;LIBRERIAS EXTRA
#INCLUDE <1WIRE.INC>
;===================================================================================
INICIO
;===================================================================================
;-----------------------------------------------------------------------------------
CONFIGURACION
;-----------------------------------------------------------------------------------
BCF STATUS,RP0 ;BANCO 0
CLRF PORTA ;INICIALIZA PUERTO A
CLRF PORTB ;INICIALIZA PUERTO B
BSF STATUS,RP0 ;BANCO 1
CLRF ANSEL ;TODOS LOS PINES EN MODO DIGITAL
MOVLW B'11111111' ;LITERAL A W
MOVWF TRISA ;CONFIGURA TODO EL PUERTO A COMO ENTRADAS
MOVWF TRISB ;CONFIGURA TODO EL PUERTO B COMO ENTRADAS
BCF TRISB,3 ;CONFIGURA RB3 COMO SALIDA
BCF STATUS,RP0 ;BANCO 0
;-----------------------------------------------------------------------------------
;CICLO DE ESPERA (*** SUBSTITUIR CON SLEEP MAS INTERRUPCION AL FINAL ***)
;-----------------------------------------------------------------------------------
BTFSC PORTB,0 ;ESPERA UN CAMBIO EN RBO (DESPUES USARE UNA INTERRUPCION POR FLANCO DE CAIDA)
GOTO $-1 ;REGRESA UNA INSTRUCCION
;-----------------------------------------------------------------------------------
;POSIBLE BOTON EN EL LECTOR
;-----------------------------------------------------------------------------------
CALL RESET ;Busca una respuesta de precencia de algun boton(esta en 1WIRE.INC)
MOVLW 0x33 ;Literal a w (33h = Read ROM)
CALL TXBYTE ;Manda la instruccion 33h al boton (parte de 1WIRE.INC)
CALL RXBYTE ;Recibe la primer respuesta del boton "Family Code" 
;(en el caso de ibutton DS1904 deberia ser 24h))
MOVF IOBYTE,W;Mueve el dato a w
MOVWF DATO1 ;Guarda el dato en "DATO1"

CALL RXBYTE ;Recibe segunda respuesta
;(primeros 8 bit de numero de serie)
MOVF IOBYTE,W;Mueve dato a W
MOVWF DATO2 ;Guarda el dato en "DATO2"

CALL RXBYTE ;Resibe tercer respuesta
;(bits 8-16 del numero de serie del boton)
MOVF IOBYTE,W;Mueve el dato a W
MOVWF DATO3 ;Guarda el dato en "DATO3"

CALL RXBYTE ;Recibe cuarto byte de respuesta
;(bits 16-24 de numero de serie)
MOVF IOBYTE,W;Mueve el dato a W
MOVWF DATO4 ;Guarda el dato en "DATO4"

CALL RXBYTE ;Recibe cuarto byte de respuesta
;(bits 24-32 de numero de serie)
MOVF IOBYTE,W;Mueve el dato a W
MOVWF DATO5 ;Guarda el dato en "DATO5"

CALL RXBYTE ;Recibe cuarto byte de respuesta
;(bits 32-40 de numero de serie)
MOVF IOBYTE,W;Mueve el dato a W
MOVWF DATO6 ;Guarda el dato en "DATO6"

CALL RXBYTE ;Recibe cuarto byte de respuesta
;(bits 40-48 de numero de serie)
MOVF IOBYTE,W;Mueve el dato a W
MOVWF DATO7 ;Guarda el dato en "DATO7"

CALL RXBYTE ;Recibe cuarto byte de respuesta
  ;(bits 1-8 de CRC)
MOVF IOBYTE,W;Mueve el dato a W
MOVWF DATO8 ;Guarda el dato en "DATO8"

NOP
NOP
NOP
;-----------------------------------------------------------------------------------
;====================================================================================
END
;====================================================================================




LIBRERIA 1WIRE.INC

Código: [Seleccionar]
; *******************************************************
;
; Protocolo de comunicación 1-Wire de Dallas para PIC16F88
;
; *******************************************************

; *******************************************************
; MACROS
; *******************************************************
ALTO:MACRO ; DECLARA UNA NUEVA MACRO "ALTO"
      BSF           STATUS,RP0 ; BANCO 1
      BSF           TRISB,0 ; PON AL PIN DQ(RB0) EN ESTADO DE ALTA IMPEDANCIA
      ; (ALTA IMPEDANCIA = ENTRADA CON PULLUP)
      BCF           STATUS,RP0 ; BANCO 0
      ENDM ; FIN DE MACRO "ALTO"
; --------------------------------------------------------
BAJO:MACRO ; DECLARA UNA NUEVA MACRO "BAJO"
      BCF           STATUS,RP0 ; BANCO 0
      BCF           PORTB, 0        ; LIMPIA PIN(RB0)
      BSF           STATUS,RP0      ; BANCO 1
      BCF           TRISB, 0        ; RBO COMO SALIDA CON 0
      BCF           STATUS,RP0      ; BANCO 0
      ENDM ; FIN DE MACRO "BAJO"
; --------------------------------------------------------
WAIT:MACRO TIME ;DECLARA MACRO "WAIT" CON PARAMETRO DE ENTRADA "TIME"
;ESTE MACRO ES UN RETARDO QUE DURA
;UN TIEMPO "TIME" EXPRESADO EN MICROSEGUNDOS
;QUE DEBEN SER MULTIPLOS DE 5µs

;***Esta macro se me hace increible***
;¿Como es que el parametro "TIME" puede ser mayor a 255?
;¿Como es que funciona la division con el assembler?
;Ojala alguien pudiera darme alguna info de como funciona "victor.terr@gmail.com"

      MOVLW         (TIME/5)-1      ;1µs
      MOVWF         TMPO ;1µs
      CALL          WAIT5U ;2µs
      ENDM ;termina la macro "WAIT"


; *******************************************************
;       Dallas Semiconductor 1-Wire ROUTINES
; *******************************************************
WAIT5U:
;RETARDO 5µs
      NOP ;1µs
      NOP ;1µs
      DECFSZ        TMPO,F ;1µs o 2µs cuando sale del ciclo
      GOTO          WAIT5U  ;2µs
      RETLW         0       ;2µs REGRESA
      ;(***No se por que no se usa RETURN***)
; -------------------------------------------------------
RESET: ;RUTINA RESET(ES EL INICIO DE CUALQUIER COMUNICACCION CON EL BOTON
      ALTO                  ;NORMALMENTE YA ESTA EN ESTADO DE ALTA IMPEDANCIA EL BUS
      CLRF       PDBYTE    ;LIMPIA EL BYTE DONDE SE GUARDARA EL BIT DE PRECENCIA(PD)
      BAJO ;PON RB0 CON UN ESTADO DE SALIDA CON 0
      WAIT          .500    ;ESPERA 500µs EN ESE ESTADO
      ALTO ;REGRESA AL ESTADO DE ALTA IMPEDANCIA
      WAIT          .70     ;ESPERA 70µs EN ESE ESTADO
      BTFSS         PORTB,0 ;BUSCA LA RESPUESTA DE PRECENCIA DEL BOTON
      INCF          PDBYTE,F;SI EL BOTON ESTA PRESENTE INCREMENTA PD BYTE
      WAIT          .400    ;ESPERA 400µs
      RETLW       0 ;REGRESA
      ;(***No se por que no se usa RETURN***)
; --------------------------------------------------------
RXBYTE: ;RUTINA PARA LA LECTURA DE 1 BYTE DE INFO DEL BOTON
      MOVLW         .8 ;MUEVE VALOR LITERAL "8 decimal" A REGISTRO W
      MOVWF         COUNT   ;MUEVE EL VALOR A LA VARIABLE CUENTA
     ALTO ;RB0 YA DEBERIA DE ESTAR EN ALTA IMPEDANCIA
RXLP: ;CICLO DE LECTURA
      BAJO ;ESTADO DE BAJA IMPEDANCIA EN RB0
      ;(LE INDICARA AL BOTON QUE EL PIC ESTA LISTO PARA RECIBIR DATOS)
      NOP ;NO OPERA ESPERA 1us;
      NOP ;NO OPERA ESPERA 1us;
      NOP ;NO OPERA ESPERA 1us; MANTIENE EL ESTADO DE BAJA IMPEDANCIA
      NOP ;NO OPERA ESPERA 1us; DURANTE 6us
      NOP ;NO OPERA ESPERA 1us;
      NOP                   ;NO OPERA ESPERA 1us;
      ALTO ;ESTADO DE ALTA IMPEDANCIA EN RB0
      ;(EL BOTON SE CARGARA DURANTE DESPUES MANDARA RESPUESTA)
      NOP ;NO OPERA ESPERA 1us;
      NOP ;NO OPERA ESPERA 1us;
      NOP ;NO OPERA ESPERA 1us;
      NOP                   ;NO OPERA ESPERA 1us; 4µs
      BCF           STATUS,C;LIMPIA EL BIT DE ACARREO
     BTFSC          PORTB,0 ;VE SI RB0 ESTA EN 0
     BSF         STATUS,C ;SI ESTA EN 0 PON EN 1 EL BIT DE ACARREO
     RRF           IOBYTE,1 ;CARGA EL RESULTADO DEL BIT DE ACARREO EN IOBYTE
      WAIT          .50     ;ESPERA 50us
      ALTO ;YA DEBERIA DE ESTAR EN ALTA IMPEDANCIA
     DECFSZ        COUNT,F  ;DECREMENTA LA CUENTA DE BITS
      GOTO          RXLP ;VE AL CICLO DE LECTURA
      RETLW         0 ;REGRESA
; --------------------------------------------------------
TXBYTE:                      ; ENVIA UN BYTE AL BOTON (CARGAR PRIMERO EL BYTE EN W)
      MOVWF         IOBYTE ; MUEVE W AL BYTE DE ENTRADA SALIDA (IOBYTE)
      MOVLW         .8 ; INICIA UNA CUENTA DE BITS EN 8 DECIMAL
      MOVWF         COUNT    ; MUEVE EL 8 A VARIABLE CUENTA
TXLP: ; CICLO ESCRITURA
      BAJO ; ESTADO DE BAJA IMPEDANCIA
      NOP ; NO OPERA ESPERA 1us;
      NOP ; NO OPERA ESPERA 1us;
      NOP                    ; NO OPERA ESPERA 1us;  ESPERA 3µs
      RRF           IOBYTE,F ; ROTA A LA DERECHA EL BIT DE ENTRADA SALIDA "IOBYTE"
      BSF           STATUS,RP0  ; BANCO 1
      BTFSC         STATUS,C    ; REVISA EL BIT DE ACARREO
      BSF           TRISB,0     ; ESTADO DE ALTA IMPEDANCIA EN RB0 SI ACARREO ES 1 (MANDA UN 1)
      BCF           STATUS,RP0  ; BANCO 0
      WAIT          .60         ; ESPERA 60us
      ALTO                      ; ALTA IMPEDANCIA EN RB0 (MANDA UN 0)
      NOP ; NO OPERA ESPERA 1us;
      NOP                       ; NO OPERA ESPERA 1us; ESPERA   2µs
      DECFSZ        COUNT,F     ; DECREMENTA LA CUENTA DE BITS
      GOTO          TXLP ; VE AL CICLO DE ESCRITURA
      RETLW         0 ; REGRESA
; --------------------------------------------------------
« Última modificación: 30 de Octubre de 2008, 10:17:14 por pakuak »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #1 en: 30 de Octubre de 2008, 12:53:04 »
Hola pakuak, en primer lugar perdon si algo que escribo ya lo conoces, el CRC se aplica para verificar que los datos que recibiste del dispositivo son correctos, lo que se hace es computar el CRC de los datos y compararlos con el CRC recibido, si son iguales se asume que la lectura fue correcta. El desarrollo matematico del CRC creo que escapa de este post y tambien escapa de mis conocimientos. Dado el algoritmo, hay dos formas de implementarlo, una es calcular en vuelo cada valor y otra es usar una table lookup, con valores precalculados. Este último método es el más apropiado porque es más rápido pero consume 256 bytes de la tabla precomputada.
Tengo código escrito en C que funciona perfectamente, decime si queres y te lo subo.

Saludos !

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #2 en: 30 de Octubre de 2008, 20:20:08 »
Gracias por tu respuesta RICHI777 . Si te agradeceria bastante tu ejemplo.Quien sabe, quisas tenga algo que me ilumine las neuronas.Creo que vale mucho la pena darle un vistazo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #3 en: 31 de Octubre de 2008, 01:47:04 »
Hola pakuak.

En el gráfico parece tal vez más complejo de lo que realmente es.
Recién he estado trabajando(porque me ha entrado la curiosidad, asi que has tenido suerte y lo he hecho) en generar el código assembler para calcular el CRC8 que estabas buscando.

Creo que funciona :D

;Constante del polinomio: X^8+X^5+X^4+1
#DEFINE      POLY   0x8C
;Variables generales
CRC         EQU      0x20
CONT      EQU      0x21

;//////////////////////////////////////////////////
;FUNCION: CALC_CRC8
;recibe W(byte del cual calcular el CRC)
;devuelve CRC(CRC calculado)
;//////////////////////////////////////////////////

CALC_CRC8
   movwf CRC
   movlw   .8
   movwf   CONT
next_crc
   bcf      STATUS,C
   rrf      CRC,F
   movlw   POLY
   btfsc   STATUS,C
   xorwf   CRC,F

   decfsz   CONT,f
   goto   next_crc      
   
   return


Cualquier cosa me avisas.

Saludos ;)

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #4 en: 31 de Octubre de 2008, 05:12:48 »
Muchísimas gracias Bruno, me has ayudado muchísimo. :-/ :-/ 

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #6 en: 01 de Noviembre de 2008, 06:44:14 »
Muchas gracias RICH1777 :-)

En especial me gusto mucho el link del foro de Microchip. Le dare una buena revisada mas detenida y hare mas pruebas a lo largo del dia. Luego les comentare como me ha ido.


Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #7 en: 02 de Noviembre de 2008, 06:44:55 »
Solo quiero darles un avance de como va todo esto del CRC.

Gracias a una pagina de Rich177 he logrado encontrar un documento con un programa que entendí bastante bien. que utiliza una tabla para dar el CRC . Tengo algunos problemas para hechar a andar bien la tabla. Pero creo que ya estoy del otro lado. En este momento estoy batallando con que tengo los valores de los datos guardados en variables para cada dato (dato1,dato2,dato3 ... ). Y pasa algo muy raro cuando intento meter estos datos en la tabla. por ejemplo cuando trato de cargar la variable 24h ,que corresponde a  dato1. Simplemente hago una instrucción MOVF dato1,w y en lugar de que W cargue el 24h .Se carga un 21h :shock:.

En fin, si a alguien se le ocurre algo les agradeceré mucho cualquier  sugerencia, aquí o en mi correo victor.terr@gmail.com

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #8 en: 02 de Noviembre de 2008, 09:42:47 »
Hola. No entiendo el problema si ya debería alcanzar con el algoritmo que publiqué.
Lo de la carga en W seguro que es un error tuyo. Publicá el código y lo vemos.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #9 en: 03 de Noviembre de 2008, 05:49:41 »
Hola de nuevo. Posteo acá el código para comprobar los 8 bytes de los ibuttons que contienen la familia, Numero de serie y CRC.

Para aprender cómo calcularlo, primero hay que leer la aplication note 27 de maxim(de la cual ha sido extraida esa imágen).

Este programita que hice comprueba los primeros 7 bytes(56 bits) y muestra en el puertob el CRC calculado. Si el CRC coincide con el esperado, PORTA,0 se pone en alto.

Esto es un poco a mera manera educativa. Luego sencillamente lo que se hace es someter al mismísimo byte del CRC(8vo byte)  también al algoritmo. Si el resultado es 0, entonces el CRC es correcto.(es decir, cargar a CONT2 con 8 en lugar de 7, y al final solo asegurarse que INDEX valga 0)


El programa(use los 8 bytes del ejemplo de la AP27):
Código: ASM
  1. ;BY BRUNO FASCENDINI
  2. ;---------------Encabezado-------------
  3.     LIST p=16f876A
  4.         include "p16F876A.inc"
  5.     radix hex
  6.  
  7.         __config _XT_OSC & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _CP_OFF
  8.  
  9.  
  10.  
  11. ;Constante del polinomio: X^8+X^5+X^4+1
  12. #DEFINE         POLY    0x8C
  13. ;Variables generales
  14. CRC             EQU             0x20
  15. CONT            EQU             0x21
  16. CONT2           EQU             0x22
  17. INDEX           EQU             0x23
  18.  
  19.         CBLOCK          0x30
  20.                 DATA0,DATA1,DATA2,DATA3
  21.                 DATA4,DATA5,DATA6,DATA7
  22.         ENDC
  23.        
  24.  
  25.         org     0x00
  26.  
  27.         bsf     STATUS,RP0
  28.         movlw   0x06
  29.         movwf   ADCON1
  30.         clrf    TRISA
  31.         clrf    TRISB
  32.         clrf    TRISC
  33.         bcf     STATUS,RP0
  34.  
  35.         clrf    PORTA  
  36.         clrf    PORTB
  37.         clrf    PORTA
  38.        
  39.         movlw   0x02                ;flia
  40.         movwf   DATA0
  41.         movlw   0x1C
  42.         movwf   DATA1
  43.         movlw   0xB8
  44.         movwf   DATA2
  45.         movlw   0x01
  46.         movwf   DATA3
  47.         movlw   0x00
  48.         movwf   DATA4
  49.         movlw   0x00
  50.         movwf   DATA5
  51.         movlw   0x00             ;datos
  52.         movwf   DATA6
  53.         movlw   0xA2             ;valor del CRC esperado
  54.         movwf   DATA7  
  55.  
  56.         clrf    INDEX
  57.         movlw   .7
  58.         movwf   CONT2
  59.         movlw   DATA0
  60.         movwf   FSR
  61.  
  62. Prox
  63.         movf    INDF,W
  64.         xorwf   INDEX,W
  65.         call    CALC_CRC8
  66.         movwf   INDEX
  67.         incf    FSR,F
  68.         decfsz  CONT2,F
  69.         goto    Prox
  70.  
  71.         movf    INDEX,W                 ;CRC CALCULADO EN W
  72.         movwf   PORTB
  73.  
  74.         movf    DATA7,W
  75.         xorwf   INDEX,W
  76.         btfsc   STATUS,Z
  77.         bsf     PORTA,0
  78.  
  79.         goto    $
  80.  
  81. ;//////////////////////////////////////////////////
  82. ;FUNCION: CALC_CRC8
  83. ;recibe W(byte del cual calcular el CRC)
  84. ;devuelve CRC(CRC calculado)
  85. ;//////////////////////////////////////////////////
  86.  
  87. CALC_CRC8
  88.         movwf   CRC
  89.         movlw   .8
  90.         movwf   CONT
  91. next_crc
  92.         bcf     STATUS,C
  93.         rrf     CRC,F
  94.         movlw   POLY
  95.         btfsc   STATUS,C
  96.         xorwf   CRC,F
  97.  
  98.         decfsz  CONT,f
  99.         goto    next_crc               
  100.        
  101.         movf    CRC,W
  102.         return
  103.  
  104.  
  105.  
  106. ;------------------------------------------
  107.     end ; se acabó
  108. ;------------------------------------------

Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #10 en: 03 de Noviembre de 2008, 06:06:54 »
Bruno  :D Justamente te estaba escribiendo acerca de eso, creo que si te llego mi mail después de todo. Ahorita tuve un problema técnico con mi máquina , y tuve que reinstalar Windows. Afortunadamente siempre tengo todo respaldado, Revisare el código en el transcurso del día y mañana en la mañana posteo como me fue. Enserio muchísimas gracias.  :-)

Saludos.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #11 en: 03 de Noviembre de 2008, 06:10:53 »
Ahh los mails llegan, pero no siempre tengo tiempo(y/o ánimo) de revisarlos o responderlos todos. ;)

Debería irte bien! A mi me funcionó a la perfección.

Suerte. Ya contarás cómo te ha ido.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Ayuda para calcular un CRC (DOW) en un ibutton
« Respuesta #12 en: 08 de Noviembre de 2008, 08:19:38 »
Disculpen la tardanza con mas actualizaciones. Tuve unos días terribles en la oficina y realmente no pude darme el tiempo para analizar bien el código de Bruno. El cual por cierto fue fabuloso.  :-/ :-/ :-/

Ya tengo un código perfecto para calcular el CRC DOW :-).   

Muchas muchas gracias Bruno y gracias RICHI777 , por  su tiempo y su paciencia.

Aqui esta el código de Bruno con algunas modificaciones mias :

Código: [Seleccionar]
 


De ahora en adelante seguire subiendo mas sobre el proyecto que tengo pero lo hare en nuevos temas .

       
   
      ;BY BRUNO FASCENDINI
      ;COMENTARIOS  Y ADAPTACION A  PIC 16F88 AGREGADOS POR VICTOR TERRAZAS
     
     
      ;---------------ENCABEZADO-------------
         ; LIST P=16F876A
      ; INCLUDE "P16F876A.INC"
       ; RADIX HEX
      ;__CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF & _BODEN_OFF & _CP_OFF
   
    ;-----------------ENCABEZADO 16F88-----------------
    #INCLUDE <P16F88.INC>
    LIST P = 16F88
    ERRORLEVEL - 302
    ERRORLEVEL - 305
  ;------------------------------------------------------------------
 
      ;CONSTANTE DEL POLINOMIO: X^8+X^5+X^4+1
#DEFINE POLY 0X8C
;VARIABLES GENERALES
 
CRC EQU 0X20
CONT EQU 0X21
CONT2 EQU 0X22
INDEX EQU 0X23
 
      CBLOCK 0X30 ; REGISTROS 0X30 A 0X37
  DATA0,DATA1,DATA2,DATA3 ; SERAN USADOS PARA ALMACENAR EL
  DATA4,DATA5,DATA6,DATA7 ; VALOR  DE LOS DATOS DEL BOTON
  ENDC ; ES IMPORTANTE QUE SEAN SUCESIVOS
 
  ORG 0X00
 
INICIALIZAR_PIC
  ;{;    
;SELECCIONAR MODO DIGITAL
BSF STATUS,RP0 ;BANCO 1
  ;MOVLW 0X06 ;  no necesario para inicializar pic 16f88
  ;MOVWF ADCON1 ;
  CLRF ANSEL ;
 
  ;CONFIGURAR ENTRADAS Y SALIDAS
  CLRF TRISA ;TODO EL PUERTO A COMO SALIDA
  CLRF TRISB ;TODO EL PUERTO B COMO SALIDA
  ;CLRF TRISC ;TODO EL PUERTO C COMO SALIDA

;LIMPIAR SALIDAS
BCF STATUS,RP0 ;BANCO 0
  CLRF PORTA ;TODO EL PUERTO A   = 0
  CLRF PORTB ;TODO EL PUERTO B   = 0
 ;};
 
DATOS_DEL_BOTON
;{;Estos datos en la practica tendrian que ser leidos del boton
; Se pone su valor para poder simular este programa sin los botones reales

;mi boton ;prog original
MOVLW 0X24 ;0X02                ;2 HEX A W (10 BIN , 2 DEC)
  MOVWF DATA0 ;MUEVE 2HEX A "DATA 0"
 
MOVLW 0X27 ;0X1C ;1C HEX A W (11100 BIN ,28DEC )
  MOVWF DATA1 ;1C A "DATA 1"
 
  MOVLW 0X40 ;0XB8 ;B8 HEX A W (10111000BIN , 184DEC)
  MOVWF DATA2 ;B8 A "DATA2"
 
  MOVLW 0X2F ;0X01 ;01 HEX A W (1 BIN, 1 DEC)
      MOVWF DATA3 ;01 A "DATA 3"
     
      MOVLW 0X00 ;0x00 ;00 HEX (0 BIN , 0 DEC) A W
      MOVWF DATA4 ;0 A "DATA 4"
      MOVWF DATA5            ;0 A "DATA 5"
      MOVWF DATA6 ;0 A "DATA 6"
     
      MOVLW 0XA2 ;A2 HEX A  W (10100010 BIN , 162 DEC)             
      MOVWF DATA7 ;A2 HEX A "DATA 7 " (CRC ESPERADO)
 ;};
 
 PROCESAR_DATOS
 
      CLRF INDEX ;LIMPIA VARIABLE INDEX

      MOVLW .7 ;7DEC A W
      MOVWF CONT2 ;MUEVE 7 DEC A CUENTA REGRESIVA  "CONT2"
     
      MOVLW DATA0 ;2 HEX A W (10 BIN , 2 DEC)
      MOVWF FSR ;2 HEX A FSR
     
      PROX
      MOVF INDF,W ;MUEVE EL CONTENIDO DE FSR  A W(indirectamente)
      XORWF INDEX,W ;HAZ UNA OPERACION XOR ENTRE INDEX Y W
      CALL CALC_CRC8 ;LLAMA A LA RUTINA CALC_CRC8
      MOVWF INDEX ;LO QUE REGRESA EN W
      INCF FSR,F ;INCREMENTA EL REGISTRO DE FSR
      DECFSZ CONT2,F ;DECREMENTA LA CUENTA CONT2
      GOTO PROX ;REGRESA AL CICLO PROX
 
MOVF INDEX,W ;CRC CALCULADO EN W
MOVWF PORTB ;MANDA EL CRC CALCULADO AL PUERTO B
MOVF DATA7,W ;MUEVE EL ULTIMO DATO A W
XORWF INDEX,W ;HAS UNA OPERACION XOR ENTRE INDEX Y EL ULTIMO DATO
BTFSC STATUS,Z ;PRUEBA SI LA ULTIMA OPERACION DIO 0 COMO RESULTADO
BSF PORTA,0 ;SI NO DA CERO ENCIENDE PORTA,0
 
       
 
      GOTO $ ;ALTO
 
       
 
      ;//////////////////////////////////////////////////
 
      ;FUNCION: CALC_CRC8
 
      ;RECIBE W(BYTE DEL CUAL CALCULAR EL CRC)
 
      ;DEVUELVE CRC(CRC CALCULADO)
 
      ;//////////////////////////////////////////////////
 
       
 
      CALC_CRC8 ;FUNCION
 
      MOVWF CRC ;MUEVE EL DATO EN W A CRC
      MOVLW .8 ;
      MOVWF CONT ;INICIA UNA CUENTA EN 8
      NEXT_CRC ;CICLO
      BCF STATUS,C ;LIMPIA EL INDICADOR DE CERO EN OPERACION ANTERIOR (STATUS,C)
 
      RRF CRC,F ;ROTA LA VARIABLE CRC EN SI MISMA
 
      MOVLW POLY ;MUEVE LA VARIABLE POLY A W
 
      BTFSC STATUS,C ;PRUEBA EL INDICADOR DE CERO EN OPERACION ANTERIOR(STATUS,C)
 
      XORWF CRC,F ;SI EL INDICADOR ES 1 ; HAS UN XOR ENTRE W Y LA VARIABLE XOR
      ;SI EL INDICADOR ES 0 ;SALTA LA OPERACION XOR
      DECFSZ CONT,F ; DECREMENTA EL CONTADOR (CONT)
      GOTO NEXT_CRC ;VE AL CICLO (NEXT_CRC)
 

      MOVF CRC,W ;MUEVE CRC A W
 
      RETURN ;REGRESA
 
       
 
     
       
 
      ;------------------------------------------

         END ; SE ACABÓ
 
      ;------------------------------------------


Le he agregado un montón de comentarios por que asi se me hizo mas fácil agarrarle el hilo. Tambien lo modifique para que funcionara con un pic 16f88 , que son los pics que estoy usando de momento . Y por ultimo le agregue un par de segmentos desplegables de código . Espero que  les sirva a todos tanto como a mi.

El proyecto que estoy haciendo continua , asi que ire poniendo mas programas al respecto.Mi siguiente objetivo ahora sera lograr un CRC16.

Si alguien gusta contactarme por cualquier duda o comentario mi correo es  victor.terr@gmail.com
« Última modificación: 08 de Noviembre de 2008, 08:23:36 por pakuak »


 

anything