Autor Tema: PIC18F4520 + TERMOPAR TIPO J (MAX31855)  (Leído 3950 veces)

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

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« en: 27 de Enero de 2015, 03:03:00 »
Que tal amigos del foro, me encuentro realizando un proyecto donde tengo que tomar lecturas de dos termopares tipo J. Buscando en varias páginas me encontré con este interesante CI. MAX31855. Por lo que entendí en la hoja de datos digitaliza y compensa la temperatura de casi todo tipo de termopares. Bien el protocolo es SPI, solo de lectura. Nos da 4 bytes por cada lectura. Las preguntas son estas:

Alguien a trabajado con este integrado? De ser asi podrian compartir el código para revisarlo y entenderlo. La segunda pregunta de acuerdo a sus conocimientos, creen que es buena opción para poder trabajar con termopares?

Saludos amigos.

 :)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #1 en: 27 de Enero de 2015, 03:27:15 »
Podrias portar un codigo de alguna libreria de otra plataforma... no parece complejo para nada. es enviar todos 0, unas 4 veces para tomar los 32 bits.

https://github.com/adafruit/Adafruit-MAX31855-library/blob/master/Adafruit_MAX31855.cpp
https://github.com/RobTillaart/Arduino/tree/master/libraries/MAX31855

Al menos te va a guiar como leer el IC, pero igual vas a renegar un poco mas en ASM, un poco de rengar con pasar la temperatura a algo mas leible ya que esta formado por bits que van desde 210 a 2-2 como el datasheet lo indica.
Aunque parece simple dentro de todo.

leete el datasheet del MAX31855 ahi vas a ver que son cada uno de los 32 bits a recibir.
« Última modificación: 27 de Enero de 2015, 03:31:40 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #2 en: 27 de Enero de 2015, 12:53:52 »
Gracias por las recomendaciones KillerJC, voy a estudiarle un poco y en cuanto haya conseguido algo les platico. ;-)

Saludos

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #3 en: 27 de Enero de 2015, 20:39:18 »
Que tal ya consegui leerlo. Para SPI prefiero trabajarlo por Software.  :-/ aqui esta el código:

   CLRF   SPI_BYTE1
   CLRF   SPI_BYTE2
   CLRF   SPI_BYTE4
   CLRF   SPI_BYTE3
   CLRF   TS1
;;;;;;;;;;;;;;;;;;;;;;;;   
   BCF      CS1
   NOP
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,7
;;;;;;;;;;;;   
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,6
;;;;;;;;;;;;
   NOP
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,5
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,4
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,3
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,2
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,1
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE1,0
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,7
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,6
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,5
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,4
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,3
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,2
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,1
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE2,0
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,7
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,6
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,5
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,4
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,3
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,2
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,1
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE3,0
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,7
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,6
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,5
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,4
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,3
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,2
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,1
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF      SPI_BYTE4,0
;;;;;;;;;;;;
   BCF      CLK
   NOP
   BSF      CS1
   NOP
   BTFSC   SPI_BYTE4,0
   CALL   NO_SENSOR
   RETURN



Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #4 en: 27 de Enero de 2015, 23:49:58 »
A mi gusto me quedo muchas veces mas hecho por hardware , me parece mas corto xD. Incluso intente hacerlo con acceso indirecto y rotacion y me parece que quedo largo aun.
Mientras que por SPI y por hardware deberias llenar el TXREG al menos 3 veces ( digo 3 por que tiene 2 niveles de FIFO + el shift register para recibir ), y ya estarias recibiendo 3 bytes, enviar uno mas y listo.
O usar interrupciones, en la recepcion cuando se llene la FIFO, con 2 entradas guardas los datos que necesitas. Y en la transmision para enviar los otros 3 siguientes datos ( ya que el primero te llevaria aca ). Ademas el micro podrias seguir haciendo otra cosa hasta que desde la interrupcion se active una flag indicando que el dato es valido.

Aca mi intento de hacerlo con acceso indirectos y rotaciones
Código: [Seleccionar]
lectura
   BCF      CS1
   NOP
   MOVLW 0x06
   MOVF CONTADOR_BITS

   MOVLW 0x06
   MOVF CONTADOR_BYTE+1

   MOVLW direccion del primer registro alto
   MOVF    FRS0H
   MOVLW direccion del primer registro bajo
   MOVF    FRS0L

lectura_start

   DECFNZ    CONTADOR_BYTE,F
   RETURN
   CLRF INDF0

cargarbyte
   BCF      CLK
   NOP
   BSF      CLK
   NOP
   BTFSC   MISO
   BSF    INDF0,7
   RRNCF  INDF0,F
   DECFSZ  CONTADOR_BITS,F
   GOTO  cargabyte
   INCFNZ   FRS0L,F
   INCF       FRS0H,F
   GOTO lectura_start

  
« Última modificación: 28 de Enero de 2015, 04:06:28 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #5 en: 29 de Enero de 2015, 20:46:25 »
Muy buena la rutina KillerJC, muchas gracias. Creo que en definitiva si es mejor, solo un par de preguntas, sucede que no entiendo del todo como funcionan los FSR...

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #6 en: 29 de Enero de 2015, 20:49:00 »
Código: ASM
  1. lectura
  2.    BCF      CS1
  3.    NOP
  4.    MOVLW 0x06
  5.    MOVF CONTADOR_BITS
  6.  
  7.    MOVLW 0x06
  8.    MOVF CONTADOR_BYTE+1
  9.  
  10.    MOVLW direccion del primer registro alto ;Aqui meto la direccion? Por ejemplo 0x020?
  11.    MOVF    FRS0H
  12.    MOVLW direccion del primer registro bajo ; Aqui seria la 4 consecutiva?
  13.    MOVF    FRS0L
  14.  
  15. lectura_start
  16.  
  17.    DECFNZ    CONTADOR_BYTE,F
  18.    RETURN
  19.    CLRF INDF0
  20.  
  21. cargarbyte
  22.    BCF      CLK
  23.    NOP
  24.    BSF      CLK
  25.    NOP
  26.    BTFSC   MISO
  27.    BSF    INDF0,7
  28.    RRNCF  INDF0,F
  29.    DECFSZ  CONTADOR_BITS,F
  30.    GOTO  cargabyte
  31.    INCFNZ   FRS0L,F
  32.    INCF       FRS0H,F
  33.    GOTO lectura_start

Veo que hay un 6 en el contador de bits + la primera ejecución tengo 7 bits? O como queda el 8°?

Muchas gracias por tu apoyo.

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #7 en: 29 de Enero de 2015, 23:20:51 »

Veo que hay un 6 en el contador de bits + la primera ejecución tengo 7 bits? O como queda el 8°?

Muchas gracias por tu apoyo.

Saludos

Perdon seguro que fue el copy-paste de alguna parte del borrador que habia realizado, la idea era un contador para los 8 bits y el otro un contador para los 4 bytes.
Una cosa que me acorde el otro dia y es: No pone nuevamente CS1 a 1

Por los contadores deberian quedar:

Código: ASM
  1. MOVLW 0x05  ; Por que tiene el decrementar ANTES de la funcion
  2. MOVF CONTADOR_BYTE
  3.  
  4. MOVLW 0x07 ; Por que decremento despeus de la funcion
  5. MOVF CONTADOR_BITS


Muy buena la rutina KillerJC, muchas gracias. Creo que en definitiva si es mejor, solo un par de preguntas, sucede que no entiendo del todo como funcionan los FSR...

en los FSR cargas la direccion de memoria del registro que vos queres acceder.
Entonces si queres leer/escribir ESA direccion utilizas el INDF ( es decir el contenido de esa direccion )

Ej:

Código: ASM
  1. MI_REG  EQU 0x20
  2. MI_REG2 EQU 0x21
  3. MI_REG3 EQU 0x22
  4.  
  5. cargo 0x20 en FSR0 (MOVLW y MOVWF )
  6.  
  7. Quiero asignarle el valor de 0x35 a ese registro
  8. MOVLW 0x35
  9. MOVWF INDF0  ; No es un registro de por si INDF solo apunta a lo que le dice FSR, por lo tanto aca estaria cargando el valor en MI_REG
  10.  
  11. INCF FSR0,F  ; Incremento direccion ahora 0x21
  12. MOVLW 0x98
  13. MOVWF INDF0 ; Ahora MI_REG2 vale 0x98

Tambien otra cosa que podras notar es que no me importa donde esta ubicado el registro en cuestion, me puedo mantener en el banco donde estan los registros CONTADOR_BITS y CONTADOR_BYTES y los demas pueden estar en cualquier banco sin necesidad de cambiar los BSR, igual los PIC18 tienen mucha mas complejidad y yo los maneje muy poco en ASM, por eso seguro que se puede hacer algo mas pequeño o eficiente y no lo que hice. Algunas de las cosas que agrega el PIC18:

Por ejemplo podes reemplazar:
Código: ASM
  1. MOVLW direccion del primer registro alto ;Aqui meto la direccion? Por ejemplo 0x020?
  2.    MOVF    FRS0H
  3.    MOVLW direccion del primer registro bajo ; Aqui seria la 4 consecutiva?
  4.    MOVF    FRS0L

por

Código: ASM
  1. LFSR 0,DIRECCION ; DIRECCION, es la direccion del registro (12 bits)

Tambien si queres asignar un valor y luego incrementar el valor del FSR0 sin necesidad de realizar 2 instrucciones para eso, simplemente usas un registro que se llama POSTINC0 , este funciona igual que el INDF pero ademas incrementa FSR0 ( y no tenes que preocuparte por que estan divididos en FSR0H:FSR0L ya que lo maneja como si fuera uno de 12 bits, me refiero al overroll de FSR0L de 0xFF a 0x00 influye en FSR0H )

De todas formas tu codigo es mas rapido, pero ocupa mas espacio, asi que depende de lo que queres hacer vos.
Y como dije en mi post, es solo fue solo un intento de hacerlo, por eso me quedaron algunos valores mal y la falta del CS1 a 1, veo que no recarga el contador de bits, hay varias fallas xD. Y puede que tenga mas cosas malas.
« Última modificación: 30 de Enero de 2015, 06:39:46 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC18F4520 + TERMOPAR TIPO J (MAX31855)
« Respuesta #8 en: 30 de Enero de 2015, 06:04:47 »
Perdon por el doble post pero sino se hacia super largo

Citar
Y como dije en mi post, es solo fue solo un intento de hacerlo, por eso me quedaron algunos valores mal y la falta del CS1 a 1, veo que no recarga el contador de bits, hay varias fallas xD. Y puede que tenga mas cosas malas.

Creo que lo arregle todo, tambien creo aun se puede mejorar mas si se pudiera habilitar el set extendido de instrucciones que te permite el manejo de bits como BSF desde el acceso indirecto, Pero puede que te traiga mas dolores de cabeza que soluciones.
En fin sigo prefiriendo el tema de la interrupciones, ya que en ves de estar haciendo esto, podria estar haciendo otra cosa el micro y con las interrupciones usas el SPI xD. O tambien podes usar el SPI sin interrupciones, aunque te lleva mas lineas al tener que configurarlo.

Una ultima cosa, yo me base en tu programa, pero viendo el datasheet el primer bit es el bit31, por lo tanto en este codigo comienzo modificando el bit 0 y luego roto a la izquierda, asi queda el bit 31 en la posicion 7.

Código: ASM
  1. SPI_BYTE      EQU 0x30          ;Dejar lugar para los siguientes o definirlo, todos seguidos
  2. CONTADOR_BIT  EQU 0x29          ;Presupongo ademas que los contadores/temp estan en el banco 0 o ACCESS y no BANKED. Por ende no modifico BSR
  3. CONTADOR_BYTE EQU 0x28
  4. TEMP          EQU 0x27          ;Registro temporal usado para rotar el byte. Que lo podes usar en cualquier otra cosa tambien, a no ser que tengas un RTOS.
  5.  
  6. Lectura
  7.    BCF     CS1
  8.    MOVLW   0x03                 ;Inicio mi contador ( contador = bytes - 1 )
  9.    MOVWF   CONTADOR_BYTE
  10.    LFSR    0,SPI_BYTE           ;Inicio el puntero
  11. Aux1
  12.    MOVLW   0x08                 ;Inicio mi contador de bits ( contador = bits )
  13.    MOVWF   CONTADOR_BITS
  14.    CLRF    TEMP                 ;Pongo a 0 el registro auxiliar
  15. Cargarbyte                      ;Empiezo a cargar el byte
  16.    BCF     CLK
  17.    NOP
  18.    BSF     CLK
  19.    RLNCF   TEMP,F               ;Roto el registro sin carry , roto aca de paso me queda un NOP menos y mas simple el programa (si lo roto cuando tiene 0x00 no importa )
  20.    BTFSC   MISO
  21.    BSF     TEMP,0
  22.    DECFSZ  CONTADOR_BITS,F
  23.    BRA     Cargarbyte           ;BRA ocupa un lugar de la memoria de instrucciones vs 2 de GOTO, pero lo limita a un rango de -1024<x<1023
  24.    MOVFF   TEMP,POSTINC0        ;Termino de cargar el byte, TEMP -> [SPI_BYTE + Offset] y FSR0 = FSR0 + 1
  25.    DECFSZ  CONTADOR_BYTE,F     
  26.    BRA     Aux1                 ;Tengo mas bytes por rellenar
  27.    BSF     CS1                  ;Finalizo y pongo a 1 CS1
  28.    RETURN

Y este tambien es experimental (usando el SPI, no reviza por errores nada. Solo recibe, presupongo que no usa interrupciones el programa):
Nota: Parece mas corto pero tenes que inicializar y configurar el SPI, asi que lo que te ahorras aca lo terminas usando en otro lado.

Código: ASM
  1. Lectura
  2.    MOVLW   0x03
  3.    MOVWF   CONTADOR_BYTE
  4.    LFSR    0,SPI_BYTE           ;Inicio el puntero
  5.    BCF     CS1
  6. loop1
  7.    CLRF    TXREG                        ;No se si dispara el transmisor al limpiarlo, imagino que si por ponerle un 00
  8. loop2
  9.    BTFSS   PIR1,RCIF
  10.    BRA     loop2
  11.    MOVFF   RCREG,POSTINC0
  12.    DEFSZ   CONTADOR_BYTE
  13.    BRA     loop1
  14.    BSF     CS1
  15.    RETURN

Finalmente luego de esto usaras las registros que te quedaron para sacar los valores que necesitas.
« Última modificación: 30 de Enero de 2015, 07:46:39 por KILLERJC »


 

anything