|
USART baud rate |
|
|
|
Dec 27 2010, 09:43
|

Участник

Группа: Участник
Сообщений: 17
Регистрация: 27-09-10
Из: Харьков
Пользователь №: 59 762

|
Здравствуйте, нужна помощь вот в каком вопросе: пишу инициализацию усарта для Mega48PA Код .equ SYSCLK = 20000000;System Clock [Hz] .equ BaudSpeed0=1200 ;speed of UART .equ bauddivider = (SYSCLK/(16*BaudSpeed0))-1
;************************************************************************ ; USART0_Init ; lds R16,PRR andi R16,255-(1<<PRUSART0);USART0 wake up sts PRR,R16
ldi R16,0b00000000 ;RXCn, TXCn, UDREn, FEn, DORn, UPEn, U2Xn, MPCMn sts UCSR0A,R16
ldi R16,0b00011000 ;RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZn2,RXB8,TXB8 sts UCSR0B,R16
ldi R16,0b00000110 ;-, UMSELn, UPMn1, UPMn0, USBSn, UCSZn1, UCSZn0, UCPOLn sts UCSR0C,R16
ldi R16,High(bauddivider) sts UBRR0H,R16 ldi R16,Low(bauddivider) sts UBRR0L,R16 ;BaudRate Gen. при симуляции в протеусе получаю: Код (AVR USART 0)Baud rate = 54212 b/s частота 20МГц выставлена и для контроллера и для кварца. Решил написать инициализацию усарта для 128 меги на С под ИАРом. Скорость установилась как и ожидалось - 1200 Ткните где я не прав
|
|
|
|
|
 |
Ответов
|
Jan 10 2011, 20:04
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Метценгерштейн @ Jan 11 2011, 00:53)  Из-за чего проблема? Что 8,5% искажения? Надо подбирать кварц для 0% искажений? Чтобы было 0% искажений, то надо подбирать кварц с такой частотой, чтобы она НАЦЕЛО (т.е. без остатка) делилась на нужную вам частоту в бодах 115200. Если это условие будет соблюдено, то МК сможет выбрать целочисленный делитель (а дробного у него не может быть), чтобы из кварцованной частоты получить рабочую. А если нацело не разделится, то частное придется округлить до целого делителя, и тогда рабочая частота будет получаться не точно, а с искажением. Например, кварцевые частоты 3.6864 МГц и 7.3728 МГц отлично делятся без остатка не только на 115200, но и на все более низкие бодовые частоты: 3686400 / 115200 = 32 7372800 / 115200 = 64 А раз так, то частоту 115200 можно получить из частоты кварца после деления ее на 32 или 64. При этом результат 115200 получится точно. Но вот мы берем кварц на 4 МГц и обнаруживаем, что: 4000000 / 115200 = 34.72 тогда как делитель может быть только целочисленный. Придется тогда нам округлить 34.72 до ближайшего целого, т.е. до 35. Однако с таким делителем вместо нужной вам частоты 115200, получится частота: 4000000 / 35 = 114285 которая на те 8% меньше нормы. А если бы округлили в меньшую сторону - до 34, то тогда искажение стало бы еще больше, только в сторону увеличения: 4000000 / 34 = 117647 Т.е. куда не кинь, всюду клин. Я когда-то тоже не знала про эту кухню и сильно удивлялась, отчего кварцы делают на такие "кривые" частоты  . А как стала с USART работать, так сразу поняла причину. Впрочем, с ошибкой до 2% обычно всё устойчиво работает, хотя в даташите требуют не более пол процента. Ну а 8% - это, конечно, перебор.
|
|
|
|
|
Jan 11 2011, 10:09
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Xenia @ Jan 11 2011, 02:04)  Но вот мы берем кварц на 4 МГц и обнаруживаем, что: 4000000 / 115200 = 34.72 тогда как делитель может быть только целочисленный и, в данном случае, кратный степени 2 Цитата Придется тогда нам округлить 34.72 до 32 Цитата Однако с таким делителем вместо нужной вам частоты 115200, получится частота: 4000000 / 32 = 125000 Цитата которая на те 8% больше нормы. ну и т.д. ... 2 rezident: относительная ошибка останется одинаковой и на битовом, и на символьном интервале. 2 Метценгерштейн: как вариант, убрать кварц и калибровать внутренний генератор по COM-порту. Где-то в аппнотах был пример по auto-baud.
|
|
|
|
Сообщений в этой теме
HoboTech USART baud rate Dec 27 2010, 09:43 rezident Цитата(HoboTech @ Dec 27 2010, 17:43) Ткн... Dec 27 2010, 09:58 HoboTech Цитата(rezident @ Dec 27 2010, 15:58) В и... Dec 27 2010, 10:07  rezident Цитата(HoboTech @ Dec 27 2010, 18:07) а к... Dec 27 2010, 10:12 нечитатель Если, несмотря на внимательность, прочитание и дов... Dec 27 2010, 10:21 DpInRock В даташите черным по белому приведена таблица дели... Dec 27 2010, 10:21 HoboTech Цитата(DpInRock @ Dec 27 2010, 15:21) В д... Dec 27 2010, 11:31 V_G Не скажу за мегу48 (не работал), но у меги128 есть... Dec 27 2010, 11:12 Палыч Цитата(V_G @ Dec 27 2010, 17:12) Не скажу... Dec 27 2010, 12:45 777777 Цитата(V_G @ Dec 27 2010, 17:12) Не скажу... Dec 28 2010, 05:11 DpInRock В любом случае - использовать протеус в роли отлад... Dec 27 2010, 14:06 HoboTech Зашил в мегу8:
Код#include <ioavr.h>
#de... Dec 28 2010, 06:14 demiurg_spb Это некрасиво:
Цитата(HoboTech @ Dec 28 2010,... Dec 28 2010, 06:44  HoboTech Цитата(demiurg_spb @ Dec 28 2010, 11:44) ... Dec 28 2010, 07:00   demiurg_spb Цитата(HoboTech @ Dec 28 2010, 13:00) Я ж... Dec 28 2010, 07:10 MrYuran Цитата(HoboTech @ Dec 28 2010, 12:14) Как... Dec 28 2010, 07:08 rx3apf Цитата(Метценгерштейн @ Jan 11 2011, 00:5... Jan 10 2011, 18:57 Marchello При скорости 114285 ошибка будет 0,8%, при 117647... Jan 11 2011, 04:22 rezident Цитата(Marchello @ Jan 11 2011, 12:22) Пр... Jan 11 2011, 08:45  ViKo Цитата(rezident @ Jan 11 2011, 13:45) Это... Jan 11 2011, 12:42 Метценгерштейн Да, спасибо всем за подробные объяснения. Буду ква... Jan 11 2011, 09:32 DpInRock Вообще кварц не ставьте и будет вам щастья. Jan 11 2011, 09:41 Метценгерштейн Замена кварца на 3.6864 помогла. Похоже, 8% погреш... Jan 11 2011, 12:15 rezident Цитата(xemul @ Jan 11 2011, 18:09) 2rezid... Jan 11 2011, 17:52 ViKo Цитата(rezident @ Jan 11 2011, 22:52) А э... Jan 12 2011, 06:45  rezident Цитата(ViKo @ Jan 12 2011, 14:45) Я поним... Jan 12 2011, 10:42   ViKo Цитата(rezident @ Jan 12 2011, 15:42) Это... Jan 12 2011, 11:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|