Autor Tema: conectar termopar al pic16f877  (Leído 18837 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #30 en: 28 de Agosto de 2006, 01:40:41 »
hola:

de momento no he cambiado las cofig (probare esta tarde), pero he metido las señalesen un osciloscopio "normal" opara poder llegar a los 10 uS y sigo sin ver nada. No puedo mostrartelas graficas, pues tendria que dibujarlas, pero despues de poner el osciloscopio en la base de tiempos desde 10 uS a 0.1uS y lo que quisiera yo ver venia a ser muy parecido a las últimas graficas. Es decir que no consigo ver unas señales "bonitas".

El caso es que al micro le tengo un cristal de 4mhz.

probare a cambiar las configuraciones de los flancops, etc....


Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #31 en: 31 de Agosto de 2006, 01:14:10 »
hola de nuevo:

he "jugado" con los registros del modulo spi. Estudié a fondo las graficas del max y reconfigure el sspstat y el sspcon, de tal forma que el reloj del sck lo puse a 1/16 (asi más lento), y retoque lo de los flancos. El caso es que empezó a darme un valor de lectura.

Pero he descubierto que no cambiaba el dato, y active el watchdog y resulta que se va reseteando y va cambiando el dato "baila".

Bueno ese es un asunto que tengo que ver donde se pierde el programa :mrgreen:

ahora como el presunto dato esta al reve´s (segun los datasheet del max), y hay cierto bits que no son del dato, construire una rutina opara ordenar el dato (como bien me indicasteis) y ver si realmente esta leyendo del max o se los inventa :lol:

asi que seguire adelante un poco más.

incluso bajando la velocidad del tiemr para la señal sck, mi osciloscopi(que es de esosde los que conectas al ordenador y son "baratos"), ve las señales con dificultadad, o yo no estoy acostumbrado a este tipo de señales.



Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #32 en: 31 de Agosto de 2006, 13:23:35 »
hola de nuevo:

he "jugado" con los registros del modulo spi. Estudié a fondo las graficas del max y reconfigure el sspstat y el sspcon, de tal forma que el reloj del sck lo puse a 1/16 (asi más lento), y retoque lo de los flancos. El caso es que empezó a darme un valor de lectura.

Pero he descubierto que no cambiaba el dato, y active el watchdog y resulta que se va reseteando y va cambiando el dato "baila".

Bueno ese es un asunto que tengo que ver donde se pierde el programa :mrgreen:

ahora como el presunto dato esta al reve´s (segun los datasheet del max), y hay cierto bits que no son del dato, construire una rutina opara ordenar el dato (como bien me indicasteis) y ver si realmente esta leyendo del max o se los inventa :lol:

asi que seguire adelante un poco más.

incluso bajando la velocidad del tiemr para la señal sck, mi osciloscopi(que es de esosde los que conectas al ordenador y son "baratos"), ve las señales con dificultadad, o yo no estoy acostumbrado a este tipo de señales.


Tal vez debas seguir lidiando con tu pic antes que con el SPI.     Lo del WDT es extraño y tampoco entiendo porqué lo habilitas, si recién comienzas a debugear tu software.

Tal vez estés obviando algo muy simple de ver y que se te esté pasando por alto.

El SPI puede ir a 5Mhz en un pic, pero si lo alimentas con 4Mhz no lograras tanta velocidad.  Si tu osciloscopio es de los baratos, ¿no creo que tenga menos de 1Mhz verdad?  Si es así, debieras ver tranquilamente los flancos del CLOCK del SPI.

¿Has usado alguna vez un simulador?  Estoy pensando en uno del estilo de Proteus con el que puedas comprobar tu software bien en un entorno amigable.  Si ahí funciona y en tu hardware no, bueno, tal vez en tantas manipulaciones has quemado algún pin del PIC.

Bueno, espero sigas avanzando y sino, al menos sube un esquemático de como has finalmente dejado el circuito y si subes tu código tal vez podamos seguir viendo en detalle el problema

Otra pregunta, ¿a qué te refieres con que te tira los datos invertidos?

Saludos
« Última modificación: 31 de Agosto de 2006, 13:25:27 por maunix »
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #33 en: 01 de Septiembre de 2006, 01:09:19 »
por supuesto que cuando vaya mejorando cuelgo el esquema (que es como en un princi`pio deciais; sin pull-up) y la programacion.

ahora bien: la programacion es un lio, pues como se van haciendo pruebas parece un programa lleno de remiendos por todas partes.

el osciloscopio, pues bueno es de picotech. y tengo dos modelos el adc-10 y el adc-40, además tengo el adc16 que es un data logger, el cual no manejo bien.

sus caracteristicas, pues no se si estan bien pues me pierdo un poco.

su pagina es www.picotech.com

la verdad es que no se si estan bien estos osciloscopios....


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #34 en: 01 de Septiembre de 2006, 08:23:43 »
LAFUMAT, el punto es que estas con muchas dudas, a ennumerar las más grandes:

1) ¿Cómo armar el hardware?
2) ¿Cómo codificar tu software?
3) ¿Funciona bien mi osciloscopio?

Te he ido guiando paso a paso para que vayas solucionando los temas por partes, realmente si no tienes un código, si no sabes si tu osciloscopio funciona bien y si tampoco sabes si funciona bien el IC... entonces no hay salida!

No se si me explico, pero 'algo' de todo lo que tienes , debes saber que funciona bien! sino como puedes debuggear algo?

Por ejemplo, si tengo una rutina que enciende un LED y el led no enciende, entonces puedo pensar que es el LED que está quemado, al revés o bien que el pic no está funcionando o que su pin está dañado.  Pero de algo tengo certeza, que el software enciende el LED porque lo he simulado.

Debes recurrir a solucionar el problema por partes. 

Vayamos por partes:

1) Veamos si funciona bien tu osciloscopio o no, entonces haz un software que haga cambiar un pin de 0 a 1, constantemente.  Si lo ves bien en el osciloscipio entonces podrás saber que el mismo funciona bien.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #35 en: 01 de Septiembre de 2006, 14:26:11 »
hola maunix:

esto es caotico pero no tragico :mrgreen:

1) el oscislocopio finalmente debe de ir bien. Te adjunto señales de un pin de portb que alimenta a un segmento de los displays de 7seg, y tambien uno del port a que alimenta a un trt de activacion de digito.

Parece ser que las señales de modulo spi si las veo, pero cuando amplio la imagen veo que las subidas y bajadas son muy rapidas.

pero cierto es que desde que reconfigure el modulo spi como tu me indicastes, se ven las señales todas.


2) con el hardware ya quedo aclarado. esta bien montado. (sin resistencias pull-up)

3) el debugger. pues directamente el mplab.

4) lo del wachtdog, simplemente habre realizado demasiados "call" o algo asi.

5) sigo con el codigo para ya una vez cogido el dato (maxlow y maxhigh), quedarme con los bits que sean del dato, colocarlo  de forma correcta y traducirlo a algo legible (temperatura).

 :P

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #36 en: 01 de Septiembre de 2006, 17:53:13 »
LAFUMAT me has dado un respiro!! jejee, pensé que no te andaba nada.

Es que tu anterior post parecía un relato trágico de la muerte anunciada de tu circuito, tu firmware y tu osciloscopio!!  :D :D

Bueno, me alegro que vayas por buen camino.  No hace falta que subas tu código, al menos yo no lo requiero para uso personal, simplemente era para echarte una mano si te ocurrían cosas 'muy raras'.


Saludos  y sigue comentando como te va yendo.  :) :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #37 en: 02 de Septiembre de 2006, 08:52:02 »
vaya lio tengo en el soft:

el caso es que ciertas rutinas se que van, pero cuando pongo todo, esto no va... :(

el codigo esta un poco revuelto, pues ciertas rutinas las baje de la web de todopic(ejemplos) otras las modifique y otras son realizadas por mi, y claro esta con vuestra ayuda....

para que sea más facil te comento el montaje.


      4 displays 7 segmento al puerto b del micro.

       las lineas de activacion estan desde ra1 a ra4.

      en ra0 entrada de adc.

      en puerto d el cs del max

      conectado el max


lo que pretendo al final del todo es ajustar un nivel con un potenciometro por ra0, leer la temperatura del max en los displays y comparar esa lectura con el valor fijado por el potenciometro para asi dar una alarma....

probe primero el adc, y me llego a funcionar, pues de 0 a 5 voltios leia en los displays el valor de 000 a fff, peroi el display 4 no me funcionaba (problemas en ra4).....

la rutina de leer del max creo que va bien, pues cuando no usso el paso a bcd del dato del max y vuelco en el display, va leyendo datos. Pero sigo teniendo que tener el WDT activafdo porqwue sino, el dato no se mueve (hace una lectura y se para).....


bueno te pego el codigo, que seguro es una bestialidad el ponerlo todo....
Código: [Seleccionar]
list      p=16f877            ; list directive to define processor
#include <p16f877.inc>        ; processor specific variable definitions

; __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.


ERRORLEVEL -302  ;ASEGURARSE DE TRABAJAR EN EL BANCO COREÇRECTO
ERRORLEVEL -305
ERRORLEVEL -173



;***** VARIABLE DEFINITIONS
w_temp        EQU     0x70        ; variable used for context saving
status_temp   EQU     0x71        ; variable used for context saving

;     MemoriaDeUsuario
dig1    equ     0X20          ;acumulador miles
dig2    equ     0X21             ;acumulador centenas
dig3    equ     0X22             ;acumulador decenas
dig4    equ     0X23            ;acumulador unidades
rota    equ     0X24            ;variable para desplazamiento de display

HEXADECIMAL EQU 0X25 ;VARIABLES PARA LA CONVERSION DE
BCD_S EQU 0X26
BCD_H EQU 0X27 ; HEXADECIMAL A 7 SEG
BCD_M EQU 0X28
BCD_L EQU 0X29
DIGITO_H EQU 0X2A
DIGITO_M EQU 0X2B
DIGITO_L EQU 0X2C
Valor EQU 0X2D

ADCLOW EQU 0X2E
ADCHIGH EQU 0X2F




loops3 equ 0x77 ; PARA RETARDO
loops4 equ 0X78 ; PARA RETARDO
VALOR EQU 0X79 ; VARIABLE
loops equ 0x7A ; PARA RETARDO DISPLAY
loops2 equ 0X7B ; PARA RETARDO DISPLAY
DPL_1 EQU 0X7C
DPL_2 EQU 0X7D
DPL_3 EQU 0X7E
DPL_4 EQU 0X7F
VALOR2 EQU 0X30

MAXHIGH EQU 0X31
MAXLOW EQU 0X32



;**********************************************************************
ORG     0x000             ; processor reset vector
  clrf    PCLATH            ; ensure page bits are cleared
  goto    main              ; go to beginning of program


ORG     0x004             ; interrupt vector location
; movwf   w_temp            ; save off current W register contents
; movf STATUS,w          ; move status register into W register
; movwf status_temp       ; save off contents of STATUS register
GOTO 0X000

; isr code can go here or be located as a call subroutine elsewhere


; movf    status_temp,w     ; retrieve copy of STATUS register
; movwf STATUS            ; restore pre-isr STATUS register contents
; swapf   w_temp,f
; swapf   w_temp,w          ; restore pre-isr W register contents
; retfie                    ; return from interrupt

;PROGRAMA PRINCIPAL

main       ; remaining code goes here


CALL CONF_PORTA
CALL CONF_PORTB
CALL CONF_PORTC
CALL CONF_PORTE
CALL CONF_SPI
; CALL CONFIGURAR


INIC

BCF  STATUS, RP0 ;BANO 0
      BCF    STATUS, RP1
CALL LEE_SPI
; CALL    CONVERTIR
; CALL RETARDO
; MOVFW ADCLOW

CALL DATA_MAX

movlw B'00000010'
MOVWF PORTA

MOVFW MAXLOW
MOVWF PORTB

; MOVWF HEXADECIMAL
; CALL TEST

GOTO INIC

;**************************************************************************************
;*                                                                                    *
;*                                                                                    *
;*                                      RUTINAS                                       *
;*                                                                                    *
;*                                                                                    *
;**************************************************************************************

CONF_PORTA ;CONFIGURA PORT A COMO AN[TER1 TER2] [ VREF-  VREF+] DIG[FUNCION] AN[DERR]

BSF  STATUS, RP0 ;BANO 1
      BCF    STATUS, RP1
MOVLW B'10001110' ;PATILLAS DIGITALES de la ra7 a la ra1 y an0 es analogica
MOVWF ADCON1
MOVLW B'00000000' ;dirreccion datos, 0-salida 1-entrada
MOVWF TRISA
BCF STATUS,RP0 ;BANCO 0
CLRF PORTA ;BORRA PUERTO
RETURN

CONF_PORTB ;CONFIGURA EL PORT B COMO SALIDA

BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'00000000' ;SALIDAS
MOVWF TRISB
BCF STATUS,RP0 ;BANCO 0
CLRF PORTB
RETURN

CONF_PORTC ;CONFIGURA EL PORT C

BCF STATUS,RP1
BSF STATUS,RP0
MOVLW b'10010101'
MOVWF TRISC
BCF STATUS,RP0
CLRF PORTC
RETURN

CONF_PORTE ;CONFIGURA EL PORT B COMO SALIDA

BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'00000000' ;SALIDAS
MOVWF TRISE
BCF STATUS,RP0 ;BANCO 0
MOVLW B'00000111'
MOVWF PORTE
RETURN
CONF_SPI

BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'10100100' ;REGISTRO
MOVWF SSPSTAT
BCF STATUS,RP1 ;BANCO 0
BCF STATUS,RP0
MOVLW B'00110010' ;SSPCON1
MOVWF SSPCON
BCF STATUS,RP1 ;BANCO 1
BSF STATUS,RP0
MOVLW B'00000000' ;SSPCON2
MOVWF SSPCON2

RETURN

CONFIGURAR

bcf STATUS, RP0       ; Go to BANK0
bcf STATUS, RP1
movlw B'11000001'       ; Fosc/8, A/D enabled
movwf ADCON0            ; Fosc/8 [7-6], A/D ch0 [5-3], A/D on [0]

bsf STATUS,RP0  ; Go to BANK1
movlw B'00001111'       ;TMR0 prescaler, 1:256
movwf OPTION_REG

movlw B'10001110'       ; Left justify, 1 analog channel
movwf ADCON1 ; VDD and VSS references (5v,0v)
bcf STATUS, RP0       ; Go to BANK0
RETURN

LEE_SPI

CALL RETARDO_MAX
bcf STATUS, RP0       ; Go to BANK0
bcf STATUS, RP1
MOVLW B'00000110' ;ACTIVAMOS CS DEL MAX
MOVWF PORTE
MOVLW B'00001111' ;BYTE BASURA
MOVWF SSPBUF
NOP
NOP
bSf STATUS, RP0       ; Go to BANK1
bcf STATUS, RP1
ESP1 BTFSS SSPSTAT,BF
GOTO ESP1
bcf STATUS, RP0       ; Go to BANK0
bcf STATUS, RP1
MOVFW SSPBUF
MOVWF MAXHIGH ;ESCRIBE EN MAXHIG LOS PRIMEROS 8 BITS
NOP
MOVLW B'00001111' ;BYTE BASURA
MOVWF SSPBUF
NOP
NOP
bSf STATUS, RP0       ; Go to BANK1
bcf STATUS, RP1
ESP2 BTFSS SSPSTAT,BF
GOTO ESP2
bcf STATUS, RP0       ; Go to BANK0
bcf STATUS, RP1
MOVFW SSPBUF
MOVWF MAXLOW ;ESCRIBE EN MAXlow LOS SEGUNDOS 8 BITS
NOP
bcf STATUS, RP0       ; Go to BANK0
bcf STATUS, RP1
MOVLW B'00000111' ;DESACTIVAMOS CS DEL MAX
MOVWF PORTE
RETURN
;


CONVERTIR
Main
btfss INTCON, T0IF ; Wait for Timer0 to timeout
goto Main              ; <bit 2> espera interrupcion
bcf INTCON,T0IF       ; pone en cero el bit2 de interrupcion
                        ; <1> timer interrumpido
                              ; <0> timer no interrumpido
bsf ADCON0,GO       ; Start A/D conversion
                        ; Pone el bit Go en <1>

Wait
btfss PIR1,ADIF       ; Wait for conversion to complete
goto Wait              ; Bandera <ADIF> -->
                        ; <0> no conversion aun
                        ; <1> conversion ok
                       
; banksel ADRESH          ; ADC-LSB en W, aqui hago lo que quiero

bSf STATUS, RP0       ; Go to BANK1
bcf STATUS, RP1

movf    ADRESL,w        ; ADC-MSB en W, aqui ha go lo que quiero
BCF STATUS,RP0


; MOVF ADRESH,W
; MOVWF ADCHIGH

  movwf   HEXADECIMAL ;LEDs
       
       
       
RETURN





RETARDO_MAX                      ;subrutina de retardo GENERAL
        movwf   loops3           ;la variable de trabajo contiene la cant.
top4    movlw   D'400'          ;de ms a demorar
        movwf   loops4
top3    nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops4         ;controla si termina 1mS
        goto    top3
        decfsz  loops3          ;controla si termina el retardo completo
        goto    top4
RETURN
ERROR1
MOVLW H'0C'
CALL TABLA
MOVWF DPL_1
MOVWF DPL_2
MOVWF DPL_3
MOVWF DPL_4
CALL PRESENT_DPL
GOTO INIC


DATA_MAX

; BTFSC MAXLOW,1 ;SI BIT 1=0 SALTA (CERO ES ID ES OK)
; GOTO ERROR1 ;DISPOSITIVO MAX MAL
; BTFSC MAXLOW,2 ;SI BIT 2 =0 SALTA (0 ES CORRECTO)
; GOTO ERROR1 ;TERMOPAR MAL O SUELTO
BCF STATUS,C ;BORRA EL CARRY Y ROTAMOS TRES VECES
RRF MAXLOW,1
BCF STATUS,C
RRF MAXLOW,1
BCF STATUS,C
RRF MAXLOW,1 ;EN MAX LOW NOS QUEDA SOLO EL DATO
RETURN

DATA_MAX2
BTFSC MAXHIGH,0 ;COMPROBABOS BIT 0 DE HIGH PARA PASARLO  AL D5 DEL LOW
GOTO ES11
BCF MAXLOW,5 ;=0 ENTOCES BIT 5 DEL LOW A 0
CERO1 BSF MAXHIGH,0 ;PONEMOS EL BIT A CERO
GOTO BIT2
ES11 BSF MAXLOW,5 ;=1 ENTOCES BIT 5 DEL LOW A 1
GOTO CERO1

BIT2 BTFSC MAXHIGH,1
GOTO ES12
BCF MAXLOW,6
CERO2 BSF MAXHIGH,1
GOTO BIT3
ES12 BSF MAXLOW,6
GOTO CERO2

BIT3 BTFSC MAXHIGH,2
GOTO ES13
BCF MAXLOW,7
CERO3 BSF MAXHIGH,2
GOTO BITFUERA
ES13 BSF MAXLOW,7
GOTO CERO3

BITFUERA
BCF STATUS,C ;ROTAMOS EN HIGH PARA COLOCAR
BCF MAXHIGH,7 ;NOS ASEGURAMOS QUE EL BIT15 SEA CERO
RRF MAXHIGH,1
RRF MAXHIGH,1
RRF MAXHIGH,1 ;ROTAMOS TRES VECES Y TENEMOS COLOCADO


RETURN


RETARDO_DPL                        ;subrutina de retardo PARA DISPLAY
        movwf   loops           ;la variable de trabajo contiene la cant.
top2    movlw   D'10'          ;de ms a demorar
        movwf   loops2
top     nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2         ;controla si termina 1mS
        goto    top
        decfsz  loops          ;controla si termina el retardo completo
        goto    top2
RETURN


PRESENT_DPL

MOVF DPL_1,0 ;CARGA DATO DISPLAY 1
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00000010' ;LO PRESENTA EN DPL_1
MOVWF PORTA
CALL RETARDO_DPL

MOVF DPL_2,0 ;CARGA DATO DISPLAY 2
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00000100' ;LO PRESENTA EN DPL_2
MOVWF PORTA
CALL RETARDO_DPL

MOVF DPL_3,0 ;CARGA DATO DISPLAY 3
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00001000' ;LO PRESENTA EN DPL_3
MOVWF PORTA
CALL RETARDO_DPL

MOVF DPL_4,0 ;CARGA DATO DISPLAY 4
MOVWF PORTB ;LO PONE EN PORT B
MOVLW B'00010000' ;LO PRESENTA EN DPL_4
MOVWF PORTA
CALL RETARDO_DPL

RETURN

TEST

; MOVLW B'00011111'
; MOVWF HEXADECIMAL
CALL Hex_Bcd

MOVFW BCD_L
CALL    TABLA
MOVWF DPL_1

MOVFW BCD_M
CALL    TABLA
MOVWF DPL_2

MOVFW BCD_H
CALL    TABLA
MOVWF DPL_3

MOVLW BCD_S
CALL TABLA
MOVWF DPL_4

CALL PRESENT_DPL

RETURN



TABLA                           ;genera los numeros sobre el display
        addwf   0X002             ;agrega al cont. programa el valor de work
        retlw   b'00111111'     ;genera el 0
        retlw   b'00000110'     ;genera el 1
        retlw   b'01011011'     ;genera el 2
        retlw   b'01001111'     ;genera el 3
        retlw   b'01100110'     ;genera el 4
        retlw   b'01101101'     ;genera el 5
        retlw   b'01111101'     ;genera el 6
        retlw   b'00000111'     ;genera el 7
        retlw   b'01111111'     ;genera el 8
        retlw   b'01100111'     ;genera el 9
retlw   b'01111011'     ;genera el A
        retlw   b'01111100'     ;genera el B
        retlw   b'00111001'     ;genera el C
        retlw   b'01011110'     ;genera el D
        retlw   b'01111001'     ;genera el E
        retlw   b'01110001'     ;genera el F

RETURN
;RUTINA PARA PASAR DE HEX A BCD Y DESPUES A 7 SEG
; LA VARIABLE A INTRODUCIR EL " HEXADECIMAL"

Hex_Bcd
;
  clrf   BCD_S
  clrf    BCD_H                   ;Para BCD D'0'
      clrf    BCD_M                   ;Para BCD D'0'
      clrf    BCD_L                   ;Para BCD D'0'
;
;Millar

 ;     movlw   D'1000'                  ;D'1000' --> W
 ;     subwf   HEXADECIMAL,W           ;HEXADECIMAL - D'100' --> W
 ;     skpc                            ;? HEXADECIMAL es menor que D'100' ?
  ;    goto    Centenas                 ;Si
  ;    movwf   HEXADECIMAL             ;Salva el resto
  ;    incf    BCD_S,F                 ;Incrementa el contador de millar BCD
  ;    goto    Millar                ;Vuelve por otros D'1000'
;
Centenas
;
      movlw   D'100'                  ;D'100' --> W
      subwf   HEXADECIMAL,W           ;HEXADECIMAL - D'100' --> W
      skpc                            ;? HEXADECIMAL es menor que D'100' ?
      goto    Decenas                 ;Si
      movwf   HEXADECIMAL             ;Salva el resto
      incf    BCD_H,F                 ;Incrementa el contador de centenas BCD
      goto    Centenas                ;Vuelve por otros D'100'
;
Decenas
;
      movlw   D'10'                   ;D'10' --> W
      subwf   HEXADECIMAL,W           ;HEXADECIMAL - D'10' --> W
      skpc                            ;? HEXADECIMAL es menor que D'10' ?
      goto    Unidades                ;Si
      movwf   HEXADECIMAL             ;Salva el resto
      incf    BCD_M,F                 ;Incrementa el contador de decenas BCD
      goto    Decenas                 ;Vuelve por otros D'10'
;
Unidades
;
      movf    HEXADECIMAL,W           ;El resto pertenece
      movwf   BCD_L                   ;a las unidades BCD
      clrf    HEXADECIMAL             ;Pone a cero el registro HEXADECIMAL
      return                          ;Retorna


;*************
;
; entrada : W            Valor bcd a convertir         (H'00' a H'09').
; salida  : W            Valor 7 segmentos
;
;La codificacion de los siete segmentos es la siguiente.
;
;  PABCDEFG
;B'xxxxxxxx'
;
;        A
;      ----
;   F |    | B
;     |  G |
;      ----
;   E |    | C
;     |    |
;      ---- o P "punto decimal"
;        D
Bcd_7Seg
      andlw   H'0F'
      addwf   PCL,F
;                PGFEDCBA
       retlw   b'00111111'     ;genera el 0
       retlw   b'00000110'     ;genera el 1
       retlw   b'01011011'     ;genera el 2
       retlw   b'01001111'     ;genera el 3
       retlw   b'01100110'     ;genera el 4
       retlw   b'01101101'     ;genera el 5
       retlw   b'01111101'     ;genera el 6
       retlw   b'00000111'     ;genera el 7
       retlw   b'01111111'     ;genera el 8
       retlw   b'01100111'     ;genera el 9
;
;Los siguientes debuelven E de "error", esto es por si se pasa
;un valor a la tabla desde H'0A' hasta H'0F'.
;
      retlw   b'01111011'     ;genera el A
        retlw   b'01111100'     ;genera el B
        retlw   b'00111001'     ;genera el C
        retlw   b'01011110'     ;genera el D
        retlw   b'01111001'     ;genera el E
        retlw   b'01110001'     ;genera el F

;*************
;Presenta el digito en su respectivo display de 7 segmentos
;
Display
;
; No codifiqué esta rutina ya que depende del pic usado y
; la asignación de sus puertos
;
;     movf    DIGITO_H,W
;     movf    DIGITO_M,W
;     movf    DIGITO_L,W
;      return


END ;FIN DE PROGRAMA

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #38 en: 03 de Septiembre de 2006, 11:19:08 »
la rutina de leer del max creo que va bien, pues cuando no usso el paso a bcd del dato del max y vuelco en el display, va leyendo datos. Pero sigo teniendo que tener el WDT activafdo porqwue sino, el dato no se mueve (hace una lectura y se para).....

Bueno, vayamos por pasos.  Está bien que subas tu código pero si el problema está en algo puntual tal vez podamos resolverlo usando solo esa parte.

La pregunta es, cuando usas la rutina de solamente leer datos del MAX, ¿tu soft se traba? Digamos, más allá de no verlo por los display, podrías verlo por el osciloscopio si es que siempre tienes comunicación.

Si debes recurrir al WDT para que se te reinicie el PIC cada vez, pues bien, entonces el problema me huele a que es otra cosa.

¿Te parece probar solamente la comunicación y comentar el resto del código?  No lo borres, solo comentalo.  Es muy fácil con el editor del MPLAB, con el botton derecho puedes comentar o 'descomentar' código.

Saludos

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #39 en: 05 de Septiembre de 2006, 03:20:20 »
hola:

voy probando el codigo poco a poco, y veo que cuando desactivo el WDT, y simplemente leo el max, cojo el dato maxlow y lo coloco en los displays; se queda el dato fijo, pero al poner el osciloscopio en al sck, sdo y el sdi, hay señales corriendo.....



por otra parte, algo no me va bien con la rutina pasar de hex a bcd.....


a ver si poco a poco....


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #40 en: 05 de Septiembre de 2006, 08:19:55 »
hola:

voy probando el codigo poco a poco, y veo que cuando desactivo el WDT, y simplemente leo el max, cojo el dato maxlow y lo coloco en los displays; se queda el dato fijo, pero al poner el osciloscopio en al sck, sdo y el sdi, hay señales corriendo.....

Esto puede ser porque tengas una rutina bastante larga en la que no borres el timer del watchdog.  Puedes agregar una instrucción clrwdt antes de enviar un dato, con eso te asegurarás bien esto.


por otra parte, algo no me va bien con la rutina pasar de hex a bcd.....

Coincido, en mi opinión así se debuggean los programas, parte por parte.  Jamás hago un programa complejo y lo pruebo todo de una, siempre voy probando por partes hasta compilar y/o ensamblar todo junto.



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #41 en: 06 de Septiembre de 2006, 02:42:30 »
hola:

probare lo que me dices (clrwdt).

esta claro que con el apoyo de gente con más experiencia voy aprendiendo a hacer el trabajo....


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #42 en: 06 de Septiembre de 2006, 08:17:09 »
hola:

probare lo que me dices (clrwdt).

esta claro que con el apoyo de gente con más experiencia voy aprendiendo a hacer el trabajo....



Gracias, lo bueno es que tú, a diferencia de otros, pones empeño en resolverlo tú mismo consultando solamente en los puntos en que te sientes inseguro.   Y así como has empezado tú , hemos empezado varios solo que hace unos años atrás, internet no era tan masivo ni hogareño como para que tengamos acceso tan fácil a la información de otra gente relacionada con el tema.

Algunos, solo quieren la solución hecha, resuelta y nunca mas regresan.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado LAFUMAT

  • PIC16
  • ***
  • Mensajes: 148
Re: conectar termopar al pic16f877
« Respuesta #43 en: 07 de Septiembre de 2006, 02:48:34 »
he probado a poner el CLRWDT y sigue sin funcionar.

lo he colocado en varios sitios pero no....

seguire investigando.

por cierto, pienso igual que tu sobre los que nunca regresan. Yo quiero aprender, y me entusiasma el poder ayudar a alguien....

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: conectar termopar al pic16f877
« Respuesta #44 en: 07 de Septiembre de 2006, 08:32:12 »
he probado a poner el CLRWDT y sigue sin funcionar.

lo he colocado en varios sitios pero no....

seguire investigando.

por cierto, pienso igual que tu sobre los que nunca regresan. Yo quiero aprender, y me entusiasma el poder ayudar a alguien....

He estado pensando, ¿tu hardware permite agregarle un MAX232?

Se le podría anexar a tu código, un envío del dato recibido del max por RS232.  Además se podría enviar un dato cuando el PIC se 'reinicia'.  De esa forma sabrás si el pic se está reiniciando o simplemente se pierde el software (y esto a su vez produce que se reinicie o no)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)