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

 
 
> Проблема с UART при передаче, Проблема с UART при передаче
kokINoff
сообщение May 18 2011, 16:09
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 17-05-11
Пользователь №: 65 070



Всем доброе время суток. Помогите разобраться с проблемой при передаче информации через UART. Никогда не пользовался им, а тут возникла необходимость. Использую AT89C2051. Пишу в среде от Franklin Software (ProView32). Инициализирую UART:
SCON = 0x50; //UART в режим 1, прием разрешен
SCON = 0xC0;
TMOD = 0x20; //TL1 в 8-ми разрядном режиме с перезагрузкой из TH1
TH1 = 0xF4; // 9600
PCON = 0x80; //установка бита SMOD - удвоение скорости передачи UART
IE = 0x90; //разреш.прерыв.
TCON = 0x40; //запускаем T1
RI = 0; //на всякий
TI = 0; //на всякий

в теле основной программы кидаю байт
SBUF = TEMP;
while (!TI);
и у меня тут же генерится прерывание (без зависания на функции while), хотя во всех ДШ написано, что флаг TI поднимается при передаче стопового бита, который в посылке идет последним. В чем проблема не могу разобраться sad.gif Буду очень признателен, если укажете на мою ошибку.
Предварительно почитал темы на форуме связанные с проблемами UART, кто-то предлагал отказаться от прерывания и использовать while (!TI); ... пробовал, не помогло. При выполннии команд в этой среде даже видно, что после помещения данных в буфер сразу же генерится прерывание (без всяких временнх задержек пока все битики выдвинутся наружу на скорост 9600 бод).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kokINoff
сообщение May 19 2011, 16:24
Сообщение #2





Группа: Новичок
Сообщений: 2
Регистрация: 17-05-11
Пользователь №: 65 070



Здравствуйте еще раз. Только не смейтесь над моей серостью. Никогда протеусом не пользовался. Столько про него всего хорошего слышал, но ни разу не щупал. На счет того что в реале происходит с камнем: использую программу Terminal для прослушки COM порта. Вижу только что в СОМ летит какой-то мусор (последовательность состоящая из набора:<><><><>...)при включении и выключении питания схемы (на входе питания стоит диодный мост, после него конденсатор, после 78L05, опять конденсатор, сам контроллер по питанию зашунтирован конд. на 0.1 мКф). На счет того, что вываливается программа сразу в прерывание и это правильно ничего подобного. Если в этом отладчике франклиновском в буфер ввести любой символ, то он далеко не сразу вываливается в прерывание. Более того на порт повешал светодиод для визуализации процесса, он в основном цикле программы он должен светиться, а во время выполнения прерывания должен потухать, так он предательски светится чуть заметным свечением, хотя выключение должно приходиться на ничтожно малый промежуток времени (выполнение оперции сброса бита TI и инструкция возврата из прерывания) .
Я чего испугался-то. Первый раз с СОМом работаю. А в принципе ни в одном из предложенных ответов не было указано, что в программе ошибки какие-то.
Может кто-нибудь поделится куском кода банальной инициализации уарта, как в него байт забрасывают... попробую в отладчик свой запихнуть. И на отладчик грешить не могу. Порядкому уже, пускай простеньких, программ в нем отлаживал - все работать сразу начинало корректно после прошивки камня. А тут прям как в стену уперся и стою на месте одном sad.gif
Буду очень приочень признателен Вам за это!
Go to the top of the page
 
+Quote Post
O.L.
сообщение May 19 2011, 17:14
Сообщение #3


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

Группа: Свой
Сообщений: 96
Регистрация: 10-06-05
Из: Новосибирск
Пользователь №: 5 890



Цитата(kokINoff @ May 19 2011, 23:24) *
использую программу Terminal для прослушки COM порта. Вижу только что в СОМ летит какой-то мусор (последовательность состоящая из набора:<><><><>...)при включении и выключении питания схеме
....Более того на порт повешал светодиод для визуализации процесса, он в основном цикле программы он должен светиться, а во время выполнения прерывания должен потухать, так он предательски светится чуть заметным свечением, хотя выключение должно приходиться на ничтожно малый промежуток времени
.... поделится куском кода банальной инициализации уарта, как в него байт забрасывают... !

Для того, что бы получить правильный ответ нужно:
1. Огласить наконец частоту кварцевого резонатора. Я надеюсь, Вы уже поняли, что его частота неким образом влияет на скорость передачи данных.
2. Ни у Вас ни у присутствующих нет понимания, что делает ваша программа в основном цикле. А есть ли он? Так что - "код в студию".
3. Светодиод конечно хорошо, но его наличие сильно мешает нормальной работе с COM портом. Да, а как Вы реализовали связь между TTL уровнями последовательного порта контроллера и COM портом компьютера? Микросхема MAX232 или аналогичная в схеме Вашего отладчика имеется?
4. Воля Ваша, но ProView3 не совсем хороший выбор даже для начала освоения микроконтроллеров. Keil гораздо лучше.
Код
TI = 0;                    /* clear transmit interrupt */
/*------------------------------------------------
Set timer 1 up as a baud rate generator.
------------------------------------------------*/
TR1 = 0;                       /* stop timer 1 */
ET1 = 0;                /* disable timer 1 interrupt */

PCON |= 0x80;              /* 0x80=SMOD: set serial baudrate doubler */

TMOD &= ~0xF0;        /* clear timer 1 mode bits */
TMOD |= 0x20;                /* put timer 1 into MODE 2 */

TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));

TR1 = 1;                /* start timer 1 */

EA = 1;                         /* Enable Interrupts */
}

//где XTAL == частота кварцевого генератора например 12000000UL
//      baudrate == скорость передачи например 9600

В принципе можно значение которое загружается в регистр TH1 посчитать на калькуляторе.
Калькулятор

Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:24
Рейтинг@Mail.ru


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