|
Atmega16 +dht11 |
|
|
|
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. Но это не столь важно. До тех пор, пока вы в этом не разберетесь, ничего у вас как положено не заработает ...
|
|
|
|
|
Nov 27 2014, 17:07
|
Участник

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

|
Исправил везде мс и мкс. Сейчас датчик стал отзываться, но передает ахинею, я пока тестирую только температуру (влажность всегда =0). У меня нет доступа пока к реальнйо плате по этому и моделирую в proteus'e. Fuse биты выставил как я понял из датиша следующим образом: CKSEL = 1111, SUT =01. CODE int D_1=123, D_2=456, D_3=789, D_4=012, D_5= 045; void DHT_Read_Data(){ int data[50]; int counter = 0, sum = 0, i = 0; // Очистить массив контролльных сумм data[0] = data[1] = data[2] = data[3] = data[4] = 0; DDRD.7 = 1; // делаем вывод мк выходом // Подготока шины для передачи PORTD.7 = 1; delay_ms(250); // Инициализаруем передачу PORTD.7 = 0; // прижимаем к земле не менее чем на 18 мс delay_ms(20); PORTD.7 = 1; // поднимаем и ждём реакции датчика delay_us(35); DDRD.7 = 0; // делаем выход мк входом delay_us(80);
// если всё ок, идём дальше и ждём пока датчик не подымет до 1 и не начнет передачу while( PIND.7 == 1) { delay_us(30); // ждём появления нуля на шине первый раз while (counter <= 40) // принимаем 40 бит данных { while( PIND.7 == 0) { // запускаем по битовый приём if( PIND.7 == 1) { data[counter] = 0; } delay_us(40); // если 1 держится более 28 мкс, то передаётся 1 if (PIND.7 == 1) { data[counter] = 1; } //delay_us(20); // ждём появления нуля на шине counter++; // увеличиваем счётчик на один } } } // проверяем всё
/* sum = data[0] + data[1] + data[2] + data[3]; if( sum != data[4]){ data[0] = 999; } */ D_1 = data[0]; D_1 = D_1 <<1; D_1 = D_1 | data[1]; D_1 = D_1 <<1; D_1 = D_1 | data[2]; D_1 = D_1 <<1; D_1 = D_1 | data[3]; D_1 = D_1 <<1; D_1 = D_1 | data[4]; D_1 = D_1 <<1; D_1 = D_1 | data[5]; D_1 = D_1 <<1; D_1 = D_1 | data[6]; D_1 = D_1 <<1; D_1 = D_1 | data[7]; D_3 = data[16]; D_3 = D_3 <<1; D_3 = D_3 | data[17]; D_3 = D_3 <<1; D_3 = D_3 | data[18]; D_3 = D_3 <<1; D_3 = D_3 | data[19]; D_3 = D_3 <<1; D_3 = D_3 | data[20]; D_3 = D_3 <<1; D_3 = D_3 | data[21]; D_3 = D_3 <<1; D_3 = D_3 | data[22]; D_3 = D_3 <<1; D_3 = D_3 | data[23]; D_2 = data[10]; sprintf(lcd_buffer,"d0=%i d3=%i \n%i%i%i%i%i%i%i%i",D_1, D_3, data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(100); }
Сообщение отредактировал Stiner - Nov 27 2014, 17:17
|
|
|
|
|
Nov 28 2014, 08:09
|
Участник

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

|
Цитата(kovigor @ Nov 27 2014, 22:35)  Старшие биты с младшими не перепутаны ? нет, он считывает не все такты как я понимаю или стартует не с 1 такта...
|
|
|
|
|
Dec 3 2014, 17:11
|
Участник

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

|
На реальном железе теже проблемы, осцилографа нет.
|
|
|
|
|
Dec 3 2014, 19:57
|
Участник

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

|
Вот же готовая библиотека на нормальном Си. Там STM, но с адаптацией проблем быть не должно. Ещё, для "общего развития". Там библиотека для DHT-22, они с 11 похожи. Там где-то есть маленький косяк, если нужно будет, пишите в ЛС, найду и укажу.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|