TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cossworth en 02 de Noviembre de 2008, 20:24:51
-
Hola, antes que nada disculpen si éste tema ya se habló, estuve revisando todo el foro y no encontre lo que busco.
Hace unos dias que empecé con los PIC's, por ahora solo simulando en proteus (estoy armando un trainer). Hice los ejemplos que figuran en esta seccion como las luces del auto fantastico, displays de 7 segmentos, etc.
Ahora quisiera hacer algo un poco mas avanzado, la idea que tengo es una lampara rgb manejando cada led con un pwm independiente para poder lograr mezclas de colores (si no se entiende pongo un video).
Hasta ahora todos los ejemplos de PWM en CSS que encontré en el foro, usan el PWM por hardware, y el micro que yo utilizo (16f628) solo tiene una salida de éste tipo. Por eso ando buscando algun ejemplo o una pista de como hacerlo por soft, solo necesito que haga eso el programa, no pretendo que me escriban el codigo ni nada de eso, solo algo para aprender :)
Muchas gracias!
-
Tienes que tener un contador (de PWM) que comienza en cero y termina en el número de pasos de PWM que quieras obtener (por ejemplo para 8 bits serían 255 pasos). Con cada incremento tienes que compararlo con tus valores actuales de tus "salidas pwm" y de ahí encenderlas o apagarlas según corresponda.
-
Hola!
Seguro estos post te son de mucha ayuda:
Programa para controlar X servos con 1 interrupción (PIC18 y PIC16) (http://www.todopic.com.ar/foros/index.php?topic=20918.0)
Algoritmo para controlar hasta 8 servos con una sola interrupción (en C) (http://www.todopic.com.ar/foros/index.php?topic=20335.0)
Son para generar PWM para servos, pero seguro sacas ideas de como conseguir adaptarlo para leds rgb.
Busca tambien algo sobre el "giroplay", puede que alli hablen sobre como controlar leds rgb.
Salu2
-
Justo yo estos dias estuve jugando con un led rgb. Me robe un ejemplo de nocturno y lo modifique un poquito para q funcione con un 16f84 a 4MHz. Espero q te sirva.
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#byte port_a=0x05
#byte port_b=0x06
#bit LedRojo = port_b.0
#bit LedVerde = port_b.1
#bit LedAzul = port_b.2
#bit reloj = port_b.3
#define Retardo 2
#define precarga 220
int8 Rojo,Verde,Azul, Ticks;
#int_Timer0
void ActivaLed()
{
Ticks++;
if (Ticks==0)
{
LedAzul=1;
LedRojo=1;
LedVerde=1;
reloj = !reloj;
};
if (Ticks==Rojo)
LedRojo=0;
if (Ticks==Verde)
LedVerde=0;
if (Ticks==Azul)
LedAzul=0;
set_timer0(precarga);
}
void Demo()
{
Rojo=255;
Verde=0;
Azul=0;
for (Verde=0;Verde<255;Verde++)
delay_ms(Retardo);
for (Rojo=255;Rojo>0;Rojo--)
delay_ms(Retardo);
for (Azul=0;Azul<255;Azul++)
delay_ms(Retardo);
for (Verde=255;Verde>0;Verde--)
delay_ms(Retardo);
for (Rojo=0;Rojo<255;Rojo++)
delay_ms(Retardo);
for (Azul=255;Azul>0;Azul--)
delay_ms(Retardo);
Rojo=0;
}
void main()
{
set_tris_b(0x00);
set_tris_a(0xFF);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);
set_timer0(precarga);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(TRUE)
{
Demo();
}
}
-
Este (http://www.micropic.es/index.php?option=com_content&task=view&id=59&Itemid=42) es el proyecto de nocturno que modifico gera, en el site de manolo podes registrarte y ver el codigo para usarlo como guia. Saludos.
-
Muchas gracias a todos por las respuestas, cuando llegue de la uni a la tarde me pongo a leer, ni bien tenga un codigo mas o menos coherente lo subo para que me comenten su opinion :)
-
Estuve leyendo el ejemplo de Nocturno, entendi casi todo :D
Un par de preguntas, en esta seccion de codigo:
#int_Timer0
void ActivaLed() {
Ticks++;
if (Ticks==0) {
LedAzul=1;
LedRojo=1;
LedVerde=1;
};
if (Ticks==Rojo)
LedRojo=0;
if (Ticks==Verde)
LedVerde=0;
if (Ticks==Azul)
LedAzul=0;
set_timer0(140);
}
1º) Cada vez que desborda el timer se ejecuta la funcion que hay debajo de la interrupcion sin importar que haya sido llamada por el main, no? (Nunca usé timers)
2º) Al ser "Ticks" una variable de 8 bits, cuando vale 256 y le sumo 1, vuelve a 0? Sino no encuentro en que parte se resetea :?
3º) El valor de 140 del timer, como se calcula? Lei varias paginas, seguí los pasos que indican ACA (http://todopic.mforos.com/46840/3568095-timer-0-como-se-utiliza/) pero me da una frecuencia cercana a los 17khz. Es decir, deseo saber a que se debe la eleccion del valor 140, o si puede ser cualquier valor siempre y cuando sea superior a los 33hz para engañar al ojo humano.
Gracias por la paciencia, si les parece adecuado muevan el tema a "Primeros pasos-Iniciación a los Microcontroladores" yo lo coloqé aca porque solo uso C.
Muchas gracias nuevamente.
-
1º) Cada vez que desborda el timer se ejecuta la funcion que hay debajo de la interrupcion sin importar que haya sido llamada por el main, no? (Nunca usé timers)
2º) Al ser "Ticks" una variable de 8 bits, cuando vale 256 y le sumo 1, vuelve a 0? Sino no encuentro en que parte se resetea :?
3º) El valor de 140 del timer, como se calcula? Lei varias paginas, seguí los pasos que indican ACA (http://todopic.mforos.com/46840/3568095-timer-0-como-se-utiliza/) pero me da una frecuencia cercana a los 17khz. Es decir, deseo saber a que se debe la eleccion del valor 140, o si puede ser cualquier valor siempre y cuando sea superior a los 33hz para engañar al ojo humano.
1-Esa directiva q esta arriba de la funcion, significa q esa funcion es la q se va a ejecutar cuando ocurra la interrupcion del rtcc
2-Exacto, cuando llega a 255, y le sumas 1, vuelve a 0. Aunq es saludable resetear la variable por ahi, cosa de q sea visible al ojo del programador.
3-Tenes q tener en cuenta la frecuencia del oscilador, y el tamaño del timer (el timer1 es de 16 bits, los demas de 8). Yo modifique todos esos valores para q funcione con un clock de 4MHz.
Saludos!
-
1º) Cada vez que desborda el timer se ejecuta la funcion que hay debajo de la interrupcion sin importar que haya sido llamada por el main, no? (Nunca usé timers)
2º) Al ser "Ticks" una variable de 8 bits, cuando vale 256 y le sumo 1, vuelve a 0? Sino no encuentro en que parte se resetea :?
3º) El valor de 140 del timer, como se calcula? Lei varias paginas, seguí los pasos que indican ACA (http://todopic.mforos.com/46840/3568095-timer-0-como-se-utiliza/) pero me da una frecuencia cercana a los 17khz. Es decir, deseo saber a que se debe la eleccion del valor 140, o si puede ser cualquier valor siempre y cuando sea superior a los 33hz para engañar al ojo humano.
1-Esa directiva q esta arriba de la funcion, significa q esa funcion es la q se va a ejecutar cuando ocurra la interrupcion del rtcc
2-Exacto, cuando llega a 255, y le sumas 1, vuelve a 0. Aunq es saludable resetear la variable por ahi, cosa de q sea visible al ojo del programador.
3-Tenes q tener en cuenta la frecuencia del oscilador, y el tamaño del timer (el timer1 es de 16 bits, los demas de 8). Yo modifique todos esos valores para q funcione con un clock de 4MHz.
Saludos!
Buenisimo, me quiero matar, se me habia pasado totalmente por alto tu post, ahora que lo veo es mucho mas "entendible" que el del link.
Veo si hoy puedo hacer el codigo, ya que estoy voy a intentar con la comunicacion serie a ver si lo puedo hacer andar :)
-
El valor 140 no es crítico. Con él conseguirás aumentar o disminuir la frecuencia de parpadeo de los leds y hay un amplio rango de frecuencias en el que será lo suficientemente rápido como para que el ojo no note parpadeos, y el led responda bien al PWM.
Lo mejor es probar con varios valores y quedarte con el que más te guste.
-
El valor 140 no es crítico. Con él conseguirás aumentar o disminuir la frecuencia de parpadeo de los leds y hay un amplio rango de frecuencias en el que será lo suficientemente rápido como para que el ojo no note parpadeos, y el led responda bien al PWM.
Lo mejor es probar con varios valores y quedarte con el que más te guste.
Muchas gracias, una duda menos :)
Ya tengo un codigo que funciona, casi igual a los que postearon :D pero ahora lo entiendo.
Proximo paso intentar la conexion serial y ensamblarlo en el trainer :-/
-
Sigo con dudas aqui: http://www.todopic.com.ar/foros/index.php?topic=23777.0