uranium 0 17 ноября, 2008 Опубликовано 17 ноября, 2008 (изменено) · Жалоба Всем привет! Ситуация такая: МК должен прибавлять фиксированную задержку к импульсу, 8 - аппаратных и 8 - программных. Почему-то получаются 3 вида задержки 1 нормальная, 2 - нормальная минус дельта t, 3 - 0-я + та де дельта t, t меньше самой задержки. Ни как не могу понять почему! Спасибо, если поможете! ATtiny2313_7s_.zip Изменено 17 ноября, 2008 пользователем _Олег_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 17 ноября, 2008 Опубликовано 17 ноября, 2008 · Жалоба Ниччо не понятно , ни в ваших словах, ни в ващем коде :) Вы опишите, что у вас за устройство, что вы ожидаете увидеть и что вы реально видите. Но чудес то не бывает, если у вас плавает задержка, то где то , наверное, происходит наложение прерываний, непример, у вас произошло внешнее прерывание, и вы вошли в обработчик прерывания и в момент выполнения предыдущего обработчика у вас должно произойти прерывание от вашего таймера, но обработчик прерывания таймера вызовется только после окончания обработчика внешнего прерывания + 1 команда из основного цикла. Это во-первых. Затем, во-вторых, вместо if (i == 16) я бы написал if (i >= 16) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 17 ноября, 2008 Опубликовано 17 ноября, 2008 (изменено) · Жалоба можете посмотреть это, что бы понять принцип, но там не видно нестабильности задержки. Да, нужен proteus ATmega16_7s.zip Изменено 17 ноября, 2008 пользователем _Олег_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 17 ноября, 2008 Опубликовано 17 ноября, 2008 · Жалоба Протеуса нету, описывайте словами. Хорошо заданный вопрос содержит в себе половину ответа, может и сами разберетесь когда по полочкам все разложите. Попробуйте вложенные прерывания разрешить, может поможет хотя бы понять место, в котором проблема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 17 ноября, 2008 Опубликовано 17 ноября, 2008 · Жалоба Протеуса нету, описывайте словами. Хорошо заданный вопрос содержит в себе половину ответа, может и сами разберетесь когда по полочкам все разложите. Попробуйте вложенные прерывания разрешить, может поможет хотя бы понять место, в котором проблема. да, я сейчас посмотрел входной сигнал 3,3 В может из-за этого неправильно срабатывает прерывание на INT0 Mode: Any change, а входной импульс 1Гц, скважность 0,5. Попробую найти с амплитудой 5 В. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 17 ноября, 2008 Опубликовано 17 ноября, 2008 (изменено) · Жалоба Нет, проблема не в этом. Меня еще смущает то что иногда, TIM0_COMPA сразу же срабатывает, как буд-то счетчик таймера не обнулился.Период импульса всего 1 с, скважность 0,5 Изменено 17 ноября, 2008 пользователем _Олег_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 18 ноября, 2008 Опубликовано 18 ноября, 2008 · Жалоба Спасибо за ответы и просмотры. Решение найдено, пока полет нормальный :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 18 ноября, 2008 Опубликовано 18 ноября, 2008 · Жалоба Спасибо за ответы и просмотры. Решение найдено, пока полет нормальный :) Все таки поделитесь с народом, в чем была проблема и как разрешилась. Получется, что топик затеяли и все? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 18 ноября, 2008 Опубликовано 18 ноября, 2008 (изменено) · Жалоба Все таки поделитесь с народом, в чем была проблема и как разрешилась. Получется, что топик затеяли и все? Да все оказалось просто - нужно было останавливать таймер после прерывания совпадения, т.е. // Timer 0 output compare A interrupt service routine***************************** interrupt [TIM0_COMPA] void __timer0_compa_isr(void) { M_PPS = PPS; //устанавлиаем программный pps TCCR0B = 0; //останавливаем таймер0 } //*********************************************************************** Да, еще хочу оптимизировать, включить режим Mode: CTC top=OCR0A что бы счетчик TCNT0 сам обнулялся, тогда, наверно то же надо будет таймер останавливать. ATtiny2313_7s.zip Изменено 18 ноября, 2008 пользователем _Олег_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 21 ноября, 2008 Опубликовано 21 ноября, 2008 · Жалоба Еще раз всем привет! Хочу спросить у экспертов: вот отладил программу, но ни как не могу избавиться от неточности таймера, она конечно маленькая но плавающая +- 140 нс получилась. Работает так: приходит фронт импульса, запускается таймер и отсчитывает 4 мкс, потом выставляется этот же фронт на выходе. Так вот , таймер плавает +- 140 нс. Посмотрите пожалуйста код, возможно от этого избавиться? Спасибо. вот v0.1.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 21 ноября, 2008 Опубликовано 21 ноября, 2008 · Жалоба Хочу спросить у экспертов: никак не могу избавиться от неточности таймера, она конечно маленькая но плавающая +- 140 нс получилась Это как раз 0, 1 или 2 такта вашего проца. Прерывание ждёт завершения очередной команды, отсюда получается такая неравномерность, так называемый джиттер прерывания. Избежать до конца не удастся, но можно сгладить, например, непосредственно перед прерыванием ползёте по цепочке нопов (однотактных команд в общем случае), задержка будет одинаковая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 21 ноября, 2008 Опубликовано 21 ноября, 2008 · Жалоба Это как раз 0, 1 или 2 такта вашего проца. Прерывание ждёт завершения очередной команды, отсюда получается такая неравномерность. Избежать можно, не так сложно, как нудно, если знать, какая команда выполнялась до входа в прерывание. Залезаете в стек, смотрите адрес возврата, определяете тип команды, корректируете данные для таймера соответствующе. А как вычислить коррекцию, если запрос на прерывание таймера, пришол во время обработки другого прерывания? Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 21 ноября, 2008 Опубликовано 21 ноября, 2008 · Жалоба А как вычислить коррекцию, если запрос на прерывание таймера, пришол во время обработки другого прерывания? Я текст предыдущего поста поправил, извините, подумал, что не всегда такое возможно. Можно использовать ICR, затем смотреть на захваченное время, тогда джиттер уменьшится до полтакта в среднем, т.е. 34 нс. Не так плохо, думаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uranium 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 (изменено) · Жалоба Это как раз 0, 1 или 2 такта вашего проца. Прерывание ждёт завершения очередной команды, отсюда получается такая неравномерность, так называемый джиттер прерывания. Избежать до конца не удастся, но можно сгладить, например, непосредственно перед прерыванием ползёте по цепочке нопов (однотактных команд в общем случае), задержка будет одинаковая. Спасибо, буду пробовать, значит все команды в основном цикле нужно сделать однотактными. Вот попробовал только однотактные команды, все равно джиттер 2 такта. v0.1b.zip Изменено 24 ноября, 2008 пользователем _Олег_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться