Как стать автором
Обновить

Комментарии 47

Прикольно надо попробывать
while (!(TIFR0 & (1 << OCF0A)));

А что там, прерываний нет? Так всю жизнь прождать можно.
А как нужно? Автор кода как Вы заметили по большому счёту не я, особенно той части что касается вывода.
Взвел таймер, поготовил значение. Как таймер стрельнул — вывел значение на ногу, выставил таймер, подготовил следующее значение
А в главном цикле там программа шарашит свое
Если я ещё умел бы это так запрограммировать как Вы сказали…
Программный UART в прерывании это то же самое что delay…
..., потому что… ???
Ээээ… а как на счёт тактовой частоты контроллера, неужели она стабильна? Ведь там используется жутко нестабильный RC-генератор частота которого зависит от напряжения питания и температуры, и довольно серьёзно. А для UART нужна тактовая частота с точностью не хуже +-2%. Неужели контроллер без калибровки поехал, или ваш USB-UART переходник автоматически подстраивается под скорость передачи?
Нет конечно, скорость UART 115200 выставлена. Стоит только нагреть микроконтроллер до градусов с 50-ти и всё… начинает приходить мусор…
Значит все-таки конвертор подстраивается под скорость. 50 градусов нагрева это будет уже под 20% отклонение в тактовой частоте.
Я делал на тиньке девайс, +-10% коррекция предусмотрена программная и её уже на обычных сквозняках не хватает.
Попробуйте снизить до 9600, у меня была подобная проблема на меге8 без кварца, когда от теплового дрифта частоты переставал работать уарт, спаслось уменьшением скорости передачи данных. Вам же не потоковое аудио слать, а мелкие строки, скорее всего — пару байт в секунду, так что 9600 за глаза.
Я бы с удовольствием снизил скорость до 9600, но как? Когда речь заходит про регистры микроконтроллера то я тут особо ничего не понимаю…
У вас есть шанс и время разобраться =)
Насколько я понимаю, здесь:

  TCCR0A = 1 << WGM01; // compare mode
  TCCR0B = 1 << CS00; // prescaler 1
  OCR0A = 75; //115200 baudrate at prescaler 1

говорится следующее:
Таймер настроен на совпадение со значением в регистре OCR0A, на частоте 9.6 МГц.
Тогда если выбрать предделитель на 8:
TCCR0B = 1 << CS01; // prescaler 8

Получим частоту 14400.
Теперь чтобы добиться меньшей частоты, необходимо увеличить задержку, через увеличение регистра сравнения:
OCR0A = 75, тогда 14400/75=192, 14400-9600=4800, 4800/192=25.
Получается такой код:
  TCCR0A = 1 << WGM01 ;// compare mode
  TCCR0B = 1 << CS01; // prescaler 8
  OCR0A = 100; //9600 baudrate at prescaler 8

Вы объяснили работу таймеров лучше чем первые 5 мануалов в гугле, в которых только сказано «что бы включить делай так».
Рад, что смог объяснить доходчиво, только гуглу не говорите, а то заберет меня в рабство — отвечать на запросы пользователей :)

А если серьезно, то это далеко не все возможности таймеров и их режимов. Я еще сам не все использовал в своих приложениях. Попробуйте разобраться с ШИМ, причем как аппаратным, так и программным — это не сложно, а таймеры Вам станут ближе! А прошивку лучше испытывать в программе Proteus, там есть счетчик частоты, логический анализатор, осциллограф и другие полезные штуки для тестов.
Так я и так сначала в симуляторе тренируюсь, а потом уже в железо переношу. Правда сейчас по работе перешел на ARM STM32. Мне они показались более гибкими чем avr'ки, хотя у них ресурсов поболее будет. Еще 9 тинек осталось и несколько посылок с китая в пути. Как время будет заряжу что ни будь на них.
STM32 замечательны когда нужны такие вычислительные мощности, для более простых задач это оверхед.
Увы, но не заработало.
Приходит мусор.
Осциллограф есть? Определить бы скорость в результате модификации…
Увы но нет.
тогда пробуйте подбирать близкие скорости с шагом в 0.5%
Не получится :(
Насколько я понял ТС юзает такую: байду, и судя по описанию, она на PL-2303

А вот ДШ на PL-2303, в котором сказано, что частота в ней программируемая. То есть сама она не подстраивается, а задается.
Сетка скоростей получается делением опорной частоты на какой-то делитель. Так что скорость подбирать получится еще как, особенно на малых скоростях шаг будет точнее чем ближе к максимальным.
9600 прекрасно берется входом аудиокарты… посчитать период с записанного с аналогового входа этот сигнал в программе вроде CoolEdit на 96К не представляется проблемой.
Проблема не уйдет, поскольку скорость даже на 9600 точно так же привязана к тактовой частоте, относительное изменение скорости будет точно таким же.
Вы не учли такой показатель как шаг градуирования, который этим действием увеличен в 10 раз, что дает увеличение точности, благодаря увеличенному диапазону дрейфа частоты.
Ваше: «Проблема не уйдет...», применимо в данной задаче в любых условиях (так как идеальных не существует в природе).
Но очевидно, что проявления указанных недостатков, благодаря снижению частоты, будут отложены так как 1% намного менее 10% (кстати как и 2% < 20%)
тактовая частота уходит одинаково. для формирования интервалов мы опираемся только на неё, и если она уплывёт на 10% то скорость 115200 будет так же отличаться на 10% и 9600 уйдут на те же 10%. Ну да, изначальную скорость можно будет выставить точнее, но речь идет о уходе частоты после калибровки.
Это справедливо (с натяжкой) при условии одинаковой задержки.
Повторюсь: при использовании внутреннего задающего генератора частоты, у Вас нет альтернатив. Вы не сможете его откалибровать через вычисление задержек, потому как в критических условиях, погрешности спонтанны. Они — шум на графике, и если вы откалибруете «константу» в момент времени T0, то для T1 она будет отличаться. А усреднение показателей при длинных итерациях, даже если и будет достижимо разрядностью, то даст поправку только для временного интервала Т'. И пока вы будете гонять циклы итераций для усреднения, наступит время интервала T'', в котором Ваши, усредненные показатели уже не действительны.
Что за моменты времени T0 и T1? И причем тут время?
У нас есть только два параметра — тактовая частота и скорость передачи. Они жестко связаны. В этом вопросе не касаемся проблемы джиттера — она не устранима при таком способе формирования.
Уходит тактовая частота — и в след за ней уходит скорость передачи. Как только она уходит дальше чем может обеспечить приемник устойчивый прием — начинается мусор.
Я чего-то не до-понимаю, Вы пришли с решением проблемы, или — за ним?
Или мы друг друга сознательно убеждаем в нерешимости проблемы?! :)
определиться надо какую проблему решаем?
В лоб пробелма неразрешима, нужна какая-то опорная частота, в МК с RC-генератором ей взяться неоткуда — от напряжения питания и температуры эта частота плавает. Причем как правило не мгновенно, если периодически калибровать по какому-то внешнему источнику то можно удержаться в пределах. У меня калибровка основана именно на внешнем источнике образцовой частоты(через измерение длительности специально сформированного стартового импульса перед передачей пакета данных).

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

Проблемы кстати нет если использовать контроллер ATTINY85 или ATTINY45 у которого RC-генератор встроенный с термокомпенсацией — один раз откалибровал и без проблем.
Тинька 20Мгц не потянет, к тому же один вывод будет использован, а их бывает хватает только впритык.
К тому же, если вы бы заглянули бы в даташит ATTINY13 не работает с кварцевым резонатором принципиально — у неё нет встроенного кварцевого генератора для работы с резонаторами, только режим работы от внешней тактовой частоты.
К тому же, если вы бы заглянули бы,

Вот и загляните, с генератором работает.
На первой странице:
Advanced RISC Architecture
– 120 Powerful Instructions – Most Single Clock Cycle Execution
– 32 x 8 General Purpose Working Registers
– Fully Static Operation
– Up to 20 MIPS Througput at 20 MHz

На 24-ой:
CKSEL[1:0] Device Clocking Option
00 External Clock (see page 24)
01,10 Calibrated Internal 4.8/9.6 MHz Oscillator (see page 25)
11 Internal 128 kHz Oscillator (see page 26)
Ага. Именно то что я и сказал. Три режима работы с внутренним RC-генератором, и режим входа внешнего источника частоты. Режима работы с кварцевым резонатором НЕТ.
External Clock — это и есть вход тактовой частоты, у него нет выхода генератора для кварцевого резонатора.
А где я говорил про кварцевый резонатор? А то я что-то утомлен.
По ссылкам, они ведут на кварцевые резонаторы а не генераторы.
Учите мат-часть, у генератора 4 контакта или больше, у резонатора два.
Боюсь разочаровать, но это лишь необходимое но не достаточное условие. Кварцы бывают и в 4-х контактном корпусе где используются только два из них, иногда туда же помещают и конденсаторы выводя их на третий вывод.
А, ну точно! Еще в корпус XMega помещают ATTiny, a в корпусе i7 можно на Pentium-II нарваться :)
Видимо по этой банальной причине ATTiny не запускается от внешнего генератора на 20 МГц!
Только не валите все на китайцев, они парни отличные, и умные.
Со многими из них знаком лично, с ними можно дела вести, для них это дело чести!
Типичный 4-х контактный кварц.
image
Тогда вынужден извиниться, не встречал. Видимо потому что стараюсь использовать подножное.
такие и такие, тоже не подходят?
И если подходят, проблема решена?
Подходят. Но… жаба давит, это уже не 7 копеек. И для использования с UART-ом лучше найти генератор на кратную частоту.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.