Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Калибровка Tiny13 и софтовый COM-порт на ней
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
sbw
Стоит задача реализовать софтово COM-порт (только передачу) на Тини13.
Столкнулся с тем, что не смотря на автозагрузку заводского калибровочного байта, некоторые процессоры выдают такую частоту в ком-порт, какую компьютер не принимает. То есть с одного прошитого процессора данные в терминалке на экран выводятся, а с другого - нет, или не все, или с мусором.
По даташиту точность заводской калибровки - порядка 10%, видимо этого недостаточно.
В аппнотах описана процедура калибровки с подачей внешней частоты 32кгц, но не понимаю, как это применить к авреалу.
Посоветуйте что-нибудь.
defunct
Цитата(sbw @ Dec 18 2007, 17:53) *
Посоветуйте что-нибудь.

Подайте на любой вход опорную частоту. Пусть это будет 1 Khz.
заведите таймер на отсчет одной секунды c коеф. деления - 9.6M.
Если ипульсов за внутреннюю "секунду" насчитается больше тысячи - то частота ниже 9.6Mhz делаем OSCCAL += 1, и повторяем опыт.. Если импульсов насчитается меньше 1000, то частота соответвенно выше чем 9.6Mhz - делаем OSCCAL -= 1. Когда застрянете между двумя значениями OSCCAL'a - выбирайте то которое дает меньшее отклонение по числу импульсов.

e.g:
OSCCAL 129 - 996
OSCCAL 128 - 1016

выбираем 129, т.к. отклонение составляет (1000 - 996) * 100% / 1000 = 0.4%
oran-be
Я как то пробовал подстроить генератор Меги8 под сеть 50 Гц - так флуттуации частоты генератора в интервале 20 мСек были настолько велики, что эта система автоподстройки сходила с ума. Пришлось таки вставить кварц.
=GM=
Цитата(sbw @ Dec 18 2007, 14:53) *
Стоит задача реализовать софтово COM-порт (только передачу) на Тини13. Столкнулся с тем, что не смотря на автозагрузку заводского калибровочного байта, некоторые процессоры выдают такую частоту в ком-порт, какую компьютер не принимает. То есть с одного прошитого процессора данные в терминалке на экран выводятся, а с другого - нет, или не все, или с мусором.
По даташиту точность заводской калибровки - порядка 10%, видимо этого недостаточно.
В аппнотах описана процедура калибровки с подачей внешней частоты 32кгц, но не понимаю, как это применить к авреалу

Для 10-битных пакетов точность разности частот приёмника и передатчика должна быть не хуже ±(0,5/9,5)=0,053 т.е. порядка ±5%.

Если у вас есть точные 32 КГц, то можно применить алгоритм измерения частоты, только оценивать не входную частоту 32 кГц, а тактовую частоту процессора, думаю 10-50 мс должно хватить на оценку. Ну а зная тактовую, можно настроить длительность одного бита.

Как вариант, можно ещё посылать с ПК байт 0х55 время от времени и по длительности нуля и единицы также оценивать тактовую частоту проца.
sbw
Цитата(=GM= @ Dec 19 2007, 14:03) *
Как вариант, можно ещё посылать с ПК байт 0х55 время от времени и по длительности нуля и единицы также оценивать тактовую частоту проца.


Нет, точных внешних частот без серьезной переделки программатора нет. А вот по поводу идеи подавать посылку с ком-порта компьютера (допустим, это возможно): достаточно ли будет подачи одного байта '$55' ? Или может лучше '00', и оценивать длительность "нулей"? Какую имеет смысл установить скорость передачи этого байта, поменьше? Например, 1200 или меньше? Я так понимаю, что чем длинее посылка - тем выше точность. И, как я понимаю, нельзя рассчитывать на длительность передачи нескольких байт, компьютер может быть неожиданно занят чем-то другим и увеличить паузу между передаваемыми байтами, да?

Пока что я склоняюсь к мысли поставить на плату программатора еще один процессор с кварцем, который бы начинал генерить 100-гц импульсы по ноге MISO через 1с после ресета программируемого проца и до момента проседания в ноль ноги SCK (то есть, если после ресета начинается прошивка программируемого процессора, чтобы этот генератор отрубился и не мешал, и перестал генерить после того, как программируемый процессор решил, что он откалибровался и ему хватит, можно работать). Как вам идея?
=GM=
Цитата(sbw @ Dec 19 2007, 14:18) *
А вот по поводу идеи подавать посылку с ком-порта компьютера (допустим, это возможно): достаточно ли будет подачи одного байта '$55' ? Или может лучше '00', и оценивать длительность "нулей"? Какую имеет смысл установить скорость передачи этого байта, поменьше? Например, 1200 или меньше? Я так понимаю, что чем длинее посылка - тем выше точность. И, как я понимаю, нельзя рассчитывать на длительность передачи нескольких байт, компьютер может быть неожиданно занят чем-то другим и увеличить паузу между передаваемыми байтами, да?

Думаю, что достаточно подать один байт в начале программирования, он будет еще как бы признаком старта. Вы же понимаете, что частоты гуляют очень и очень медленно, в основном от температуры или от старения. Измерили вы частоту и за 20-30 минут никуда она серьёзно не убежит. Имеет смысл подавать байт 0х55, потому что программа может измерить длительности четырёх 1 и четырёх 0, и сравнить их между собой, гарантия того, что это не помеха или не простое перетыкание разъёмов. Скорость передачи можно поставить 9600, можно 1200, не имеет значения, 1мс или 10мс, время ничтожное, лишь бы вы успели измерить длительность с приемлемой точностью.
Цитата(sbw @ Dec 19 2007, 14:18) *
Пока что я склоняюсь к мысли поставить на плату программатора еще один процессор с кварцем, который бы начинал генерить 100-гц импульсы по ноге MISO через 1с после ресета программируемого проца и до момента проседания в ноль ноги SCK (то есть, если после ресета начинается прошивка программируемого процессора, чтобы этот генератор отрубился и не мешал, и перестал генерить после того, как программируемый процессор решил, что он откалибровался и ему хватит, можно работать). Как вам идея?

Не знаю ваших задумок, но здесь вы вроде ребёночка выплеснули вместе с водой. У вас же вроде не было точных частот, и вы кварц не хотели ставить, а теперь ставите, да ещё с МК. Оно вам надо?

Вот, кстати ещё, подумал, что таким способом можно обмениваться двум бескварцевым МК, на каждом обмене корректирующим скорость приёмника под чужой передатчик.
AlexG_changed
Цитата(=GM= @ Dec 19 2007, 21:10) *
Вот, кстати ещё, подумал, что таким способом можно обмениваться двум бескварцевым МК, на каждом обмене корректирующим скорость приёмника под чужой передатчик.


что-то такое было у Atmel: AVR140: ATmega48/88/168 family run-time calibration of the Internal RC oscillator

PS: пробовал делать подстройку частоты RC-генератора под частоту часового кварца, но что-то было сделано неверно и программа имела склонность разгонять процессор smile.gif когда ей казалось что нехватает быстродействия.
digital
вариант:

пусть МК выдает несколько посылок на разные частотах (желательно контрольную сумму добавить)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.