Код: Выделить всё
#include "avr/io.h"
#include<avr/interrupt.h>
#include<avr/boot.h>
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h>
ISR(TIMER1_COMPA_vect) // вектор прерывания (хрен знает зачем, может поможет)
{
//reti();
sei();
}
int main(void)
{
sei(); // устанавливаем флаг глоб. прерывания
DDRA = 0; // Порт A на ввод
DDRB = 0; // Порт B на ввод
PORTA = 0xFF; // Включить внутренние резисторы порта А
PORTB = 0xFF; // Включить внутренние резисторы порта В
ACSR = 0x80; // Отключить компаратор
ADCSRA = 0x80; // Отключить АЦП
DDRC = 0xFF; // Порт С на вывод
PORTC = 1; // выдать на порт С лог. "1"
DDRD = 0xFF; // Порт D на вывод для генерации ШИМ на ногах OC1В и ОС1А (PD4 и PD5)
PORTD = 0; // выдать на порт D лог. "0"
// Нога OC1B должна работать в неинверсном режиме, а нога OC1А в инверсном
// Для этого записываем в в соотв. разряды регистра TCCR1A соотв. уровни
TCCR1A |= _BV(COM1A1);
TCCR1A |= _BV(COM1A0);
// Нога OC1B должна работать в неинверсном режиме, а нога OC1А в инверсном
// Для этого записываем в в соотв. разряды регистра TCCR1A соотв. уровни
TCCR1A |= _BV(COM1B1);
TCCR1A &= ~_BV(COM1B0);
// Значение TOP должно храниться в регистре OCR1A, для этого разряды WGM13:10
// должны быть равны 1
TCCR1A |= _BV(WGM11);
TCCR1A |= _BV(WGM10);
// Значение TOP должно храниться в регистре OCR1A, для этого разряды WGM13:10
// должны быть равны 1
TCCR1B |= _BV(WGM13);
TCCR1B |= _BV(WGM12);
// Записываем значение TOP в OCR1A = 500, а в ICR1 = 500/2 = 250 (скважность ШИМ = 2)
OCR1A = 500;//000;
ICR1 = 250;//000;
//OCR1B = 50;//000;
TIMSK |= _BV(OCIE1A); // Устанавливаем маску прерывания (хрен знает зачем, может поможет)
TCNT1 = 0; // Обнуляем счётный регистр (хрен знает зачем, может поможет)
// Запускаем счётчик выбрав источник тактового сигнала (напрямую от внутреннего генератора
// без использования предделителя )
TCCR1B |= 1;
while(1)
{
PORTC = ~PORTC;
}
}


