[atmega328p][BCM] Modulation de led RGB

Bonjour tous le monde, je cherche a faire un fondu de couleur pour mon horloge à tube nixie. N’ayant pas mis mes LED RGB sur des sorties PWM, j’ai eu l’idée de faire un petit BCM (merci skywood :stuck_out_tongue: )
Le fondu a l’aire de bien se faire mais … c’est que ça clignote se bazars :fearful: :sob:

Voila une petit vidéo (même si ce n’est pas très visible dessus :confused: )

Voici les codes :

#define F_CPU 16000000UL //Fréquence horloge à 16Mhz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "./fonction.h" //Inclusion des fonction
int position_bit_bcm = 1;
int main(void)
{
	setup_pins(); //Configuration des pins et du registre à décalage
	PORTB = 0x00;
	init_interupt();
	sei();
	while(1)//Boucle infinie
	{
	}
}
ISR(TIMER0_COMPA_vect)
{
	if(OCR0A == 0b10000000)
	{
		OCR0A = 0x01;
	}
	else
	{
		OCR0A = OCR0A<<1;
	}
	couleur();
	routine_affichage();
	
}

et

#define F_CPU 16000000UL									//Fréquence horloge à 16Mhz

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/* Chargement des librairie */
#include "./lib/hc74595.h"
#include "./lib/DS1307.h"
#include "lib/UART.h"

/* Config des pin */
#define LED_RED 1<<PINB3									
#define LED_GREEN 1<<PINB4									
#define LED_BLUE 1<<PINB5	


int bcm_red = 0;
int bcm_green = 0;
int bcm_blue = 0;
void init_interupt()
{
	TCCR0A = 0x00;
	TCCR0B = (TCCR0B&(~(_BV(CS00)|_BV(CS02))))|_BV(CS01); //Prescale 8
	TCNT0 = 0x00 ;
	OCR0A = 0x01;
	TIMSK0 = _BV(OCIE0A); //Enable interupt
}
void setup_pins()
{
	USART_ini();
	DDRD &= LOW(1<<PIND2);
	DDRC &= LOW(1<<PORTC5|1<<PORTC4);
	DDRB &= LOW(1<<BP_CONF|1<<BP_MOINS|1<<BP_PLUS);			//Config des entrée pour les bp
	DDRC |= 1<<SR_HEUR|1<<SR_MINUTE|1<<SR_SECONDE;			//Config des sortie Pour les pin enable
	PORTC &= LOW(1<<SR_HEUR|1<<SR_MINUTE|1<<SR_SECONDE);	//Active tous les registre a décalage
	DDRB |= LED_RED | LED_GREEN | LED_BLUE ;				//Config des sortie pour les LED
	PORTB &= LOW(LED_RED|LED_GREEN|LED_BLUE);				//Mise à 0 de toutes les LED
	if(rtc.r_seconde() == 0x80)
		rtc.w_seconde(0x00);
}
void couleur()
{
		if(OCR0A == 0b10000000)
		{
			if(bcm_red < 255 && !bcm_blue && !bcm_green)
				bcm_red++;
			else if(bcm_red == 255 && bcm_blue < 255 && !bcm_green)
				bcm_blue++;
			else if(bcm_red > 0 && bcm_blue == 255 && !bcm_green)
				bcm_red--;
			else if(!bcm_red && bcm_blue == 255 && bcm_green < 255)
				bcm_green++;
			else if(!bcm_red && bcm_blue > 0 && bcm_green == 255)
				bcm_blue--;
			else if (bcm_red < 255 && !bcm_blue && bcm_green == 255)
				bcm_red++;
			else if (bcm_red == 255 && !bcm_blue && bcm_green > 0)
				bcm_green--;							
		}
		if(bcm_red & OCR0A)
			PORTB |= LED_RED;
		else
			PORTB &= LOW(LED_RED);
		if(bcm_green & OCR0A)
			PORTB |= LED_GREEN;
		else
			PORTB &= LOW(LED_GREEN);
		if(bcm_blue & OCR0A)
			PORTB |= LED_BLUE;
		else
			PORTB &= LOW(LED_BLUE);
}

Voici les codes complet mais sans la modulation BCM : https://github.com/adri66/Horloge-tube-nixie/blob/master/Nixie%20clock/Nixie%20clock.cpp

Est-ce que quelle-qu’un pourrait éclairé ma lanterne car je ne vois pas le soucis et selon se que j’ai pus en déduire un cycle du fondu devrais se faire en une dizaine de secondes avec le prescalle qui est à 1024, j’ai redescendu le prescale à 8 pour voir si il y avait une amélioration mais aucun changement :frowning:

Merci d’avance :slight_smile: