Цитата:
Сообщение от Admin
PHP код:
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile uint8_t tic, Dimmer1, Dimmer2, Dimmer3;
uint8_t data;
void setup()
{
D4_Out; D5_Out; D6_Out; //Настраиваем порты на выход
D4_Low; D5_Low; D6_Low; //установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
UART_Init(115200); //инициализация порта
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer1 < tic ) D4_High; //управляем выходом
if(Dimmer2 < tic ) D5_High; //управляем выходом
if(Dimmer3 < tic ) D6_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
D4_Low; D5_Low; D6_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
//*************************************************************************
void loop()
{Start
if (UART_ReadByte(data)) Dimmer1=data;
Dimmer2=195; //200=мин. 0=макс
Dimmer3=0; //200=мин. 0=макс
End}
|
Доброго времени суток!
Признаюсь честно, не так давно заинтересовался программированием МК, причем с целью именно прикладного применения. Язык С++ изучаю уже 3й день и видимо по этому у меня есть вопросы по данному коду

Не сочтите за неуважение!
Как я понял, изначально мы назначаем нулевому прерыванию на входе 2 запускать функцию detect_up() при появлении низкого уровня (переход через ноль).
Эта функция обнуляет счетчик tic и запускает таймер1 "тикать" с периодичностью 40мкс, заодно переопределяя функцию и условие нулевого прерывания.
В это время таймер "тикает", синусоида ползет вверх и когда количество тиков превышает "уровень" диммера, на выход подается единица, лампочка светит с этого момента синусоиды и до её спада до нуля.
При переходе через ноль, функция detect_down() останавливает тиканье таймера, обнуляет его и ставит ноль на выходы, "гася лампочку" на какую-то часть периода, до нового запуска цикла.
Верно ли я мыслю?
Отсюда первый вопрос, почему всего 201 уровень (0...200), если в полупериод 50Гц укладывается 250 отрезков по 40мкс?
И ещё объясните пожалуйста значение выражения volatile uint8_t tic?
Это что-то связанное с работой регистров?
8 это разрядность таймера?
Спасибо за терпение! Простите за тупость )