Перейти к содержанию
    

Проблема с UART при передаче

Всем доброе время суток. Помогите разобраться с проблемой при передаче информации через 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 поднимается при передаче стопового бита, который в посылке идет последним. В чем проблема не могу разобраться :( Буду очень признателен, если укажете на мою ошибку.

Предварительно почитал темы на форуме связанные с проблемами UART, кто-то предлагал отказаться от прерывания и использовать while (!TI); ... пробовал, не помогло. При выполннии команд в этой среде даже видно, что после помещения данных в буфер сразу же генерится прерывание (без всяких временнх задержек пока все битики выдвинутся наружу на скорост 9600 бод).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использую AT89C2051. Пишу в среде от Franklin Software (ProView32). Инициализирую UART:

Я так понимаю, что пользуетесь Вы симулятором от Franklin Software, или такое поведение наблюдается на реальном кристалле? Правда я уже не вспомню, какой отладчик, кроме монитора на последовательный же порт, к Franklin-у можно было "прикрутить".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота тактирования я так понимаю 11,059МГц? Попробуй промоделировать в Proteus. Модель 2051 там есть, возьми виртуальный терминал и все увидишь.

 

В общем случае, если не используется бит PCON.7 для удвоения скорости обмена, значение регистра TH1 вычисляется по формуле:

TH1 = 256 – (Fosc / 384 / скорость обмена),

- где Fosc – тактовая частота, на которой работает микроконтроллер.

Например, при тактовой частоте 11,059 МГц и требуемой скорости обмена 9600 бод значение регистра TH1 должно быть равным:

256 – (11059000 / 384 / 9600) = 256 – 2,999 = 253, или 0xFD в шестнадцатеричной

нотации.

- Если используется бит удвоения скорости PCON.7, то тактовая частота делится не на 384, а на 192. В этом случае для той же скорости обмена в 9600 бод значение TH1 должно равняться:

- 256 – (11059000 / 192 / 9600) = 256 – 5.9999 = 250, или 0xFA в шестнадцатеричной нотации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в теле основной программы кидаю байт

SBUF = TEMP;

while (!TI);

и у меня тут же генерится прерывание (без зависания на функции while), хотя во всех ДШ написано, что флаг TI поднимается при передаче стопового бита, который в посылке идет последним.

Если, как заметил O.L., вы пользуетесь симулятором, то ничего удивительного нет. Сразу после SBUF = TEMP TI вылезет в единицу, а на реальном кристалле после передачи байта.

 

кто-то предлагал отказаться от прерывания и использовать while (!TI);

не надо отказываться. Прерывания - удобная вещь, проблемы с ними возникают как правило из-за невнимательности разработчика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте еще раз. Только не смейтесь над моей серостью. Никогда протеусом не пользовался. Столько про него всего хорошего слышал, но ни разу не щупал. На счет того что в реале происходит с камнем: использую программу Terminal для прослушки COM порта. Вижу только что в СОМ летит какой-то мусор (последовательность состоящая из набора:<><><><>...)при включении и выключении питания схемы (на входе питания стоит диодный мост, после него конденсатор, после 78L05, опять конденсатор, сам контроллер по питанию зашунтирован конд. на 0.1 мКф). На счет того, что вываливается программа сразу в прерывание и это правильно ничего подобного. Если в этом отладчике франклиновском в буфер ввести любой символ, то он далеко не сразу вываливается в прерывание. Более того на порт повешал светодиод для визуализации процесса, он в основном цикле программы он должен светиться, а во время выполнения прерывания должен потухать, так он предательски светится чуть заметным свечением, хотя выключение должно приходиться на ничтожно малый промежуток времени (выполнение оперции сброса бита TI и инструкция возврата из прерывания) .

Я чего испугался-то. Первый раз с СОМом работаю. А в принципе ни в одном из предложенных ответов не было указано, что в программе ошибки какие-то.

Может кто-нибудь поделится куском кода банальной инициализации уарта, как в него байт забрасывают... попробую в отладчик свой запихнуть. И на отладчик грешить не могу. Порядкому уже, пускай простеньких, программ в нем отлаживал - все работать сразу начинало корректно после прошивки камня. А тут прям как в стену уперся и стою на месте одном :(

Буду очень приочень признателен Вам за это!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

использую программу 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 посчитать на калькуляторе.

Калькулятор

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот исходный текст простейшей программы, выводящей текстовую строку в последовательный порт: (код написан под среду Keil 51)

#include <stdio.h>
#include <REG52.H>
void main(void)
{
SCON = 0x50;
TH1 = 0xFD;
TMOD |= 0x20;
TR1 = 1;
TI = 1;
printf(”Hello, world\n”);
}

Частота кварцевого резонатора 11,059 МГц, скорость 9600 бод, 1 стоповый бит.

Если вы только начинаете изучать МК х51, то советую изучать его совместно с книгой "Микроконтроллеры серии 8051. Практический подход".

Изменено пользователем zovsilab

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...