Диммер 220 вольт от РоботДин

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rankle пишет:

Ну а чё, у нас в России всё череж жопу. 

Кто Вам сказал? Суворов вот "через Альпы" ходил.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дим-мычъ пишет:

b707 пишет:

Функцию delay() нельзя использовать в прерываниях, а вот delayMicroseconds() - можно. 

Ещё бы знать почему?

Откройте текст этих функций и посмотрите. Если вопросы останутся, тогда спросите.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

ЕвгенийП пишет:

Откройте текст этих функций и посмотрите. Если вопросы останутся, тогда спросите.

К сожалению, пока не смог найти текст функции delay(), но нашёл полезную для себя ветку на форуме

http://arduino.ru/forum/programmirovanie/vzaimodeistvie-preryvanii-s-delay-i-mezhdu-soboi

 Пока понял лишь  , что delay() работает используя micros() (минимум 4 микросекунды??) по прерываниям от счётчика Timer0,

Так же и delayMicroseconds() использует Timer0.

и в это время запрещаются все другие прерывания. Не ясно пока становятся ли они в очередь, или пропадают.

Был бы благодарен, если-бы Вы подсказали, где можно посмотреть текст этих функций.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дим-мычъ пишет:

К сожалению, пока не смог найти текст функции delay()

Она лежит на Вашем компьютере, неужели поиском по файлам не умеете пользоваться?

Дим-мычъ пишет:

delayMicroseconds() использует Timer0.

Это неправда, Вас обманули. Хотя, глянул по Вашей ссылке, там такого не написано. Скорее всего Вы это сами придумали. Так вот, это не так.

Дим-мычъ пишет:

и в это время запрещаются все другие прерывания. 

Это тоже неправда. Ничего там не запрещается.

Дим-мычъ пишет:

где можно посмотреть текст этих функций.

На Вашем собственно компьютере в файле

<где у Вас там стоит Arduino IDE>\hardware\arduino\avr\cores\arduino\wiring.c

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

 

 

Спасибо! Искал в библиотеках, поэтому и не нашёл.Так и есть (может опять не правильно всё понял))

1.delayMicroseconds() не использует

Timer0, а , насколько я смог понять, считает циклы сама , возвращая 1через каждые 4-ре цикла. Поэтому минимальная задержка зависит от частоты процессора.

Поэтому эту функцию и можно использовать в прерываниях.

2.delay() использует micros(), который работает по прерываниям от счётчика Timer0.

Поэтому и нельзя прерывание использовать в прерываниях.

3.Прерывания в delay() запрещаются только во время переполнения регистров счётчика, но после сброса все флаги сохраняются, так что другое прерывание может "потеряться" если только сработает точно во время overflow Timer0 (это уже мои догадки...)