TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx2 en 26 de Diciembre de 2007, 18:03:14
-
Amigos: he hecho el circuito de manolo para controlar un led rgb , y ha ido espectacular
el tema es que cuando barre colores , en el ciclo for en el que la variable sube ( ejemplo : rojo++ ) no hay problema , ahora cuando hago el regresivo ( rojo -- ) en el descenso hace unos destellos como si en lugar de pasar de 255 a 1 de a uno por vez , en algun momento por ejemplo entre el 67 y el 66 se intercala un 255 que es el que pega el " relampagazo" de color.
Si alguien me puede ayudar ,desde ya gracias!!
-
Hola Fastyx, no entiendo qué es lo que te ocurre, no tiene lógica que pase por el valor 255.
Más bien me imagino que pudiera tener algo que ver con la atención de alguna interrupción que detenga la generación del PWM o algo parecido.
¿Has utilizado el mismo programa, tal y cual estaba?, ¿y los fuses?
-
desde ya gracias por contestar!
lo de 255 lo puse como una suposicion de lo que podria estar pasando ya que cuando la variable del color disminuye por el ciclo for en la que esta involucrada,
de repente hacia un destello de maximo brillo y seguia normal.
con respecto al pic usado , lo hice con un 16f648a , logicamente adaptando las direcciones de memoria de los puertos , los pines en los que puse los leds , y tambien varió los pines del rs232.
funcionó todo , la comunicación serial, el cambio de colores , inclusive le agregue un printf en el barrido para jugar un poco.
de paso te comento que lo solucioné haciendo esto :
en la interrupcion del timer0 en lugar Ticks == rojo , TIcks == verde y Ticks == azul , les coloque el signo de mayor , es decir cuando los ticks sean inmediatamente mayores a la variable , que se apaguen el led en cuestión.
esto lo hice en forma medio empirica , ya que hubo veces en donde tenia un conteo en el main , y en el momento de la comparacion entraba justo una interrupción , y por ahi la igualdad se perdia , pero no asi la comparacion de: mayor que .
#int_Timer0
void ActivaLed ( )
{
Ticks ++ ;
if ( ticks == 0 )
{
LedAzul = 1 ;
LedRojo = 1 ;
LedVerde = 1 ;
}
if ( Ticks > Rojo ) LedRojo = 0 ; // aca cambie la == por la >
if ( Ticks > Verde ) LedVerde = 0 ; // aca cambie la == por la >
if ( Ticks > Azul ) LedAzul = 0 ; // aca cambie la == por la >
set_timer0 ( 140 ) ;
}
otra cosa : es seguro dejar que los ticks pasen " solos" a cero por overflow de variable? ya que no encontre que lo hayas puesto ,salvo al principio en el main
Un abrazo
Fastyx
-
No veo lógica a que se haya resuelto con ese cambio, pero si lo has logrado, bienvenido sea :D
Sí, es seguro que se reinicien por overflow, ya que la variables pasan de 255 a 0 con las mismas garantías que pasan de 14 a 15 o de 33 a 34, por ejemplo.
-
Pues, me pasaba lo mismo (excepto que lo hacía aleatoriamente) y al igual que Fastyx lo he solucionado con su aporte... la verdad tiene sentido lo que comenta, es decir, si la interrupción no entra 'a tiempo' el color no se apaga y da un destello. Pero claro es extraño, ya que supuestamente el PWM es a 100Hz y no debería dar tiempo a que viéramos el 'destello'. En cualquier caso parece que la cosa va bien de esa forma...!!
saludos!