Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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 байт/с, и быстродействие интерфейса перестает играть тут решающую роль.
<< Назад В начало Далее >> |
|