TODOPIC
Microcontroladores PIC => - Niple - => Mensaje iniciado por: Heraldosantos en 29 de Febrero de 2012, 13:29:21
-
Hola les comento estoy haciendo un simple cronometro, el cual quiero que maneje hasta centecimas de segundo, para lo cual configure la interrupcion por TMR0 cada 10ms por lo cual tengo un contador que cuando se interrumpe este incrementa hasta llegar a 100, cuando llega a 100 este suama un segundo. y asi tambien para el minuto.
El problema se da en la visualizacion del LCD, el problema se me da que cuando controlo con un cromoetro el cronometro me marca 1 minuto y mi cronometro me marca 42 segundos, osea esta lento.
EL cristal que uso es de 20Mhz, ah la visualizacion esta adentro de la interrupcion del tmr0
adjunto el programa para que me den una ayuda. ah esta en la version 5.6
saludos
-
Voy a echar un vistazo.
Cual es el que va lento que no me ha quedado claro. el reloj o la visualizacion
F.
-
Visto el programa y bajo mi punto de vista entiendo que lo que se atrasa es la cuenta de tu programa.
Para mi la razon está en la cantidad de instrucciones que hay dentro de la rutina de interrupcion del TMR0, ademas me parece que con la primera instrucion dentro de la interrupcion al colocar lo de "Reiniciar" me da la impresion que el valor del tmro pasa a valor 00 y no se si los preescales, con esto hasta que se desborbe por una nueva interrupcion tienen que contar 255 pulsos.
Si te das cuenta al principio cuando configuras el TMRO para conseguir los 10msg hay que contar solo 125pulsos con lo que hay puede estar parte del retraso ya que para cada interrupcion se esta contando el doble.
Yo probaria con al principio de la interrupcion solo parar el TMR0 y justo al final antes del fin de la interrupcion lo recargaria de nuevo. Por otra parte intentaria sacar todo lo de actualizar el valor de visualizacion de la rutina de interrupcion, erservando esta solo para incrementar los valores de los registros pertinentes.
Te adjunto una imagen de como seria una interrupcion del TMRo para que sea efectiva.
F.
-
Gracias Fer_TACA, vos sabes que probe sacando la vizualizacion afuera pero no se alcanza a vizualisar los numeros, en el display, ojo eso lo hice con un cristal de 4mhz con el de 20 no probe. voy a probar eso que me decis y te comento que eso de reiniciar el tmr0 cuando entra en la interrupcion lo saque de un ejemplo que dejo canito en la web
pruebo y te comento
Gracias
-
Sigo con mi problema, no puedo lograr el segundo esacto, si le saco la visualizacion a la interrupcion y la pongo fuera no se visualizan las centecimas, y si pondo dento de la interrupcion se hace lento, es como que para hacer la visualizacion hay un retardo en el envio de datos. porque lo optimice lo mas que pude y nada
el problema lo tengo al visualizar las centecimas
Ayudaaaaa por favoor.
-
Hola heraldosantos, no uso niple, pero te recomiendo usar el timer2 como base de tiempos para que tengas mas presicion, y dentro de la interrupcion un flag que indique la necesidad de mostrar el tiempo, pero éste en el bucle principal no dentro de la interrupcion.
mira por ACA (http://www.todopic.com.ar/foros/index.php?topic=38092.msg317080#msg317080)
saludos.
-
Kallitos Gracias por la idea tiene pinta de que puede ser la solucion, pero no me esta quedando en claro algo:
En el TMR0 que configuro (la interrupsion del segundo?)
y en el tmr2 configuro la visualizacion del tiempo en el lcd? o al reves todo
-
unicamente usa el tmr2 cuando salta la interrupcion haces la suma del tiempo, en este caso 10ms, y pones a 1 un flag que diga ke hay nuevo valor y se debe mostrar, en el programa principal realiza un test del flag, si esta a 1 la muestra en el lcd y pone a 0 el flag.
asi estara atento y no retrasaras, procura usar la menor cantidad de codigo posible dentro de las interrupciones.
saludos.
-
Bueno voy a probar y ver que pasa, en estos dias te cuento que paso.
Saludos y muchas gracias.
-
hola! el problema que tenés es que al usar el timer 0 configurado para temporizar automáticamente el niple te configura el prescaler en 16 y 125 incrementos, lo que genera una interrupción cada 400 uS. Después niple cuenta 2000 ciclos y llama a la rutina de interrupción que vos pedís, pero la realidad es que cada 400 uS el programa se para y hace cosas que te retrasan el tiempo total. Empeza por usar el timer 1, configura el prescaler en 8 y 6250 incrementos para generar una sola interrupción de 10 mS.
Después podés reiniciar el timer dentro de la interrupción y volver a activarlo (no es necesario reconfigurarlo), si el tiempo de refresco del lcd no es mayor a 10 mS podés refrescar todo ahí mismo. Yo tengo un programa que genera bases de tiempo a partir de 10 mS refrescando un gLCD, que es muuuuuucho mas lento q tu display de caracteres.. así q no tendrías que tener problemas. Sino también podés probar haciendo solo la suma de tiempo y usar un flag como dice kallitos.
Conta q tal te fue con los cambios, saludos.
-
Gracias Vesperia, con esto me dan un gran incentivo para no dejar de lado este proyectito
Saludos los mantendre al tanto con los resultado obtenidos
-
Estimado Heraldo, no se si resolviste tu problema, pero te comento que Niple en las ultimas versiones, incorpora la posibilidad de temporizar un tiempo deseado con los temporizadores internos.
Cuando configuras el temporizador, seleccionas "Temporizar" y automáticamente Niple realiza el cálculo y las configuraciones de prescalado, incrementos en el TMR y cantidad de bucles, según la velocidad de cristal que estés usando, para generar un segundo, o el tiempo que desees. Tiene una precisión de 1 micro segundo.
Luego en la programación del entorno de interrupción por TMR debes cargar el módulo "Reiniciar" que esta en las herramientas de TMR junto con "Configurar". Con esto Niple colocara dos bloques, el primero es el que se encarga de recargar el valor de los incrementos en el TMR en cada interrupción. El segundo, es el que dice cuando llego al tiempo deseado, por ejemplo 1 segundo.
Espero haberte ayudado.
Saludos,
-
Estimado Heraldo, no se si resolviste tu problema, pero te comento que Niple en las ultimas versiones, incorpora la posibilidad de temporizar un tiempo deseado con los temporizadores internos.
Cuando configuras el temporizador, seleccionas "Temporizar" y automáticamente Niple realiza el cálculo y las configuraciones de prescalado, incrementos en el TMR y cantidad de bucles, según la velocidad de cristal que estés usando, para generar un segundo, o el tiempo que desees. Tiene una precisión de 1 micro segundo.
Luego en la programación del entorno de interrupción por TMR debes cargar el módulo "Reiniciar" que esta en las herramientas de TMR junto con "Configurar". Con esto Niple colocara dos bloques, el primero es el que se encarga de recargar el valor de los incrementos en el TMR en cada interrupción. El segundo, es el que dice cuando llego al tiempo deseado, por ejemplo 1 segundo.
Espero haberte ayudado.
Saludos,
Hola, Antes que Nada gracias por preocuparte por mi problema, todabia no realice las pruebas porque mande a hacer hacer los circuitos impresos, creo que esta semana los tendre y ya podre probar. Ev verdad lo que vos decis pero pasa que de esa manera en el tmr0 el programa se interrumpe cada 255 ciclos lo cual no podes poner mucho dentro de la interrupcion, fijate y si lees bien las respuestas anteriores ahi me explicaron al dedillo como hay que hacer, y cuando te fijes en niple te vas a dar cuenta que es asi como dicen, de todas maneras nuevamente gracias por tu interes.
-
Estimado Heraldo, esta bien lo que me decís.
No se que versión de Niple estés usando, pero cuando yo ingreso el módulo de configuración del TMR0 me propone prescalado 64 x 125 incrementos y 125 bucles. Esto te daría cada interrupción cada 8000 micro segundos o ciclos para cada interrupción.
Igualmente Niple te propone algo, pero nos es imposible cubrir todas las necesidades de los usuarios. Puede darse el caso, que a algún usuario le sea incomodo esta configuración, de los 8000 ciclos por interrupción, porque su programa no lo admite por su necesidad puntual. En este caso Niple permite cambiar los valores de prescalado, incremento y bucles, y te muestra el resultado final del tiempo obtenido. Y el programa sigue dándote tu segundo con precisión de 1 micro segundo o con la base de tiempo según el cristal que estés utilizando.
Me da mucho gusto que haya gente como Vesperia y FerTACA que la tienen muy clara con Niple y programación de PIC, que estén dedicando parte de su valioso tiempo, ayudando a los que recién comienzan en esto.
Saludos,
Silvio Galán
-
Me da mucho gusto que haya gente como Vesperia y FerTACA que la tienen muy clara con Niple y programación de PIC, que estén dedicando parte de su valioso tiempo, ayudando a los que recién comienzan en esto.
Ya me gustaria de disponer de mas tiempo, pero llevo un mes muy liadisimo y lo mas grave es que me paree que en los 2 proximos va a seguir asi. No obtante iré aportando lo que pueda.
Esto es tener mono de foro.
F.
-
Me da mucho gusto que haya gente como Vesperia y FerTACA que la tienen muy clara con Niple y programación de PIC, que estén dedicando parte de su valioso tiempo, ayudando a los que recién comienzan en esto.
Gracias! Compartir conocimientos y experiencias entre todos es un buen incentivo, lastima q al igual q Fer no siempre tengo tiempo para hacerlo.. Saludos!
-
Bueno muchachos, ya me tiene loco esto del segundo, ayer me llego la placa y arme el circuito y empece a probar el tema del cronometro y no doy en al tecla.
Lo configure con el TMR1 en 16bits y lo puse 1 escalar y 10000 ciclos y 1 escalar, total de tiempo 10mS,
Bueno dentro de la interrupcion tengo el incremento de las centecimas, si llega a 99 cuenta un segundo, y asi para el minuto.
La visualizacion le puse un control que si cambia la centecima muestra el nuevo valor y asi tambien para el segundo y el minuto, pero eso esta fuera de la interrupcion.
El Cristal es de 4Mhz.
Bueno ahora el problema, controlo un minuto con un cronometro y en mi cronometro me marca 48seg, osea 60seg de relog = 48 seg del mi cronometro. diferencia 12 segundos. bueno que hice a la interrupcion la puse cada 8mS porque era lo que me faltaba para equiparar el segundo del reloj y que paso ahora mi cronometo cuenta 60 segungos y el reloj 48 jeje se invirtio la cosa
No se en que puedo estar errando.
Espero de su ayuda
Saludos
-
adjuntá el .npl q te lo reviso, saludos!
-
Bueno te lo paso, anoche le empece a hacer un menu que todabia no lo termine pero te paso como lo tengo hasta aca configurado al tema del timer y de la visualizacion.
saludos
Esta en la ultima version del niple
-
Este es el programa terminado completo, pero con el problema de el segundo esacto
Saludos
-
Bueno muchachos tengo buenas noticias, encontreeeeeee el problema, si encontre el error, bueno les comento cual era el problema.
El problema se encontraba en la visualizacion. se daba que yo puse que me primero comprueve que si hubo cambio en las centecimas y despues en los segundos y despues en los minutos
Lo que hice fue invertir la secuencia de visualizacion primero minutos, segundos y despues centecimas.
Asi que de esa manera se soluciono el problema y ahora puedo decir que problema solucionado.
Gracias a todos de una u otra manera por el aporte, muchas gracias
-
me alegro! ando medio cargado con la facu y el laburo, así q recién la sem pasada pude mirar el último npl q habías subido, pero la parte del timer parecía estar toda bien. saludos!
-
Bueno muchachos tengo buenas noticias, encontreeeeeee el problema, si encontre el error, bueno les comento cual era el problema.
El problema se encontraba en la visualizacion. se daba que yo puse que me primero comprueve que si hubo cambio en las centecimas y despues en los segundos y despues en los minutos
Lo que hice fue invertir la secuencia de visualizacion primero minutos, segundos y despues centecimas.
Asi que de esa manera se soluciono el problema y ahora puedo decir que problema solucionado.
Gracias a todos de una u otra manera por el aporte, muchas gracias
Enhorabuena por haberlo resuelto.
F.
P.D.: ¿De verdad te funciona bien? dentro de la interrupcion del TMR1 cada vez que incrementas en una unidad los registros: Centenas, segundo y minutos. haces una asignacion a cada uno de ellos =1. Si esto es asi, todos ellos aunque se incrementen nunca pasaran de valor 1 y por tanto no contaran nunca hasta: 99, 59 y 59 respectivamente.
¿me estoy perdiendo en algo o son mis neuronas despues de tanto tiempo?