1-wire -> ПК реализация

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

1-wire -> ПК реализация

Сообщение danger3466 »

Пытаюсь реализовать 1-wire -> ПК устройство.
Ресет-присутствие реализовал.
Отправку-прием бита реализовал, но проверить не могу.
Отправляю команду READ ROM [33h], но считываю все биты как 1, то есть мне не кто не отвечает.
Вложения
main.c
(2.92 КБ) 322 скачивания
Реклама
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

А как проверить что я верно отправляю биты?
Может ds1821 как-нибудь характерно реагирует на какие-нибудь команды?
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

ds1821 не реагирует на команду READ_ROM потому как не имеет этой самой ROM. вы бы определились, что у ва за датчик, чтобы разговор был предметным.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

DS1821
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Я думал это одна из тех команд на которые реагируют все 1-wire устройства
А SEARCH ROM будет реагировать?
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: 1-wire -> ПК реализация

Сообщение md5sum »

Если внешний подтягивающий резистор установлен, то манипуляции с 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]
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Если внешний подтягивающий резистор установлен, то манипуляции с PORTB можно выкинуть...
Ok, учту но это пока не мешает. Резистор 4.7к
И всегда перед тем как послать в линию 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 -> ПК реализация

Сообщение danger3466 »

На запрос температуры в терминал выдает 00011110 что соответствует в десятичной 30.
На температуру слабо похоже, у нас вроде прохладней :) как её высчитывают?
Код прилагаю. Кстати я со строками в си плохо. Правильно работаю или как? 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 -> ПК реализация

Сообщение Dmitry Dubrovenko »

Я что-то недопонял, сопряжение с ПК, или с МК?
ICQ нет, и, в ближайшее время, не будет.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

danger3466 писал(а):После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
вы вообще откуда такую инфу черпаете? 0 в линии, паузы... бред какой-то. не пробовали изучать ДОКУМЕНТАЦИЮ - все-таки эта литература хоть доброе и вечное не сеет, но разумное - как правило... DS1820 не устанавливает в линии 0 на вермя преобразования - зарубите себе это на носу! и впредь не используйте для написания программ непроверенные СЛУХИ - только документацию производителя. во многих случаях даже переводам доверять следует с опаской.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: 1-wire -> ПК реализация

Сообщение md5sum »

danger3466 писал(а):После команды EEh ds1820 вроде должен на линии 0 организовать пока не преобразует температуру, но ds1821 так себя не ведет, где то в исходниках увидел паузу на 800мкс, так и сделал.
А как красиво начиналось: DS1821... и вдруг используем слухи для 1820
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

А куда деваться если по даташиту не получается или не понимаешь, приходится черпать информацию из всех возможных источников, в том числе и чужих исходниках исходников.
Просто я давно уже думал заняться этим датчиком, еще с тех времен помню что датчику надо дать время на
преобразование температуры, в даташите не нашел такой задержки ну и понеслась моя в гугл :))

А про поиск датчика я глюканул потому что сначала изучал именно ds18b20, когда покупал такого не было, ну и взял 1821, одно на другое и наложилось :(

Да сопряжение именно с ПК, но через МК и набор команд в com-порт, не люблю реализации наподобие win-модемов :) Так удобней потом работать в Linux sh/bash-скриптами, с с++ плохо дружу потому и не хочется потом на каждую платформу изобретать драйвер.

Так что с полученными данными, можно двигаться дальше, данные скорее корректно (или некорректно) получаю?
Как вам как я работаю со строками? Или так лучше не делать?

Спасибо всем откликнувшимся :))
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 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++;
	}
}
вот это у вас на самом деле работает? и data == '\n' тоже?!

зачем функция 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
	};
}
почему большинство функций у вас типа int? для AVR напрасная трата ресурсов...

То, что пытаетесь разобраться самостоятельно - похвально. желаю удачи!
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

вот это у вас на самом деле работает? и data == '\n' тоже?!
О, прикол, не заметил, и кстати да работает ведь :)))

Код: Выделить всё

зачем функция Send если фактически используется USART_Send ?
Задел на будущее, туда планирую потом еще добавить дисплейчик
зачем вообще городить что-то свое, если есть stdio.h ?
stdin пробовал, но не понравилось сколько он памяти отобрал, тогда оптимизация была O3, может потому что не O2 :))
зачем в начале каждой функции работы с шиной 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
	};
}
Такой for вижу врервые, потому и сделал как сделал :)
почему большинство функций у вас типа int? для AVR напрасная трата ресурсов...
То есть boolen какой-нибудь, что там на 1 бит?

Так нужна задержка что бы дать датчику температуру переварить?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

задержка нужна. но ее величина ДОКУМЕНТИРОВАНА, хотя взятая вами величина в 800 мс подходит :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Мастер Ломастер писал(а):задержка нужна. но ее величина ДОКУМЕНТИРОВАНА, хотя взятая вами величина в 800 мс подходит :)))
Ну так, подглядел где надо :))
Сейчас специально даташит перелистаю, за одно поищу в каком виде возвращается температура

Мастер Ломастер, посоветуете что нибудь по СИ почитать естественно применительно к МК(AVR, а можно и PIC). А то я как не увижу книжку по СИ, так она скорее напоминает мануаль по Visual Studio, а не по языку :)) Хоть бири и ищи конкретно по с99 :tea:
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Код: Выделить всё

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
   };
}
До меня дошло что происходит в for, как я понимаю сдвиг бита слева направо, а вот битовая операция command & mask не понятна, пойду в гугли книги искать :(
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

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 -> ПК реализация

Сообщение danger3466 »

Мастер Ломастер писал(а):зачем вообще городить что-то свое, если есть stdio.h ?
Включил stdio.h, uart занимает 1.5кб + код для 1wire 0.5 это при общем объеме в 2кб, не хватает что то около 60б :evil:
Оптимизация O2
Есть мысли?
Вложения
main.c
(2.49 КБ) 287 скачиваний
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»