![]() |
Модераторы: PILOT, ManiaK, Mazzi |
![]() ![]() ![]() |
|
bend |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 2.3.2009 Репутация: нет Всего: нет |
Работаю в Linux. Собрал stk200, все работает отлично, прошивает. Собрал из сырцов avr-gcc. Пытаюсь сделать термометр с 1-wire шиной.
Прикрутил дисплэй от 3310 для вывода информации. Почитал про ds18s20, навоял некоторый код на с++, проблема в том что после "сброса" датчик отвечает "что мол я есть" ![]() я не силен в с++, в инете много примеров но они не всегда совместимы с gcc компилятором как я понял... Подскажите в чем может быть проблема? Тактовая частота CPU 1Мгерц процедура сброса. датчик висит на порту С на 2 пине. void wire_reset (void){ LcdGotoXY ( 1, 1); DDRC|=(1<<2); PORTC &= ~_BV(PD2); _delay_ms(0.480); DDRC&=~(1<<2); _delay_ms(0.06); if(bit_is_clear(PINC,2)){ LcdStr(1,"DS1820 found"); } else { LcdStr(1,"Bus ERROR"); } LcdUpdate(); DDRC&=~(1<<2); _delay_ms(0.500); // процедура нормально работает, видно что датчик живой и отвечает. } =================================запись байта================== void OneWireWriteByte(unsigned char data) { unsigned char i; for (i=0;i<=7;i++) { DDRC |= (1<<2); //set port to output if (data & 0x01) { PORTC &= ~_BV(PD2); // send 1 _delay_ms(0.007); // начало таймслота DDRC &= ~(1<<2); //set port to input _delay_ms(0.120); } else { PORTC &=~ _BV(PD2); // send 0 _delay_ms(0.125); DDRC &= ~(1<<2); //set port to input _delay_ms(0.01); } data>>=1; } DDRC &= ~(1<<2); //set port to input _delay_ms(1); } =================================================чтение байта=================== void OneWireReadByte(void) { unsigned char data = 0; unsigned char i; for (i=0;i<=7;i++) { DDRC |= (1<<2); //set port to out PORTC &= ~_BV(PD2); // out 0 start timeslot _delay_ms(0.006); // начало таймслота DDRC &=~(1<<2); //set port to input _delay_ms(0.008); // чтение бита через 14-16 мкс от начала таймслота data>>=1; if(bit_is_clear(PINC,2)){ data &= 0x7f; LcdStr(1,"0"); } else { data |= 0x80; LcdStr(1,"1"); } _delay_ms(0.120); } return data; DDRC&=~(1<<2); LcdUpdate(); } В результате после OneWireWriteByte(0xCC); OneWireWriteByte(0x44); //тут пробовал разные команды OneWireReadByte(); Читаються одни 11111111 Подскажите где ошибки? Это сообщение отредактировал(а) bend - 5.3.2009, 05:37 |
|||
|
||||
Mazzi |
|
||||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
нужно сделать вот так
Удачи! -------------------- Мне нужны помощники. |
||||
|
|||||
bend |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 2.3.2009 Репутация: нет Всего: нет |
Да, большое спасибо за подсказку, но в итоге сам доковырял.
![]() получились десятичные числа 118, 62, 55, 51, раз младший бит это 0.5 градуса то я просто поделил значение попалам, в итоге получилось после нагрева спичкой 59, 31, 27.5, 25.5, ну думаю что 25.5 градусов это моя комнатная температура что вполне соотвествует реальности... Правельно ли я сделал пересчет? |
|||
|
||||
Mazzi |
|
|||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Расчёт сделал правИльно.
![]() -------------------- Мне нужны помощники. |
|||
|
||||
bend |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 2.3.2009 Репутация: нет Всего: нет |
Вот теперь очередной стопор, не получаеться переделать char или int в string :(
В линуксе походу типа string нету... А переделать с помощью sprintf не получаеться вот такой код: unsigned int TL=285; //(ну типа 28.5 градусов) unsigned char al_s[6]; //тут непонятно какая длина поидее int 0..65535 т.е. 5 символов всего + #0 вконце? Эх как же было хорошо в PERL все можно ![]() sprintf(al_s, "%d", TL); avrledtest.c:138: warning: implicit declaration of function 'sprintf' avrledtest.c:138: warning: incompatible implicit declaration of built-in function 'sprintf' avrledtest.c:138: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness Может есть какой-нить простой и универсальный способ перевести int в string? |
|||
|
||||
Mazzi |
|
|||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Я пользуюсь этим:
-------------------- Мне нужны помощники. |
|||
|
||||
bend |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 2.3.2009 Репутация: нет Всего: нет |
sprintf не заработал, зато заработал atoi.
![]() + +++++++++ +++++++++++ ======DS18S20=========DS18S20=========DS18S20=========DS18S20=====+ Atmega8 +=== + LCD3310 + ++++++++++ +++++++++++ Нужно дать RESET, получить ответ, дать 0xCC, 0x44, подождать... (все датчики сформируют температуру), и потом поочереди считать каждый датчег. Выборка должна видимо быть такой -Команда RESET, потом MATCH ROM (0x55), потом передать 8 байт, адреса конкретного устройства(датчега) 8 байт это 1байт класс устройства, 6 байт номер, 1 байт CRC, Веселые ребята писали это протокол ![]() Затем дать команду на считывание температуры 0x44 и принять данные. Вобщем подключил я 1 датчик, дал команду 0x33,( READ ROM), и узнал тем самым серийный номер из 8 байт. Впринципе можно сделать так для каждого датчика, но наверняка есть какой-то способ "опрашивать" шину на предмет всех устройств? ![]() ![]() |
|||
|
||||
Mazzi |
|
|||
![]() Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Давай адрес в личку, укажи по поводу чего пишешь, пришлю тебе исходник с реализацией всего.
-------------------- Мне нужны помощники. |
|||
|
||||
AntonGr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 8.6.2009 Репутация: нет Всего: нет |
Возможно вопрос немного не в тему, но около того, поэтому решил не открывать новую тему. Разбираюсь с работой датчиков DS18S20 через преобразователь интерфейсов 1-Wire/RS232 U9097. Код программы пишу на C++ (под Windows). Приложение у меня многопоточнои, и вот я заметил, что при одновременной работе трех потоков одни из датчиков (второй) считывает температуру -43. Находятся датчики всегда правильно и по количеству и по номеру, а вот ошибка в температуре проскакивает. Я понимаю, что где-то проблема с задержками, вызванная квазипараллелизмомо работы потоков, но пока не хватает тяму сообразить самому, может подскажите, в какую сторону лучше копать...
|
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 8 Всего: 99 |
AntonGr, код выложи...
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
AntonGr |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 8.6.2009 Репутация: нет Всего: нет |
Вот код. За основу взят пример создания компьютерного термометра. Уже не помню где нашел.
thread_temp - файлы определяющие основную функцию потока temp - функции поиска устройств и чтения температур ownet - сами функции работы с 1-wire Присоединённый файл ( Кол-во скачиваний: 34 ) ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |