Comments 47
Прикольно надо попробывать
0
while (!(TIFR0 & (1 << OCF0A)));
А что там, прерываний нет? Так всю жизнь прождать можно.
+1
А как нужно? Автор кода как Вы заметили по большому счёту не я, особенно той части что касается вывода.
0
Взвел таймер, поготовил значение. Как таймер стрельнул — вывел значение на ногу, выставил таймер, подготовил следующее значение
А в главном цикле там программа шарашит свое
А в главном цикле там программа шарашит свое
+4
Ээээ… а как на счёт тактовой частоты контроллера, неужели она стабильна? Ведь там используется жутко нестабильный RC-генератор частота которого зависит от напряжения питания и температуры, и довольно серьёзно. А для UART нужна тактовая частота с точностью не хуже +-2%. Неужели контроллер без калибровки поехал, или ваш USB-UART переходник автоматически подстраивается под скорость передачи?
0
Нет конечно, скорость UART 115200 выставлена. Стоит только нагреть микроконтроллер до градусов с 50-ти и всё… начинает приходить мусор…
0
Значит все-таки конвертор подстраивается под скорость. 50 градусов нагрева это будет уже под 20% отклонение в тактовой частоте.
Я делал на тиньке девайс, +-10% коррекция предусмотрена программная и её уже на обычных сквозняках не хватает.
Я делал на тиньке девайс, +-10% коррекция предусмотрена программная и её уже на обычных сквозняках не хватает.
0
UFO just landed and posted this here
Я бы с удовольствием снизил скорость до 9600, но как? Когда речь заходит про регистры микроконтроллера то я тут особо ничего не понимаю…
0
UFO just landed and posted this here
Насколько я понимаю, здесь:
говорится следующее:
Таймер настроен на совпадение со значением в регистре OCR0A, на частоте 9.6 МГц.
Тогда если выбрать предделитель на 8:
Получим частоту 14400.
Теперь чтобы добиться меньшей частоты, необходимо увеличить задержку, через увеличение регистра сравнения:
OCR0A = 75, тогда 14400/75=192, 14400-9600=4800, 4800/192=25.
Получается такой код:
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
+2
Вы объяснили работу таймеров лучше чем первые 5 мануалов в гугле, в которых только сказано «что бы включить делай так».
+2
Рад, что смог объяснить доходчиво, только гуглу не говорите, а то заберет меня в рабство — отвечать на запросы пользователей :)
А если серьезно, то это далеко не все возможности таймеров и их режимов. Я еще сам не все использовал в своих приложениях. Попробуйте разобраться с ШИМ, причем как аппаратным, так и программным — это не сложно, а таймеры Вам станут ближе! А прошивку лучше испытывать в программе Proteus, там есть счетчик частоты, логический анализатор, осциллограф и другие полезные штуки для тестов.
А если серьезно, то это далеко не все возможности таймеров и их режимов. Я еще сам не все использовал в своих приложениях. Попробуйте разобраться с ШИМ, причем как аппаратным, так и программным — это не сложно, а таймеры Вам станут ближе! А прошивку лучше испытывать в программе Proteus, там есть счетчик частоты, логический анализатор, осциллограф и другие полезные штуки для тестов.
0
Так я и так сначала в симуляторе тренируюсь, а потом уже в железо переношу. Правда сейчас по работе перешел на ARM STM32. Мне они показались более гибкими чем avr'ки, хотя у них ресурсов поболее будет. Еще 9 тинек осталось и несколько посылок с китая в пути. Как время будет заряжу что ни будь на них.
0
Увы, но не заработало.
0
Приходит мусор.
0
Осциллограф есть? Определить бы скорость в результате модификации…
0
Увы но нет.
0
тогда пробуйте подбирать близкие скорости с шагом в 0.5%
0
9600 прекрасно берется входом аудиокарты… посчитать период с записанного с аналогового входа этот сигнал в программе вроде CoolEdit на 96К не представляется проблемой.
+1
Проблема не уйдет, поскольку скорость даже на 9600 точно так же привязана к тактовой частоте, относительное изменение скорости будет точно таким же.
0
Вы не учли такой показатель как шаг градуирования, который этим действием увеличен в 10 раз, что дает увеличение точности, благодаря увеличенному диапазону дрейфа частоты.
Ваше: «Проблема не уйдет...», применимо в данной задаче в любых условиях (так как идеальных не существует в природе).
Но очевидно, что проявления указанных недостатков, благодаря снижению частоты, будут отложены так как 1% намного менее 10% (кстати как и 2% < 20%)
Ваше: «Проблема не уйдет...», применимо в данной задаче в любых условиях (так как идеальных не существует в природе).
Но очевидно, что проявления указанных недостатков, благодаря снижению частоты, будут отложены так как 1% намного менее 10% (кстати как и 2% < 20%)
+1
тактовая частота уходит одинаково. для формирования интервалов мы опираемся только на неё, и если она уплывёт на 10% то скорость 115200 будет так же отличаться на 10% и 9600 уйдут на те же 10%. Ну да, изначальную скорость можно будет выставить точнее, но речь идет о уходе частоты после калибровки.
0
Это справедливо (с натяжкой) при условии одинаковой задержки.
Повторюсь: при использовании внутреннего задающего генератора частоты, у Вас нет альтернатив. Вы не сможете его откалибровать через вычисление задержек, потому как в критических условиях, погрешности спонтанны. Они — шум на графике, и если вы откалибруете «константу» в момент времени T0, то для T1 она будет отличаться. А усреднение показателей при длинных итерациях, даже если и будет достижимо разрядностью, то даст поправку только для временного интервала Т'. И пока вы будете гонять циклы итераций для усреднения, наступит время интервала T'', в котором Ваши, усредненные показатели уже не действительны.
Повторюсь: при использовании внутреннего задающего генератора частоты, у Вас нет альтернатив. Вы не сможете его откалибровать через вычисление задержек, потому как в критических условиях, погрешности спонтанны. Они — шум на графике, и если вы откалибруете «константу» в момент времени T0, то для T1 она будет отличаться. А усреднение показателей при длинных итерациях, даже если и будет достижимо разрядностью, то даст поправку только для временного интервала Т'. И пока вы будете гонять циклы итераций для усреднения, наступит время интервала T'', в котором Ваши, усредненные показатели уже не действительны.
0
Что за моменты времени T0 и T1? И причем тут время?
У нас есть только два параметра — тактовая частота и скорость передачи. Они жестко связаны. В этом вопросе не касаемся проблемы джиттера — она не устранима при таком способе формирования.
Уходит тактовая частота — и в след за ней уходит скорость передачи. Как только она уходит дальше чем может обеспечить приемник устойчивый прием — начинается мусор.
У нас есть только два параметра — тактовая частота и скорость передачи. Они жестко связаны. В этом вопросе не касаемся проблемы джиттера — она не устранима при таком способе формирования.
Уходит тактовая частота — и в след за ней уходит скорость передачи. Как только она уходит дальше чем может обеспечить приемник устойчивый прием — начинается мусор.
0
Я чего-то не до-понимаю, Вы пришли с решением проблемы, или — за ним?
Или мы друг друга сознательно убеждаем в нерешимости проблемы?! :)
Или мы друг друга сознательно убеждаем в нерешимости проблемы?! :)
0
определиться надо какую проблему решаем?
В лоб пробелма неразрешима, нужна какая-то опорная частота, в МК с RC-генератором ей взяться неоткуда — от напряжения питания и температуры эта частота плавает. Причем как правило не мгновенно, если периодически калибровать по какому-то внешнему источнику то можно удержаться в пределах. У меня калибровка основана именно на внешнем источнике образцовой частоты(через измерение длительности специально сформированного стартового импульса перед передачей пакета данных).
А к вашему посту, для понимания сказанного очень не хватает иллюстрации.
Проблемы кстати нет если использовать контроллер ATTINY85 или ATTINY45 у которого RC-генератор встроенный с термокомпенсацией — один раз откалибровал и без проблем.
В лоб пробелма неразрешима, нужна какая-то опорная частота, в МК с RC-генератором ей взяться неоткуда — от напряжения питания и температуры эта частота плавает. Причем как правило не мгновенно, если периодически калибровать по какому-то внешнему источнику то можно удержаться в пределах. У меня калибровка основана именно на внешнем источнике образцовой частоты(через измерение длительности специально сформированного стартового импульса перед передачей пакета данных).
А к вашему посту, для понимания сказанного очень не хватает иллюстрации.
Проблемы кстати нет если использовать контроллер ATTINY85 или ATTINY45 у которого RC-генератор встроенный с термокомпенсацией — один раз откалибровал и без проблем.
0
0
Тинька 20Мгц не потянет, к тому же один вывод будет использован, а их бывает хватает только впритык.
К тому же, если вы бы заглянули бы в даташит ATTINY13 не работает с кварцевым резонатором принципиально — у неё нет встроенного кварцевого генератора для работы с резонаторами, только режим работы от внешней тактовой частоты.
К тому же, если вы бы заглянули бы в даташит ATTINY13 не работает с кварцевым резонатором принципиально — у неё нет встроенного кварцевого генератора для работы с резонаторами, только режим работы от внешней тактовой частоты.
0
К тому же, если вы бы заглянули бы,
Вот и загляните, с генератором работает.
На первой странице:
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)
0
Ага. Именно то что я и сказал. Три режима работы с внутренним RC-генератором, и режим входа внешнего источника частоты. Режима работы с кварцевым резонатором НЕТ.
External Clock — это и есть вход тактовой частоты, у него нет выхода генератора для кварцевого резонатора.
External Clock — это и есть вход тактовой частоты, у него нет выхода генератора для кварцевого резонатора.
0
А где я говорил про кварцевый резонатор? А то я что-то утомлен.
0
По ссылкам, они ведут на кварцевые резонаторы а не генераторы.
0
Пример генератора но ценник не гуманный.
0
Учите мат-часть, у генератора 4 контакта или больше, у резонатора два.
0
Боюсь разочаровать, но это лишь необходимое но не достаточное условие. Кварцы бывают и в 4-х контактном корпусе где используются только два из них, иногда туда же помещают и конденсаторы выводя их на третий вывод.
0
А, ну точно! Еще в корпус XMega помещают ATTiny, a в корпусе i7 можно на Pentium-II нарваться :)
Видимо по этой банальной причине ATTiny не запускается от внешнего генератора на 20 МГц!
Видимо по этой банальной причине ATTiny не запускается от внешнего генератора на 20 МГц!
0
Только не валите все на китайцев, они парни отличные, и умные.
Со многими из них знаком лично, с ними можно дела вести, для них это дело чести!
Со многими из них знаком лично, с ними можно дела вести, для них это дело чести!
0
Типичный 4-х контактный кварц.


0
Only those users with full accounts are able to leave comments. Log in, please.
Ещё один программный UART на ATtiny13