Autor Tema: ayuda! tiempos inexactos timer0  (Leído 2525 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado WOOD_girl

  • PIC12
  • **
  • Mensajes: 56
ayuda! tiempos inexactos timer0
« en: 25 de Agosto de 2008, 12:53:45 »
hola mis amigos, vuelvo en busca de su respetable sabiduria, esta ves me surgio un problema con un programilla que estoy haciendo para, por una parte controlar un mux, y por la otra parte inyectarle las señales ke estoy generando en el puerto c a un elevador de nivel, osea ke en el puerto b, necesito sacar el codigo binario de 0 a 3, y en el puerto c las señales ke deben ser en forma de escalera (osea primero C3, luego C4, y de ultimo C5), cuando hice este programa para ke trabajara a medio segundo, funciona excelentemente, pero cuando lo pongo a trabar al tiempo ke realmente necesito que es 5 ms el programa empieza a trabajr pero como ke enviando las señales a tiempos "locos", como ke el led parpadea pero no a un tiempo constante, y duran mas o menos de los 5ms que necesito, como si estuviera loco, espero que me hayan entendido aki pongo el programita, ojala alguien me colabore cone sto por que la verdad no se que pasa, a tiempo rapido se vuelve loco. acontinuacion le dejo el codigo;

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
int conta=0;



#int_rtcc
 
interrupcion_timer0()
{

if (conta<=3)
    {
   
   output_b(conta);
   delay_ms(3);
     conta++;
    }
   else
   {(conta=0);}                     


if (conta==1)
{output_high(pin_c3);

}
if (conta==2)
{output_high(pin_c4);
}
if (conta==3)
{
output_low(pin_c4);
output_high(pin_c5);
}
if (conta==0)
{
output_low(pin_c5);
}

if(input(pin_d0)==1){  //esto era para manejar el inh del mux, pero tampoco logro una señal a tiempo constante
   output_low(pin_d0);
    }
   else
   {output_high(pin_d0);}

set_rtcc(5);
}

void main()
{

set_tris_c(0x00);

setup_counters(RTCC_INTERNAL,RTCC_DIV_8|RTCC_8_BIT);
set_rtcc(5);
ENABLE_INTERRUPTS(INT_RTCC);
ENABLE_INTERRUPTS(GLOBAL);

while (1)
   {}}


gracias por la atencion prestada

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda! tiempos inexactos timer0
« Respuesta #1 en: 25 de Agosto de 2008, 14:03:39 »
Hola.

Pues mira, yo no acostumbro a colocar delay_ms(x) dentro de las interrupciones. Otra cosa, si vas a usar un pin para el mux, cuya frecuencia deba ser precisa, es mejor usar otro timer, el 2 por ejemplo, de esta manera con el timer0 manejas el envio de los numero (no he revisado esa parte) y con el timer2 se generaria la frecuencia para el pin del mux.

Saludos
El papel lo aguanta todo

Desconectado WOOD_girl

  • PIC12
  • **
  • Mensajes: 56
Re: ayuda! tiempos inexactos timer0
« Respuesta #2 en: 25 de Agosto de 2008, 16:22:50 »
gracias por el dato mlo, supongo que son muchas cosas para el timer0, lo voy a realizar a ver ke tal me va

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda! tiempos inexactos timer0
« Respuesta #3 en: 25 de Agosto de 2008, 18:03:06 »
Hola.

Segun veo tu estas interrmpiendo el timer0 cada 2mS no? (si los calculos no me fallan) y tienes un delay de 3mS, por lo que el compilador deshabilitara las interrupciones generales durante ese periodo para garantizar esa temporizacion ... lo que hace que el resto del codigo no se cumpla hasta pasados los 3mS.
por eso yo no acostumbro mucho a colocar delay_ms dentro de los procesos de interrupcion.

Saludos
El papel lo aguanta todo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ayuda! tiempos inexactos timer0
« Respuesta #4 en: 25 de Agosto de 2008, 18:03:51 »
Un detalle que veo en tu programa:

La configuración del Timer0 (RTCC) que haces creo que está mal.

Salvo error u omisión el Timer0 del 18F877 corriendo a 4 Mhz en 8 Bits y con un pre-escaler de 1:8 tarda 2.048 mS en desbordar.
Que calculado es D = 256 * 4 * (1 / 4000000) * 8

Como tú haces una precarga de set_rtcc(5); entonces tardará 2.008 mS en desbordar.
Que calculado es D = (256 - 5) * 4 * (1 / 4000000) * 8

Como dentro de la misma interrupción tienes un delay_ms(3); que retarda todo 3 mS además de lo que tarden las otras instrucciones dentro de la misma lo que ocurre es que se está disparando de nuevo antes de terminar ...

Si deseas un disparo de la interrupción RTCC cada 5 ms deberías configurarlo con un  pre-escaler de 1:32 y pre-cargarlo con un set_rtcc(100); con lo que conseguirías un desborde de 4.992 mS
Que calculado sería D = (256 - 100) * 4 * (1 / 4000000) * 32

Prueba y cuéntanos.  :mrgreen:




« Última modificación: 25 de Agosto de 2008, 18:06:11 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda! tiempos inexactos timer0
« Respuesta #5 en: 25 de Agosto de 2008, 19:35:56 »
Como dentro de la misma interrupción tienes un delay_ms(3); que retarda todo 3 mS además de lo que tarden las otras instrucciones dentro de la misma lo que ocurre es que se está disparando de nuevo antes de terminar ...

Yo pensaba que las interrupciones se deshabilitaban maestro!!!, a mi me sale este warning cuando coloco delayssss dentro de una interrupcion
Código: [Seleccionar]
>>> Warning 216 "US3_US1.c" Line 1412(0,1): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)


es decir que se deshabilitan las interrupciones para evitar precisamente volver a entrar en ellas, la version que uso es la 4.073.

Saludos
El papel lo aguanta todo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ayuda! tiempos inexactos timer0
« Respuesta #6 en: 26 de Agosto de 2008, 02:57:22 »
Si, en los 4.x ya toma en cuenta esta circunstancia, en los 3.x como el que yo uso no dice nada de nada.
Seguramente no se disparará hasta salir de ella y volver a rearmarse el bit de control por lo que la interuppción se ejecutará cada X ms (de la interrupción) + Y ms (de lo que tarda la interrupción en ejecutarse)
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda! tiempos inexactos timer0
« Respuesta #7 en: 26 de Agosto de 2008, 10:54:12 »
Ok. Gracias por la aclaracion maestro.

Saludos
El papel lo aguanta todo

Desconectado WOOD_girl

  • PIC12
  • **
  • Mensajes: 56
Re: ayuda! tiempos inexactos timer0
« Respuesta #8 en: 26 de Agosto de 2008, 11:05:21 »
uy muchas gracias por las ayudas mlo y diego, que aprovecho de una vez pa decirte redpic que de tu pagina de picmania, he sacado infinidad de ayudas,y de hecho con esos ejemplo es que adquiri lo poco que se de PIC C, gracias de nuevo...

weno ahora voy a implementar lo que me han dicho a ver que sucede.

talvez se preguntaran por que hice esa cuestion de desbordarlo a 2 ms y luego poner un delay de 3; pues bueno era para poder enviar con ese mismo timer la señal de inh del multiplexor, para que se disparara cada 2ms, y asi tuviese las tres señales (canal 1, 2  y3 )de duracion de 5ms, y la señal de inh ke me bloquea el paso cada que transcurran 3ms, espero me explique bien, en pocas palabras lo que busco es hacer un analizador logico, para un osciloscopio, y ke con la ayuda de la persistencia del ojo humano se vea como si las 4 lineas estuvieran al mismo tiempo.


Desconectado WOOD_girl

  • PIC12
  • **
  • Mensajes: 56
Re: ayuda! tiempos inexactos timer0
« Respuesta #9 en: 26 de Agosto de 2008, 16:45:28 »
weno pues estuve siguiendo sus consejos y con la ayuda del ccs, modifique el programa asi;

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)

#use fast_io(C)

int conta=0;

 

#int_rtcc
 
void interrupcion_timer0()
{


if (conta<=3)
    {
   output_b(conta);
   //conta++;   cuando lo tengo aki se pierde la sincronia.
    }
   else
   {(conta=0);}
switch(conta)
{

       
         case 1:     output_high(pin_c3);

                            break;
         case 2:        output_high(pin_c4);
                            break;
         case 3:        output_low(pin_c4);
                        output_high(pin_c5);
                            break;
       
         default:    output_low(pin_c5);
                        output_low(pin_c3);
                        output_low(pin_c6);
                        output_low(pin_b0);
                        output_low(pin_b1);

}

 conta++;
set_rtcc(100);
}

void main()
{



set_tris_c(0x00); //configuro el puerto c como salida



setup_counters(RTCC_INTERNAL,RTCC_DIV_32|RTCC_8_BIT);
set_rtcc(100); 
ENABLE_INTERRUPTS(INT_RTCC);
ENABLE_INTERRUPTS(GLOBAL);

while (1) // esto no lo he entendido por ke lo ponen asi, yo solo imito a mis mentores, pero si alguien me explica ke significa , bientoss
   {}}

con esta modificacion note algo curioso que si pongo el conta++ por fuera del if como esta me salen en sncronia los pulsos asi, c mo se muestra en la primera grafica ke adjunto, pero si lo pongo dentro del if, las señales de los canales se adelantan 5ms, curioso no, esto se puede ver en la segunda grafica que adjunto...
gracias por la ayudita prestada y que opinan del codigo, lo dejo mejor como estaba antes???

ahhhhhhh, otra pregunta a quien le debo creer???, osea, es que cuando miro estos analisis graficos las ondas salen perfectas, pero cuando le doy play al proteus, se ven las señales como si no estuvieran sincronizadas, se demora una mas ke otra o aveces como ke se salta un led, entonces acual de las dos le creo, no hay una forma mas extacta de ver lo ke pasa???. ahora si gracias por la ayuda. :g)

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda! tiempos inexactos timer0
« Respuesta #10 en: 27 de Agosto de 2008, 00:18:44 »
Hola.

El ciclo while{1} es un ciclo infinito, un loop, en el que el micro queda "engatillado" para que siga y siga y siga ...... haciendo nada .. solo atendiendo las interrupciones  :mrgreen:

El proteus es una muy buena herramienta para la simulacion y ayuda mucho para el debug ... pero si quieres saber que pasa realmente es mejor un osciloscopio ...

Saludos
El papel lo aguanta todo


 

anything