TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: chelomiche en 03 de Septiembre de 2008, 17:57:50

Título: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: chelomiche en 03 de Septiembre de 2008, 17:57:50
Hola a todos. Se que hay varios maestros de la programación aca.

Quien me da una mano generando dos señales en un mismo PIC. Quiero sacar por una pata una señal cuadrada de 31.25Khz y por otra pata una señal cuadrada de 50 hz. Estas deberían estar sincronizadas entre sí.

Por mi parte he intentado hacerlo con el tmr0, y si bien obtengo la señal de 31.25khz, cuando empiezo a programar mas codigo esta frecuencia varía.

Escucho sugerencias.

Desde ya muchas gracias a todos por su tiempo.

Marcelo
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: scientist en 03 de Septiembre de 2008, 18:20:30
si puedes poner tu programa, te puedo hechar la mano, saludos
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: gera en 03 de Septiembre de 2008, 23:22:52
hola chelomiche!
q pic estas usando? yo te sugiero q uses alguno q tenga pwm.
saludos!
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: MLO__ en 04 de Septiembre de 2008, 13:42:50
Hola.

Pues a mi se me ocurre que generes bien la de 31.25kHz con el timer0 u otro y cuentes 625 veces la entrada a esa funcion y con una bandera activar el toogle del pin que saca los 50Hz, asi quedarian sincronizadas.

Saludos
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: chelomiche en 04 de Septiembre de 2008, 16:52:20
Gracias a todos por responder:

MLO_ yo pensé igual que vos. Pero en vez de salir por el PIN_B5 50hz, me sale 276.5 hz y está desfazado con respecto a los 31.25kz.
Otra cosa que no me coincide, es que offset del tmr0 en teoría debería funcionar con 216 para generar una interrupción cada 16us, pero tengo que llevarlo a 232 para obtener los 31.25khz

Este es el programa que utilicé:

#include <16f84a.h>                   
#fuses HS,NOWDT,NOPROTECT,PUT         
#use delay(clock=20000000)
#use fast_io(b)

int NInts=0;

#int_RTCC                           
RTCC_isr()
{

   Output_Toggle(PIN_B4);
   Set_timer0(232);
   ++NInts;
   if (Nints==625){
      Output_Toggle(PIN_B5);
      NInts=0;
   }

}


void main()
{
  
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   Set_timer0(232);
  
   enable_interrupts(INT_RTCC);              
   enable_interrupts(global);            

   set_tris_b(0xCF);

   while(1)
   {
   }

}
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: gera en 04 de Septiembre de 2008, 18:46:22
Asumo q el desfasaje se debe a q invertis mucho tiempo dentro de la interrupcion. Lo q podrias hacer es dentro de la interrupcion levantar un flag y recargar el valor del timer. Luego en tu while, verificas el flag constantemente, y cuando se levante, haces todo lo necesario.
Saludos!
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: MLO__ en 04 de Septiembre de 2008, 21:26:12
Hola.

Yo no lo pensaba asi. Digo generar los 31.25kHz con el timer0 y solo asignar la bandera ( int1 flagg) a true, y ya en el main procesarla (para los 50Hz) , es lo que siempre hago con las interrupciones  :-/  :-/

Saludos
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: chelomiche en 10 de Septiembre de 2008, 13:46:46
Lo q podrias hacer es dentro de la interrupcion levantar un flag y recargar el valor del timer. Luego en tu while, verificas el flag constantemente, y cuando se levante, haces todo lo necesario.
Saludos!

Bueno eso he hecho y los resultados son poeres a hacer las operaciones dentro de la interrupción del tmr0. Me sale en la pata 9 22,32Khz y en la pata 10 197.6Hz

Este es el programa:

#include <16f84a.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=20000000)
#use fast_io(b)

int NInts=0;
char bandera=0;

#int_RTCC
RTCC_isr()
{
   bandera=1;
   Set_timer0(216); //Interrumpir cada 16us
}


void main()
{

   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   Set_timer0(216);

   enable_interrupts(INT_RTCC);
   enable_interrupts(global);

   set_tris_b(0xCF);

   while(1)
   {
      if(bandera==1){
         bandera=0;
         Output_Toggle(PIN_B4);
         ++NInts;
      }
      if(NInts==625){
         Output_Toggle(PIN_B5);
         NInts=0;
      }

   }

}


Estoy empezando a pensar que si no se hace en assembler no voy a tener un control exacto de los tiempos. El problema es que de assembler se poco y nada, por eso es que esperaba que alguien me salvara.

Saludo a todos.
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: MLO__ en 10 de Septiembre de 2008, 14:38:20
Hola.

genera una freecuencia en el timer y la otra en el while a ver que sucede

Saludos
Título: Re: (Hsync y Vsync ) Quien me ayuda con esto
Publicado por: chelomiche en 15 de Septiembre de 2008, 13:01:42
Hola.

genera una freecuencia en el timer y la otra en el while a ver que sucede

Saludos

Probé de todas las maneras y llegué a la conclución que no se puede hacer en C (por lo menos yo no puedo). Asi que me metí en el Assembler, primero con interrupciones y luego sin ellas. Y me alegra decirles que lo he logrado.
Le agradezco a todas las personas que me dieron ideas y se molestaron en escribir.

Y para aquellos que necesiten del programita, se los paso. No lo posteo aqui porque está en assembler y este es el foro en C.

Saludo a todos y nos mantenemos en contacto.