Широтно-импульсная модуляция (ШИМ) в AVR Studio

Я пытаюсь использовать ШИМ для светодиода на ATmega8, на любом контакте порта B. Установка таймеров меня раздражает, и я не знаю, что делать с моим OCR1A. Вот мой код, и я хотел бы получить отзывы.

Я просто пытаюсь понять, как использовать ШИМ. Я знаю концепцию, и OCR1A должен быть частью всего времени счетчика, на которое мне нужен импульс.

#define F_CPU 1000000  // 1 MHz

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

int main(void){

    TCCR1A |= (1 << CS10) | (1 << CS12) | (1 << CS11);
    OCR1A = 0x0000;
    TCCR1A |= ( 0 << WGM11 ) | ( 1 << WGM10 ) | (WGM12 << 1) | (WGM13 << 0);
    TCCR1A |= ( 1 << COM1A0 ) | ( 0 << COM1A1 );
    TIMSK |= (1 << TOIE1); // Enable timer interrupt
    DDRB = 0xFF;
    sei(); // Enable global interrupts
    PORTB = 0b00000000;

    while(1)
    {
        OCR1A = 0x00FF; //I'm trying to get the timer to alternate being on for 100% of the time,
        _delay_ms(200);
        OCR1A = 0x0066; // Then 50%
        _delay_ms(200);
        OCR1A = 0x0000; // Then 0%
        _delay_ms(200);
    }
}

ISR (TIMER1_COMA_vect)  // timer0 overflow interrupt
{
    PORTB =~ PORTB;
}
9
задан michaeljiz 27 February 2017 в 18:54
поделиться