Прошу помощи сообщества в решении такой проблемы.
Имеем Attiny13 задачей которой стоит формирование ШИМ сигнала, скважность задаём состояние входов PB4 PB3 PB2.
Загвоздка в том, что не могу заставить тиньку сменить скважность, несмотря на то, что на прерывание по состоянию входов реагирует, значения в OCR0A заносит. Маленькое замечание в железе не делал, только в Proteus.
Код:
#define F_CPU 9600000
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
volatile bool SetMode_flag = false;
volatile char Select_Mode = 0;
//-------------------------------------------------
void PWM_init()
{
//Порты PB0 и PB1 устанавливаем на выход, остальные на вход
DDRB = 0b00000011;
//Входные порты PINB0 и PINB1 в HIGH, остальные в Pull-UP
PORTB = 0b00111111;
//Разрешаем прерывания PCINT1 - по изменению вывода
GIMSK |= (1<<PCIE);
//Накладываем маску на выводы
PCMSK |= (1<<PINB4) |(1<<PINB3) |(1<<PINB2);
//Запрещаем все прерывания пo совпадению и переполнению
TIMSK0 = 0x00;
//Устанавливаем режим работы таймера в режиме ШИМ с фазовой коррекцией
TCCR0A |= (1<<COM0A1) |(1<<COM0B1) |(0<<WGM01) |(1<<WGM00);
TCCR0B |= (1<WGM02);
//Предделитель частоты уставливаем clk\1024 или приблизительно 18Гц
// Fclk_I/O
//Fpcpwm = -------- (N предделитель 1, 8, 64, 256, 1024)
// N *510
TCCR0B |= (1<<CS02) |(0<<CS01) |(1<<CS00);
//Обнуляем счётный регистр
TCNT0 = 0x00;
}
//-------------------------------------------------
ISR (PCINT0_vect)
{
SetMode_flag = true; // Устанавливаем флаг события
Select_Mode = (PINB >> 2); //Сохраняем значение со сдвигом младших разрядов
}
//-------------------------------------------------
int main(void)
{
PWM_init();
sei();
while (1)
{
if (SetMode_flag)
{
switch ( Select_Mode )
{ case 0:
OCR0A = 0; break; // ШИМ выключен
case 1:
OCR0A = 40; break; //Скважность 15%
case 2:
OCR0A = 80; break; //Скважность 30%
case 3:
OCR0A = 120; break; //Скважность 45%
case 4:
OCR0A = 150; break; //Скважность 60%
case 5:
OCR0A = 180; break; //Скважность 75%
case 6:
OCR0A = 210; break; //Скважность 90%
case 7:
OCR0A = 255; break; //Включен постоянно
default:
break;
}
SetMode_flag = false; //Сбрасывем флаг
}
}
}
main.cpp
PWM neew.pdsprj