Re: Всё по DS18(B/S)20.
Добавлено: Пт сен 26, 2014 08:48:14
Не проще ли просто взять DS1821? Её даже с компа можно запрограммировать.
Спасибо, но этих датчиков у нас нет. Да и железка собрана уже...Gudd-Head писал(а):Не проще ли просто взять DS1821?
Покажите где вы такой бред вычитали.Freerider писал(а):после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование
А мне казалось, просто дёргаешь линию — и если датчик не дёрнул в ответ, то преобразование закончилось.uldemir писал(а):Т.е. посылаешь 00100010
Сей бред тут http://open.e-voron.dp.ua/wp-content/up ... 20-rus.pdf.Gudd-Head писал(а):Покажите где вы такой бред вычитали.Freerider писал(а):после отправки команды 0x44 (Конвертирование температуры) датчик должен линию опустить в ноль пока датчик выполняет температурное преобразование
не надо доёбываться до слов. Посылаешь 00100010 - это команда 0х44 - конвертирование температуры. Если "просто" дёргать шину - вообще нифига не будет. Это работает только сразу после команды конвертирования. Иначе, как бы другие устройства на шине могли бы работать?Gudd-Head писал(а):А мне казалось, просто дёргаешь линию — и если датчик не дёрнул в ответ, то преобразование закончилось.uldemir писал(а):Т.е. посылаешь 00100010
Кстати, в даташите так и написано:Freerider писал(а):Сей бред тут http://open.e-voron.dp.ua/wp-content/up ... 20-rus.pdf.
т.е. надо посылать "временные интервалы считывания", а не проверять состояние линии.после посылки команды Convert T мастер может посылать временные интервалы считывания и DS18B20 ответят, выдавая 0 во время преобразования температуры,
Ну, значит мы друг друга недопоняли.uldemir писал(а):Посылаешь 00100010 - это команда 0х44 - конвертирование температуры.
трудности перевода... Вы же читаете температуру? ну вот так же и надо посылать команды чтения. Я их называю слот чтения (который ничем не отличается от слота записи лог.1).Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
Я делал так:Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
Да просто хотелось не тупить с задержкой а опрашивать датчик чтоб как только так сразу его считыватьshads писал(а):Я делал так:Freerider писал(а):Тогда вопрос про "временные интервалы считывания" сколько они по времени должны быть
раз в секунду по таймеру читаю данные температуры предыдущего замера, и тут же посылаю команду на следующее преобразование, выхожу из обработчика до следующего прерывания.
И все... одно отвлечение в секунду и переменная температуры всегда актуальна....
А смысл какой? Для скоростных применений этот датчик не подходит... а для визуального отображения температуры - нет смысла чаще одного раза в сек менять показания... да и программа меньше становится, если в прерывании по таймеру просто поднять флаг, а в основном цикле опрашивать этот флаг и инитить обмен...Freerider писал(а):как только так сразу его считывать
Код: Выделить всё
#define ONEWIRE_PORT PORTC
#define ONEWIRE_DDR DDRC
#define ONEWIRE_PIN PINC
#define ONEWIRE_PIN_NUM 0 //нога PC1 N22
inline void onewire_low() {// Устанавливает низкий уровень на шине 1-wire
ONEWIRE_DDR |= (1<<ONEWIRE_PIN_NUM);
}
inline void onewire_high() {// "Отпускает" шину 1-wire
ONEWIRE_DDR &= ~(1<<ONEWIRE_PIN_NUM);
}
inline uint8_t onewire_level() {// Читает значение уровня на шине 1-wire
return ONEWIRE_PIN & (1<<ONEWIRE_PIN_NUM);
}
// Определения и функции ниже нужны только если требуется "сильный" подтягивающий резистор
#define ONEWIRE_STRONG_DDR DDRC
#define ONEWIRE_STRONG_PORT PORTC
#define ONEWIRE_STRONG_PIN_NUM 1 //нога PC1 N23
void onewire_strong_enable() {// включение "сильной" подтяжки
ONEWIRE_STRONG_PORT |= (1<<ONEWIRE_STRONG_PIN_NUM);// Для исключения низкого уровня на шине, сначала изменяется регистр значения
ONEWIRE_STRONG_DDR |= (1<<ONEWIRE_STRONG_PIN_NUM);// затем - регистр направления
}
void onewire_strong_disable() {// отключение "сильной" подтяжки
ONEWIRE_STRONG_DDR &= ~(1<<ONEWIRE_STRONG_PIN_NUM);// Для исключения низкого уровня на шине, сначала изменяется регистр направления
ONEWIRE_STRONG_PORT &= ~(1<<ONEWIRE_STRONG_PIN_NUM);// затем - регистр значения
}
// Выдаёт импульс сброса (reset), ожидает ответный импульс присутствия.
// Если импульс присутствия получен, дожидается его завершения и возвращает 1, иначе возвращает 0
uint8_t onewire_reset(){
onewire_low(); //проваливает уровень
_delay_us(640); // Пауза 480..960 мкс
onewire_high(); // поднимает в единицу
_delay_us(2); // Время необходимое подтягивающему резистору, чтобы вернуть высокий уровень на шине
for (uint8_t c = 80; c; c--) {// Ждём не менее 60 мс до появления импульса присутствия;
if (!onewire_level()) {
// Если обнаружен импульс присутствия, ждём его окончания
while (!onewire_level()) { } // Ждём конца сигнала присутствия
return 1;
}
_delay_us(1);
}// for (uint8_t c = 80; c; c--) {// Ждём не менее 60 мс до появления импульса присутствия;
return 0;
}
int main(void){
while(1)
{
_delay_us(4000);
onewire_reset();
};
}