Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT89S8253
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Pretorianec
Возникла проблема при использовании 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 не включился.

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

Вы какой DataSheet курили? Где Вы в АТ89S8253 нашли сие замечательное устройство? В DS на АТ89S8253 есть раздел 11 с названием "Baud Rate Generator", но в нём для генерации нужной скорости UART рекомендуют применять таймер 2...
Pretorianec
Цитата
Вы какой 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
Nemo2000
Цитата(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 отсутсвует, тобишь его в данной м/с нет.
Палыч
Цитата(Pretorianec @ Jun 2 2010, 12:32) *
Изначально для тактирования UART использовался Timer 1

Что мешает и дальше использовать Timer 1 для задания скорости работы UART? Зачем Вы полезли в какие-то дебри?
Pretorianec
Цитата
возникла потребность соединить с другим устройством на скорости 115200 бод


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

Ага - щас! У меня ведь работает. У Вас, возможно, кварц стоит "не той" частоты. Вы в курсе, что большенство АТ89 работают на частотах до 24 МГц?
Harbinger
Вообще-то крайне желательно, чтобы частота кварца была кратна скорости.
Обычно использую таймер 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
SysRq
Код
#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;
}
niksfromru
На 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 порту ПК
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.