TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: LAFUMAT en 07 de Agosto de 2006, 06:41:26

Título: conectar termopar al pic16f877
Publicado por: LAFUMAT en 07 de Agosto de 2006, 06:41:26
hola a todos. Tengo dudas de como conectar el max6675 (adaptador para termopar) al pic.

En principio es facil, pues el max trabaja en modo spi esclavo, entoces, se lo conectamos al pic y listo; pero he visto que el max me da una salida serie de 10 bits, y el pic tiene 8 bits y ya no se por donde coger esto.

espero que alguien más inteligente que yo pueda ayudarme un poco en el hard, y muchom en como hacer funcionar el spi del PIC pues no lo he usado nunca.


gracias
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 07 de Agosto de 2006, 08:17:12
hola a todos. Tengo dudas de como conectar el max6675 (adaptador para termopar) al pic.

En principio es facil, pues el max trabaja en modo spi esclavo, entoces, se lo conectamos al pic y listo; pero he visto que el max me da una salida serie de 10 bits, y el pic tiene 8 bits y ya no se por donde coger esto.

espero que alguien más inteligente que yo pueda ayudarme un poco en el hard, y muchom en como hacer funcionar el spi del PIC pues no lo he usado nunca.


gracias

Los dispositivos SPI rara vez son 'justo' de 8 bits.  Suelen ser de más bits, 8, 10, 16, 24, 21, etc.

Lo bueno es que el módulo no te enviará datos al menos que tu generes una transmisión, ya que el pic hace de master y por lo tanto controla el clock.

Debes hacer 2 lecturas.  En la primera leeras 8 bits y en la segunda también 8 bits, pero solo te harán falta 2.

Deberas entonces tener en tu software 1 variable de 16 bits que contenga ambos bytes.

Espero haberme explicado, sino vuelve a preguntar.

Saludos


Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 07 de Agosto de 2006, 10:50:40
muchas gracias, pero sigo dudando, pues veo que conoces muy bien el modulo spi.

la duda que me surge es la siguiente;

el maX6675 tiene un cs(chip select), cuando se pone esta linea a cero, manda por la salida los 10 bit ( con un star), entonces, como me los manda de seguido, ¿me da tiempo a hacer dos lecturas?

Título: Re: conectar termopar al pic16f877
Publicado por: GustavoT en 07 de Agosto de 2006, 11:46:39
El SPI tiene 4 líneas
 
Data out
Data in
Clock
CS

Cuando habilitas el cs lo que haces es decirle al esclavo, te escojo a ti , nada mas

Para comenzar a trasmitir tienes que enviar una palabra desde el PIC al MAX con cualquier dato basura, este a medida que se va enviando la palabra basura ira devolviendo (MAX --> PIC) los 8 primeros bits , estos quedaran guardados en el modulo del pic, tienes que tomar esos datos y pasarlos a alguna otra variable

Luego comienza de vuelta a mandar la segunda palabra basura , y el max te devolverá los siguientes 8 bits.


Si te fijas en la figura 1a y 1b , vas a ver que son 16bits lo que se te envían, pero cada bit se envían en el momento en el que el clock habilita, por lo que no te tenes que preocupar de los tiempos todo lo maneja el pic

También en la figura 2 te indica que el dato se encuentra en los bits 14 al 3 , siendo el 14 el mas significativo, por lo que cuando tengs las dos palabras en el pic, tendrás que acomodar estos datos para que te queden cómodo para su uso

En tu caso solo tenes 3 lineas,

Desde el pic tenes Data in Clock out, CS

Desde el MAX tenes Data out, Clock In ,CS




Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 08 de Agosto de 2006, 05:31:18
muchas gracias, me empiezo a enterar.

ahora lo que voy a hacer es montar el ciruito y empezar a programar con las directrices que me habeis hecho llegar.

os agradezco un monton vuestra ayuda, aunque seguro que os vuelvo a preguntar, pues estoy empezando y hago aguas rapidamente.

os ire contando.


:)
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 08 de Agosto de 2006, 08:23:37
muchas gracias, me empiezo a enterar.

ahora lo que voy a hacer es montar el ciruito y empezar a programar con las directrices que me habeis hecho llegar.

os agradezco un monton vuestra ayuda, aunque seguro que os vuelvo a preguntar, pues estoy empezando y hago aguas rapidamente.

os ire contando.


:)


No hay problema en que preguntes una y otra vez.

Acá encontraras siempre buena disposición para ayudarte siempre y cuando tú demuestres buena disposición para aprender, leer.

Hay muy buena gente y muy buenos profesionales en este foro, solo piden lo que te acabo de decir.

Saludos y bienvenido.
Título: Re: conectar termopar al pic16f877
Publicado por: GustavoT en 08 de Agosto de 2006, 09:51:25
Te paso el código de mi programa, suponiendo que sabes manejar interrupciones, esto esta como para hacer una transmisión de 16bits como la que vos queres hacer, el código esta para la serie 18F es muy simple por lo que no tenes que tener problemas para pasarlo a la serie 16F

;-------------------------------------------------------------------
;   Inicializo   SPI  Para 16F818 , mandando el primer dato
;Nota: cada vez que llames a esta rutina va a comenzar una trasmisión de datos, es importante que dejes el tiempo prudencial como para que termine la
:         trasmisión antes de llamar nuevamente la rutina
;-------------------------------------------------------------------
inicializo_trasmision_con_16F818

       BCF PORTC,1,0  ; Cler linea de /CS ; Comienza la comunicacion con  16F818

      nop  ; pequeño delay
      nop
      nop      
      nop
   
; -- mando el primer dato
         movlw 0xAB        ; Dato basura
         movwf SSPBUF,0 ; al cargar el registro SSPBUF comienza la tramision de dato

   Return
;-------------------------------------------------------------------
;     SPI  Para 16F818
;-------------------------------------------------------------------


Una vez que mandaste el primer dato tenes que esperar a la interrupcion del SPI que va a volver con los primero 8 bits

En el lugar de las interrupciones va esto:


;-----------------------------------------------------------------------------------------
;  Modulo SPI para 16F818 INTERRUPCION
;-----------------------------------------------------------------------------------------
Modulos_16F818

            btfsc   Flag_SPI,0   ; uso esta bandera para saber si llegaron los primero 8 bits o los segundos 8 bits
            Goto Resivo_los_segundo_8bits
   
;-----------------------------------------
;Resivo_los_primero_8bits

        movFF SSPBUF,Datos1  ; aqui se guardan los primeros 8 bits

       bsf Flag_SPI,0 ; esta bandera es importante por que indica que la próxima vez que llame la interrupción va a venir los 8 segundos bits

        nop
       nop
        nop
       nop

      movlw  0x07
      movwf  SSPBUF,0  ; cargo cualquier gyuebada, para inicializar nuevamente la tramisión de datos y resivir los segundos 8 bits

        Fin_de_INTERUPCION  ; ---MACRO---- ; esto esta en todos los datasheet de microchip como entrar y salir de las interrupciones
;---------------------------------------


;-------------------------------------
Resivo_los_segundo_8bits

      movFF SSPBUF,Dato2  ;   aqui se guardan los segundos 8 bits

           bcf Flag_SPI,0 ; esta bandera es importante por que indica que la próxima vez que llame la interrupción va a venir los 8 primeros bits

        Fin_de_INTERUPCION  ; ---MACRO---- ; esto esta en todos los datasheet de microchip como entrar y salir de las interrupciones
;-----------------------------------------------------------------------------------------
;  Modulo SPI para 16F818  FIN de INTERRUPCION
;-----------------------------------------------------------------------------------------




;===================================================================
;============   PROGRAMACION DEL MODULO "SPI"   =============================
;===================================================================
; con esto configuras el modulo SPI
     MOVLW   0x00 
     MOVWF SSPSTAT,0
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     MOVLW   0x31
     MOVWF SSPCON1,0;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     MOVLW   0x00  ;
     MOVWF SSPCON2,0;
;===================================================================

Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 09 de Agosto de 2006, 05:45:52
que bueno.

me estais ayudando un monton, pero yo no consigo ir tan deprisa.

 hoy me ha llegado el adaptador de soic a dip para el max6675, asi podre pincharlo en una protoboard.

despues recopilare todas vuestras ideas y empezare a ver que pasa.


espero no tardar mucho tiempo.

:)
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 09 de Agosto de 2006, 08:03:57
HOLA DE NUEVO:

ME ESTOY MACHACANDO CON EL DATASHEET DEL PIC 16F877 Y EL MAX6675.

EL CASO ES QUE SEGUN LEO HAY QUE CONECTARLO Y YO DE MOMENTO TENGO PENSADO CONECTARLO DE LA SIGUIENTE FORMA:

CS DEL MAX AL SS/RA5 DEL PIC (ES EL CHIP SELECT): CUANDO ESTA A 1 EL MAX ESTA CONVIRTIENDO Y AL PONERLO A CERO ESTE EMPIEZA A TRANSMITIR.

SO DEL MAX (SALIDA) AL SDI/RC4 DEL PIC, POR LA CUAL LEO LOS DATOS.

SCK (CLOCK) DEL MAX AL SCk/RC3 DEL PIC ( QUE ES EL RELOJ).


PERO TENGO DUDAS DE SI ES ASI COMO ME INDICAIS COMO HE DE HACERLO.

PUES ENTONCES TENDRIA QUE PONER EL SS DEL PIC A CERO, EMPEZARIA A TRANSMIOTIR LOS DATOS DESDE EL MAX AL PIC A LA VELOCIDAD DEL RELOJ, Y ENTRARIAN LOS DATOS AL PIC, PERO COMO LEO LOS 12 BIT, SI CREO QUE EL SPI SOLO TIENE 8???

:)
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 09 de Agosto de 2006, 08:08:20
PODRIA SER LA ALTERNATIVA EL CAMBIAR EL SCK DEL PIC POR EL SDO Y ASI HACER COMO ME DECIS; ES DECIR SACAR UN DATO DE 8 BITS Y ESE ESEL QUE HACE DE RELOJ, LUEGO DEJAR EL SS EN CERO TODAVIA, OPERAR CON LOS 8 PRIMEROS BITS, Y LUEGO SACAR OTROS 8 BITS Y COGER EL SEGUNDO??
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 09 de Agosto de 2006, 08:23:53
Acabo de leer bien el datasheet y en realidad transmite 16 bits no 12!.  Bueno he aquí la respuesta.

CS DEL MAX AL SS/RA5 DEL PIC (ES EL CHIP SELECT): CUANDO ESTA A 1 EL MAX ESTA CONVIRTIENDO Y AL PONERLO A CERO ESTE EMPIEZA A TRANSMITIR.

Cuidado con esto, este pin del pic es el CS del pic pero para cuando el mismo es esclavo.  Si lo usas como salida, actuará como cualquier otro pin de salida y no habrá problemas, pero no confundas su significado.


SO DEL MAX (SALIDA) AL SDI/RC4 DEL PIC, POR LA CUAL LEO LOS DATOS.

SCK (CLOCK) DEL MAX AL SCk/RC3 DEL PIC ( QUE ES EL RELOJ).

Esto está bien, pero también al menos el SDO del pic (RC5) ponle una resistencia de 10K por ejemplo a GND para que no quede al aire.


PERO TENGO DUDAS DE SI ES ASI COMO ME INDICAIS COMO HE DE HACERLO.

PUES ENTONCES TENDRIA QUE PONER EL SS DEL PIC A CERO, EMPEZARIA A TRANSMIOTIR LOS DATOS DESDE EL MAX AL PIC A LA VELOCIDAD DEL RELOJ, Y ENTRARIAN LOS DATOS AL PIC, PERO COMO LEO LOS 12 BIT, SI CREO QUE EL SPI SOLO TIENE 8???

Esto ya fue explicado pero si aún no has entendido te lo explico de otra forma

1) Configuras el módulo SPI

2) Haces un CS del MAX

3) Envías un byte basura (Escribiendo cualquier cosa en el registro SSPBUF).  El pic enviará 8 bits automáticamente con sus correspondientes clock.  Qué envía no te importa ya que al MAX6675 solo le llega el clock.

4) Esperas a que se ponga en 1 el bit SSPSTAT,BF

5) Lees el 1er byte recibido, haciendo un MOVF SSPBUF,W  (sí acá ahora tienes los primero 8 bits que te envío el max).  Luego lo guardas en por ejemplo MAX6675_DATAHIGH

6) Envías un byte basura (Escribiendo cualquier cosa en el registro SSPBUF).  El pic enviará 8 bits automáticamente con sus correspondientes clock.  Qué envía no te importa ya que al MAX6675 solo le llega el clock.

7) Esperas a que se ponga en 1 el bit SSPSTAT,BF

8 ) Lees el 2do byte recibido, haciendo un MOVF SSPBUF,W  (acá tienes el 2do byte) , luego lo puedes guardar en MAX6675_DATALOW

En MAX6675_DATAHIGH y MAX6675_DATALOW tienes los 16 bits de la respuesta del MAX.

Ahora bien, deberás ir rotando hacia la derecha para quedarte con los 12 bits que solo corresponden al dato leído.

Creo que ya explicar como rotar ... es algo bastante básico.

Saludos


Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 09 de Agosto de 2006, 15:04:43
gracias maunix.

eres el más grande. Me lo has explicado de sobresaliente. Creo que ya entendi todo muy bien.

ya solo me queda como dije esta mañana, montarlo y empezar a probar.

ojala ualgun dia me parezca a todos los que sabeis tanto, y asi poder ayudar yo tambien.


mil gracias

 :-/
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 09 de Agosto de 2006, 15:50:23
gracias maunix.

eres el más grande. Me lo has explicado de sobresaliente. Creo que ya entendi todo muy bien.

ya solo me queda como dije esta mañana, montarlo y empezar a probar.

ojala ualgun dia me parezca a todos los que sabeis tanto, y asi poder ayudar yo tambien.


mil gracias

 :-/

Agradezco tus agradecimientos. :), de todas formas era una pregunta no muy difícil, no es para tanto.  :)

Tu recién comienzas, todo te será nuevo, luego si algún día relees estos posts, sabrás que no fue para tanto la explciación.  Sabemos 'antes' que es diferente :)

Acá encontrarás mucha gente que sabe mucho y te sentirás a gusto de seguro, tu sigue estudiando sin perder las ganas de leer y de esforzarte por obtener tú mismo los resultados


Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 14 de Agosto de 2006, 08:21:29
BUENO, COMO ERA DE ESPERAR TENGO QUE PREGUNTAR :shock:

HE REALIZADO UNA PROTOBOARD CON UN 16F877, AL CUAL ENTRE EL PUERTO B Y CUATRO LINEAS DEL A, TENGO 4 DISPLAYS DE 7SEG.

HE CONECTADO EL MAX COMO ME DIJISTE MAUNIX, SOLO QUE EL CS LO HE COGIDO DEL RE0. PUSE AL SDO LA RESISTENCIA DE 10K, REALIZE EL PROGRAMA, PARA QUE LEYERA LOS DATOS, Y EN PRINCIPIO (A MODO DE PRUEBA), COGER POR EJEMPLO EL MAXLOW Y PASARLO A BCD Y PONERLO EN EL DISPLAY.

PERO NO ME FUNCIONA.

LAS DOS RUTINAS (DDE CONFIGURACION DEL SPI) Y LA DE LEER SON LAS SIGUIENTES:


RUTINA DE CONFIGURACION DEL SPI:

CONF_SPI

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

      RETURN

RUTINA DE CONFIGURACION DEL PUERTO E (PARA EL CS):
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

Y LA RUTINA QUE SE SUPUNE QUE LEERIA EL PUERTO Y ALMACENA EN VARIABLE

LEE_SPI

      bcf         STATUS, RP0         ; Go to BANK0
      bcf         STATUS, RP1
      MOVLW      B'00000110'      ;ACTIVAMOS CS DEL MAX
      MOVWF      PORTE   
      MOVLW      B'01010101'      ;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'01010101'      ;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 MAXHIG LOS SEGUNDOS 8 BITS
      NOP
      bcf         STATUS, RP0         ; Go to BANK0
      bcf         STATUS, RP1
      MOVLW      B'00000111'      ;DESACTIVAMOS CS DEL MAX
      MOVWF      PORTE         
      RETURN


DE MOMENTO ESA ES MI DUDA, NO SE SI HAGO ALGO MAL EN EL SOFTWARE O EN EL HARDWARE, PUES SEGUN SEEXPLICA ES SENCILLO DE HACER ESTO...


GRACIAS
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 16 de Agosto de 2006, 02:12:06
sigo buscando:

¿puedo tener problemas por no esperar el tiempo suficiente para la conversion?

he leido por internet que debo esperar unos 200ms antes de leer el max.

sera cuestion de probar


 :shock:
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 16 de Agosto de 2006, 08:36:56
sigo buscando:

¿puedo tener problemas por no esperar el tiempo suficiente para la conversion?

he leido por internet que debo esperar unos 200ms antes de leer el max.

sera cuestion de probar


 :shock:


Lafumat, no te he respondido porque no he tenido tiempo de revisar tu código conciensudamente en conjunto con el datasheet.

Ni bien tenga un par de horitas, te hecho una mano al código.

Un abrazo

PD: tienes osciloscopio con el que puedas ver las señales del SPI?
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 16 de Agosto de 2006, 09:38:29
si tengo osciloscopio promax de 2 canales de 40MHz.

seguire probando mientras buscais como ayudarme.

probare lo del retardo.

Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 16 de Agosto de 2006, 10:21:47
si tengo osciloscopio promax de 2 canales de 40MHz.

seguire probando mientras buscais como ayudarme.

probare lo del retardo.



Tal vez no leíste bien mi post pero te escribí:
¿tienes osciloscopio con el que puedas ver las señales del SPI?

La idea es que lo conectes a los pines del SPI y nos comentes qué ves!
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 17 de Agosto de 2006, 01:01:16
en mi casa veia que en la salida sdo del pic al poner una resistencia pull-up me daba una señal cuadrada (puede ser que el dato basura fuera 0101010101) pero en 4V, y en las otras patillas (clk y input) no veia nada.

todo esto lo mire con un osciloscopio para pc ( un poco malo), pero lo conectare a un osciloscopio "real" para ver que pasa.


 :shock:
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 21 de Agosto de 2006, 11:36:23
hola:

estado currando un poco y nada.

en el soft no encuentro de momento nada.

posteo lo que me da el oscilo en las patillas asi como el esquema....

creo que eso de que las señales esten entorno a 4V no es bueno.



 :shock:
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 21 de Agosto de 2006, 11:40:23
a ver el esquema:

Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 23 de Agosto de 2006, 01:07:23
Antes que nada, me he demorado en responder porque he estado ocupado.

He visto las gráficas y dejame decirte que no me parecen para nada buenas, excepto que sean la señal de dato solamente pero el clock... realmente es muy extraño ese comportamiento. 

Por otra parte, no recuerdo el datasheet pero ¿porqué pones las resistencias de pullup? Son muy usadas en el i2c pero en el SPI? es la primera vez que veo eso, jamás las he usado.

Aún no he revisado el código pero si tu dices que está todo bien con el código, por eso me enfoqué en el esquema solamente.



Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 23 de Agosto de 2006, 01:52:27
hola maunix:

pues no se si el codigo esta bien 100%, pero no encuentro nada.

en cuanto el esquema , puse las resistencias pull-up porque sin ellas, no tengo señal en la patilla del clk, y en la de entrada....

me estoy volviendo un poco loco.. :?

por eso no se si esta el codigo mal o que. Voy a quitar las resistencias pull-up y subir las graficas de ellas.

el caso es que en el portb tengo unos 7seg y las señales de datos son "bonitas", las de las entradas del oscilador del micro tamopoco me gustan mucho....
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 23 de Agosto de 2006, 05:45:55
y sigo:

he encontrado un datasheet de microchip el an975, que trata de como conectar EEproms series al pic16f877.

voy a leerlo y a fijarme de como se hace pues sera muy parecido.

a ver que tal....
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 24 de Agosto de 2006, 20:43:26
y sigo:

he encontrado un datasheet de microchip el an975, que trata de como conectar EEproms series al pic16f877.

voy a leerlo y a fijarme de como se hace pues sera muy parecido.

a ver que tal....

Lafumat, he observado tu código de configuración y lo veo correcto, no tengo nada para objetar al respecto.

Lo mismo para el código de envío y recepción, también creo que están correctos.

Ahora bien, insisto en que no hacen falta esas resistencias de pull-up , prueba sin ellas.

En cuanto a la configuración de los puertos, no he visto la configuración del TRISC, ¿puedes subir tu código de configuración de dicho registro?

Por más que demore el dispositivo en responderte o tener el resultado listo, debieras poder ver la salida de clock del pic.

Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 25 de Agosto de 2006, 13:43:32
hola maunix:

he quitado las resistencias pull-up, y nada pues antes no las tenia puestas.

lo del trisc:

pues no se si lo tengo bien o mal:

CONF_PORTC                  ;CONFIGURA EL PORT C

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

Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 25 de Agosto de 2006, 14:45:52
hola maunix:

he quitado las resistencias pull-up, y nada pues antes no las tenia puestas.

lo del trisc:

pues no se si lo tengo bien o mal:

CONF_PORTC                  ;CONFIGURA EL PORT C

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



Bueno, fíjate, estas poniendo el RC3/SCK (El clock el SPI) como entrada.

Lo debes poner como salida.

De esta forma:

Código: ASM
  1. MOVLW   b'10010101'
  2.                 MOVWF   TRISC

Los otros bits no se que tienes en ellos así que los dejo tal como estan.

Saludos


Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 26 de Agosto de 2006, 04:31:59
HOLA MAUNIX:

RETOQUE EL TRIC C, QUITE TODAS LAS REISTENCIAS, Y ME LEE UN VALOR, PERO NO SE YO:

EL CASO ES QUE EN TEORIA ME TENDRIAN QUE ENTRAR 16 BITS, LOS CUALES ALMACENO EN MAXHIGH Y MAXLOW. eSTOS 16 BITS ESTAN DESORDENADOS, PERO PARA EMPEZAR ME DA IGUAL (CREO YO), DDE MOMENTO QUIERO VER 8 DE ESOS BITS EN LOS DISPLAYS 7 SEG Y VER QUE AL CAMBIAR LA TEMPERATURA DEL TERMOPAR, VN CAMBIANDO LOS BITS, Y ASI LUEGO YA VER COMO TRATAR LOS DATOS.

PUES BIEN, ME LEE UN VALOR, QUE NO CAMBIA NI CON EL TERMOPAR NI CON NADA.

PONGO LAS SEÑALES DEL SO, SPI Y SCK (QUE SIGUEN SIN GUSTARME NADA Y VOY A REVISAR EL CODIGO.

¿QUE ME PODRÁ ESTAR PASANDO? ¿TAN DIFICIL ES ESTO DEL SPI?

Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 26 de Agosto de 2006, 04:34:57
AHI VAN LAS GRAFICAS
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 26 de Agosto de 2006, 09:38:45
PUES BIEN, ME LEE UN VALOR, QUE NO CAMBIA NI CON EL TERMOPAR NI CON NADA.

Esto también puede ser que le estes enviando mal el tipo de clock y data.  Es decir, el 'flanco' en el cual el otro lado leerá el dato.  Esto lo puedes ir probando esto cambiando el CKP y CKE del SSPSTAT y SSPCON respectivamente.

PONGO LAS SEÑALES DEL SO, SPI Y SCK (QUE SIGUEN SIN GUSTARME NADA Y VOY A REVISAR EL CODIGO.

El SPI es un bus rápido, de alta velocidad.  Tu lo tienes configurado en 1/16.  Si corre a 20Mhz, pues estarán saliendo las señales a algo mas de 1Mbps

Esto significa que 8 bits, no durarían más que 2 o 3 microsegundos.  Tu estas viendo los pulsos en milisegundos!  Pon tu osciloscopio con un paso de 10useg con el trigger activado y ahí los debieras ver bien a los pulsos.

¿QUE ME PODRÁ ESTAR PASANDO? ¿TAN DIFICIL ES ESTO DEL SPI?

Como cada módulo del PIC tiene sus particularidades.  Tu estas haciendo una aplicación bastante simple, hay módulos que son bastante más engorrosos de manejar.  Ni hablar si pones varios módulos en "cadena" uno tras el otro porque ahí si que se complica bastante mas saber a cual uno direccionará .

Ten paciencia y has el cambio que te dije en el osciloscopio y vuelve a colgar las gráficas.  Si sigues leyendo basura o el mismo valor es porque está mal el modo SPI (que lo cambias con lo que te dije antes del bit CKP y CKE)
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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....

Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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.


Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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....

Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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
Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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.  :) :)
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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
Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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

Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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....

Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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.



Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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....

Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT 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....
Título: Re: conectar termopar al pic16f877
Publicado por: maunix 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)
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 11 de Septiembre de 2006, 13:44:26
hola:

he estado unos dias fuera, y por ello no he adelantado.


como seria lo del max, pues me pierdo un poco.....
Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 11 de Septiembre de 2006, 14:40:47
hola:

he estado unos dias fuera, y por ello no he adelantado.


como seria lo del max, pues me pierdo un poco.....


Lo que quise decir es lo siguiente:

Si tu pic se reinicia y no descubres la causa, le podrías agregar un IC MAX232 , conectarlo a la USART del pic y del otro lado a la PC.

Podrías armar ciertas comunicación que envíe un dato cuando el pic se reinicia.  De esa forma podrás ver si es un efecto frecuente, con qué frecuencia se da, cuando se da, etc.

De todas formas, tal vez te la estoy complicando y puedas resolverlo sin necesidad de eso.

Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 13 de Septiembre de 2006, 01:24:38
hola:

estoy un poco liado de tiempo, pues en esta epoca no dispongo de mucho tiempo y por ello voy poco a poco.

creo que el problema va a ser de las rutinas de los displays de 7 segmentos.

voy a dar unos pasitos hacia atras;

dejare mi hardware con el pic conectado al max y voy a conectar simplemente leds al puerto b para ver en binario el MAXLOW y ver que pasa;

simplemente, leer del max y volcarlo al puerto. y asi ir quitando problemas....

(lo del max, no me importaria probarlo, pues tengo ese chip, y prdria ser una posibilidad futura del circuito, el conectarlo al rs232)

Título: Re: conectar termopar al pic16f877
Publicado por: maunix en 13 de Septiembre de 2006, 08:20:48
hola:

estoy un poco liado de tiempo, pues en esta epoca no dispongo de mucho tiempo y por ello voy poco a poco.

creo que el problema va a ser de las rutinas de los displays de 7 segmentos.

voy a dar unos pasitos hacia atras;

dejare mi hardware con el pic conectado al max y voy a conectar simplemente leds al puerto b para ver en binario el MAXLOW y ver que pasa;

simplemente, leer del max y volcarlo al puerto. y asi ir quitando problemas....

(lo del max, no me importaria probarlo, pues tengo ese chip, y prdria ser una posibilidad futura del circuito, el conectarlo al rs232)



Bien, entonces es posible que conectes el MAX232 y así puedas ver , por puerto serie, qué estás leyendo en el dispositivo SPI.

Es una técnica muy usada para "debuggear" o "probar y depurar" el código.

Saludos
Título: Re: conectar termopar al pic16f877
Publicado por: LAFUMAT en 12 de Octubre de 2006, 08:36:45
hola de nuevo maunix:

resulta que he estado fuera de por aqui y no avance con el tema...

bueno, he realizado un circuito que solo tiene el max y 8 leds al PUERTOB, RESULTA QUE HAGO QUE EL PROGRAMA SOLO ME SAQUE un dato (por ejemplo 00001111) y no me da fallos; a continuacion le pongo las subrutinas de configuracion de puertos, y sigue sacando el dato.

pero a la gora de poner la subrutina de LEE_SPI y DATA_MAX, ya no funciona....

tendre que ver que pasa en estas subrutinas