Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Закомментированая команда rjmp mml нужна для отладки программы: если ее раскомментировать, то запись будет осуществляться каждую минуту.
Таким образом, после каждого включения МК у нас будет записываться кадр времени, и мы всегда сможем привязать данные к абсолютному времени и дате, даже если в записи был длительный перерыв. Это немного уменьшит полезный объем памяти, но из-за относительно малого числа сбоев такое уменьшение можно не принимать во внимание.

Чтение данных
Здесь мы немного опередим события, и будем читать данные через UART с помощью процедуры outcom, подробно описанной в главе 13. Там же мы остановимся на том, как вызывать процедуру чтения, которую мы назовем
ReadFullFlash (ЛИСТИНГ 12.1 1).
Листинг 12.11
ReadFullFlash: cli
mov YH,'AddrH ; сохраняем текущий адрес в Y mov YL,AddrL
clr AddrL ;чтение начнем с начала памяти clr AddrH loopRF:
cp AddrL,YL ;не дошли ли до текущего срс AddrH, YH
breq end_RF ;если дошли, то конец чтения rcall ReadFlash ;собственно чтение mov
temp,DATA ;данные из DATA в temp rcall out_com ;передаем наружу adiw AddrL,1 /следующий адрес rjmp loopRF end_RF:
mov AddrH, YH ; восстанавливаем текущий адрес mov AddrL, YL sei ret

Процедура эта проста, но будет длиться значительное время, если записан сколько-нибудь существенный кусок в памяти (для передачи 32 кбайт со скоростью 9600 бит/с потребуется порядка полминуты), и на все это время прерывания будут запрещены. Есть еще один момент, который связан с процедурой чтения данных из flash-памяти— раз мы считаем время в МК отдельно, то при такой 'длительной процедуре счет неизбежно собьется. Чтобы исправить этот момент, в реальной программе потребуется заново инициализировать часы в самом конце чтения вызовом процедуры Rclocklni, либо перезапускать МК сторожевым таймером.

В этой программе есть потенциальная ошибка, хотя и не очень серьезная: если мы обратимся к какой-либо длительной процедуре (в данном случае это чтение содержимого памяти данных), то при совпадении ее по времени с записью данных последняя осуществлена не будет, и данные пропадут. Чтобы полностью исключить подобное, нужно отслеживать время, и вблизи значения часа, кратного трем, запрещать такие процедуры. Можно поступить еще проще— устанавливать при чтении флаг первичной записи, и тогда пропущенная запись не приведет к сбою при анализе информации. Но здесь я не стал углубляться в детали, т. к. совпадение все же крайне маловероятно (чтение занимает максимум пару десятков секунд, можно и вручную отследить этот момент).

ГЛАВА 1 3
Программирование U ART/US ART
Все контроллеры Mega и Classic (кроме давно позабытого AT90S1200), а также некоторые Tiny, содержат в себе модули асинхронного приемопередатчика UART или синхронно-асинхронного USART. При работе USART в асинхронном режиме он ничем не отличается от UART, за исключением наименования некоторых регистров. В дальнейшем, чтобы не путаться, мы будем обобщенно называть этот модуль UART, подчеркивая, что речь идет об асинхронном режиме обмена данными, но по ходу дела рассмотрим дополнительные возможности, которые предоставляет расширенный порт USART там, где он присутствует.

Как мы уже упоминали в главе 3, интерфейс UART двухпроводный (не считая "земли"), причем линии имеют разное назначение — одна (TxD) для передачи данных от модуля, другая (RxD) — для приема данных в модуле. Отметим, что несмотря на это, регистр данных у модуля UART один и на прием, и на передачу, и носит наименование UDR ИЛИ UDRX, где х — О, Iесли модулей UART более одного (в дальнейшем я таких оговорок делать' не буду, предполагая, что модуль всего один). Однако физически регистры данных приемника и передатчика разделены; кроме того, эти регистры являются лишь буферами, а собственно передача/прием ведется с помощью отдельных сдвиговых регистров. Потому интерфейс UART считается полнодуплексным, т. е. в каждый момент времени может вестись передача и прием данных одновременно, хотя пишутся (читаются) эти данные по одному адресу UDR.

В протоколе UART (см. рис. 3.1 в главе 3) не предусматривается никаких особых состояний "Старт" или "Стоп", как в 12С, просто каждая посылка всегда сопровождается стартовым и стоповым битами для синхронизации (при оговоренной заранее скорости обмена). Следующая посылка может прийти через произвольный промежуток времени, потому протокол и называется асинхронным. Посылка в большинстве случаев состоит из 8 битов (как обычный байт), но может быть и 9-битовой, а в модулях USART ее длина может составлять от 5 до 9 битов.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru