Но тут меня ожидала засада не получается сделать счет секундных импульсов таймером TIM1_COMPA Очевидно дело в настройке задержками тут я потратил много времени но все пока впустую, эта часть кода что для меги 8 измерения производит, но не больше.... добавить какие либо функции в программу больше не получается, DHT11 уходит в ступор... Подскажите что в энтом коде можно сделать так чтобы он работал более стабильно (как например ds18b20), или укажите на еще какойнибудь благополучный пример использования DHT11 в CodeVisionAV....
Прошу, кто разбирается помочь, переложить этот код для CodeVisionAVR. DHT.C Спойлер
Код:
/* DHT-11 Library (c) Created by Charalampos Andrianakis on 18/12/11.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "DHT.h"
uint8_t DHT_Read_Data(uint8_t select){
//data[5] is 8byte table where data come from DHT are stored //laststate holds laststate value //counter is used to count microSeconds uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0;
//Prepare the bus DDR(DHT_PORT) |= _BV(DHT_PIN); //Set pin Output DHT_PORT |= _BV(DHT_PIN); //Pin High _delay_ms(250); //Wait for 250mS
//Send Request Signal DHT_PORT &=~_BV(DHT_PIN); //Pin Low _delay_ms(20); //20ms Low
DHT_PORT |= _BV(DHT_PIN); //Pin High _delay_us(40); //40us High
//Set pin Input to read Bus DDR(DHT_PORT) &=~_BV(DHT_PIN); //Set pin Input
laststate=DHT_Read_Pin; //Read Pin value
//Repeat for each Transistions for (i=0; i<MAXTIMINGS; i++) { //While state is the same count microseconds while (laststate==DHT_Read_Pin) { _delay_us(1); counter++; }
//laststate==_BV(DHT_PIN) checks if laststate was High //ignore the first 2 transitions which are the DHT Response if (laststate==_BV(DHT_PIN) && (i > 2)) { //Save bits in segments of bytes //Shift data[] value 1 position left //Example. 01010100 if we shift it left one time it will be //10101000 data[j/8]<<=1; if (counter >= 40) { //If it was high for more than 40uS data[j/8]|=1; //it means it is bit '1' so make a logic } //OR with the value (save it) j++; //making an OR by 1 to this value 10101000 } //we will have the resault 10101001 //1 in 8-bit binary is 00000001 //j/8 changes table record every 8 bits which means a byte has been saved //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 laststate=DHT_Read_Pin; //save current state counter=0; //reset counter
} sei(); //Enable interrupts
//Check if DHT-11 is connected if (data[0]==0 && data[1]==0 && data[2]==0 && data[3]==0) { uart_puts("\r\nDHT not pluged!"); return(-1); } //Check if data received are correct by checking the CheckSum if (data[0] + data[1] + data[2] + data[3] == data[4]) { if (select==DHT_Temp) { //Return the value has been choosen return(data[2]); }else if(select==DHT_RH){ return(data[0]); } }else{ uart_puts("\r\nCheck Sum Error"); }
}
DHT.h Спойлер
Код:
/* DHT-11 Library (c) Created by Charalampos Andrianakis on 18/12/11.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include <stdlib.h> #include <avr/io.h> #include <util/delay.h>
//DHT Pin and Port #define DHT_PORT PORTC #define DHT_PIN 0
//The packet size is 40bit but each bit consists of low and high state //so 40 x 2 = 80 transitions. Also we have 2 transistions DHT response //and 2 transitions which indicates End Of Frame. In total 84 #define MAXTIMINGS 84
//Select between Temp and Humidity Read #define DHT_Temp 0 #define DHT_RH 1
Garin, у Вас отсутствует понимание на физическом уровне того, что Вы делаете, подсказки как бы не помогут, нужно систему строить именно в голове... В Вашем распоряжении прекрасный компилятор, хм... который, правда, не обновлялся с 2010 года - ну кто-то поправьте меня, если я не прав - какой на фиг кодевижин.... Какой смысл под кодевижин хоть что-то портировать... Кодевижин пусть у вас стоит на компе - только как генератор начального кода - все...
urry действительно подсказки мне не очень то и понятны. Особенно здесь, когда это все связано с прерываниями. Кодевижин для меня это все таки весчь, по нему есть много готовых проектов, у меня ведь любительский уровень, а с ним как то сразу получилось у меня , так сказать "управлять МК". сделал термометр ,таймер, вольтметр (естественно все сделал из других кусков программ, у самого ума не хватило бы сделать с полного нуля...) Да вот незадача , есть эти неплохие детальки DHT11 , только смотрю в основном их прикручивают к аrduino ( аrduino перспективен ?) , а в CodeVisionAVR очевидно есть пробел с применением таких датчиков (точнее их применяют, но наверное проекты коммерческие((() а написать для этого датчика протокол Wire эт наверное не каждому любителю по силам , тут ведь знания нужны, а знания как известно добываются трудом.... вот и нет у меня понимания, так как не учился и не практиковался (кстати для меня в программировании очень интересная математика, это не просто скучные числа 12345... а все числа имеют имена, для меня такая математика стала очень интересна, не знаю поймете ли вы мою мысль правильно , но это ж из ваших цитат " не стреляйте в пианиста он играет как может"....) (esli chestno, sam ja schitaju , chto nekotoryh sledovalo-by OTSTRELIT''!, chtoby ne muchalis')...)))))))
oleg110592 с вашим примером пока ничего не могу сделать, не получается вывод данных в основной цикл, и далее на ЖКИ (USART не нужен) Вот примерно так ... Спойлер
Код:
/***************************************************** CodeWizardAVR V2.04.4a Advanced Date : 29.12.2012 Chip type : ATmega8 AVR Core Clock frequency: 4,000000 MHz *****************************************************/
//data[5] is 8byte table where data come from DHT are stored //laststate holds laststate value //Счетчик используется для подсчета микросекунд uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0;
//Подготовкаthe bus DDR_DHT_PORT |= _BV(DHT_PIN); //Set pin Output DHT_PORT |= _BV(DHT_PIN); //Pin высокой delay_ms(250); //Wait for 250mS
//Send Request Signal DHT_PORT &=~_BV(DHT_PIN); //Pin Низкая delay_ms(20); //20ms Low
DHT_PORT |= _BV(DHT_PIN); //Pin высокой delay_us(40); //40us высокой
//Set pin ввода to read Bus DDR_DHT_PORT &=~_BV(DHT_PIN); //Set pin Input
laststate=DHT_Read_Pin; //Чтение значенияPin value
//Repeat for each Transistions for (i=0; i<MAXTIMINGS; i++) { //While state is the same count microseconds while (laststate==DHT_Read_Pin) { delay_us(1); counter++;
}
//laststate==_BV(DHT_PIN) checks if laststate was High //ignore the first 2 transitions which are the DHT Response if (laststate==_BV(DHT_PIN) && (i > 2)) { //Save bits in segments of bytes //Shift data[] value 1 position left //Example. 01010100 if we shift it left one time it will be //10101000 data[j/8]<<=1; if (counter >= 40) { //If it was high for more than 40uS data[j/8]|=1; //it means it is bit '1' so make a logic } //OR with the value (save it) j++; //making an OR by 1 to this value 10101000 } //we will have the resault 10101001 //1 in 8-bit binary is 00000001 //j/8 changes table record every 8 bits which means a byte has been saved //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 laststate=DHT_Read_Pin; //save current state counter=0; //сброс счетчика
} #asm("sei"); //Разрешить прерывания
// //Check if DHT-11 is connected // if (data[0]==0 && data[1]==0 && data[2]==0 && data[3]==0) { // putsf("\r\nDHT not pluged!"); //не подключен // return(-1); // } // //Check if data received are correct by checking the CheckSum // if (data[0] + data[1] + data[2] + data[3] == data[4]) { // if (select==DHT_Temp) { //Return the value has been choosen // return(data[2]); // }else if(select==DHT_RH){ // return(data[0]); // } // }else{ // putsf("\r\nCheck Sum Error"); //Ошибка контрольной суммы // }
} void main(void) {
ACSR=0x80; SFIOR=0x00;
// LCD module initialization lcd_init(16);
// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 //UCSRA=0x00; //UCSRB=0x08; //UCSRC=0x86; //UBRRH=0x00; //UBRRL=0x67;
Мм-да, не в ту степь у меня пока все получается, на днях посылку жду hih-4000 пришлют, по поводу sht, к сожалению у меня отсутствует начисто талант что либо изобретать, пока придется довольствоваться рерайтингом, копирайтингом буду по типу фрилансера....... И спасибо всем кто принял участие в обсуждении этой темы.
Как таковой схемы нет, "метеостанция" сделана на базе матричных часов JY-MCU 3208 с деалэкстрима. DHT11 подключен к PC2, датчик давления BMP085 - к аппаратному i2c. Тактирование от внутреннего генератора на 1 МГц.
интересное дело, у меня он тоже отказался работать в общем цикле, зависал контроллер на обращении к датчику. Два варианта, или кидать функцию в прерывание или в основном цикле останавливать цикл #asm("cli") выполнять функцию и запускать дальше. Датчик прикручен к этим часам
прошу прощения, вопрос не по теме, касательно BMP085, показания датчика не соответствуют действительности, давление 1050-1065, температура 118. где-то у меня косяк или все таки в коде?
Посмотрел на стену, да нет - 751 мм. Дело в том, что каждый датчик индивидуально калибруют, коэффициенты заносят ему в память. Мне было влом писать проверки, переписывать их в епром и т.д. Я их считал один раз и вбил прямо в коде как константы. Если оперативку не жалко можете считывать их каждый раз из датчика.
А показания меняются от нагревания, скажем? Допускаю, что компиляторы по разному где-то интерпретируют - там в формулах куча отрицательных значений, оаперации с разными типами... ужос. В даташите на датчик есть диаграмма вычислений с цифрами. Попробуйте забить их и посмотреть как считает прога. Я когда отлаживал, тоже каких только давлений не видел) Но выложенный код у меня работает, релиз так сказать.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения