Страница 1 из 2

DHT11 трудности использования в CodeVisionAVR

Добавлено: Чт дек 13, 2012 13:08:13
Garin
Здравствуйте, пытаюсь сделать программу для вентилятора в санузле.
Нашел в сети код для тини 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....

Re: DHT11 как полноценно использовать в CodeVisionAVR.......

Добавлено: Пн дек 17, 2012 19:41:04
Garin
Интересная деталька эта DHT11 , но если ее не научится использовать , китайцы будут плакать.! :)) :))

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Пт дек 28, 2012 23:31:38
Garin
Прошу, кто разбирается помочь, переложить этот код для 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

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Сб дек 29, 2012 09:23:42
oleg110592
А что не получается ?
в 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);

и т.д.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Сб дек 29, 2012 13:20:48
Garin
Да как-то ничего не получается , головоломку из этого могу сделать )))
вот проект в котором кручу верчу, а компилятор это не принимает.....
DHT-11.rar
(28.85 КБ) 435 скачиваний

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Сб дек 29, 2012 13:43:18
oleg110592
Дальше надо проверять
DHT11_m.ZIP
(52.77 КБ) 459 скачиваний

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Сб дек 29, 2012 15:25:00
urry
Garin, у Вас отсутствует понимание на физическом уровне того, что Вы делаете, подсказки как бы не помогут,
нужно систему строить именно в голове...
В Вашем распоряжении прекрасный компилятор, хм... который, правда, не обновлялся с 2010 года - ну кто-то поправьте меня, если я не прав - какой на фиг кодевижин.... Какой смысл под кодевижин хоть что-то портировать...
Кодевижин пусть у вас стоит на компе - только как генератор начального кода - все...

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Вс дек 30, 2012 01:25:03
Garin
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);

      };
}

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Вс дек 30, 2012 16:45:39
oleg110592
Дальше придется самому
DHT11_m2.ZIP
(59.38 КБ) 465 скачиваний

надо бы вам Кернигана и Ричи почитать

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Ср янв 02, 2013 23:03:13
Garin
Мм-да, не в ту степь у меня пока все получается, на днях посылку жду hih-4000 пришлют, по поводу sht, к сожалению у меня отсутствует начисто талант что либо изобретать, пока придется довольствоваться рерайтингом, копирайтингом буду по типу фрилансера.......
И спасибо всем кто принял участие в обсуждении этой темы.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Ср янв 09, 2013 19:01:03
Yusff
Попробуйте код отсюда, там без прерываний.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Чт янв 10, 2013 00:54:19
Garin
Yusff компилятор с файлов вашего архива генерирует код, а схема к программе этой есть, буду пробовать в железе и разбираться что к чему.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Чт янв 10, 2013 20:33:02
Yusff
Как таковой схемы нет, "метеостанция" сделана на базе матричных часов JY-MCU 3208 с деалэкстрима. DHT11 подключен к PC2, датчик давления BMP085 - к аппаратному i2c. Тактирование от внутреннего генератора на 1 МГц.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Пт фев 22, 2013 10:24:51
linoobs
интересное дело, у меня он тоже отказался работать в общем цикле, зависал контроллер на обращении к датчику. Два варианта, или кидать функцию в прерывание или в основном цикле останавливать цикл #asm("cli") выполнять функцию и запускать дальше.
Датчик прикручен к этим часам

viewtopic.php?f=20&t=50199

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Ср апр 10, 2013 12:16:01
linoobs
Yusff писал(а):Попробуйте код отсюда, там без прерываний.

прошу прощения, вопрос не по теме, касательно BMP085, показания датчика не соответствуют действительности, давление 1050-1065, температура 118. где-то у меня косяк или все таки в коде?

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Ср апр 10, 2013 22:59:34
Yusff
Посмотрел на стену, да нет - 751 мм. Дело в том, что каждый датчик индивидуально калибруют, коэффициенты заносят ему в память. Мне было влом писать проверки, переписывать их в епром и т.д. Я их считал один раз и вбил прямо в коде как константы. Если оперативку не жалко можете считывать их каждый раз из датчика.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Чт апр 11, 2013 10:19:35
linoobs
теперь все понятно, если бы еще посмотреть как эти коэффициенты считать из него...

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Чт апр 11, 2013 22:41:09
Yusff
я делал так:
Спойлер

Код: Выделить всё

#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 ну и так далее по даташиту.

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Сб апр 13, 2013 18:20:31
linoobs
спасибо, только это мало чем помогло, прошил этим кодом, считал еепром, подменил значения, теперь давление 1150, темп. тоже самое 118
мега16, 8мгц

:100000001E1FFC25C6A57C4F5CDF576B157A00329E
:100010008000D4BD0980FFFFFFFFFFFFFFFFFFFF50

Re: DHT11 трудности использования в CodeVisionAVR

Добавлено: Сб апр 13, 2013 20:28:03
Yusff
А показания меняются от нагревания, скажем? Допускаю, что компиляторы по разному где-то интерпретируют - там в формулах куча отрицательных значений, оаперации с разными типами... ужос. В даташите на датчик есть диаграмма вычислений с цифрами. Попробуйте забить их и посмотреть как считает прога. Я когда отлаживал, тоже каких только давлений не видел) Но выложенный код у меня работает, релиз так сказать.