Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
348 Часть 111. Практическое программирование микроконтроллеров АVR Код процедуры задержки иллюстрирует листинг 1 3 . 1 . Сохранение в стеке регистра cnt осуществляется с тем, чтобы не испортить его значение в задержке, т. к. вне ее он будет использоваться для отсчета обращений к TWI . delay : ; - Smks ( кварц 4 МНz ) push cnt ldi cnt , 6 cyk_delay : dec cnt brne cyk_delay рор cnt ret Используя эту процедуру задержки, можно шаг за шагом сформировать весь прото кол . Чтобы не загромождать текст этой главы, я вынес полный текст процедур об мена по I 2 c в отдельный файл i2c. prg, который доступен в архиве по адресу, указан ному во введении (этот файл представляет собой нечто вроде «библиотеки» в язы ках высокого уровня, только не надо воспринимать этот термин в данном контексте всерьез). Подробно рассматривать его мы не станем, т. к. он полностью соответст вует описанию протокола. В этом файле принято, что тактовая частота 4 МГц, а для приема-передачи используiотся младшие два вывода порта D (PD6 и PD7). При другой тактовой частоте и при желании изменить выводы или порт целиком, нужно внести в файл исправления (подробные указания по этому поводу - в начале файла). Файл можно включать в текст своей программы обычной директивой # include, но в определенном месте - сразу после таблицы прерываний, если она используется. Параметры передаются через регистры: в rl б (DАТА ) - данные, в YL - 1 2 С-адрес устройства, в УН - адрес внутреннего регистра, из которого производится чтение или в который осуществляется запись . Внутри еще используется регистр rl 7 ( cnt ) , который лучше не занимать для других нужд в основной программе. Беда только в том, что в разных устройствах могут иметься различия, - приведен ные в файле процедуры read_i2c и wri te_i2c годятся для устройств с однобайтовым адресом внутренних регистров (часов, датчиков). А, например, для доступа к ЕЕРRОМ-памяти с I 2 С-интерфейсом типа АТ24 эти процедуры придется править в расчете на двухбайтовый адрес . В таких отдельных случаях можно употреблять имеющиеся там же общие для всех случаев элементарные процедуры посылки и приема байта (бесхитростно названные write и react ) , а что именно посылается и куда - указывать в своей программе конкретно. Мы сейчас приведем несколько примеров, чтобы было понятнее, что к чему. И начнем с классической задачи чте ния и записи времени из часов DS 1 307 . Для примеров мы воспользуемся привыч ным ATmega8, но код можно перенести на ATmega8535 или на ATmega 1 6, имею щие большее число выводов, без каких-либо изменений. Для АTtiny23 1 3 код при годен ограниченно из-за необходимости изменения выводов порта и иногда некоторых других ограничений.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==