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





Посчитаем, чему должно равняться число NN. Пусть мы хотим обеспечить тактовую частоту 12С около 100 кГц, тогда длительность одного импульса (полпериода тактовой частоты) должна равняться примерно 5 мкс. Сам цикл занимает три такта (команда dec один такт + команда brne с переходом — два такта), т. е., например, при частоте кварцевого генератора 4 МГц он будет длиться 0,75 мкс. Итого, чтобы получить при этой частоте импульс в 5 мкс, нам нужно повторить цикл 6-7 раз. Можно выбрать меньшее число из этих двух, т. к. вызов процедуры и возврат из нее занимают сами по себе не менее 7 тактов. Точно подогнать частоту не удастся, но это, как мы говорили, и не требуется — опыт показывает, что при ошибке даже в два-три раза работоспособность 12С практически не нарушается.

Чтобы не отводить отдельный регистр только для такой частной задачи, как счет циклов в задержке, следует дополнить цикл процедурами сохранения в стеке значения счетчика, тогда этот регистр можно безопасно использовать где-то еще. Код процедуры иллюстрирует листинг 12.1.
Листинг 12.1
delay: ;~5mks (кварц 4 MHz)
push cnt
ldi cnt,б cyk_delay: dec cnt
brne cyk_delay
pop cnt
ret

Используя эту процедуру, можно сформировать весь протокол. Чтобы не загромождать текст этой главы, я вынес полный текст процедур обмена по 12С в приложение 3 (раздел "Процедуры обмена по интерфейсу 12С"). Подробно расшифровывать его не будем, т. к. он полностью соответствует описанию протокола.

Указанный текст, кроме общих процедур посылки и приема байта (бесхитростно названных write и read), содержит процедуры для двух конкретных устройств: энергонезависимой памяти с интерфейсом 12С (типа АТ24) и часов реального времени (RTC) с таким же интерфейсом DS1307. Эти микросхемы имеют заданные 12С-адреса— $А0 (10100000) у памяти и $D0 (11010000) у часов (подробности см. далее). Сейчас мы займемся проектированием устройства, использующего эти возможности.

Как сказано в приложении 3, текст приведенной там программы следует скопировать и сохранить в виде отдельного подключаемого файла. Мы будем предполагать, что такой файл называется i2c.prg. Директиву .include "i2c.prg" следует включать в текст программы обязательно после таблицы векторов прерываний, т. к., в отличие от файла макроопределений (inc-файла), наш включаемый файл содержит команды, а не только инструкции компилятору. В принципе можно просто вставить текст из файла в основную программу (это и делает компилятор, когда встречает директиву include), только программа тогда станет совсем нечитаемой.

Запись данных во внешнюю энергонезависимую память
Задача, которую мы сейчас будем решать, формулируется так: предположим, мы хотим, чтобы данные, полученные с нашего измерителя температуры и давления (см. главу 10) не терялись, а. каждые три часа записывались в энергонезависимую память. Разумеется, встроенной EEPROM нам хватит ненадолго и понадобится внешняя.

Режимы обмена с памятью АТ24

Выберем энергонезависимую память типа АТ24С256. Хотя она имеет структуру EEPROM (т. е. с индивидуальной адресацией каждого байта), но мы, чтобы отличить ее от встроенной EEPROM, будем ее называть flash-памятью (в частности, в наименованиях процедур) или просто внешней памятью. Последнее число в обозначении означает объем памяти в килобитах, в данном случае это 256 кбит или 32 768 байтовых ячеек (32 кбайт).
Объем памяти в 32 кбайт кажется смешным в сравнении с современными разновидностями flash-памяти, которые достигают гигабайтовых объемов, но для наших целей, как вы увидите, этого будет достаточно. Максимальная емкость памяти серии АТ24 составляет 1 Мбит (128 кбайт), но удобно применять кристаллы от 2 до 512 кбит включительно, т.к. они имеют двухбайтовую адресацию и не требуют изменений в типовых программных процедурах, за исключением коррекции максимально допустимого значения адреса.

При необходимости можно увеличить емкость памяти, поставив несколько микросхем параллельно: современные типы (с буквой "В" на конце наименования: АТ24СхххВ) имеют по три вывода А0-А2, комбинацией логических единиц на которых можно задавать последние три бита адреса: 12С-адрес устройства равен 1010А2А]Ао. Таким образом можно соединять до восьми микросхем параллельно. Старые типы без буквы "В" в наименовании имели две таких линии, соответственно, можно было подсоединять до четырех микросхем. Отметим, что специальное подсоединение выводов А0-А2 к логическому нулю не требуется, и если применяется всего одна микросхема, то эти выводы можно оставить "висящими в воздухе" — логический ноль формируется внутренней схемой. Поэтому на рис. 12.3 эти выводы не показаны, и по этой же причине переход от старых типов (с двумя адресными выводами) к новым (с тремя выводами) не требует никаких изменений ни в схеме, ни в программе — вывод А2 просто остается незадействованным.

Память принципиально больших объемов с интерфейсом 12С не выпускают— слишком он медленный. Заметим, что серия АТ24 допускает скорость обмена по 12С до 1 МГц при питании 5 В, и 400 кГц при питании 3 В. Если на шине нет более медленных устройств, а микросхемы расположены на одной плате, то вместо вызова процедуры Delay, описанной в предыдущем разделе, при тактовой частоте 4 МГц и питании 5 В можно просто поставить в программе две операции NOP. ЕСЛИ же такие устройства есть (часы DS1307, описываемые далее, допускают частоту не более 100 кГц), то для ускорения обмена с памятью можно в принципе усложнить программу, меняя скорость в зависимости от того, к чему мы обращаемся, но в режиме записи это не имеет особого смысла. Дело в том, что, как и положено энергонезависимой памяти, процедура записи медленная, и сигнал АСК после посылки очередного байта следует ожидать не ранее, чем через 5 мс, т. е. общая скорость записи ограничена величиной примерно 200 байт/с, и быстродействие интерфейса перестает играть тут решающую роль.



     
 

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