dOb 10 13 февраля Опубликовано 13 февраля · Жалоба Внимательно читайте документацию. Биты флагов помечены как rc_w0 К сожалению китайцы не описали, что это значит, но в документации STM сказано "read/clear (rc_w0) Software can read as well as clear this bit by writing 0. Writing ‘1’ has no effect on the bit value." Я поступаю так: if(TIMER_INTF(TIMER1) & TIMER_INTF_CH0IF ) { TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 13 февраля Опубликовано 13 февраля · Жалоба 29 minutes ago, dOb said: Внимательно читайте документацию. Биты флагов помечены как rc_w0 К сожалению китайцы не описали, что это значит, но в документации STM сказано "read/clear (rc_w0) Software can read as well as clear this bit by writing 0. Writing ‘1’ has no effect on the bit value." Я поступаю так: if(TIMER_INTF(TIMER1) & TIMER_INTF_CH0IF ) { TIMER_INTF(TIMER1) = ~TIMER_INTF_CH0IF; ОК. Не спорю. Код переписал. Проблема не ушла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 февраля Опубликовано 13 февраля · Жалоба 1 час назад, LAS9891 сказал: Что я тут должен понять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 13 февраля Опубликовано 13 февраля · Жалоба 7 minutes ago, Сергей Борщ said: Только никому не говорите из какой pdf вы это взяли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 февраля Опубликовано 13 февраля · Жалоба 2 часа назад, LAS9891 сказал: Только никому не говорите из какой pdf вы это взяли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 13 февраля Опубликовано 13 февраля · Жалоба 6 minutes ago, Сергей Борщ said: Страница 848. Но это не решило проблему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 13 февраля Опубликовано 13 февраля (изменено) · Жалоба Так пропуск прерываний выглядит на осциллографе. Жёлтый - источник сигнала. Голубой - пин микроконтроллера -> вход канала 3 в Timer1. Розовый - пин микроконтроллера. Пин настроен на выход и меняет своё значение на противоположное в обработчике прерывания каждый раз при обработке этого прерывания. Большинство таких пакетов совпадает бит в бит, но бывают и такие как на картинке. Из пакетов с пропусками, чаще пропущено 1 и 2 фронта/среза. На картинке самый неудачный случай из полученных. Изменено 13 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 13 февраля Опубликовано 13 февраля · Жалоба On 2/13/2024 at 4:48 PM, LAS9891 said: Розовый - пин микроконтроллера. Пин настроен на выход и меняет своё значение на противоположное в обработчике прерывания каждый раз при обработке этого прерывания. Измерьте с помощью этого пина время обработки прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 13 февраля Опубликовано 13 февраля · Жалоба 4 часа назад, LAS9891 сказал: Но это не решило проблему. Вы учли то, о чём я писал в: ? Если нет, то спады/фронты будут теряться обязательно. Вроде как это очевидно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 14 февраля Опубликовано 14 февраля (изменено) · Жалоба 12 hours ago, jcxz said: Вы учли то Я учёл, но что с этим делать не знаю. Как это сделать правильно? Подозреваю предложите ловить фронты каналом 0, а срезы ловить каналом 1. Такое решение сократит функционал платы вдвое. Есть ещё идея в обработчике прерывания проверять значение захвата и если оно меньше минимального (ширина минимально допустимого импульса известна), то не учитывать его, и полярность не менять. Уточнение: ранее проект жил на STM32F072. Там для таймера в режиме захвата можно выбрать режим: noninverted/both edges. Circuit is sensitive to both TIxFP1 rising and falling edges. И там проблемы смены полярности не было. Изменено 14 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 14 февраля Опубликовано 14 февраля · Жалоба On 2/13/2024 at 7:25 PM, jcxz said: Если нет, то спады/фронты будут теряться обязательно. Вроде как это очевидно. Но не шесть фронтов подряд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 14 февраля Опубликовано 14 февраля · Жалоба 1 hour ago, LAS9891 said: Есть ещё идея в обработчике прерывания проверять значение захвата и если оно меньше минимального (ширина минимально допустимого импульса известна), то не учитывать его, и полярность не менять. Идея дохлая. Попробовал поймать поймать длительность импульса меньше минимальной в отладке. Не поймал, пропуски фронтов присутствуют. Попробовал менять полярность в самом начале обработчика прерывания (раньше было в самом конце) - без изменений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 14 февраля Опубликовано 14 февраля (изменено) · Жалоба 16 hours ago, dimka76 said: Измерьте с помощью этого пина время обработки прерывания. Жёлтый - источник сигнала. Голубой - пин микроконтроллера -> вход канала 3 в Timer1. Розовый - пин микроконтроллера. Пин настроен на выход и меняет своё значение в начале обработчика прерывания и в конце. Вот картинки крупнее: Длительность импульса и, я полагаю, время обработки прерывания составляет 1,6857 us. Изменено 14 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 60 14 февраля Опубликовано 14 февраля · Жалоба On 2/14/2024 at 9:53 AM, LAS9891 said: Розовый - пин микроконтроллера. Пин настроен на выход и меняет своё значение в начале обработчика прерывания и в конце. Вот видите, у вас прерывание срабатывает на каждый фронт входной последовательности. Периферия отрабатывает четко. А почему у вас тогда на предыдущей осцилограмме пропуски были видны ? Вот тут Quote Розовый - пин микроконтроллера. Пин настроен на выход и меняет своё значение на противоположное в обработчике прерывания каждый раз при обработке этого прерывания. Значит ошибка у вас чисто программная, алгоритмическая. И фронты у вас какие уж больно пологие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 14 февраля Опубликовано 14 февраля (изменено) · Жалоба 10 minutes ago, dimka76 said: Вот видите, у вас прерывание срабатывает на каждый фронт входной последовательности. Просто картинка сделана когда пропусков прерываний не было. Пропуски возникают не при каждой передаче. Вы просили измерить длительность обработки прерывания, а не поймать осциллограмму с длительностью обработки во время пропуска фронта/среза. Изменено 14 февраля пользователем LAS9891 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться