|
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 Ткните где я не прав
|
|
|
|
|
 |
Ответов
|
Dec 28 2010, 06:14
|

Участник

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

|
Зашил в мегу8: Код #include <ioavr.h>
#define F_CPU 14745600 #define BAUD 1200
void USART_Init() { UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); //enable interrupts during recieve/transmit, enable recieve, enable transmit UCSRC = (1<<UCSZ1)|(1<<UCSZ0); //asynchronous mode, 8 data, 1 stop bit
UBRRH = ((F_CPU/(16*BAUD)-1)>>8); UBRRL = ((F_CPU/(16*BAUD)-1)&0xFF); }
int main( void ) { USART_Init(); asm("sei"); for(;;) { while ( !( UCSRA & (1<<UDRE)) ) ; UDR = 0xAA; for(long i = 0; i<7372;i++); }
} Тыкаю осциллографом в это тельце и вижу: длительность одного бита - 1мс. Почесал репу, заменил формулу для расчета UBRR на Код UBRRH = ((((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL) >> 8); UBRRL = ((((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL) & 0xff); Опять тыкаю осциллографом в это тельце и вижу: длительность одного бита примерно 840мкс (1200 б/с). Как так? Формула из даташита в первом случае не дает требуемого результата, в то время как вторая формула, честно подсмотренная где-то в нете, дает почти чистенькие 1200 б/с...
Сообщение отредактировал HoboTech - Dec 28 2010, 06:14
|
|
|
|
|
Dec 28 2010, 06:44
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Это некрасиво: Цитата(HoboTech @ Dec 28 2010, 12:14)  Код UBRRH = ((((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL) >> 8); UBRRL = ((((F_CPU) + 8UL * (BAUD)) / (16UL * (BAUD)) -1UL) & 0xff); Вот так без тавтологии будет. Код #define BYTE0(X) ((uint8_t)((X)>>0)) #define BYTE1(X) ((uint8_t)((X)>>8)) #define BYTE2(X) ((uint8_t)((X)>>16)) #define BYTE3(X) ((uint8_t)((X)>>24))
void uart_init_tx_8n1(void) { static const uint16_t ubrr = (F_CPU + 8UL * BAUD) / (16UL * BAUD) - 1UL; // эта формула верна ???
UCSRA = 0; UCSRB = 0; UCSRC = (1<<UCSZ0)|(1<<UCSZ1);
UBRRH = BYTE1(ubrr); UBRRL = BYTE0(ubrr);
UCSRB = (1<<TXEN); }
void uart_tx_byte(uint8_t x) { while (!( UCSRA & (1<<UDRE))) {;}
UDR = x; }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 28 2010, 07:00
|

Участник

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

|
Цитата(demiurg_spb @ Dec 28 2010, 11:44)  Код static const uint16_t ubrr = (F_CPU + 8UL * BAUD) / (16UL * BAUD) - 1UL; // эта формула верна ??? Я ж говорю - честно высмотрел на просторах интернета эту запись. В 2-х прошивках на 128 и 8 мегах работает так точно. А в 48 меге что формула из даташита, что мой вариант дают в протеусе разные скорости, очень далекие от ожидаемых. Собсно из-за этого и поднял тему.
Сообщение отредактировал HoboTech - Dec 28 2010, 07:03
|
|
|
|
Сообщений в этой теме
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 MrYuran Цитата(HoboTech @ Dec 28 2010, 12:14) Как... Dec 28 2010, 07:08 Метценгерштейн Дабы не плодить темы, задам здесь свой вопрос.
Хо... Jan 10 2011, 18:53 rx3apf Цитата(Метценгерштейн @ Jan 11 2011, 00:5... Jan 10 2011, 18:57 Xenia Цитата(Метценгерштейн @ Jan 11 2011, 00:5... Jan 10 2011, 20:04  xemul Цитата(Xenia @ Jan 11 2011, 02:04) Но вот... Jan 11 2011, 10:09 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
|
|
|