![]() |
![]() |
||||||||||||||
USART AT Mega 8.
Автор: Прежде всего, я не претендую на то, что сейчас расскажу вам что-то новое. Это давно написано в даташитах и книгах. Эта статья, для тех, кто туда лезть не хочет, или у кого нет времени. MTh Понадобился (нам с господином Storm"ом) на диплом некий модулятор цифровых данных. Поток данных нужно было откуда-то брать. Первой идеей был LPT порт. Он параллельный, с ним, на первый взгляд проще работать J. История умалчивает о причинах невозможности работы с LPT на нормальных скоростях. Ну не получилось. Что поделаешь. Решили опробовать RS232.
Прежде всего стоит упомянуть что мы использовали: CodeVision использовался по причине того, что в нём написано QAM-16 и преобразование Фурье для OFDM модулятора/демодулятора. Кроме всего прочего есть у него классный генератор начального кода. Вот пожалуй с него мы и начнем. ![]() При создании проекта, компилятор сам спрашивает, будем ли мы использовать генератор кода, отвечаем утвердительно, наблюдаем: Выбираем необходимый нам чип и частоту кварца. BootLOader использовать не будем, потому ничего на этой закладке больше не трогаем. Идем на закладку USART: Ставим галочку Transmitter(передатчик), выбираем скорость, которая нас удовлетворяет и ошибки будут минимальны (лучше, конечно чтобы их вообще не было, но так не получится, BaudRateError будет показывать 0,1% минимум, т.к. кварц должен быть не на 4 МГц, а скажем 4,485902 МГц) и параметры связи (в сокращенной форме 8N1) режим асинхронный. Здесь также стоит уточнить, что Мега может работать в синхронном режиме. Нас пока больше ничего не интересует, а потому выбираем File->Generate, Save and exit. Он нам ещё позадает вопросы по поводу имен файлов для сохранения и пр., думаю тут разберетесь. ![]() Чуть не забыл, на закладке настройки USART есть галочка x2. Зачем нужна? Верно, удвоенная скорость передачи. Да, да, да 115200 - не предел. Пробовали завести, работал, один раз. Кодгенератор не совсем корректно воспринимает её, или двойная скорость возможна не всегда, я так и не разобрался. Наблюдаем прелестную картину: есть весь код для того чтобы прямо сейчас начать работу с USART (все регистры уже настроены, ничего править не надо, читайте комментарии, дабы разобраться). Находим в конце файла след структуру:
while (1) Настройки - это конечно хорошо, однако, нам ведь надо чего-то послать, чтобы увидеть, что всё работает. Добавляем след строчку:
while (1) Нажимаем кнопочку "Make the project": ![]() Вот сейчас поклонники ассемблера начнут меня гнобить, 2.9% памяти. Достаточно много (при 8 Кб, 2.9% = 232 байта), однако, нас это волновало мало. Кто опишет всё это на ассемблере, буду только рад. )) Если вы видите это окошко, значит всё скомпилировалось и ошибок нет. Открываем PonyProg или AVReal. Открываем окно программирования битов конфигурации (fuses). Это сааааамый щекотливый момент - по идее, нужно лезть в даташит и смотреть, как заставить мегу работать с внешним кварцем (про то, что если фузы настроить неправильно, то м/с в режим последовательного программирования не перейдет, я вообще молчу, будьте внимательны). Я вас так мучить не буду, скажу лишь, что Мега8 на заводе, программируется на работу с внутренним генератором 1МГц. С такой тактовой частотой вы не сможете получить более-менее приличную скорость связи. Мы настроили USART на 19200 при 4 МГц кварце. Значит нужно сделать вот так: ![]()
Кому интересно почитает, почему так. Жмем write, пробуем считать биты еще раз, если получилось, то всё хорошо. Можно идти дальше. Если нет, то ищем параллельный программатор.
![]() Естественно не забываем про кварц и конденсаторы на землю для стабильного запуска. А также 5 ногу компорта на землю (сигнальная земля). Для MAX используется типовая схема включения. Рекомендую между информационной линией и землей воткнуть светодиоды. Там конечно-же 10 В, однако, это импульсный режим и напряжение не постоянное. Воткнутый светодиод решит 2 проблемы, отобразит импульсы, в результате вы будете хоть как-то видеть что по проводам что-то идет, и согласует нагрузку (дополнительное сопротивление на землю). У нас это всё было собрано "на скорую руку", примерно вот так: ![]()
Далее в "понике" открываем получившийся после компиляции HEX и жмем запись: Допустим все прошло хорошо. Открываем какой-нибудь терминал. Виндовым HyperTerminal не пользовался, о результате не скажу. Я использовал (кроме RS-232pro), компоненты для DELPHI - TMSA32 (Evgen, спасибо!). Прелестная вещчь! За 15 минут накидывается любой терминал, причем именно как надо тебе ;). Так вот, запускаем терминал, настраиваем порт, именно так как вы настраивали контроллер, т.е. для нашего случая ставим скорость 19200, протокол 8N1. Применяем параметры. В результате на экране должна без остановки бегать буковка "а". Если вы видите не "а", а что-то другое, то причин может быть масса, конечно же, но перечислим основные:
Я использовал 2 МАКСА чтобы почти полностью задействовать все выводы com-порта (Ring indicator так и остался висеть в воздухе:. А жаль.).
Хочу выразить благодарности:
Библиотека для PCADa Вопросы как обычно - в Форум
|
|
||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |