ШИМ с ATtiny24
#21
В том-то и простота ситуации, что частота может быть любой высокой. Т.о., если Вы говорите, что это взможно, то это просто означает, что я пока не сделал это правиьно. Нодумал, выходит, я правильно.
СПАСИБО Вам за помощь! Будем копать ))))))
#22
Да, все работает:
   
#23
Используя таймер 0 не получится плавно регулировать частоту. У 7-го режима (Fast PWM с топом OCR0A) OCR0A используется для задания частоты, а OCR0В - скважности.
У таймера 1 есть еще один регистр - ICR1, им задается частота, а OCR1A и OCR1В задают скважность (режим 14).
Зачем так сложно присваивать значения регистрам?
TCCR0A = 1<<COM0A1|0<<COM0A0|1<<COM0B1|0<<COM0B0|1<<WGM01|1<<WGM00;
Сразу весь регистр в одной строке. Все видно, ничего не напутаешь. И, опять же, не нужно проверять в дизассемблере чего там компилятор наоптимизировал. А если он по каждой твоей команде достанет значение из регистра, модифицирует, запишет обратно? Возможно так и будет, если оптимизацию 0 установить.
#24
Синтаксис - это как "уметь ходить" в шахматах. Без этого никуда, но этого мало. Я тоже в шахматах "ходун" еще тот. 1 .
По сути. Смотрим дизассемблер. Мой вариант:

TCCR1A = 1<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10;
0000001A  LDI R24,0xA2 Load immediate
0000001B  OUT 0x2F,R24 Out to I/O location

Все, две команды. Теперь твой вариант:

TCCR0A |= (1<<COM0A1);
0000001A  IN R24,0x30 In from I/O location
0000001B  ORI R24,0x80 Logical OR with immediate
0000001C  OUT 0x30,R24 Out to I/O location
TCCR0A &= ~(1<<COM0A0);
0000001D  IN R24,0x30 In from I/O location
0000001E  ANDI R24,0xBF Logical AND with immediate
0000001F  OUT 0x30,R24 Out to I/O location
TCCR0A |= (1<<COM0B1);
00000020  IN R24,0x30 In from I/O location
00000021  ORI R24,0x20 Logical OR with immediate
00000022  OUT 0x30,R24 Out to I/O location
TCCR0A &= ~(1<<COM0B0);
00000023  IN R24,0x30 In from I/O location
00000024  ANDI R24,0xEF Logical AND with immediate
00000025  OUT 0x30,R24 Out to I/O location
TCCR0A |= (1<<WGM01)|(1<<WGM00);
00000026  IN R24,0x30 In from I/O location
00000027  ORI R24,0x03 Logical OR with immediate
00000028  OUT 0x30,R24 Out to I/O location

Оптимизация по умолчанию, О1.
#25
СПАСИБО за науку. Вот не подумал бы никогда, что.... все там так запущено.
Буду иметь в виду!
#26
Получилось! Все работает!!!
TIM0 опрашивает АЦП примерно каждые 20мс для слежения за положением движков потенциометров на входе АЦП
TIM1 настроен на вывод ШИМ на выходы OC1A и OC1B со скважностью, пропорциональной числу АЦП
Код:
void TIM0_Init(void)
{
    TCCR0A = (1<<WGM01)|(1<<WGM00);
    TCCR0B = (1<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);
    TIMSK0 = 1<<TOIE0;
    OCR0A = 180; // интервал около 20мс
}

void TIM1_Init(void)
{
    TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(0<<WGM10);
    TCCR1B = (1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
    ICR1 = 255;    // частота 30кГц
}

ISR(TIM0_OVF_vect)
{
    ADC_convert(0);    In1        = ADC_8;
    ADC_convert(1);    In2        = ADC_8;
    ADC_convert(2);    Opora    = ADC_8;
    Pereschet();
    BitDrop(TIFR0,TOV0);
}
Простите, не буду расписывать за что какая переменная отвечает, из контекста понятно..
#27
(07-02-2022, 13:46)Globus_vrn : Получилось
Вот и прекрасно. Удачи.