-

Осваиваем AVR!

новости  | с чего начать? | ссылки | учебник | примеры | программатор | отладчики | осциллограф | давно это было | download | сотрудничество | пишите мне

пример отладки  | бегущие огни | Мигалка | Экономим ресурс ПЗУ | Работаем с USART | 555

Надеюсь, что приведенный здесь пример поможет вам освоить работу с USART и стыковка МК с компьютером перестанет вас пугать. Итак, для начала скачайте себе архив...

В этом архиве вы найдете:

  1. исходник программы в формате Algorithm Builder для 2313 - впрочем, с минимальнейшими переделками она будет работать на любом AVR, имеющем USART (8535, 8515, 4433)

  2. текст программы на дельфи

  3. программу для компьютера (см. рис. внизу)

 
Скачать архив с примером (200 кБ).

Окно программы на компе

Эти программы связывают МК и компьютер по RS232. С микроконтроллера передаются пакеты вида:

0x55,0xAA,  R0,R1,........,R30,R32,  контрсумма

Первые два байта (0x55,0xAA) служат для синхронизации, определяя начало пакета. Потом идут 32 байта данных, представляющих собой содержимое регистров микроконтроллера. Завершает пакет контрольная сумма - дополнение до 0. Передача пакетов идет непрерывно, В случае ошибки приема на компьютере ( контрольная сумма не 0 ) принятые данные отображаются, но увеличивается счетчик ошибок.


С компьютера передаются пакеты вида:

0x01,adres,data, контрсумма.

Первый байт (0x01) - синхро, затем два байта, затем адрес куда писать и данные - что писать. Завершает пакет контрольная сумма. Адрес должен быть в пределах 0..31, если более 31 - то принятые данные никуда не пишутся. В случае ошибки (контрольная сумма не 0) запись также не производится.


С протоколом определились, теперь попробую коротко описать работу программы МК. В начале программы вас могут насторожить таинственные переходы с векторов прерывания, адреса... Это трюк для экономии ресурса ПЗУ микроконтроллера

В сеттерах - ничего необычного, устанавливаем стек, настраиваем USART на скорость 9600 (для кварца 4 МГц!) и работу в прерываниях, затем отключаем аналоговый компаратор - ну не нужен он нам. Инициализируем переменные, разрешаем прерывания и входим в бесконечный основной цикл. В этом цикле - просто читаем порты и заносим прочитанные значения в R0 и R1. Сразу замечу, что входные линии портов к Vcc не подтянуты, поэтому считанные значения будут "плясать" от любого дуновения ветерка. 

При приеме байта с компьютера вызывается обработчик UARTReceiveComplete. Первое, что в нем делается - сохраняется в стеке регистр TMPL и регистр состояния МК, так как они будут изменяться. Для конкретно этой программы - сохранения можно бы и не делать, все равно в рабочем цикле на изменение TMPL и SREG нам глубоко наплевать. Но - давайте делать все так, как положено. Ведь эту программу можно развивать дальше...

Итак, сделаны необходимые действия при входе в прерывание. После этого начинаем собственно работу - считываем принятый байт и в зависимости от флага режима приема:

  • если  принимается служебный - надо посмотреть, равен ли он 1. Если нет - просто игнорируем принятое, синхронизируемся. Если да - следующий байт будет адресом

  • если принимается адрес - то проверяем его на допустимые пределы. Если он больше 31 - все нафиг и опять ждем служебного, если в норме - запоминаем принятый адрес в NR (R2) и переключаемся на ожидание данных.

  • если принимаются данные - просто запоминаем их в RD (R3), но еще ничего не делаем - не уверены в правильности! Ждем контрольную сумму.

  • если принимается контр. сумма - прибавляем ее к KSI (все ранее принимаемое суммировалось!). Если результат =0, то записываем байт из RD по адресу из NR. Обратите внимание на то, что для этого используется индексный регистр X. XH - всегда 0, так мне захотелось :-), а вот XL надо сохранить, а после использования восстановить! Ну и в завершение - опять переключаемся на ожидание служебного.

Передача пакетов на компьютер также ведется в прерываниях, UARTDREmpty. В принципе, структура аналогичная, только вместо флагов используется номер (APER) - если от от 0 до 31 - передается соответствующий адрес памяти (он же - регистр), если 32 - контрольная сумма, если 33/34 - то синхробайты $55/$AA. Заметим, что при старте программы APER инициализируется числом 33.

Ну вот вроде и все! Да, при старте мы заносим числа $10 в R10 и $11 в R11 - это просто чтобы проверить правильность работы. На "снимке" окна программы вы это видите.

Вы можете изменять регистры МК с компьютера! Так, введите в левый edit число 10, в правый - что вам в голову придет, и нажмите кнопочку Send. Смотрим в принимаемые данные - так и есть, R10 теперь равен не $10, а введенному вами числу! Можно радоваться.

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


Rekl:

(с)nml 11-Jul-2009