| Форум РадиоКот https://radiokot.ru/forum/ |
|
| DHT11 трудности использования в CodeVisionAVR https://radiokot.ru/forum/viewtopic.php?f=61&t=82040 |
Страница 1 из 2 |
| Автор: | Garin [ Чт дек 13, 2012 13:08:13 ] |
| Заголовок сообщения: | DHT11 трудности использования в CodeVisionAVR |
Здравствуйте, пытаюсь сделать программу для вентилятора в санузле. Нашел в сети код для тини 2313 СпойлерКод: /***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 29.07.2011 Author : Company : Comments: Chip type : ATtiny2313 Clock frequency : 8,000000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 32 *****************************************************/ #include <tiny2313.h> #include <delay.h> #define dht_dpin 3 char bGlobalErr; char dht_dat[5]; char dht_in; flash char znak[]={63,6,91,79,102,109,125,7,127,111,0,99,57,118}; char cyf=1; char out[]={0,0,0,0}; char des=0, ed=0; char fase=0; void InitDHT(void); void ReadDHT(void); char read_dht_dat(); char hex2dec(char); // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { cyf=cyf*2; if (cyf==16) cyf=1; if (fase==0){ switch (cyf) { case 1: PORTB=~znak[12]; PORTD.0=1; PORTD.3=0; break; case 2: PORTB=~znak[11]; PORTD.1=1; PORTD.0=0; break; case 4: PORTB=~znak[out[2]]; PORTD.2=1; PORTD.1=0; break; case 8: PORTB=~znak[out[3]]; PORTD.3=1; PORTD.2=0; break; } } else { switch (cyf) { case 1: PORTB=~znak[out[0]]; PORTD.0=1; PORTD.3=0; break; case 2: PORTB=~znak[out[1]]; PORTD.1=1; PORTD.0=0; break; case 4: PORTB=~znak[10]; PORTD.2=1; PORTD.1=0; break; case 8: PORTB=~znak[13]; PORTD.3=1; PORTD.2=0; break; } } } // Standard Input/Output functions #include <stdio.h> // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0x80; DDRB=0x7F; PORTD=0x7F; DDRD=0x0F; UCSRA=0x00; UCSRB=0x00; UCSRC=0x00; UBRRH=0x00; UBRRL=0x00; TCCR0A=0x00; TCCR0B=0x03; TCNT0=0x00; TIMSK=0x02; #asm("sei") InitDHT(); delay_ms(1000); while (1) { #asm("cli") PORTB=0xFF; fase=1-fase; ReadDHT(); #asm("sei") if (bGlobalErr==0) { hex2dec(dht_dat[2]); out[3]=des; out[2]=ed; hex2dec(dht_dat[0]); out[1]=des; out[0]=ed; } else { out[0]=10; out[1]=10; out[2]=10; out[3]=10; } delay_ms(3000); }; } void InitDHT(void) { DDRD.6=1; PORTD.6=1; } void ReadDHT(void) { char dht_check_sum; char i = 0; bGlobalErr=0; PORTD.6=0; delay_ms(23); PORTD.6=1; delay_us(40); DDRD.6=0; delay_us(40); dht_in=PIND.6; if(dht_in) { bGlobalErr=1; return; } delay_us(80); dht_in=PIND.6; if(!dht_in) { bGlobalErr=2; return; } delay_us(80); for (i=0; i<5; i++) dht_dat[i] = read_dht_dat(); DDRD.6=1; PORTD.6=1; dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3]; if(dht_dat[4]!= dht_check_sum) {bGlobalErr=3;} }; char read_dht_dat() { char i = 0; char result=0; for(i=0; i< 8; i++) { while(PIND.6==0); delay_us(30); if (PIND.6==1) result |=(1<<(7-i)); while (PIND.6==1); } return result; } char hex2dec(char num) { char result=0; char hex=num; des=0; ed=0; while (hex>9) { hex=hex-10; des=des+1; } ed=hex; result=((des<<4)|ed); return result; } Попытался его переложить для меги8 и ЖКИ СпойлерКод: #include <mega8.h> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <stdio.h> #include <delay.h> unsigned char dht_dat[5]; unsigned char H0=0, T2 =0; unsigned char H1=1, T3 =3; unsigned char read_dht_dat(); void InitDHT(void) { DDRD.3=1, PORTD.3=1; } void ReadDHT(void) {unsigned char RD = 0; PORTD.3=0; delay_ms(23); PORTD.3=1; delay_us(40); DDRD.3=0; delay_us(200); for (RD=0; RD<5;RD++) dht_dat[RD] = read_dht_dat(); DDRD.3=1; PORTD.3=1; }; char read_dht_dat() { unsigned char res = 0; unsigned char result=0; for(res=0; res< 8; res++) { while(PIND.3==0); delay_us(30); if (PIND.3==1) result |=(1<<(7-res)); while (PIND.3==1); } return result; } interrupt [TIM0_OVF] void timer0_ovf_isr(void) { } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // TCNT1H=0; // TCNT1L=0; } void main(void) { PORTB=0b00000000; DDRB=0b00000000; PORTC=0b00000000; // DDRC=0b00000000; PORTD=0b00000000; // DDRD=0b00000000; TCCR0=0x00; TCNT0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x1E; OCR1AL=0x85; OCR1BH=0x00; OCR1BL=0x00; MCUCR=0x00; TIMSK=0x11; ACSR=0x80; SFIOR=0x00; lcd_init(16); InitDHT(); delay_ms(100); lcd_gotoxy(0,0); lcd_putsf(" error "); // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/2048k #pragma optsize- WDTCR=0x1F; WDTCR=0x0F; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif #asm("sei") while (1) { // #asm("wdr"); //Сбрасываем счетчик WDT ReadDHT(); H0= dht_dat[0]; T2= dht_dat[2]; H1-- ; // инкрементирруем T3++; lcd_gotoxy(0,0); lcd_putsf("T2="); lcd_putchar((T2/100)%10+0x30); lcd_putchar((T2/10)%10+0x30); lcd_putchar(T2%10+0x30); lcd_putsf(" T3="); lcd_putchar((T3/100)%10+0x30); lcd_putchar((T3/10)%10+0x30); lcd_putchar(T3%10+0x30); lcd_gotoxy(0,1); lcd_putsf("H0="); lcd_putchar((H0/100)%10+0x30); lcd_putchar((H0/10)%10+0x30); lcd_putchar(H0%10+0x30); lcd_putsf(" H1="); lcd_putchar((H1/100)%10+0x30); lcd_putchar((H1/10)%10+0x30); lcd_putchar(H1%10+0x30); delay_ms(200); }; } Но тут меня ожидала засада не получается сделать счет секундных импульсов таймером TIM1_COMPA Очевидно дело в настройке задержками тут я потратил много времени но все пока впустую, эта часть кода что для меги 8 измерения производит, но не больше.... добавить какие либо функции в программу больше не получается, DHT11 уходит в ступор... Подскажите что в энтом коде можно сделать так чтобы он работал более стабильно (как например ds18b20), или укажите на еще какойнибудь благополучный пример использования DHT11 в CodeVisionAV.... |
|
| Автор: | Garin [ Пн дек 17, 2012 19:41:04 ] |
| Заголовок сообщения: | Re: DHT11 как полноценно использовать в CodeVisionAVR....... |
Интересная деталька эта DHT11 , но если ее не научится использовать , китайцы будут плакать.! |
|
| Автор: | Garin [ Пт дек 28, 2012 23:31:38 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Прошу, кто разбирается помочь, переложить этот код для 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; //Clear array data[0] = data[1] = data[2] = data[3] = data[4] = 0; cli(); //Disable interrupts //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 #define DHT_Read_Pin (PIN(DHT_PORT) & _BV(DHT_PIN)) //This is the main function which requests and reads the packet uint8_t DHT_Read_Data(uint8_t select); оригинал этого кода находится здесьhttp://www.candrian.gr |
|
| Автор: | oleg110592 [ Сб дек 29, 2012 09:23:42 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
А что не получается ? в H файле убрать: #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> добавить: #include <mega8.h> #include <delay.h> #define _BV(bit) (1 << (bit)) #define uint8_t unsigned char в С файле вместо _delay_ms(20); delay_ms(20); и т.д. |
|
| Автор: | Garin [ Сб дек 29, 2012 13:20:48 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Да как-то ничего не получается , головоломку из этого могу сделать ))) вот проект в котором кручу верчу, а компилятор это не принимает..... Вложение:
|
|
| Автор: | oleg110592 [ Сб дек 29, 2012 13:43:18 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Дальше надо проверять Вложение:
|
|
| Автор: | urry [ Сб дек 29, 2012 15:25:00 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Garin, у Вас отсутствует понимание на физическом уровне того, что Вы делаете, подсказки как бы не помогут, нужно систему строить именно в голове... В Вашем распоряжении прекрасный компилятор, хм... который, правда, не обновлялся с 2010 года - ну кто-то поправьте меня, если я не прав - какой на фиг кодевижин.... Какой смысл под кодевижин хоть что-то портировать... Кодевижин пусть у вас стоит на компе - только как генератор начального кода - все... |
|
| Автор: | Garin [ Вс дек 30, 2012 01:25:03 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
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 *****************************************************/ #include <mega8.h> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> #include <stdio.h> #include <delay.h> #include "DHT.h" int D_0=123, D_2=456; uint8_t DHT_Read_Data(uint8_t select){ //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; //Очистить массив data[0] = data[1] = data[2] = data[3] = data[4] = 0; #asm("cli") //Запретить прерывания //Подготовка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; while (1) { // DHT_Read_Data(); D_0=data[0]; D_2=data[2]; lcd_gotoxy(0,0); lcd_putsf("D_0="); lcd_putchar((D_0/100)%10+0x30); lcd_putchar((D_0/10)%10+0x30); lcd_putchar(D_0%10+0x30); lcd_gotoxy(0,1); lcd_putsf("D_2="); lcd_putchar((D_2/100)%10+0x30); lcd_putchar((D_2/10)%10+0x30); lcd_putchar(D_2%10+0x30); }; } |
|
| Автор: | oleg110592 [ Вс дек 30, 2012 16:45:39 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Дальше придется самому Вложение: надо бы вам Кернигана и Ричи почитать |
|
| Автор: | Garin [ Ср янв 02, 2013 23:03:13 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Мм-да, не в ту степь у меня пока все получается, на днях посылку жду hih-4000 пришлют, по поводу sht, к сожалению у меня отсутствует начисто талант что либо изобретать, пока придется довольствоваться рерайтингом, копирайтингом буду по типу фрилансера....... И спасибо всем кто принял участие в обсуждении этой темы. |
|
| Автор: | Yusff [ Ср янв 09, 2013 19:01:03 ] | ||
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR | ||
Попробуйте код отсюда, там без прерываний.
|
|||
| Автор: | Garin [ Чт янв 10, 2013 00:54:19 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Yusff компилятор с файлов вашего архива генерирует код, а схема к программе этой есть, буду пробовать в железе и разбираться что к чему. |
|
| Автор: | Yusff [ Чт янв 10, 2013 20:33:02 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Как таковой схемы нет, "метеостанция" сделана на базе матричных часов JY-MCU 3208 с деалэкстрима. DHT11 подключен к PC2, датчик давления BMP085 - к аппаратному i2c. Тактирование от внутреннего генератора на 1 МГц. |
|
| Автор: | linoobs [ Пт фев 22, 2013 10:24:51 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
интересное дело, у меня он тоже отказался работать в общем цикле, зависал контроллер на обращении к датчику. Два варианта, или кидать функцию в прерывание или в основном цикле останавливать цикл #asm("cli") выполнять функцию и запускать дальше. Датчик прикручен к этим часам viewtopic.php?f=20&t=50199 |
|
| Автор: | linoobs [ Ср апр 10, 2013 12:16:01 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Yusff писал(а): Попробуйте код отсюда, там без прерываний. прошу прощения, вопрос не по теме, касательно BMP085, показания датчика не соответствуют действительности, давление 1050-1065, температура 118. где-то у меня косяк или все таки в коде? |
|
| Автор: | Yusff [ Ср апр 10, 2013 22:59:34 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
Посмотрел на стену, да нет - 751 мм. Дело в том, что каждый датчик индивидуально калибруют, коэффициенты заносят ему в память. Мне было влом писать проверки, переписывать их в епром и т.д. Я их считал один раз и вбил прямо в коде как константы. Если оперативку не жалко можете считывать их каждый раз из датчика. |
|
| Автор: | linoobs [ Чт апр 11, 2013 10:19:35 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
теперь все понятно, если бы еще посмотреть как эти коэффициенты считать из него... |
|
| Автор: | Yusff [ Чт апр 11, 2013 22:41:09 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
я делал так: СпойлерКод: #include <mega8.h> #define CHIP_ADDR_RD 0xEF #define CHIP_ADDR_WR 0xEE #define TWINT 7 #define TWEA 6 #define TWSTA 5 #define TWSTO 4 #define TWWC 3 #define TWEN 2 #define TWIE 0 #define EERE 0 #define EEPE 1 #define EEMPE 2 unsigned char get_data (unsigned char subaddr) { unsigned char data; //start TWCR = (1<<(TWINT))|(1<<TWSTA)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); //chip address TWDR = CHIP_ADDR_WR; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); //register address TWDR = subaddr; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); //restart TWCR = (1<<(TWINT))|(1<<TWSTA)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); //high byte TWDR = CHIP_ADDR_RD; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA); while (!(TWCR & (1<<TWINT))); data = TWDR; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); //stop TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); return data; } void EEPROM_WR (unsigned int addr, unsigned char data) { while(EECR & (1<<EEPE)); EEAR = addr; EEDR = data; EECR |= (1<<EEMPE); EECR |= (1<<EEPE); } void main(void) { unsigned char i; for (i=0xAA;i<=0xBF;i++) { EEPROM_WR(i-0xAA,get_data(i)); }; while (1) { }; } прога перепишет калибровки в еепром контроллера. первых два байта - AC1, следующие два - AC2 ну и так далее по даташиту. |
|
| Автор: | linoobs [ Сб апр 13, 2013 18:20:31 ] | ||
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR | ||
спасибо, только это мало чем помогло, прошил этим кодом, считал еепром, подменил значения, теперь давление 1150, темп. тоже самое 118 мега16, 8мгц :100000001E1FFC25C6A57C4F5CDF576B157A00329E :100010008000D4BD0980FFFFFFFFFFFFFFFFFFFF50
|
|||
| Автор: | Yusff [ Сб апр 13, 2013 20:28:03 ] |
| Заголовок сообщения: | Re: DHT11 трудности использования в CodeVisionAVR |
А показания меняются от нагревания, скажем? Допускаю, что компиляторы по разному где-то интерпретируют - там в формулах куча отрицательных значений, оаперации с разными типами... ужос. В даташите на датчик есть диаграмма вычислений с цифрами. Попробуйте забить их и посмотреть как считает прога. Я когда отлаживал, тоже каких только давлений не видел) Но выложенный код у меня работает, релиз так сказать. |
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


