Je suis novice en programmation AVR C, je teste un PWM simple utilisant un minuteur 16 bits sur des compteurs/temporisateurs Atmega328p qui est censé agir comme un gradateur sur une DEL.Minuterie DEL dimmateur 16 bits
Mon code:
#define F_CPU 16000000UL
void initTimer();
int x = 1;
int n = 1000;
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
x++;
if(x > 65) {
x = 1;
}
}
}
void initTimer() {
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
// used for TOP, makes for 50 Hz PWM
ICR1 = 40000;
OCR1A = n * x;
}
ISR(TIMER1_OVF_vect)
{
OCR1A = n * x;
}
Le problème est qu'il ne présente pas l'effet de variation, la luminosité de la LED reste constante à toute valeur que je mis à la broche de sortie OCR1A (PB1) d'abord, son suppose pour changer la valeur que l'interruption se produire mais c'est juste ne pas faire cela, c'est supposé être simple test qu'est-ce que je fais mal?
Mise à jour:
Comme conseil que j'activer les interruptions à l'aide du registre de TIMSK1 et SEI(), mais toujours la même question la luminosité LED reste constante à quelle que soit la valeur d'origine de OCR1A qui a été spécifié dans la initTimer().
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
x++;
if(x > 65) {
x = 1;
}
}
}
void initTimer() {
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TIMSK1 |= (1 << ICIE1);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
sei();
}
ISR (TIMER1_COMPA_vect)
{
OCR1A = n * x;
}
Bien que j'ai essayé une autre approche et qui me donne la gradation effet:
int main(void)
{
initTimer();
DDRB |= (1 << PB1)| (1 << PB2);
while(1)
{
_delay_ms(20);
OCR1A = n * 4;
_delay_ms(20);
OCR1A = n * 8;
_delay_ms(20);
OCR1A = n * 15;
_delay_ms(20);
OCR1A = n * 25;
_delay_ms(20);
OCR1A = n * 1;
}
}
void initTimer() {
ICR1 = 40000;
OCR1A = n * x;
TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
}
Il semble que le problème est avec les interruptions depuis PWM affectent les œuvres, mais son juste ne fonctionne pas avec le gestionnaire d'interruption .