Главная > AVR > Еще одна реализация 1-Wire

Еще одна реализация 1-Wire

Наконец-то и я сочинил свою программную реализацию мастера шины 1-Wire. За исходниками и комментариями добро пожаловать под кат.

Недавно случай в лице школьного учителя программирования свел меня в роли помогающего с группой людей, запускающих метеозонд. Творчество юных, и все такое. Метеозонд состоит из платки на ATmega128, радиомодуля и кучки датчиков. Собственно, поскольку департамент программирования моей бывшей школы программированием железяк не занимается, этих товарищей и отправили ко мне. Датчиком температуры в том зонде работает знаменитый DS18B20. Естесственно, первым делом я предложил им нагуглить и использовать готовую библиотеку 1-Wire, после чего они отошли к работе просветленными. Однако через некоторое время оные подвижники пришли ко мне снова со словами «не компилится». «Фигня вопрос!» — подумал я. — «Наверное, что-то не задефайнили в заголовочниках», и начал ковырять библиотеку сам. Поковырял, правда не компилится. Поковырял еще, еще… В общем, сточив напильник до основания я решил, что самый лучший велосипед — велосипед, собранный самостоятельно, и решил написать модуль 1-Wire сам. Да и мне давно хотелось просто так поковыряться с этим протоколом, чисто для души.

Итак, я написал его, модуль 1-Wire моей мечты. Он состоит из двух частей. Битовые функции (послать/прочитать бит, сгенерировать PRESENCE) реализованы на православном ассемблере (внутренняя функция задержки тоже написана самостоятельно). Вторая часть — функции приема/передачи байт, они писаны на С. Используется стандартный модуль проверки CRC из поставки WinAVR. Исходники обильно прокомментированы.

Модуль написан под AVR Studio + AVR-GCC.

owbitfunc.h содержит:

#define F_CPU_MHz    8

— частота процессора в мегагерцах. F_CPU/1000000UL не прокатит, ассемблер не понимает суффикса UL, который присутствует в макросе F_CPU. Реализация работоспособна в интервале тактовых частот от 5 до 12МГц.

#define OW_PORT        PORTB
#define OW_DDR        DDRB
#define OW_PIN        PINB

— на каком порту будет реализован 1-Wire

#define OW_BUSMSK    (1<<PB0)

— битовая маска ножки, которая будет портом 1-Wire

uint8_t OW_Presence(void);

— генерирует RESET и проверяет присутствие устройства. Возвращает 0 если PRESENCE не обнаружен, 0xFF если обнаружен.

void _ow_send_1(void);
void _ow_send_0(void);
uint8_t _ow_receive_bit(void);

— собственно, сами битовые функции. Последняя возвращает 0 если принят 0, 0xFF если принята 1.

owbytefunc.h содержит:

void OW_InitBus(void);

— инициализация порта 1-Wire.

void OW_WriteByte(uint8_t byte);
uint8_t OW_ReadByte(void);

— прочитать/записать байт.

uint8_t OW_ReadRom(uint8_t rom_addr[8]);

Читает адрес устройства в массив rom_addr и заодно проверяет его CRC. Если все хорошо — возвращает 1, если не особо — 0.

Для определения PRESENCE и приема бит использован немного нестандартный подход. Чаще всего это делается так: программа выдает импульс в шину, потом ждет определенное время, потом читает значение. Я же многократно проверяю шину в границах заданного временного интервала, ожидая именно бит данных. Это повышает устойчивость программы к разбросу таймингов устройств 1-Wire. Интересующиеся могут почитать ассемблерный исходник, он обильно прокомментирован.

Отладка и тестирование производились на уже знакомой читателям макетке с ATmega48 с тестовой программой для считывания ключей iButton, поскольку это единственное 1-Wire устройство, которое у меня есть. Программа читает серийный номер, преобразует его в строку и отсылает через UART.

Я положил в два архива тестовый проект и отдельно модуль. Файлы модуля нужно просто добавить в проект, после чего подключить owbytefunc.h.

Рубрики:AVR
  1. Комментариев нет.
  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s