Перейти к содержанию
    

Странно работает прерывание при совпадении таймера!

Всем привет!

Ситуация такая: МК должен прибавлять фиксированную задержку к импульсу, 8 - аппаратных и 8 - программных. Почему-то получаются 3 вида задержки 1 нормальная, 2 - нормальная минус дельта t, 3 - 0-я + та де дельта t, t меньше самой задержки. Ни как не могу понять почему!

 

Спасибо, если поможете!

ATtiny2313_7s_.zip

Изменено пользователем _Олег_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ниччо не понятно , ни в ваших словах, ни в ващем коде :)

Вы опишите, что у вас за устройство, что вы ожидаете увидеть и что вы реально видите.

Но чудес то не бывает, если у вас плавает задержка, то где то , наверное, происходит наложение прерываний, непример, у вас произошло внешнее прерывание, и вы вошли в обработчик прерывания и в момент выполнения предыдущего обработчика у вас должно произойти прерывание от вашего таймера, но обработчик прерывания таймера вызовется только после окончания обработчика внешнего прерывания + 1 команда из основного цикла. Это во-первых.

 

Затем, во-вторых, вместо

if (i == 16)

я бы написал

if (i >= 16)

.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можете посмотреть это, что бы понять принцип, но там не видно нестабильности задержки.

Да, нужен proteus

ATmega16_7s.zip

Изменено пользователем _Олег_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Протеуса нету, описывайте словами. Хорошо заданный вопрос содержит в себе половину ответа, может и сами разберетесь когда по полочкам все разложите.

Попробуйте вложенные прерывания разрешить, может поможет хотя бы понять место, в котором проблема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Протеуса нету, описывайте словами. Хорошо заданный вопрос содержит в себе половину ответа, может и сами разберетесь когда по полочкам все разложите.

Попробуйте вложенные прерывания разрешить, может поможет хотя бы понять место, в котором проблема.

 

да, я сейчас посмотрел входной сигнал 3,3 В может из-за этого неправильно срабатывает прерывание на INT0 Mode: Any change, а входной импульс 1Гц, скважность 0,5. Попробую найти с амплитудой 5 В.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, проблема не в этом. Меня еще смущает то что иногда, TIM0_COMPA сразу же срабатывает, как буд-то счетчик таймера не обнулился.Период импульса всего 1 с, скважность 0,5

Изменено пользователем _Олег_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы и просмотры. Решение найдено, пока полет нормальный :)

Все таки поделитесь с народом, в чем была проблема и как разрешилась. Получется, что топик затеяли и все?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все таки поделитесь с народом, в чем была проблема и как разрешилась. Получется, что топик затеяли и все?

 

 

Да все оказалось просто - нужно было останавливать таймер после прерывания совпадения, т.е.

// 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

Изменено пользователем _Олег_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз всем привет!

 

Хочу спросить у экспертов: вот отладил программу, но ни как не могу избавиться от неточности таймера, она конечно маленькая но плавающая +- 140 нс получилась.

Работает так: приходит фронт импульса, запускается таймер и отсчитывает 4 мкс, потом выставляется этот же фронт на выходе. Так вот , таймер плавает +- 140 нс. Посмотрите пожалуйста код, возможно от этого избавиться?

 

Спасибо.

 

вот

v0.1.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу спросить у экспертов: никак не могу избавиться от неточности таймера, она конечно маленькая но плавающая +- 140 нс получилась

Это как раз 0, 1 или 2 такта вашего проца. Прерывание ждёт завершения очередной команды, отсюда получается такая неравномерность, так называемый джиттер прерывания. Избежать до конца не удастся, но можно сгладить, например, непосредственно перед прерыванием ползёте по цепочке нопов (однотактных команд в общем случае), задержка будет одинаковая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это как раз 0, 1 или 2 такта вашего проца. Прерывание ждёт завершения очередной команды, отсюда получается такая неравномерность. Избежать можно, не так сложно, как нудно, если знать, какая команда выполнялась до входа в прерывание. Залезаете в стек, смотрите адрес возврата, определяете тип команды, корректируете данные для таймера соответствующе.

 

А как вычислить коррекцию, если запрос на прерывание таймера, пришол во время обработки другого прерывания?

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как вычислить коррекцию, если запрос на прерывание таймера, пришол во время обработки другого прерывания?

Я текст предыдущего поста поправил, извините, подумал, что не всегда такое возможно. Можно использовать ICR, затем смотреть на захваченное время, тогда джиттер уменьшится до полтакта в среднем, т.е. 34 нс. Не так плохо, думаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это как раз 0, 1 или 2 такта вашего проца. Прерывание ждёт завершения очередной команды, отсюда получается такая неравномерность, так называемый джиттер прерывания. Избежать до конца не удастся, но можно сгладить, например, непосредственно перед прерыванием ползёте по цепочке нопов (однотактных команд в общем случае), задержка будет одинаковая.

 

Спасибо, буду пробовать, значит все команды в основном цикле нужно сделать однотактными.

 

Вот попробовал только однотактные команды, все равно джиттер 2 такта.

v0.1b.zip

Изменено пользователем _Олег_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...