и HL и LL тоже, потому что в момент одного прерывания по захвату другое такое же прерывание случится не может - и значит величина ICR1 за время копирования не изменится
однако для моей цели мне нужно чтобы считывание ШИМ сигнала производилось не на одном пине как в примере (пин D2) а на двух (D2 и D3). Возможно ли это сделать? Буду очень признателен за ответ.
однако для моей цели мне нужно чтобы считывание ШИМ сигнала производилось не на одном пине как в примере (пин D2) а на двух (D2 и D3). Возможно ли это сделать? Буду очень признателен за ответ.
да, вам сегодня повезло :) - как раз на пинах 2 и 3 это возможно и ни на каких других.
Просто напишите еще одну пару обработчиков , таких же как log0 и log1 - и повесьте их на прерывание EXT1
да, вам сегодня повезло :) - как раз на пинах 2 и 3 это возможно и ни на каких других.
Просто напишите еще одну пару обработчиков , таких же как log0 и log1 - и повесьте их на прерывание EXT1
Так оно точно работать не будет.
TCNT1 он же общий будет, для 4 функций
Нужно на другом таймере измерялку городить, для двух каналов и точность уже не та будет.
Так оно точно работать не будет. TCNT1 он же общий будет, для 4 функций Нужно на другом таймере измерялку городить, для двух каналов и точность уже не та будет.
не нужен второй таймер, достаточно TCNT1 не обнулять и считать разницу междц двумя прерываниями
не нужен второй таймер, достаточно TCNT1 не обнулять и считать разницу междц двумя прерываниями
Об этом я тоже думал, но так вообще сильно точность пострадает.
К тому же иногда будут совпадать по времени сигналы переключений. В общем спорный вариант.
решил поднять старую тему, чтобы на форуме было больше примеров кода
Понравился пример Кактуса, чуть поправил - теперь все работает
Проверка - если добавить в setup()
и соединить вывод 6 с INT0 - пином 2, получим в консоли
что точно отражает частоту и скважность в процентах
вдохновленный кодом выше, переделал его на использование прерывания Таймера1 в режиме захвата счетчика:
для проверки опять добавлем генерацию ШИМ на пине 6, как в предыдущем случае. Только теперь выход 6 нужно соединять с пином 8 - это вход ICP Таймера 1
Результат:
Как будто от того, что на форуме будет больше примеров кода, их кто-то начнет читать.
Не надо забывать про атомарность чтения двубайтовые volatile переменных.
не заглядывая в книжку - насколько помню, во втором коде этой проблемы нет, при захвате счетчик копируется безопасно.
Счётчик - да, а HL и LL?
и HL и LL тоже, потому что в момент одного прерывания по захвату другое такое же прерывание случится не может - и значит величина ICR1 за время копирования не изменится
Хорошо, иначе: в строке 31 гарантирована непрерывность копирования обеих двубайтовые переменных?
понял.... поправил.
Всем доброго дня! Я новичок в программировании arduino, по крайней мере таймеры для меня это темный лес. Мне очень помог ваш код,
однако для моей цели мне нужно чтобы считывание ШИМ сигнала производилось не на одном пине как в примере (пин D2) а на двух (D2 и D3). Возможно ли это сделать? Буду очень признателен за ответ.
однако для моей цели мне нужно чтобы считывание ШИМ сигнала производилось не на одном пине как в примере (пин D2) а на двух (D2 и D3). Возможно ли это сделать? Буду очень признателен за ответ.
да, вам сегодня повезло :) - как раз на пинах 2 и 3 это возможно и ни на каких других.
Просто напишите еще одну пару обработчиков , таких же как log0 и log1 - и повесьте их на прерывание EXT1
Насколько понял так? Теперь какую то чушь выдаёт на втором пине(( частота со знаком минус, а скважность 50 постоянно.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
да, вам сегодня повезло :) - как раз на пинах 2 и 3 это возможно и ни на каких других.
Просто напишите еще одну пару обработчиков , таких же как log0 и log1 - и повесьте их на прерывание EXT1
Так оно точно работать не будет.
TCNT1 он же общий будет, для 4 функций
Нужно на другом таймере измерялку городить, для двух каналов и точность уже не та будет.
Ладно, в любом случае спасибо за ответы. Буду писать видимо в рубрику "Ищу исполнителя".
Так оно точно работать не будет. TCNT1 он же общий будет, для 4 функций Нужно на другом таймере измерялку городить, для двух каналов и точность уже не та будет.
не нужен второй таймер, достаточно TCNT1 не обнулять и считать разницу междц двумя прерываниями
не нужен второй таймер, достаточно TCNT1 не обнулять и считать разницу междц двумя прерываниями
Об этом я тоже думал, но так вообще сильно точность пострадает.
К тому же иногда будут совпадать по времени сигналы переключений. В общем спорный вариант.
Мне супер точность не нужна. Может быть сможете подсказать что не так в коде который я выше написал? (Или проще сказать что там так?))
не нужен второй таймер, достаточно TCNT1 не обнулять и считать разницу междц двумя прерываниями
уж не знаю, с чего там должна страдать точность...
Вот такой код
если соединить выход PWM пин 6 cо входом EXT0 пин 2, а пин 11 соответвеннос пином 3 - то получаем в Мониторе
что очень даже неплохо соответвует частоте и заполнению сигнала ШИМ, заданных в setup()
Спасибо тебе добрый человек!