kokaINoff 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Всем доброе время суток. Помогите разобраться с проблемой при передаче информации через 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 бод). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
O.L. 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба Использую AT89C2051. Пишу в среде от Franklin Software (ProView32). Инициализирую UART: Я так понимаю, что пользуетесь Вы симулятором от Franklin Software, или такое поведение наблюдается на реальном кристалле? Правда я уже не вспомню, какой отладчик, кроме монитора на последовательный же порт, к Franklin-у можно было "прикрутить". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zovsilab 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба Частота тактирования я так понимаю 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 в шестнадцатеричной нотации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба в теле основной программы кидаю байт SBUF = TEMP; while (!TI); и у меня тут же генерится прерывание (без зависания на функции while), хотя во всех ДШ написано, что флаг TI поднимается при передаче стопового бита, который в посылке идет последним. Если, как заметил O.L., вы пользуетесь симулятором, то ничего удивительного нет. Сразу после SBUF = TEMP TI вылезет в единицу, а на реальном кристалле после передачи байта. кто-то предлагал отказаться от прерывания и использовать while (!TI); не надо отказываться. Прерывания - удобная вещь, проблемы с ними возникают как правило из-за невнимательности разработчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kokaINoff 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба Здравствуйте еще раз. Только не смейтесь над моей серостью. Никогда протеусом не пользовался. Столько про него всего хорошего слышал, но ни разу не щупал. На счет того что в реале происходит с камнем: использую программу Terminal для прослушки COM порта. Вижу только что в СОМ летит какой-то мусор (последовательность состоящая из набора:<><><><>...)при включении и выключении питания схемы (на входе питания стоит диодный мост, после него конденсатор, после 78L05, опять конденсатор, сам контроллер по питанию зашунтирован конд. на 0.1 мКф). На счет того, что вываливается программа сразу в прерывание и это правильно ничего подобного. Если в этом отладчике франклиновском в буфер ввести любой символ, то он далеко не сразу вываливается в прерывание. Более того на порт повешал светодиод для визуализации процесса, он в основном цикле программы он должен светиться, а во время выполнения прерывания должен потухать, так он предательски светится чуть заметным свечением, хотя выключение должно приходиться на ничтожно малый промежуток времени (выполнение оперции сброса бита TI и инструкция возврата из прерывания) . Я чего испугался-то. Первый раз с СОМом работаю. А в принципе ни в одном из предложенных ответов не было указано, что в программе ошибки какие-то. Может кто-нибудь поделится куском кода банальной инициализации уарта, как в него байт забрасывают... попробую в отладчик свой запихнуть. И на отладчик грешить не могу. Порядкому уже, пускай простеньких, программ в нем отлаживал - все работать сразу начинало корректно после прошивки камня. А тут прям как в стену уперся и стою на месте одном :( Буду очень приочень признателен Вам за это! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
O.L. 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба использую программу 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 посчитать на калькуляторе. Калькулятор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zovsilab 0 20 мая, 2011 Опубликовано 20 мая, 2011 (изменено) · Жалоба Вот исходный текст простейшей программы, выводящей текстовую строку в последовательный порт: (код написан под среду 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. Практический подход". Изменено 20 мая, 2011 пользователем zovsilab Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться