Risolto:Pin PWM

Ciao a tutti, sto sviluppando un progetto in cui devo variare 6 led, con 6 PWM indipendenti.
Utilizzo un nano, e so che i pin PWM su tale micro sono i pin 3-5-6-9-10-11.
Ho fatto uno programmino banale, che quando premo un pulsante parte a contare da 0 a 255 illuminando il led come un fade, e alla sua pressione successiva va da 255 a 0 spegnendolo.
Ho un dubbio, perchè sul pin 3 il fade non lo fa, passa da spento ad acceso e da acceso a spento, mentre il pin 5 funziona regolare....
C'è qualcosa che sbaglio nella mia teoria??
Utilizzo libreria Wire, EEPROM e MsTimer 2
Può essere che quest'ultima libreria affetti il funzionamento del pin 3??
Grazie.

Non so quante volte dovrò rimettere sempre la stessa tabella ... ::slight_smile:

ATmega328P

Timer0
Usato da millis() e delay() e per il PWM sui pin 5 e 6
fast hardware pwm
(default 976.5625 Hz)
Pin 5 è anche usato per il “pulse counting”
Pin 8 è usato per il “input capture”

Timer1
Usato dalla libreria Servo e per il PWM sui pin 9 e 10. Libreria e PWM mutuamente esclusivi.
8-bit phase correct pwm mode
(default 488.28125 Hz)

Timer2
Usato per il PWM sui pin 3 e 11
8-bit phase correct pwm mode
(default 488.28125 Hz)

... quindi ... che ne deduci?

Guglielmo

Che come l'ho pensato non funzionerà mai.........
toglierò la libreria MsTimer2....
ma anche i millis :frowning:
......
A questo punto devo percorrere un'altra strada....
Quindi quale consiglio per avere 6 PWM ed utilizzare i millis()????

millis() NON c'entra nulla, Timer0 è già a posto per millis(), delay() E per il PWM ... che, dato come è programmato il timer, NON interferisce.

Timer2 o lo usi come è programmato e quindi ti funziona anche il PWM o, se lo tocchi, chiaramente NON ti funziona più il PWM.

	// set fast PWM on Timer0
	sbi(TCCR0A, WGM01);
	sbi(TCCR0A, WGM00);
	// set Timer0 prescale factor to 64
	sbi(TCCR0B, CS01);
	sbi(TCCR0B, CS00);
	// enable Timer0 overflow interrupt
	sbi(TIMSK0, TOIE0);
	//
	// timers 1 and 2 are used for phase-correct hardware pwm
	TCCR1B = 0;
	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
	if (F_CPU >= 8000000L)
		sbi(TCCR1B, CS10);
	// put timer 1 in 8-bit phase correct pwm mode
	sbi(TCCR1A, WGM10);
	// set timer 2 prescale factor to 64
	sbi(TCCR2B, CS22);
	// configure timer 2 for phase correct pwm (8-bit)
	sbi(TCCR2A, WGM20);
	//

Guglielmo

Ok grazie Guglielmo....
Ora provo a modificare lo sketch utilizzando i millis...
Grazie

Ok, ho tolto la libreria ed utilizzato i millis e sembra girare tutto bene...
Grazie.