TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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
-
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
-
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?
-
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
-
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.
:)
-
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.
-
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;
;===================================================================
-
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.
:)
-
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???
:)
-
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??
-
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
-
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
:-/
-
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
-
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
-
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:
-
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?
-
si tengo osciloscopio promax de 2 canales de 40MHz.
seguire probando mientras buscais como ayudarme.
probare lo del retardo.
-
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!
-
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:
-
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:
-
a ver el esquema:
-
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
-
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....
-
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....
-
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
-
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
-
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:
MOVLW b'10010101'
MOVWF TRISC
Los otros bits no se que tienes en ellos así que los dejo tal como estan.
Saludos
Saludos
-
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?
-
AHI VAN LAS GRAFICAS
-
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)
-
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....
-
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.
-
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
-
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....
-
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
-
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
-
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. :) :)
-
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....
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
-
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
-
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....
-
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.
-
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....
-
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
-
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 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)
-
hola:
he estado unos dias fuera, y por ello no he adelantado.
como seria lo del max, pues me pierdo un poco.....
-
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
-
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)
-
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
-
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