Ich versuche, die Helligkeit einer LED mit PWM mit Timer0 auf dem ATMega164PA zu erhöhen. Nach dem Ausführen meines Codes unterhalb bleibt die LED nur ausgesendet und ändert ihre Helligkeit nicht.PWM mit ATMega164PA
Bitte nehmen Sie sich einen Blick auf meinem Code und ich sagen, ob es etwas, was ich falsch tue ist:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int dutycycle = 0; // Variable for dutycycle
/********************************************** MAIN ****************************************************/
int main(void)
{
DDRB |= (1 << PB3); // Make pins output and OC0A pin for PWM
TCCR0A |= (1 << COM0A1) | (1<<WGM01) | (1<<WGM00); // Clear OC0A on comare match and set OC0A at BOTTOM
TIMSK0 |= (1<<TOIE0); // Overflow Interrupt Enabled
TCNT0 = 0; // Set Counter Value Register for comparison with OCR0A
OCR0A = (dutycycle/100) * 255; // Set duty cycle ON period
sei(); // Enable global interrupts
TCCR0B |= (1 << CS00); // Prescale of 1 - start timer
while (1)
{
_delay_ms(500);
dutycycle += 10; // increase duty cycle by 10% every 500ms
if (dutycycle > 100) // if duty cycle is greater than 100% set to 0
{
dutycycle = 0;
}
}
}
ISR(TIMER0_OVF_vect)
{
OCR0A = (dutycycle/100) * 255; // Set duty cycle ON period
}
Ich versuche, das Tastverhältnis um 10% zu erhöhen, bis es 100% erreicht. Wenn dies passiert, möchte ich den Duty Cycle-Wert zurück auf 0 setzen und wiederholen. Ich erhalte nur eine Ausgabe, wenn ich den ganzzahligen Wert an der Spitze meines Codes ändere, es scheint, dass die Berechnung innerhalb der Hauptausgabe ignoriert wird und OCR0A gerade der Ganzzahl des Arbeitszyklus zugewiesen wird. Ich machte die Änderung, die Sie vorgeschlagen, aber immer noch kein Glück :( – LoneCoder