TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
si puedes poner tu programa, te puedo hechar la mano, saludos
-
hola chelomiche!
q pic estas usando? yo te sugiero q uses alguno q tenga pwm.
saludos!
-
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
-
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)
{
}
}
-
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!
-
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
-
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.
-
Hola.
genera una freecuencia en el timer y la otra en el while a ver que sucede
Saludos
-
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.