|
Atmega328P и DS18B20 в фоновом режиме |
|
|
|
Nov 28 2011, 03:53
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Всем привет,
имеется атмега328п, хочется к ней прикрутить несколько, от одного до четырех, датчиков температуры DS18B20 по 1-wire. Незадачка в том, что эта атмега должна в реальном времени выполнять кучу другой работы, которую нельзя прерывать 100мкс-750мс ожиданиями протокола 1-wire.
В то же время, как я понимаю из прочтения исходников протокола общения с этими датчиками, большую часть времени микроконтроллер должен ждать.
Возникает идея, что этот протокол может быть реализован на прерываниях таймера и int0 (я могу повесить 1-wire на эту ножку) и практически не занимать время процессора, но программировать это может быть довольно не тривиально.
Скажите, пожалуйста, может кто-то уже такое запрограммировал, и такие исходники существуют в сети? Если да, тыкните, пожалуйста, пальцем где скачать. Если нет, может я в чем-то ошибаюсь и это не так просто, как мне кажется?
Знаю, что есть еще решение - поставить на плату тиньку или еще одну ардуину, которая будет 100% занята опросами этой температуры, но очень не хотелось бы это делать.
Спасибо
ИИВ
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 24)
|
Dec 8 2011, 19:46
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 22-01-10
Из: Kiev
Пользователь №: 55 001

|
А у кого опыт паразитного питания? Какие основные моменты? Вот, думаю, что лучше уменьшить разрядность? Или при единственном датчике на линии это не имеет значения? Кто-то утверждал, что на паразитном питании получает лучшие результаты по длине кабеля, чем при постоянном питании. Как это может быть?
|
|
|
|
|
Dec 13 2011, 17:06
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 22-01-10
Из: Kiev
Пользователь №: 55 001

|
"Время заряда давать не менее 800-900мс" ---------------------------------------------------- Вы имеете в виду выдержку в "1 = +5В" после команды СТАРТ?
|
|
|
|
|
Dec 13 2011, 17:36
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Так будет понятнее CODE ds_start: // andi flags,0xFC // чистим флаги rcall ds_reset // сброс cli // выключаем прерывания ldi tmp, 0x55 // соответствие ROM rcall ds_write // push zl // сохраняем адрес серийника push zh // rcall send_serial // посылаем 8 байт 1 код устройства 6 серийный номер 1 црц pop zh // восстанавливаем адрес серийника pop zl // ldi tmp, 0x44 // Посылаем команду конвертировать температуру rcall ds_write // sbi dal_port,ds_p sbi dal_ddr,ds_p sei // cbi portb,load // Load -> 0 rcall wait_075s // даем еденицу для конвертирования температуры минимум 800-900 мс ( о чем я говорил ) rcall ds_reset // cli // ldi tmp, 0x55 // соответствие ROM rcall ds_write // rcall send_serial // ldi tmp, 0xBE // Посылаем команду что сейчас будем читать датчик rcall ds_write // sei ldi xl,65 // Ждем 50 мкс rcall wait // cli rcall ds_read // читаем 12 бит cbi dal_port,ds_p sbi dal_ddr,ds_p // RESET Dallas ставим 0 чтоб избежать саморазогрев датчика rcall ds_bcd // ds_ok: // sei // ret // Выход из подпрограммы
send_serial: // Посылаем 8 байт серийного номера в датчик DS18B20 // Адрес строки предварительно загружаем в Z ldi loop2,8 // send_c: // lpm tmp,Z+ // rcall ds_write // dec loop2 // brne send_c // ret //
|
|
|
|
|
Dec 13 2011, 22:52
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 22-01-10
Из: Kiev
Пользователь №: 55 001

|
Понятно, спасибо, Павлик!
Сообщение отредактировал usav - Dec 13 2011, 22:52
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|