TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: groundman en 02 de Febrero de 2008, 16:48:33
-
hola a todos.
ya he terminado la primera fase de un circuito para emular los caudalimetros de los automoviles.y se me presenta un problema que no se si es de harware o software.
es la primera vez que trabajo con el wachtdog,y me esta pasando algo raro que no se si tiene que ver con este.
resulta que cuando engancho el circuito a la alimentacion,el circuito funciona bien.pero avezes al alimentar el circuito el chip no funciona como debiera.y he activado el watchdog para que se resetee el circuito si se bloquea.
pero aun asi cuando el circuito se bloquea,el chip no se puede hechar a funcionar aunque le haga un reseteo externo.
para que funcione hay que volver a quitar la alimentacion,y posteriormente conectarlo.
que puede pasar aqui?
lo unico que se me pasa por la cabeza es que como el arranque del programa ,esta basado en un valor que esta almacenado en la eeprom de datos.y puede que cuando activo la alimentacion el valor sea diferente o que no lo halla leido bien y por eso no funcione,lo que hare es modificar el programa para que cuando lea el valor lo haga dos vezes.
si a alguien se le ocurre que podiera haber otro problema se lo agradeceria.
-
he averiguado algo.y es que cuando se bloquea,realmente no esta bloqueado.ya que un contador interno que he confecionado para que incremente unas direcciones de datos de la eeprom interna,funciona perfectamente.
asi que las interrupciones funcionan bien. ahora me queda ver porque no corre el programa principal.algo mas dificil ya que el fallo no ocurre cuando uno quiere.
lo que no entiendo es porque aunque resetee el pic,este no comienza el programa desde el principio.
es que hay algun registro interno que no se borra al resetear el pic,y que si se borra si se apaga? cuales son? y como borrarlos si se produce este fallo.
-
creo haber encontrado el problema.
resulta que otra vez me ha fallado el hardware del registro STATUS.como comentaba en este tema:
http://www.todopic.com.ar/foros/index.php?topic=20118.msg149155#msg149155
por lo visto,el problema puede estar,en que estoy utilizando un xtal de 4.194304Mhz en vez del 4Mhz que es el que puede como maximo el pic que estoy utilizando.
ya que el pic ejecutaba bien un subprogama de contador de tiempo.que tengo puesto en una interrupcion por desbordamiento del TMR1.
y en el programa principal tengo una instruccion de resta que modifica el valor del registro STATUS,y que luego compruebo el bit de carry,para tomar una decision.
pues despues de conectar la alimentacion de forma intermitente,para producir el fallo,el pic se me quedo bloqueado.
y no podia ponerlo a funcionar.entonces introduge la linea BSF STATUS,C en la zona donde el pic se quedaba bloqueado y logre que el pic empezara a funcionar de nuevo.
aunque quizas lo que hubiera hecho falta poner era BCF STATUS,C pero se desbloqueo con la anterior instruccion.
supongo que al escribir en el bit C de STATUS,he desbloqueado esta celula de memoria.
he intentado hacer lo mismo con el otro pic que tengo bloqueado,pero no funciona.seguro que este flag se ha estropeado.
P.D alguien me puede dar informacion de los problemas de trabajar con velocidades superiores a las dadas por el fabricante?
-
hola groundman
que pic estas usando? que no admite 4.194304Mhz como tienes configurado el cristal? creo que para ese valor es XT pero prueba con HS
otra cosa, dices que el programa re-arranca tras desconectar la alimentacion y no tras un reset. eso puede ser por algun registro de la ram que no le da tiempo a perder la info, e interfiere en el arranque del programa, como hablas algo sobre el arranque con un reg. de la eeprom, a lo mejor es un reg. usado en esa rutina, si el reset es de muy corto tiempo y queda algo de energia en el circuito, poca ya que el pic resetea, pero suficiente pues tarda mas en borrar la ram con algo de energia, que sin nada, al quitar la alimentacion. algunos registros se quedan con algo de info tras un reset, prueba a borrar los registros de ram al principio antes de iniciar tu programa.
en cuanto a lo de freir el bit C :shock: que rutina matabits utilizas en los programas?? :D lei en un post de Leon pic, creo, que era bastante dificil cargarse uno de esos registros por sobreescribirlo demasiadas veces, refiriendose a los reg utilizados en las rutinas de retardo, creo. como lo has frito :shock:
prueba esto y comenta el resultado, seguiremos descartando posibles fallos, intenta pegar el programa por si alguien ve el fallo en las rutinas
un saludo y espero te ayude
-
Porque no subes aqui el codigo y esquematico, asi podremos ayudarte...
Coincido con Alogic, es muy dificil de creer que te pase lo que describes, ojo!! no estoy diciendo que es imposible!!
Pero yo en mi carrera con los PICs ya me cargue unos cuantos, pero siempre por mala conexion, nunca por un codigo mal escrito, ni tampoco vi que se rompan por conectar un cristal superior al que lleva, en todo caso al poner el que lleva se soluciona el problema... :mrgreen:
-
gracias por vuestros comentarios.he hecho algunos cambios en mi programa.pero no funcionan.
en la zona PRINCIPAL he puesto unas lineas de codigo que tengo deshabilitadas para comprobar si fallava el bit carry de STATUS.
y este bit funciona bien en los dos chips.no se cual sera el fallo,me va ha costar encontrarlo.
porque en la zona RESTA del programa donde se me queda bloqueado.no se porque no sale del bucle RESTA2.
aqui pongo parte del programa porque tiene 1104 lineas ensambladas y no caben en esta respuesta.
DIVIDE
call RESTA
movf RESUL,w
addwf ANALOG,f ;suma analog y resul
btfss STATUS,C ;comprueva si analog se pasa de 255
return
movlw 0xff
movwf ANALOG ;si analog se pasa de 255 se le asignara valor 255
return
;//////////////////////////////resta tabla a dato analogico///////////////////
RESTA movf TEMP_TABLA,w ;carga temp_tabla en el acumulador
subwf ANALOG_TEMP,f ;resta temp_tabla analog_temp
btfsc STATUS,C ;comprueva si hay acarreo
goto RESTA2
goto RESTA3 ;goto si hay acarreo
RESTA2 ;BSF STATUS,C
clrwdt
incf RESUL,f
goto RESTA
RESTA3
clrf ANALOG_TEMP ;si hay acarreo, analog=0
return
y aqui un subprograma que he hecho para probar si falla el bit de carry,y cuando lo cargo funciona bien.asi que creo que el problema puede estar al realizarse la resta entre los dos registros ANALOG_TEMP Y TEMP_TABLA
PRINCIPAL BANK0
movlw 0x50
movwf ENTRADA
movlw 0X45 ;cambiar a 55h para comprobar si carry funciona
movwf SALIDA
subwf ENTRADA,W
btfsc STATUS,C
goto PRINCIPAL
movlw 0xff
movwf PORTB
EN GOTO EN
-
ya logre hacer funcionar los dos chips,no hera ningun bit de carry averiado.
el problema estaba en el programa.y es que este programa graba unos valores en la eeprom de datos ,que al volber a alimentar el circuito.este funcionava segun el valor que tuviera la direccion de eeprom de datos.y se me habia pasado grabar otros valores muy importantes,y claro al ponerlo enmarcha de nuevo,no funcionava bien.
pero me ha venido muy bien esta experiencia,ya que nunca tube en cuenta de que no es lo mismo desconectar el circuito,que hacerle un reset externo,o con el wachdog.por eso me he dado cuenta de que es muy importante asignar un valor aunque sea cero a los registros de proposito general.para que cuando se produzca un reset,el circuito no nos haga cosas raras.
saludos.
-
Podrias explicar mejor, cual es la funcion del circuito? es por curiosidad :D a que te refieres con emular el caudalimetro del coche?
-
se trata de que todos los caudalimetros de placa caliente,ya no se los de hilo caliente.se desgastan o modifican las propiedades de sus componentes por el desgaste y la suciedad del paso del aire por el mismo.
yo tengo un citroen motor HDI. y con 80.000Km tube que cambiar el caudalimetro por falta de potencia.
ahora tiene 140.000Km y ya noto la falta de potencia.he comprobado con el circuito que he hecho,y el caudalimetro y me da un voltage maximo de salida de 4.5V
cuando deberia ser de 5V.ya que este circuito almacena en la eeprom interna el valor maximo que proporciona el caudalimetro.
este circuito se intercala entre el conector que va hacia el caudalimetro y el caudalimetro.
lo que hace el circuito es convertir el valor maximo del caudalimetro en 5v.y sus valores intermedios,con valores relativos.
asi aprendo y me ahorro un dinero ya que el caudalimetro me costo unos 100€.
-
Y esto realmente funciona :S es decir el caudalimetro por suciedad y demas puede no llegar al maximo los 5v que dices tu y por ejemplo quedarse en 4, pero esos valores intermedios como los calculas? porque no precisamente su funcionamiento seria lineal no?
Es decir para caudal maximo suponte 5v y para medio 2,5 igual ahora el maximo no pasa de 4 pero el medio sigue dando 2,5 no se si me explico :S
-
lo siento no se que quieres decir.pero te dire que el funcionamiento se basa en unas tablas precalculadas.y que tomando el valor maximo que entrega el caudalimetro al pic,que para ello hay que poner le motor ya en caliente y a 140km/h en cuarta velocidad si es que llega.pero para esto tendras que ir a un circuito de pruevas,para no salirte de la ley. :D
de esta forma el caudalimetro habra llegado a su pleno rendimiento.
el valor analogico que entrega el caudalimetro,pasara al pic para su gestion.
y una vez tratado se sacara el valor por uno de sus puertos de 8bit y de este a un conversor D/A yo he usado el DAC 0808.
y si,el valor es lineal. va desde 0v a 5v sin saltos.esto se hace con un contador para la salida que incrementa o decrementa segun el valor de entrada.
o si lo que preguntas es como se calcula los valores diferenciales para corregir el valor,te dire que entre 4 y 5v hay 16 valores que pertenecen a la tabla que diseñe.con un monton de calculos y que ya no me acuerdo ni como las hize.porque hace ya casi 2 años.
-
me refiero precisamente a esta frase ""si,el valor es lineal. va desde 0v a 5v sin saltos"" cuando el caudalimetro se va estropeando no deberia de estropearse precisamente de forma lineal...esa es la duda que tengo, porque supones que se estropea de forma lineal ;)
-
exacto,se estropea de forma lineal normalmente.y es devido en parte a la suciedad que trae el aire y se deposita en las placas.e incluso a la placa calefactora que emite menos temperatura con el desgaste del tiempo de uso.