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





Иное дело при чтении. При частоте 100 кГц мы можем передавать по линии 10-11 кбайт в секунду (с учетом задержки на передачу сигнала АСК). В режиме чтения одиночного байта (в описании микросхем АТ24 это называется random — случайное чтение) вся процедура займет не менее четырех таких циклов — "мастер" посылает три байта (адрес устройства и два байта адреса памяти), и "ведомый" отвечает байтом данных. Получается что-то около 2,5 кбайт/с (чтобы прочесть все 32 кбайта микросхемы АТ24С256, потребуется примерно 12 с). Отметим, что в программе вывода звука в главе 8 тактовая частота МК была 16 МГц, поэтому скорость интерфейса при тех параметрах задержки, что установлены в файле i2c.prg, составляла около 400 кГц, а скорость чтения — около 10 кбайт/с.

Время чтения можно сократить, если попробовать выжать из 12С все, на что он способен — при тактовой частоте на шине SCL, равной 1 МГц, в режиме одиночного чтения получится около 25 кбайт/с, а при чтении всей памяти подряд можно вообще не подавать значения адреса памяти (только один раз подать команду на чтение) и получить скорость чтения около 100 кбайт/с. В случае, который мы разберем далее, это непринципиально, все равно данные, полученные чтением из памяти, мы будем передавать через UART примерно с такими же по порядку величины скоростями.

Теперь давайте определимся, что именно мы будем записывать, и, соответственно, на сколько нам хватит этой памяти. Базовый кадр данных у нас будет состоять из четырех байтов значений давления- и температуры (см. главу 10— напряжение батареи нас "наверху", естественно, не интересует). Мы можем, конечно, писать и в распакованном BCD-виде, взяв подготовленные для индикации значения физических величин, но зачем загромождать память лишними байтами, если коэффициенты пересчета мы знаем (они' у нас хранятся в EEPROM), и на ПК, куда в конце концов попадут эти данные, пересчитать всегда сможем. Если ориентироваться на четыре байта, то в наши 32 кбайта мы сможем вместить 8192 измерения (на самом деле чуть меньше, как мы увидим, но это несущественно). Разумеется, писать их все подряд не нужно — напомним, что у нас измерения производятся каждые 3 с, но за это время в погоде вряд ли что изменится.

Стандартный метеорологический интервал подразумевает трехчасовой цикл (8 измерений в сутки), тогда памяти нам хватит на 1024 суток, или почти на 3 года записей! Как видите, даже объем памяти в 32 кбайта в данной ситуации вполне приемлемый.

Программа
Адресация в АТ24С256 двухбайтовая, поэтому под адрес потребуются два регистра (AddrL и AddrH). Мы выбираем г24 и г25 (см. текст процедур в приложении 3), почему именно эти, вы увидите далее. Записываемые данные будут храниться в регистре DATA. ЭТИ регистры действуют как для процедуры записи, так и чтения.
Исходные значения температуры и давления хранятся в SRAM в четырех ячейках старших 256 байтов (начиная с адреса Tres = 01:06, см. главу 10). Сама запись производится очень просто: с каждым байтом мы увеличиваем на единицу содержимое счетчика адресов AddrH:AddrL (командой adiw— именно для этого и выбирались регистры г24 и г25, чтобы ее можно было использовать), "забиваем" нужный байт в регистр DATA И вызываем процедуру WriteFlash.

Но тут возникают две проблемы: во-первых, нужно решить, что делать, когда память закончится. Тогда следует либо обнулять ячейки и начинать запись заново, поверх младших адресов, либо, что гораздо красивее, остановить запись, пока содержимое ее не будет просчитано и адрес принудительно не будет обнулен. Значит, потребуется какой-то флаг, сигнализирующий о заполнении памяти. Причем отвести для этого флага, например, бит в каком-то регистре (Flag), будет недостаточно: а что произойдет при сбое питания? Нам придется хранить где-то во встроенной EEPROM и этот флаг и, главное, текущий адрес памяти, иначе данные будут пропадать после каждого отключения питания. А для прибора, который может писать три года подряд, это несолидно.

Во-вторых, необходимо как-то отсчитывать время, когда производить запись. Для того чтобы метеоданные были полноценными, их нужно не просто записывать каждые три часа, но и привязывать к реальному времени. И тут мы неизбежно приходим к тому, чтобы объединить часы с нашим измерителем. Использовать сам контроллер в качестве часов нецелесообразно, слишком много он всего делает такого, что может вызвать сбой в отсчете времени. Потребуются внешние часы, но подключение RTC заметно сложнее, чем памяти, и мы рассмотрим этот вопрос отдельно.

А пока, чтобы отработать процедуры обмена по I С, договоримся, что запись в память у нас будет производиться по прерыванию сравнения Timer 1, который все равно в измерителе ничем не занят. При тактовой частоте 4 МГц и максимально возможном коэффициенте ее деления 1024 можно заставить Timer 1 срабатывать каждые, например, 15 секунд, для чего в регистр сравнения придется записать число 58 594 (проверьте!). С такой частотой память, конечно, заполнится очень быстро (32 кбайт менее чем за 1,5 суток), но это, наоборот, удобно, если поставлена задача проверить все наши процедуры.

Итак, повторим адреса SRAM: ,
/адреса SRAM старший' байт адреса .equ Tres = Охб /0x6,0x7 — ст. .equ Pres = 0x8 /0x8,0x9 — ст.
SRAM=0x01
и мл. байты Т рез. усреднения и мл. байты Т рез. усреднения

Отдельно запишем адреса в EEPROM, в которой будет храниться текущий адрес памяти и специальный флаг разрешения записи:
.equ . equ . equ
FEnEE
EaddrH EaddrL
= 0x10 ;флаг если равен $FF, то писать во flash =0x11 /старший байт тек. адреса =0x12 ;младший байт тек. адреса



     
 

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