реклама на сайте
подробности

 
 
> AT89S8253, Скорость UART
Pretorianec
сообщение Jun 1 2010, 10:49
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 18-01-06
Пользователь №: 13 317



Возникла проблема при использовании UART.
Старая разработка всю жизнь работала на скорости 4800 бод, возникла потребность соединить с другим устройством на скорости 115200 бод.

Просмотрев DataSheet пришел к выводу, что нужно использовать внутренний BaudGenerator, пришлось прописывать новые регистры:

sfr BDRCON = 0x9B; /* Serial Port Baud Rate Control*/

/*------------------------------------------------
BDRCON (0x9B) Baud Rate Control Register
------------------------------------------------*/
#define SRC_ 0x01
#define SPD_ 0x02

#define RBCK_ 0x04
#define TBCK_ 0x08

#define BRR_ 0x10


однако BaudGenerator не включился.

Может быть кто уже решал подобную проблему?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
Палыч
сообщение Jun 1 2010, 14:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Pretorianec @ Jun 1 2010, 14:49) *
Просмотрев DataSheet пришел к выводу, что нужно использовать внутренний BaudGenerator... однако BaudGenerator не включился.

Вы какой DataSheet курили? Где Вы в АТ89S8253 нашли сие замечательное устройство? В DS на АТ89S8253 есть раздел 11 с названием "Baud Rate Generator", но в нём для генерации нужной скорости UART рекомендуют применять таймер 2...
Go to the top of the page
 
+Quote Post
Pretorianec
сообщение Jun 2 2010, 08:32
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 18-01-06
Пользователь №: 13 317



Цитата
Вы какой DataSheet курили?

Официальный )

Дело в том, что в этом документе пункт посвященный UART отсутствует, но есть ссылка на другой, так называемый Atmel C51 Hardware Manual.
Который в принципе является общим для всего семейства. Там эту информацию про генератор и нашел. А так как в DataSheet на 8253 нету опровержения, сделал вывод, что должно работать.

Изначально для тактирования UART использовался Timer 1, принцип работы с которым и описан в Atmel C51 Hardware Manual :

http://www.atmel.com/dyn/resources/prod_do...nts/DOC4316.PDF
Go to the top of the page
 
+Quote Post
Nemo2000
сообщение Jun 2 2010, 09:32
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 8-04-05
Из: Санк-Петербург
Пользователь №: 3 972



Цитата(Pretorianec @ Jun 2 2010, 11:32) *
Официальный )

Дело в том, что в этом документе пункт посвященный UART отсутствует, но есть ссылка на другой, так называемый Atmel C51 Hardware Manual.
Который в принципе является общим для всего семейства. Там эту информацию про генератор и нашел. А так как в DataSheet на 8253 нету опровержения, сделал вывод, что должно работать.

Изначально для тактирования UART использовался Timer 1, принцип работы с которым и описан в Atmel C51 Hardware Manual :

http://www.atmel.com/dyn/resources/prod_do...nts/DOC4316.PDF


В DataSheet на 8253 нету и подтверждения. smile.gif В таблице SFR регистр BDRCON отсутсвует, тобишь его в данной м/с нет.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 2 2010, 14:25
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Pretorianec @ Jun 2 2010, 12:32) *
Изначально для тактирования UART использовался Timer 1

Что мешает и дальше использовать Timer 1 для задания скорости работы UART? Зачем Вы полезли в какие-то дебри?
Go to the top of the page
 
+Quote Post
Pretorianec
сообщение Jun 3 2010, 13:48
Сообщение #6





Группа: Участник
Сообщений: 14
Регистрация: 18-01-06
Пользователь №: 13 317



Цитата
возникла потребность соединить с другим устройством на скорости 115200 бод


С помощью Timer 1 невозможно достичь такой скорости. sad.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 3 2010, 13:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Pretorianec @ Jun 3 2010, 17:48) *
С помощью Timer 1 невозможно достичь такой скорости. sad.gif

Ага - щас! У меня ведь работает. У Вас, возможно, кварц стоит "не той" частоты. Вы в курсе, что большенство АТ89 работают на частотах до 24 МГц?
Go to the top of the page
 
+Quote Post
Harbinger
сообщение Jun 3 2010, 18:57
Сообщение #8


старший лаборант
******

Группа: Свой
Сообщений: 2 702
Регистрация: 30-09-05
Из: ЮЗЖД
Пользователь №: 9 097



Вообще-то крайне желательно, чтобы частота кварца была кратна скорости.
Обычно использую таймер 2. Примерно так:
Код
void UART_Init(void)
{
    PCON = 0x00;    //без удвоения
    T2CON=0;
    T2MOD=0;
    RCAP2L=0x0FA; //115200; 22,1184 МГц
    RCAP2H=0x0FF;
    RCLK=1;
    TCLK=1;
    TF2=0;
    TR2=1;
    SCON = 0x050;
    ES = 1;
        
}


Цитата(Палыч @ Jun 3 2010, 16:54) *
Вы в курсе, что большенство АТ89 работают на частотах до 24 МГц?

8253, по крайней мере первых ревизий, для этого нужно было специально готовить. smile.gif Даже на 8 МГц при околонулевой температуре тактовый генератор мог не завестись. sad.gif


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Jun 5 2010, 15:21
Сообщение #9


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Код
#include "reg8253.h"

#define TRUE    1
#define FALSE    0

#define XTAL    11059200UL

CODE
void UART_Initialize(void) // initialization
{
UART_RxTail = 0; // reset buffer counters
UART_RxHead = 0;

UART_TxTail = 0;
UART_TxHead = 0;

UART_TxInProgress = FALSE;

#define UART_BAUDRATE 115200UL
#define UART_TIMER2_PRESCALER_VALUE (unsigned int) (65536.5 - XTAL / (32.0 * UART_BAUDRATE))

TH2 = (unsigned char) (UART_TIMER2_PRESCALER_VALUE >> 8);
TL2 = (unsigned char) (UART_TIMER2_PRESCALER_VALUE);
RCAP2H = (unsigned char) (UART_TIMER2_PRESCALER_VALUE >> 8);
RCAP2L = (unsigned char) (UART_TIMER2_PRESCALER_VALUE);

TCLK = TRUE;
RCLK = TRUE;
TR2 = TRUE;

SM1 = TRUE;
REN = TRUE;

ES = TRUE;
}
Go to the top of the page
 
+Quote Post
niksfromru
сообщение Jun 17 2010, 06:35
Сообщение #10





Группа: Участник
Сообщений: 4
Регистрация: 17-06-05
Пользователь №: 6 103



На AT89S8252 я этот вопрос решал так (уже плохо помню почему wink.gif ):
//------------------------------
RCAP2H = 0xFF ;
RCAP2L = 0xFF ; //Baudrate 750000 (Fclk = 24 Mhz)
TH2 = 0xFF;
TL2 = 0xFF;


T2CON = 0x34;
SCON = 0x52;

TI=1;
ES = 1;
//------------------------------
В качестве драйвера был какой-то ADM485 (на линии висело порядка 20 датчиков) и вся эта "розовая чушь" через FT232 подключалась к USB порту ПК
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 23:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01661 секунд с 7
ELECTRONIX ©2004-2016