Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART: инициализация скорости
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
gala
Ув. пользователи MCS-51

Много лет применял инициализацию скорости UART.
Потерял 2 дня для адаптации к SiLabs C8051F064 (читать Datasheet было лень)
Оказалось, инициализация по-умолчанию НЕ соответствует "классике" Intel MCS-51

For classic MCS-51:
Th1=(signed char)(K*Osc_Freq)/(Baud_Rate*32*12); //if(SMOD==1) K=2; else K=1;
T2 =(signed word)(K*Osc_Freq)/(Baud_Rate*32); //K=1;

For SiLabs C8051Fxx:
Th1=(signed char)(K*Osc_Freq)/(Baud_Rate*32*N); //N=1,4,12,48(SysCLC) or N=8(ExtCLC)
T2 =(signed word)(K*Osc_Freq)/(Baud_Rate*16*N); //N=1,2,12(SysCLC) or N=8(ExtCLC);

Готового FAQ по отличиям инициализации скорости UART для разных MCU-51 не нашел.

Предлагаю поделиться грустным опытом
Волощенко
Цитата(gala @ Mar 22 2007, 14:55) *
Предлагаю поделиться грустным опытом
Вот здесь http://www.silabs.ru/appnotes.php есть все...
Для UART можно смело AN115 – «Примеры и софт для UART»
Отличий есть и много, хотя бы CrossBar не забыть определить (см.AN101). Здесь очень полезен Code Configuration Wizard, в том числе и для UART.
Есть еще много чего в:
http://www.silabs.ru/publication.php
http://www.dito97.narod.ru/document.htm
http://www.electrosnab.ru/silabs/Silabs_1_1.htm
gala
Цитата(Волощенко @ Mar 22 2007, 16:02) *
Вот здесь http://www.silabs.ru/appnotes.php есть все...
Для UART можно смело AN115 – «Примеры и софт для UART»
Отличий есть и много, хотя бы CrossBar не забыть определить (см.AN101). Здесь очень полезен Code Configuration Wizard, в том числе и для UART.
Есть еще много чего в:
http://www.silabs.ru/publication.php
http://www.dito97.narod.ru/document.htm
http://www.electrosnab.ru/silabs/Silabs_1_1.htm


Полностью согласен=хорошие ссылки по SiLabs

А по другим производителям семейства MCS-51 замечены отличия???
AlexanderX
В процессорах Silabs C8051F06x очень много разнообразной периферии и не все регистры специального назначения (SFR) поместились в стандартное адресное пространство. Для решения этой проблемы был введен регистр указатель активной страницы для доступа к соответствующим SFR.

Теперь по поводу инициализации UART:
1. Определяете от какого генератора работает процессор, если от внешнего то его нужно инициализировать
2. Инициализируете Crossbar со включенным UART
3. Собственно инициализация режима UART

Пример кода инициализации скорости работы и режима UART т.е. пункт 3.
//
// Initialize UART
// Use Timer 1
//
void UART_Init (void)
{
SFRPAGE = 0x00; // ATTENTION Set Page 0 !!!!
CKCON |= 0x10; // Timer1 clocked from SYSCLK = 24MHz
TMOD &= 0x0F;
TMOD |= 0x20; // Timer1 set to 8-bit mode with auto-reload
TH1 = 0xF3;
TL1 = 0xF3; // Set UART speed 115200
TCON |= 0x40; // Run Timer1
SCON0 = 0xD0; // Receiver enabled, simple 9-bit mode
SSTA0 = 0x10; // Timer 1 is source baudrate for UART
ES0 = 1; // UART interrupt enable
}

Удачи.
evg123
Силабсы достаточно навороченные в отличие от стандартных. Мне пришлось дня два-три потратить прежде чем я перешёл от AT89S8252 на F310. Берите pdf-ник по F064 и распечатывайте целиком (полный вариант, т.к. с экрана читать даже на ЖКИ будет не сильно приятно) и затем читайте его целиком и медленно (т.к. потом это сэкономит кучу времени, ведь программируете вы не только УАРТ). Там, можно сказать, всё не так, как в стандартном 51-ом за исключением системы команд. Но всё, что написано - работает хорошо. Есть книга О.И.Николайчук "x51-совместимые микроконтроллеры контроллеры фирмы Cygnal" djvu. Она правда весит 16 метров и там много полезной информации.
Halfback
А может кто написать маленький примерчик как заставить на МЦУ С51 работать UART без использования таймера + обработчик прерывания от трансмиттера. А то я понять не могу почему у меня программа в отладчике в этот обработчик не входит...
Kolia
Цитата(Halfback @ Apr 3 2007, 22:33) *
UART без использования таймера + обработчик прерывания от трансмиттера. А то я понять не могу почему у меня программа в отладчике в этот обработчик не входит...


UART без таймера не работает -> соответственно и в прерывание не входит huh.gif
Halfback
Цитата
UART без таймера не работает -> соответственно и в прерывание не входит

ну в общем я разобрался в чём я был не прав - там помимо EA=1 (разрешение всех прерываний) надо было выставить ES = 1 (разрешить индивидуально для UART)
А вот как заставить заработать UART без таймера я так и не разобрался. Смысл в том что в кейле байты по УАРТу шлются а протеусовская симуляция не работает =) может глюк протеуса 6,9 SP5 ???
Kolia
Цитата(Halfback @ Apr 4 2007, 20:30) *
может глюк протеуса 6,9 SP5 ???


Скореее всего глюки blink.gif Keila или просто глюки wacko.gif.

Вообще таймер определяет скорость передачи по UART. Соответственно если таймер выключен, то скорость = 0. Если не веришь проверь в режиме эмуляции кейла Peripherals->Serial->Baudrate.
Halfback
Цитата
Если не веришь проверь в режиме эмуляции кейла Peripherals->Serial->Baudrate

Дык там в кейле и проверял - байты слались без проблем и при этом таймер в конфигурации вообще не трогал wink.gif А протеус молчит.
Кстати а как сделать так чтобы отсылка по УАРТа велась без участия тела майн ??? Что там в обработчике прерывания написать надо??? И есть ли толковая книга (ну или сайт какой-нибудь) с примерами на СИ по МЦУ С51??? а то имеются только по AVR...
Kolia
Цитата(Halfback @ Apr 5 2007, 19:39) *
Дык там в кейле и проверял - байты слались без проблем и при этом таймер в конфигурации вообще не трогал wink.gif А протеус молчит.


А какой у тубя Keil. У меня 3.31, и в мем при отключенном таймере baubrate = 0 (как и должно быть).

А вообще чего мучаться с протеус и нельзя ли все промоделировать в железе(Сейчас практически во всех МК есть UART) + ПС.

Документация здесь
h**p://electronix.ru/forum/index.php?act=Attach&type=post&id=10553

Цитата
Кстати а как сделать так чтобы отсылка по УАРТа велась без участия тела майн ???

Без main() - это что-то новенькое. А где у тебя код инициализации контроллера будет?

В ощем возьми какой нибудь пример работы с uart, разберись хорошенько и будет santa2.gif w00t.gif

Вот с этого файла я начинал свое знакомство с UART -> режим работы без прерываниия
koyodza
Грусным делиться вроде и нечем. Использовал разные сигналы (06Х, 12Х, 31Х, 35Х). Глюков или несоответствия документации практически нет. Только в 35Х есть небольшое несоответствие в виде отсутствия "минусового" ключа между встроенной опорой и землей, хотя на блок-схеме он показан. Характеристики всех АЦП очень неплохие, а главное, соответствуют заявленным.
Что не нравится - так это страничные SFR в 0ХХ-1ХХ, а также деление памяти данных на idata, pdata, xdata, но это все наследие 51 архитектуры.
Теперь по существу вопроса. На сайте силабса есть утилита ConfigWizard, которая очень помогает разобраться с тем, как инициализировать ту или иную периферию. Причем она полезна как начинающим разбираться с сигналами, так и уже опытным
http://www.silabs.com/tgwWebApp/public/web...u_configwiz.htm
Настовьяк Артём
1 Для работы уарта (F064) обязательно нужен таймер
2 если вы хотите максимальную скорость обмена, то работайте с прерыванием.
3 если вы хотите работать на скоростях выше стандартной (115200), то работайте с UART1 а не UART0.
стабильно работает с ПК через мост CP2101 на скорости 921600.
Примечание: стабильно работает при использовании для тактирования кварца 22118400, т.е. погрешность выставления скорости передачи = 0%. С использованием встроенного генератора не проверял.
alvol
Цитата(Настовьяк Артём @ Nov 19 2007, 09:58) *
3 если вы хотите работать на скоростях выше стандартной (115200), то работайте с UART1 а не UART0.
стабильно работает с ПК через мост CP2101 на скорости 921600.
Примечание: стабильно работает при использовании для тактирования кварца 22118400, т.е. погрешность выставления скорости передачи = 0%. С использованием встроенного генератора не проверял.


Работа СР2103 на скорости 921600 с использованием внутреннего генератора при работе контроллера идет отлично (на C8051F32x)
Все действия лучше делать по прерыванию УАРТа. Только нужно всего лиш проверять причину прерывания: прием илии передача и не забывать программно очищать этот флаг.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.