Autor Tema: Parpadeo de tiras leds RGB durante la transición de colores (3PWM 12f629 Timer0)  (Leído 338 veces)

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

Desconectado Kiry

  • PIC10
  • *
  • Mensajes: 1
Hola y buenas, soy nuevo en este mundo de la programación de micro-controladores.
Un día vagando por el internet, me topé con un video de un controlador de tiras led RGB
, descargué el programa(.HEX) y no me funcionaba al 100% en el Proteus. Así que tomando como excusa eso, decidí crear mi propio programa que es el siguiente.
Código: [Seleccionar]
/*
 * File:   RGBC.c
 * Author: Yo
 *
 * Created on 9 de noviembre de 2018, 11:00
 */


// PIC12F629 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#define _XTAL_FREQ 4000000

#define MaxI 255
#define MinI 0
#define ValTimer0 255

unsigned char Duty;
unsigned char T;
unsigned char cont;
unsigned char fase; // 1 (R -> G)| 2 (G -> B)| 3 (B -> R)

void __interrupt () timer0(){
   T0IF = 0; // Borra la bandera de Interrupcion del TMR0
   cont--;
   switch (fase){
       case 1: if(T == Duty){ GPIO2 = 0; GPIO1 = 1; goto final; }GPIO2 = 1; GPIO1 = 0; break;
       case 2: if(T == Duty){ GPIO1 = 0; GPIO0 = 1; goto final; }GPIO1 = 1; GPIO0 = 0; break;
       case 3: if(T == Duty){ GPIO0 = 0; GPIO2 = 1; goto final; }GPIO0 = 1; GPIO2 = 0; break;
   }
   T++;
   final:
        if(cont == 0) {
            cont = MaxI;
            if(Duty == 0){
                Duty = MaxI;
                switch(fase){
                    case 1: fase = 2; break;
                    case 2: fase = 3; break;
                    case 3: fase = 1; break;
                }
                goto final2;
            }
            Duty--;
        final2:
            T = 0;
        }   
   TMR0 = ValTimer0;
}

void main(void) {
    GPIO = 0x00; // todos en 0 lógico
    TRISIO = 0x00; // todos salidas
    CMCON = 0x07;// analógico
    fase = 1;
    Duty = cont = MaxI;
    T = 0;
    TMR0 = 0;
    INTCON = 0b00100000;
    OPTION_REG = 0b10000000; // prescaler 1:2
    GIE = 1; // activar las interrupciones globales
    PEIE = 1;
    TMR0 = ValTimer0;
    while(1){}
    return;
}

Utilizo el MPLABX v5.00 con XC8 v2.00 como compilador.

He tratado de optimizar lo más que pude mi código y aún así me llega a un periodo de onda de 15ms ~ 66,6 Hz (tengo entendido que mientras más lineas de código, más delay tendrá la onda), que luego al pasarlo al PIC12f629 hace que parpadeen durante las transiciones (R -> G, G -> B, B -> R) lo cual no entiendo ya que con 60Hz no debería notarse.

Algo que me he dado cuenta es que el código que está en el video tiene menos instrucciones hexadecimales que mi programa, no sé si esto se podría hacer en lenguaje ensamblador (ASM).

Me gustaría que me pudieran ayudar con:

1. Explicación de porqué parpadearían los leds
2. Cómo hacer para que el cambio de Duty Cycle sea más lento pero que la frecuencia sea la suficiente como para que no se note el parpadeo (Ya que esto depende de los valores que le dé al MaxI, en mi caso 255 a 0)

Uso el siguiente circuitos adjuntados:

* Sin título.png
(13.96 kB, 401x490 - visto 92 veces)


* Sin título2.png
(40.29 kB, 764x469 - visto 87 veces)


Este es el HEX del video:
* controlRGB_fuses(1).HEX
(0.75 kB - descargado 31 veces)
« Última modificación: 10 de Noviembre de 2018, 21:12:42 por Kiry »


 

anything