|
Atmega16 +dht11 |
|
|
|
Nov 24 2014, 17:15
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-04-14
Пользователь №: 81 348

|
Всем привет! Я только начинаю свой путь. Пишу в Codevisionavr 3.12. В сети кое как нашёл пример по работе с dht11, но он на прерываниях. Вся система из-за этого висит т.к. постоянно генерирует прерывание датчик. Прошу тыкнуть меня что мне нужно исправить. Большое спасибо
Сообщение отредактировал Stiner - Nov 24 2014, 17:18
Эскизы прикрепленных изображений
Прикрепленные файлы
modul.txt ( 9.36 килобайт )
Кол-во скачиваний: 120
|
|
|
|
|
 |
Ответов
|
Nov 26 2014, 10:35
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-04-14
Пользователь №: 81 348

|
Я находил сотни реализаций для Arduino, но у меня не arduino и код в codevisionavr. В связи с этим и есть проблемы. Я реализовал как смог, но не получается по этому и прошу помоши.
|
|
|
|
|
Nov 26 2014, 19:44
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-04-14
Пользователь №: 81 348

|
Цитата(kovigor @ Nov 26 2014, 14:41)  Повторю два надоедливых совета: 1. Подтяните линию данных датчика к его линии питания (резистором на 4.7КОм). 2. Откройте даташит на датчик (выше я дал на него ссылку), изучите его и напишите свою реализацию. Там работы на день, от силы. Вы на общение на форуме гораздо больше времени потратите ... 1. Подтянул, просто в схеме не отразил 2. Я написал своюй реализацию, но датчик так и молчит, не отзываясь на запрос передачи... CODE int data[5], counter = 0, sum = 0, i = 0; int D_1=123, D_2=456; void DHT_Read_Data(){ // Очистить массив контролльных сумм data[0] = data[1] = data[2] = data[3] = data[4] = 0; DDRD.7 = 0; // делаем вывод мк выходом // Подготока шины для передачи PORTD.7 = 1; delay_ms(250); // Инициализаруем передачу PORTD.7 = 0; // прижимаем к земле не менее чем на 18 мс delay_ms(25); PORTD.7 = 1; // поднимаем и ждём реакции датчика delay_ms(40); DDRD.7 = 1; // делаем выход мк входом delay_ms(60); // начинаем саму передачу if (PIND.7 ==1) { // если на выходе всё так же 1, значит датчик не ответил и мы выодим из процедуры return; } // если всё ок, идём дальше и ждём пока датчик не подымет до 1 и не начнет передачу
while( PIND.7 == 1) { delay_ms(30); // ждём появления нуля на шине первый раз while (counter <= 40) // принимаем 40 бит данных { while( PIND.7 == 0) { // запускаем по битовый приём if( PIND.7 == 1) { data[i] <<= 0; } delay_ms(40); // если 1 держится более 28 мкс, то передаётся 1 if (PIND.7 == 1) { data[i] <<= 1; } } // подсчёт значения для числа CRC if (counter < 8) i = 0; else if (counter <16) i = 1; else if (counter < 24) i = 2; else if (counter < 32) i = 3; else i = 4; counter++; // увеличиваем счётчик на один delay_ms(30); // ждём появления нуля на шине } } // проверяем всё sum = data[0] + data[1] + data[2] + data[3]; if( sum != data[4]){ data[0] = 999; } D_1 = data[0]; D_2 = data[2]; }
Сообщение отредактировал IgorKossak - Nov 26 2014, 20:06
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Nov 26 2014, 20:02
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Stiner @ Nov 26 2014, 22:44)  1. Подтянул, просто в схеме не отразил 2. Я написал своюй реализацию, но датчик так и молчит, не отзываясь на запрос передачи... У вас МК от чего тактируется ? Вы уверены, что не от внутренней RC - цепочки, а от кварца ? Я - нет. Fuse - биты запрограммированы, как надо, или оставлены по умолчанию ? Просто этот протокол весьма чувствителен к длительностям полей и битовых интервалов. А если у вас частота в N раз ниже требуемой (и ожидаемой вами), то и результат, который вы привели, вполне закономерен ...
|
|
|
|
|
Nov 27 2014, 06:38
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 12-04-14
Пользователь №: 81 348

|
Цитата(kovigor @ Nov 27 2014, 00:02)  У вас МК от чего тактируется ? Вы уверены, что не от внутренней RC - цепочки, а от кварца ? Я - нет. Fuse - биты запрограммированы, как надо, или оставлены по умолчанию ? Просто этот протокол весьма чувствителен к длительностям полей и битовых интервалов. А если у вас частота в N раз ниже требуемой (и ожидаемой вами), то и результат, который вы привели, вполне закономерен ... Fuse -биты я не трогал т.к. код написал для протеуса и там не знаю как их зашить. Я поставил на самом мк только частоту 8 мгц и работу от внешнего источника —
Сообщение отредактировал Stiner - Nov 27 2014, 07:26
|
|
|
|
|
Nov 27 2014, 09:37
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Stiner @ Nov 27 2014, 10:38)  Fuse -биты я не трогал т.к. код написал для протеуса и там не знаю как их зашить. Я поставил на самом мк только частоту 8 мгц А на самом деле, там в 8 раз меньшая частота: Цитата The device is shipped with CKSEL = ”0001” and SUT = ”10”. The default clock source setting is therefore the 1 MHz Internal RC Oscillator with longest startup time. This default setting ensures that all users can make their desired clock source setting using an In-System or Parallel Programmer. Поэтому у вас ничего и не работает. Протеус - как бы это помягче сказать .... уберите подальше. Читайте даташит, разбирайтесь с Fuse - битами и устанавливайте их (программатором, конечно же), как вам нужно. Например, я PonyProg'ом пользуюсь. Многим больше нравится AvReal. Но это не столь важно. До тех пор, пока вы в этом не разберетесь, ничего у вас как положено не заработает ...
|
|
|
|
Сообщений в этой теме
Stiner Atmega16 +dht11 Nov 24 2014, 17:15 kovigor Цитата(Stiner @ Nov 24 2014, 21:15) Прошу... Nov 25 2014, 00:09 Xenia Цитата(kovigor @ Nov 25 2014, 03:09) Если... Nov 25 2014, 00:54  kovigor Цитата(Xenia @ Nov 25 2014, 03:54) Наскол... Nov 25 2014, 09:30 Stiner Там даже не 1-wire,а какой-то свой протокол в кото... Nov 25 2014, 15:31 kovigor Цитата(Stiner @ Nov 25 2014, 19:31) Там д... Nov 25 2014, 16:07 Dust112 Stiner, поищите в инете библиотеки для Arduino по ... Nov 25 2014, 18:30 Xenia Цитата(Dust112 @ Nov 25 2014, 21:30) Stin... Nov 25 2014, 19:46  kovigor Цитата(Xenia @ Nov 25 2014, 23:46) Но что... Nov 25 2014, 20:16   Xenia Цитата(kovigor @ Nov 25 2014, 23:16) И уч... Nov 25 2014, 20:38    kovigor Цитата(Xenia @ Nov 26 2014, 00:38) Конечн... Nov 25 2014, 23:38 Dust112 Вод код позаимствованный именно из библиотеки для ... Nov 26 2014, 02:09   Timmy Цитата(Stiner @ Nov 26 2014, 22:44) 1. По... Nov 27 2014, 10:08 Stiner Исправил везде мс и мкс. Сейчас датчик стал отзыва... Nov 27 2014, 17:07 kovigor Цитата(Stiner @ Nov 27 2014, 20:07) Сейча... Nov 27 2014, 18:35  Stiner Цитата(kovigor @ Nov 27 2014, 22:35) Стар... Nov 28 2014, 08:09   kovigor Цитата(Stiner @ Nov 28 2014, 12:09) нет, ... Nov 28 2014, 08:52 Stiner На реальном железе теже проблемы, осцилографа нет. Dec 3 2014, 17:11 kovigor Цитата(Stiner @ Dec 3 2014, 21:11) На реа... Dec 3 2014, 20:07 ffs2001 Вот же готовая библиотека на нормальном Си. Там ST... Dec 3 2014, 19:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|