1-wire -> ПК реализация
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
1-wire -> ПК реализация
Пытаюсь реализовать 1-wire -> ПК устройство.
Ресет-присутствие реализовал.
Отправку-прием бита реализовал, но проверить не могу.
Отправляю команду READ ROM [33h], но считываю все биты как 1, то есть мне не кто не отвечает.
Ресет-присутствие реализовал.
Отправку-прием бита реализовал, но проверить не могу.
Отправляю команду READ ROM [33h], но считываю все биты как 1, то есть мне не кто не отвечает.
- Вложения
-
- main.c
- (2.92 КБ) 322 скачивания
- Реклама
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
А как проверить что я верно отправляю биты?
Может ds1821 как-нибудь характерно реагирует на какие-нибудь команды?
Может ds1821 как-нибудь характерно реагирует на какие-нибудь команды?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: 1-wire -> ПК реализация
ds1821 не реагирует на команду READ_ROM потому как не имеет этой самой ROM. вы бы определились, что у ва за датчик, чтобы разговор был предметным.
битва с дураками проиграна, победители торжествуют. слава победителям!
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
DS1821
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
Я думал это одна из тех команд на которые реагируют все 1-wire устройства
А SEARCH ROM будет реагировать?
А SEARCH ROM будет реагировать?
- Реклама
Re: 1-wire -> ПК реализация
Если внешний подтягивающий резистор установлен, то манипуляции с PORTB можно выкинуть...
PORTBx всегда 0, DDRx=1 ноль на линию, DDRx=0 1-на линию (внешний резистор подтянет).
Если внешнего нет, то может и не работать - 50кОм внутреннего могут не обеспечить фронты.
И всегда перед тем как послать в линию 0 (перед ресетом или стробом) проверяйте наличие 1 на линии.
DS1821 может быть на шине только единственным устройством, т.к. (Вам уже сказали) не имеет ROM! После RESET и ответа от датчика посылайте сразу команды:READ TEMPERATURE [AAh],START CONVERT T [EEh],STOP CONVERT T [22h],WRITE TH [01h],WRITE TL [02h],READ TH [A1h],READ TL [A2h],WRITE STATUS [0Ch],READ STATUS [ACh],READ COUNTER [A0h],LOAD COUNTER [41h]
PORTBx всегда 0, DDRx=1 ноль на линию, DDRx=0 1-на линию (внешний резистор подтянет).
Если внешнего нет, то может и не работать - 50кОм внутреннего могут не обеспечить фронты.
И всегда перед тем как послать в линию 0 (перед ресетом или стробом) проверяйте наличие 1 на линии.
DS1821 может быть на шине только единственным устройством, т.к. (Вам уже сказали) не имеет ROM! После RESET и ответа от датчика посылайте сразу команды:READ TEMPERATURE [AAh],START CONVERT T [EEh],STOP CONVERT T [22h],WRITE TH [01h],WRITE TL [02h],READ TH [A1h],READ TL [A2h],WRITE STATUS [0Ch],READ STATUS [ACh],READ COUNTER [A0h],LOAD COUNTER [41h]
— Не говорите мне что делать и я не скажу куда Вам идти...
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
Ok, учту но это пока не мешает. Резистор 4.7кЕсли внешний подтягивающий резистор установлен, то манипуляции с PORTB можно выкинуть...
Изначально я так и делал, а из-за того что сразу не зарабочало пошли эксперименты.И всегда перед тем как послать в линию 0 (перед ресетом или стробом) проверяйте наличие 1 на линии.
Блин, а это для меня новость. Значит щас нарисую чтение какого-нибудь байта памяти.DS1821 может быть на шине только единственным устройством, т.к. (Вам уже сказали) не имеет ROM! После RESET и ответа от датчика посылайте сразу команды:READ TEMPERATURE [AAh],START CONVERT T [EEh],STOP CONVERT T [22h],WRITE TH [01h],WRITE TL [02h],READ TH [A1h],READ TL [A2h],WRITE STATUS [0Ch],READ STATUS [ACh],READ COUNTER [A0h],LOAD COUNTER [41h]
md5sum, большие спасибо!
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
На запрос температуры в терминал выдает 00011110 что соответствует в десятичной 30.
На температуру слабо похоже, у нас вроде прохладней
как её высчитывают?
Код прилагаю. Кстати я со строками в си плохо. Правильно работаю или как? unsigned char *tmp="00000000"; Вроде массив указателей, не знал как длину указать, ввел нули для образца, иначе на следующую переменную наползал
После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
На температуру слабо похоже, у нас вроде прохладней
Код прилагаю. Кстати я со строками в си плохо. Правильно работаю или как? unsigned char *tmp="00000000"; Вроде массив указателей, не знал как длину указать, ввел нули для образца, иначе на следующую переменную наползал
После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
- Вложения
-
- main.c
- (3.17 КБ) 294 скачивания
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: 1-wire -> ПК реализация
Я что-то недопонял, сопряжение с ПК, или с МК?
ICQ нет, и, в ближайшее время, не будет.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: 1-wire -> ПК реализация
вы вообще откуда такую инфу черпаете? 0 в линии, паузы... бред какой-то. не пробовали изучать ДОКУМЕНТАЦИЮ - все-таки эта литература хоть доброе и вечное не сеет, но разумное - как правило... DS1820 не устанавливает в линии 0 на вермя преобразования - зарубите себе это на носу! и впредь не используйте для написания программ непроверенные СЛУХИ - только документацию производителя. во многих случаях даже переводам доверять следует с опаской.danger3466 писал(а):После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: 1-wire -> ПК реализация
А как красиво начиналось: DS1821... и вдруг используем слухи для 1820danger3466 писал(а):После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
— Не говорите мне что делать и я не скажу куда Вам идти...
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
А куда деваться если по даташиту не получается или не понимаешь, приходится черпать информацию из всех возможных источников, в том числе и чужих исходниках исходников.
Просто я давно уже думал заняться этим датчиком, еще с тех времен помню что датчику надо дать время на
преобразование температуры, в даташите не нашел такой задержки ну и понеслась моя в гугл
А про поиск датчика я глюканул потому что сначала изучал именно ds18b20, когда покупал такого не было, ну и взял 1821, одно на другое и наложилось
Да сопряжение именно с ПК, но через МК и набор команд в com-порт, не люблю реализации наподобие win-модемов
Так удобней потом работать в Linux sh/bash-скриптами, с с++ плохо дружу потому и не хочется потом на каждую платформу изобретать драйвер.
Так что с полученными данными, можно двигаться дальше, данные скорее корректно (или некорректно) получаю?
Как вам как я работаю со строками? Или так лучше не делать?
Спасибо всем откликнувшимся
Просто я давно уже думал заняться этим датчиком, еще с тех времен помню что датчику надо дать время на
преобразование температуры, в даташите не нашел такой задержки ну и понеслась моя в гугл
А про поиск датчика я глюканул потому что сначала изучал именно ds18b20, когда покупал такого не было, ну и взял 1821, одно на другое и наложилось
Да сопряжение именно с ПК, но через МК и набор команд в com-порт, не люблю реализации наподобие win-модемов
Так что с полученными данными, можно двигаться дальше, данные скорее корректно (или некорректно) получаю?
Как вам как я работаю со строками? Или так лучше не делать?
Спасибо всем откликнувшимся
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: 1-wire -> ПК реализация
по даташиту не может не получаться. а черпать из чужих источников, особенно когда "не понимаешь", не советую - вспомните братца Иванушку: дочерпался из "источников", бедолажка...danger3466 писал(а):А куда деваться если по даташиту не получается или не понимаешь
не увидел каких-то особых "трюков" в работе со строками, кроме грубых ошибок в коде и мелких ляпов типа избыточности.danger3466 писал(а):Как вам как я работаю со строками? Или так лучше не делать?
Код: Выделить всё
void USART_Send(unsigned char *data) // Отправка в USART
{
int i;
while(data[i]){
if (data == '\n')
USART_Send('\r');
while ( !( UCSRA & (1<<UDRE)) ){};
UDR = data[i];
i++;
}
}зачем функция Send если фактически используется USART_Send ?
зачем вообще городить что-то свое, если есть stdio.h ?
зачем в начале каждой функции работы с шиной 1-wire у вас одно и то же PORTB &= ~_BV(PB1); ?
а вот эти хитрости с data и command к чему вообще?!
Код: Выделить всё
void OWI_Send_command(unsigned char command)
{
unsigned char data=command;
int i;
for(i=0;i<8;i++)
{
data=data<<7; //Сдвиг на i разрядов влево
command=command>>1; //Сдвиг передаваемого байта
if(data==0x80) OWI_Send_1(); //Передача лог.1
else OWI_Send_0(); //Передача лог.0
data=command; //Новое значение для сдвига
};
}
Код: Выделить всё
void OWI_Send_command(unsigned char command)
{
unsigned char mask;
for(mask = 0x80; mask; mask >>= 1)
{
if(command & mask) OWI_Send_1(); //Передача лог.1
else OWI_Send_0(); //Передача лог.0
};
}
То, что пытаетесь разобраться самостоятельно - похвально. желаю удачи!
битва с дураками проиграна, победители торжествуют. слава победителям!
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
О, прикол, не заметил, и кстати да работает ведьвот это у вас на самом деле работает? и data == '\n' тоже?!
Код: Выделить всё
зачем функция Send если фактически используется USART_Send ?stdin пробовал, но не понравилось сколько он памяти отобрал, тогда оптимизация была O3, может потому что не O2зачем вообще городить что-то свое, если есть stdio.h ?
Для меня было не очевидным поведение этого бита, для верности сделалзачем в начале каждой функции работы с шиной 1-wire у вас одно и то же PORTB &= ~_BV(PB1); ?
Такой for вижу врервые, потому и сделал как сделала вот эти хитрости с data и command к чему вообще?!по-моему, логичнее как-то так:Код: Выделить всё
void OWI_Send_command(unsigned char command) { unsigned char data=command; int i; for(i=0;i<8;i++) { data=data<<7; //Сдвиг на i разрядов влево command=command>>1; //Сдвиг передаваемого байта if(data==0x80) OWI_Send_1(); //Передача лог.1 else OWI_Send_0(); //Передача лог.0 data=command; //Новое значение для сдвига }; }Код: Выделить всё
void OWI_Send_command(unsigned char command) { unsigned char mask; for(mask = 0x80; mask; mask >>= 1) { if(command & mask) OWI_Send_1(); //Передача лог.1 else OWI_Send_0(); //Передача лог.0 }; }
То есть boolen какой-нибудь, что там на 1 бит?почему большинство функций у вас типа int? для AVR напрасная трата ресурсов...
Так нужна задержка что бы дать датчику температуру переварить?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: 1-wire -> ПК реализация
задержка нужна. но ее величина ДОКУМЕНТИРОВАНА, хотя взятая вами величина в 800 мс подходит 
битва с дураками проиграна, победители торжествуют. слава победителям!
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
Ну так, подглядел где надоМастер Ломастер писал(а):задержка нужна. но ее величина ДОКУМЕНТИРОВАНА, хотя взятая вами величина в 800 мс подходит
Сейчас специально даташит перелистаю, за одно поищу в каком виде возвращается температура
Мастер Ломастер, посоветуете что нибудь по СИ почитать естественно применительно к МК(AVR, а можно и PIC). А то я как не увижу книжку по СИ, так она скорее напоминает мануаль по Visual Studio, а не по языку
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
Код: Выделить всё
void OWI_Send_command(unsigned char command)
{
unsigned char mask;
for(mask = 0x80; mask; mask >>= 1)
{
if(command & mask) OWI_Send_1(); //Передача лог.1
else OWI_Send_0(); //Передача лог.0
};
}- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
Так и есть оказываетсяdanger3466 писал(а):На запрос температуры в терминал выдает 00011110 что соответствует в десятичной 30.
На температуру слабо похоже, у нас вроде прохладней
С поправкой что если минусовая температура последний бид будет 1, следовательно нужно вычесть 0х80 из полученного числа если оно больше 0х80.
Как в терминал выдать из char(он же один байт?!) число в 10-тичной сис. сч., как я понимаю число "10" это два байта. Блин, stdio.h подключать придется?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: 1-wire -> ПК реализация
вам не по Си, а вообще по программированию чего-нибудь почитать... про системы счисления, например... 10 - это один байт... и -10 тоже один байт... и даже -125 - представьте себе! - тоже один. хотя временами может быть и не один, а поболее
за советами - к бригадиру, он мастер советовать, а я так, плету, сам не знаю что...
битва с дураками проиграна, победители торжествуют. слава победителям!
- danger3466
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Ср дек 21, 2011 12:18:39
Re: 1-wire -> ПК реализация
Включил stdio.h, uart занимает 1.5кб + код для 1wire 0.5 это при общем объеме в 2кб, не хватает что то около 60бМастер Ломастер писал(а):зачем вообще городить что-то свое, если есть stdio.h ?
Оптимизация O2
Есть мысли?
- Вложения
-
- main.c
- (2.49 КБ) 287 скачиваний


