Autor Tema: Pequeña putada del TMR0  (Leído 5003 veces)

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

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Pequeña putada del TMR0
« en: 25 de Agosto de 2011, 13:35:52 »
Pues bueno, estoy haciendo un programa en el que tengo que contar tres tiempos y lo estoy haciendo con los tres TIMERs, es en un 16F886, cada uno cuenta su tiempo y al terminar provoca una interrupcion, pero simulando me pasaba que se provocaba una interrupcion por desbode de TMR1 o TMR2 y cuando llegaba a la interrupcion se me activaba lo que se tenia que activar con la interrupcion del TMR0.
Lo tenia asi:

Código: [Seleccionar]
INICIO_ISR

movwf W_Temp ; Copiamos W a un registro Temporal
swapf STATUS, W ; Invertimos los nibles del registro STATUS
movwf STATUS_Temp

ISR
                 btfsc INTCON,T0IF  ; miramos si la interrupcion es por TIMER0
goto ACTIVAR_R ; es por TIMER0 vamos a activar TRIAC_R

btfsc PIR1,TMR1IF  ; Consultamos si es por TMR1
goto ACTIVAR_S ; es por TIMER1 vamos a activar TRIAC_S
btfsc PIR1,TMR2IF ; consultamos si es por TIMER2
goto ACTIVAR_T ; es por TIMER2 vamos a activar TRIAC_T
goto FIN_ISR ; si no fue ninguna, va a salir de la interrupcion

Analizando el problema veo que efectivamente no salto la interrupcion del TMR0 porque estaba desactivada ya que INTCON,T0IE esta a 0 y por tanto enmascara dicha interrupcion, pero como TMR0 cuenta siempre y no se puede parar (si alguien sabe como se hace que me lo diga) y el flag INTCON,T0IF se activa aunque la interrupcion no este activa da como resultado que se produce una interrupcion, cualquiera que este activada y si en la rutina ISR chequeamos primero si fue por TMR0 nos dira que si aunque sea mentira.

Bueno la solucion que veo y que estoy aplicando, es simplemente chequear T0IF de ultimo, ya que los otros dos TMRs si se comportan bien y cuando no estan activados no cuentan y cuando quieras que cuenten los activas y listo.
Queda de esta manera:

Código: [Seleccionar]
INICIO_ISR

movwf W_Temp ; Copiamos W a un registro Temporal
swapf STATUS, W ; Invertimos los nibles del registro STATUS
movwf STATUS_Temp

ISR

btfsc PIR1,TMR1IF  ; Consultamos si es por TMR1
goto ACTIVAR_S ; es por TIMER1 vamos a activar TRIAC_S
btfsc PIR1,TMR2IF ; consultamos si es por TIMER2
goto ACTIVAR_T ; es por TIMER2 vamos a activar TRIAC_T
btfsc INTCON,T0IF  ; miramos si la interrupcion es por TIMER0
goto ACTIVAR_R ; es por TIMER0 vamos a activar TRIAC_R
goto FIN_ISR ; si no fue ninguna, va a salir de la interrupcion

Bueno asi de momento en la simulacion funciona bien.
No se si es exactamente un fallo de Microchip, o simplemente que al estar asociado al WDT tiene que funcionar de esta manera, aunque el WDT tambien esta desactivado.





Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pequeña putada del TMR0
« Respuesta #1 en: 25 de Agosto de 2011, 14:18:02 »
Podes preguntar si la interrupción y la bandera estan activadas.

si(TMR0IE==1 AND TMR0IF==1)entonces
{

}


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #2 en: 25 de Agosto de 2011, 14:53:26 »
Pues si, en esta no habia caido, gracias.


Saludos.



Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Pequeña putada del TMR0
« Respuesta #3 en: 26 de Agosto de 2011, 10:53:30 »
Mirá, tal vez puedas utilizar solo el timer0 para generar esos tres tiempos.

http://www.todopic.com.ar/foros/index.php?topic=30920.0
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #4 en: 27 de Agosto de 2011, 05:37:28 »
Gracias por la sugerencia Leon, pero en este caso concreto no me vale ya que los tres TMRs van a contar el mismo tiempo, pero desfasados y superpuestos, es para hacer un arrancador suave, y detecto los pasos por 0 de las tres fases que estan desfasadas 120º (3.33seg) por lo que cuando pasa por 0 fase R empieza TMR0 a contar, 3.33seg mas tarde empieza TMR1 a contar el mismo tiempo, y 3.33seg mas tarde empieza TMR2, de manera que primero esta contando solo uno despues 2 y despues los tres, desborda uno luego otro y luego el otro, asi constantemente.
Lo estoy haciendo todo con un 16f886, pero barajo la opcion de controlar cada fase con un 12f675, por la exactitud de los tiempos, ya que con TMR0 no puedo conseguir los tiempos exactos, lo tengo con un preescaler de 1/64 y para darle al motor 10% de potencia tengo que temporizar 8.680ms y lo mas proximo que consigo son 8.647ms son solo unos pocos us, pero me gustaria que fueran exactos, ya que es para motores muy grandes, 2000 o 3000KW y hay que manejar mas de 5000A a 400V. En el precio poner los 12f675 no tiene consecuencias ya que vale cada uno 1 o 2€ y los tiristores cada uno vale 184€  y va a llevar 24 mas o menos de 4150A/600V, aunque me gustaria hacerlo todo con un solo PIC, pero lleva botones y displays para parametrzarlo, sensores de sobreconsumo, temperatura y bastantes cosas mas.
Bueno ya veremos de momento lo estoy planteando todo con un 16f886, veremos si soy tan como creo que soy y sale todo con uno. :lol: :lol:



Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Pequeña putada del TMR0
« Respuesta #5 en: 28 de Agosto de 2011, 01:59:05 »
Para hacer mas exacto la temporización del tmr0, puedes utilizar algunos NOP en la interrupción antes de re-ajustar al tmr0

En cuanto a mi sugerencia, sino me equivoco, puedes utilizarlo aún pero con banderas que la iras activando según su orden.
Otra idea, es que puedes configurar al tmr0 como contador y utilizar un reloj de precisión exterior. Sería mejor utilizar el bit RB0/int pero seguro lo tienes ocupado para detectar el cruce por cero.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #6 en: 29 de Agosto de 2011, 13:24:45 »
Citar
Para hacer mas exacto la temporización del tmr0, puedes utilizar algunos NOP en la interrupción antes de re-ajustar al tmr0

Si, no es que me guste mucho dentro de la interrupcion hacer cosas de mas que las que tengo que hacer pero......
El programa en si no tiene mucha complicacion, solo este de los tiempos, agravada por la imprecision del TMR0, pero en vez del 10% un 10.02% tampoco se notara. Dentro de la complicacion hay algo bueno y es que se en que momentos me van a pasar por 0 cada fase, si en algun momento me crearan conflictos puedo adelantar o retrasar unos us la entrada en la interrupcion, ya que va a suponer como digo
0.01 o 0.02%

Citar
En cuanto a mi sugerencia, sino me equivoco, puedes utilizarlo aún pero con banderas que la iras activando según su orden.

Para hacerlo con un solo TIMER si que no di conseguido como hacerlo, por eso me decidi por el uso de los tres con interrupcion, creo que de esta manera es la mejor, con TMR0 consigo un valor aproximado y con los otros voy consiguiendo el mismo valor del TMR0, es importante que sean iguales ya que si se descompensan las potencias entre las fases, en potencias de 2000KW para arriba puede ser fatal. Por eso aun me planteo lo de los 3*12f675 ya que ahi todos los tiempos serian con TIMER1 y este si tiene precision.

Citar
Otra idea, es que puedes configurar al tmr0 como contador y utilizar un reloj de precisión exterior. Sería mejor utilizar el bit RB0/int pero seguro lo tienes ocupado para detectar el cruce por cero.

No creo que para esto lo necesite, la precision del clock interno a 4 o 8Mz tendria que llegar de sobra.


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pequeña putada del TMR0
« Respuesta #7 en: 30 de Agosto de 2011, 17:43:41 »
Con cuántos uS de error máximo te conformarías? El error en potencia aplicada es bastante poco cerca de los cruces por cero.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #8 en: 31 de Agosto de 2011, 09:23:54 »
Me conformare con lo que TMR0 diga que remedio.  :lol:
Donde se me produce el error no es en el paso por 0 sino en el momento de la activacion de los triacs, en plena senoide. Para rampas de 5 en 5% no tendre problema, creo, pero quiero hacerlas tambien de 1 en 1% e incluso de 0.5 en 0.5, aqui unos poquitos us empezaran a ser importantes, supongo.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #9 en: 02 de Septiembre de 2011, 15:07:05 »
Bueno he empezado a mirar la cosa para ir incrementando potencia del 1 en 1%, los resultados para las potencias muy bajas 1,2,3% no son muy buenos, entre una y otra potencia la diferencia son 92us (10ms del semiciclo -0.4ms del inicio y -0.4ms del final en los que el triac no conduce, valores aproximados) el caso es que para 1% tendria que temporizar 9508ms y lo mas proximo con TMR0 son 9479, en el 98% cae casi redondo 9416 y salen 9415 (ojala fueran asi todos) en el 97% serian 9324ms y se tiene que quedar en 9287. Bueno como digo no son muy buenos, pero a partir del 11 o 12% ya puedo empezar usar preescaler de 1/32 lo que aliviara bastante estas imprecisiones (hasta ese porcentage estoy usando preescaler 1/64).

En las potencias grandes 99% y 98%, solo hice estas dos de momento, como era de esperar no hay problemas.

Creo que en las potencias muy pequeñas no deberia de tener mucha importancia que en vez del 1 sea del 1.3%, y asi sucesivamente, hasta que al llegar al 10% para delante ya pueda afinar un poco mas.

Si bien, no estoy muy defraudado, tampoco doy saltos de alegria y no descarto lo de manejar cada fase con un 12F675

Tambien comentar que con TMR2 en algunas ocasiones no voy a conseguir los tiempos exactos del TMR0, estoy con preescaler de 4 y posescaler de 10, ahora me estoy dando cuenta que si el posescaler lo pongo de 16 me tendria que dar exacto lo mismo que el TMR0 con preescaler de 64, verdad? Lo mirare.


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pequeña putada del TMR0
« Respuesta #10 en: 02 de Septiembre de 2011, 16:40:06 »
Que FOSC estas usando y podrías subirla a 20Mhz de ser necesario?

Podrian ser valores del 0 al 255 en lugar del 0 al 100? Digo para aprovechar todo el rango de un byte y mejorar la resolución.

Se me ocurren un par de formas de encararlo con poco error. Dejame que lo piense un rato y te comento.

En tu comentario anterior mencionas muchas veces mS cuando deberian ser, me parece, uS. El tiempo para el valor que mencionas del 1% me parece incorrecto, o he entendido mal como funciona...

Saludos.

« Última modificación: 02 de Septiembre de 2011, 16:46:44 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pequeña putada del TMR0
« Respuesta #11 en: 02 de Septiembre de 2011, 21:24:09 »
Hola tapi.

Te adjunto lo que se me ocurrió. El error no debería ser mayor a unos uS.

Si tenes Proteus 7.7 sp2 o superior vas a poder simularlo...


Saludos.
« Última modificación: 04 de Septiembre de 2011, 13:37:41 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #12 en: 03 de Septiembre de 2011, 06:21:23 »
Citar
Que FOSC estas usando y podrías subirla a 20Mhz de ser necesario?

De momento estoy trabajando con 4Mz, pense en subirlo a 8Mz para darle mejor definicion, pero entonces en TMR0 tenia que subir de 1/64 a 1/128, por lo que creo que casi estoy en el mismo caso. Se podria subir a 20Mz de ser necesario con clock externo, con los internos las opciones son 4 o 8Mz. De no ser por este problema 4Mz sobrarian.

Citar
Podrian ser valores del 0 al 255 en lugar del 0 al 100? Digo para aprovechar todo el rango de un byte y mejorar la resolución.

Las potencias van en porcentajes 1% en 1% o 0.5% en 0.5% por eso lo divido en 100 partes 200 etc. no entiendo bien porque al dividirlo en 255 voy a tener mas precision, aqui me perdi. :lol:

Citar
En tu comentario anterior mencionas muchas veces mS cuando deberian ser, me parece, uS. El tiempo para el valor que mencionas del 1% me parece incorrecto, o he entendido mal como funciona...

Tienes razon me olvide de poner las comas, donde pongo 9508ms debi haber puesto 9.508ms o 9508us.
Los tiempos igual te despista porque el "Mister Emulti-calc" lleva un reload incluido donde da a mayores unos ciclos de instruccion para la carga del TMR y lo tengo en 7 ciclos, en la realidad van a ser mas porque desde que desborda hasta que se ceba el triac pasan en tntre17 y 21 ciclos de instruccion, esto ya despues al depurar en el MPLAB se ajustan.
De todos modos cuanto mas porcentaje de potencia se le da al triac, menos tiempo cuentan los TMRs, ya que cuentan desde el paso por 0 hasta el cebado del triac, cuanto mayor el tiempo de retardo menos tiempo conduce.

Mirare lo que propones pero en MPLAB ya que mi PROTEUS hace lo que le da la gana, solo lo uso para diseñar, la version profesional no me simula bien, se me cuelga al poco tiempo de estar trabajando con ella, no es capaz de simular siquiera una lampara con un interruptor.

Algo que me ocurre es para porcentajes grandes descomponer los tiempos en partes mas pequeñas y con un contador ir contando desbordes. Me explico mejor, el 1% son 9508us hago desbordes de 920us lo hago 9 veces y tengo el 90% del tiempo 8280us y temporizo el resto para 99%, del tiempo que es 1%de potencia aplicada al triac, de esta manera consigo trabajar con preescaler de 4 que me da mucha mas precision.

PD:Si hay pequeños fallos en el mensaje disculpa es que el editor del foro me hace cosas raras al querer hacer modificaciones.

« Última modificación: 03 de Septiembre de 2011, 12:43:20 por un Moderador, Razón: Ojo con lo ilegal! »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pequeña putada del TMR0
« Respuesta #13 en: 03 de Septiembre de 2011, 12:42:52 »
Bueno. He modificado el programa, por un pequeño problema que podía haber durante las transiciones.

Citar
Que FOSC estas usando y podrías subirla a 20Mhz de ser necesario?

De momento estoy trabajando con 4Mz, pense en subirlo a 8Mz para darle mejor definicion, pero entonces en TMR0 tenia que subir de 1/64 a 1/128, por lo que creo que casi estoy en el mismo caso. Se podria subir a 20Mz de ser necesario con clock externo, con los internos las opciones son 4 o 8Mz. De no ser por este problema 4Mz sobrarian.

El programa que adjunte trabaja en 20Mhz. A menos Mhz hay que cambiar un par de valores, y vas a tener errores de tiempo mas grandes.

Citar
Podrian ser valores del 0 al 255 en lugar del 0 al 100? Digo para aprovechar todo el rango de un byte y mejorar la resolución.

Las potencias van en porcentajes 1% en 1% o 0.5% en 0.5% por eso lo divido en 100 partes 200 etc. no entiendo bien porque al dividirlo en 255 voy a tener mas precision, aqui me perdi. :lol:

Bueno, veo que seguís insistiendo en potencias de 1% en 1%, cuando en realidad lo que varias de a 1% es el tiempo de trabajo(duty time), no la potencia. Sí correspondería la mísma variación en potencia, si la curva de voltaje fuese horizontal(V constante) pero en tu caso son senoidales, por ende la potencia varía en cada momento distinto de tiempo y deja de ser proporcional. He aqui uno de los problemas a mi parecer. Estás particionando la potencia de manera desproporcional. Seguramente un arranque suave tendría mejor resultado respondiendo a una curva de potencia exponencial si tu problema es en los valores bajos de potencia aplicada.
El programa que hice autogenera tablas de tiempo, pero con intervalos constantes entre si(excepto para los valores de los extremos), lo que no se traduce en una senoidal a intervalos constantes de potencia pero sigue siendo lo mísmo que has hecho tú, pero con menor error. Podés modificar las tablas para que respondan a cualquier tipo de curva de aceleración.


El programa recibe el duty time a aplicar por USART, 9600 baudios. Te recomiendo que lo pruebes.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Pequeña putada del TMR0
« Respuesta #14 en: 04 de Septiembre de 2011, 05:49:59 »
Citar
Bueno, veo que seguís insistiendo en potencias de 1% en 1%, cuando en realidad lo que varias de a 1% es el tiempo de trabajo(duty time), no la potencia. Sí correspondería la mísma variación en potencia, si la curva de voltaje fuese horizontal(V constante) pero en tu caso son senoidales, por ende la potencia varía en cada momento distinto de tiempo y deja de ser proporcional. He aqui uno de los problemas a mi parecer. Estás particionando la potencia de manera desproporcional. Seguramente un arranque suave tendría mejor resultado respondiendo a una curva de potencia exponencial si tu problema es en los valores bajos de potencia aplicada.

Si, completamente de acuerdo, ya lo tenia contemplado y de hecho cuando lo haga asi todavia necesitare mas precision en los tiempos, ya que no seran lineales y mientras en el centro de la senoide donde se alcanza el valor maximo (325V de pico para 230V eficaces) sera inferior a 92us para un 1% de variacion de W, en los extremos donde empiezan y paran de conducir los triacs (400us despues de paso por 0 y antes de volver a pasar hay aprox 40V) seran bastante mayores de los 92us que salen al hacerlo lineal.

El problema solo lo tengo en los valores bajos entre el 1 y el 11% aprox porque tengo que trabajar con preescalers altos en los TMRs, con TMR2 tengo menos problemas, o eso creo, pero TMR0 con preescaler 1/64, no me da lo que quiero, por eso decia lo partir los tiempos en varias partes y con un contador ir haciendo las cuentas.

Citar
El programa recibe el duty time a aplicar por USART, 9600 baudios. Te recomiendo que lo pruebes.


Lo voy a mirar en el MPLAB y tratar de entenderlo, creo que me llevara algun tiempo, es bastante complicado. ¿Por que recibe por la USART? Realmente por la USART ira conectado via RS485 a un PLC para recibir datos desde el, sobre todo cuando trabaje como regulador de W (es algo que tambien quiero incorporarle) tambien estara comunicado con el PLC a traves de dos salidas normales ( de 0 y 1) una para ON/OFF y otra para el sentido de giro. Pero la parametrzacion tambien se hara in situ con tres o cuatro pulsadores donde se seleccionara tipo de rampa de arranque y parada. Aqui se seleccionara el % del arranque y de la parada, asi como los tiempos en cada % para hacerla mas suave o mas rapida.