Например TDA7294

Форум РадиоКот • Просмотр темы - DHT11 трудности использования в CodeVisionAVR
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 14, 2025 19:13:40

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 21 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Чт дек 13, 2012 13:08:13 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
Здравствуйте, пытаюсь сделать программу для вентилятора в санузле.
Нашел в сети код для тини 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 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
Интересная деталька эта DHT11 , но если ее не научится использовать , китайцы будут плакать.! :)) :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Пт дек 28, 2012 23:31:38 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
Прошу, кто разбирается помочь, переложить этот код для 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 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
А что не получается ?
в 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 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
Да как-то ничего не получается , головоломку из этого могу сделать )))
вот проект в котором кручу верчу, а компилятор это не принимает.....
Вложение:
DHT-11.rar [28.85 KiB]
Скачиваний: 426


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Сб дек 29, 2012 13:43:18 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Дальше надо проверять
Вложение:
DHT11_m.ZIP [52.77 KiB]
Скачиваний: 450


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Сб дек 29, 2012 15:25:00 
Сверлит текстолит когтями
Аватар пользователя

Карма: 22
Рейтинг сообщений: 81
Зарегистрирован: Пн дек 08, 2008 10:58:48
Сообщений: 1262
Откуда: Винница
Рейтинг сообщения: 0
Garin, у Вас отсутствует понимание на физическом уровне того, что Вы делаете, подсказки как бы не помогут,
нужно систему строить именно в голове...
В Вашем распоряжении прекрасный компилятор, хм... который, правда, не обновлялся с 2010 года - ну кто-то поправьте меня, если я не прав - какой на фиг кодевижин.... Какой смысл под кодевижин хоть что-то портировать...
Кодевижин пусть у вас стоит на компе - только как генератор начального кода - все...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Вс дек 30, 2012 01:25:03 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
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 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Дальше придется самому
Вложение:
DHT11_m2.ZIP [59.38 KiB]
Скачиваний: 458

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Ср янв 02, 2013 23:03:13 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
Мм-да, не в ту степь у меня пока все получается, на днях посылку жду hih-4000 пришлют, по поводу sht, к сожалению у меня отсутствует начисто талант что либо изобретать, пока придется довольствоваться рерайтингом, копирайтингом буду по типу фрилансера.......
И спасибо всем кто принял участие в обсуждении этой темы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Ср янв 09, 2013 19:01:03 
Встал на лапы
Аватар пользователя

Зарегистрирован: Сб окт 20, 2012 14:07:16
Сообщений: 124
Рейтинг сообщения: 0
Попробуйте код отсюда, там без прерываний.


Вложения:
METEO_BMP085_DHT11.zip [5.89 KiB]
Скачиваний: 758
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Чт янв 10, 2013 00:54:19 
Потрогал лапой паяльник
Аватар пользователя

Карма: -19
Рейтинг сообщений: 6
Зарегистрирован: Пн сен 12, 2011 12:13:46
Сообщений: 351
Рейтинг сообщения: 0
Yusff компилятор с файлов вашего архива генерирует код, а схема к программе этой есть, буду пробовать в железе и разбираться что к чему.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Чт янв 10, 2013 20:33:02 
Встал на лапы
Аватар пользователя

Зарегистрирован: Сб окт 20, 2012 14:07:16
Сообщений: 124
Рейтинг сообщения: 0
Как таковой схемы нет, "метеостанция" сделана на базе матричных часов JY-MCU 3208 с деалэкстрима. DHT11 подключен к PC2, датчик давления BMP085 - к аппаратному i2c. Тактирование от внутреннего генератора на 1 МГц.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Пт фев 22, 2013 10:24:51 
Родился

Зарегистрирован: Вт июн 26, 2012 20:45:39
Сообщений: 17
Рейтинг сообщения: 0
интересное дело, у меня он тоже отказался работать в общем цикле, зависал контроллер на обращении к датчику. Два варианта, или кидать функцию в прерывание или в основном цикле останавливать цикл #asm("cli") выполнять функцию и запускать дальше.
Датчик прикручен к этим часам

viewtopic.php?f=20&t=50199


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Ср апр 10, 2013 12:16:01 
Родился

Зарегистрирован: Вт июн 26, 2012 20:45:39
Сообщений: 17
Рейтинг сообщения: 0
Yusff писал(а):
Попробуйте код отсюда, там без прерываний.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Ср апр 10, 2013 22:59:34 
Встал на лапы
Аватар пользователя

Зарегистрирован: Сб окт 20, 2012 14:07:16
Сообщений: 124
Рейтинг сообщения: 0
Посмотрел на стену, да нет - 751 мм. Дело в том, что каждый датчик индивидуально калибруют, коэффициенты заносят ему в память. Мне было влом писать проверки, переписывать их в епром и т.д. Я их считал один раз и вбил прямо в коде как константы. Если оперативку не жалко можете считывать их каждый раз из датчика.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Чт апр 11, 2013 10:19:35 
Родился

Зарегистрирован: Вт июн 26, 2012 20:45:39
Сообщений: 17
Рейтинг сообщения: 0
теперь все понятно, если бы еще посмотреть как эти коэффициенты считать из него...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Чт апр 11, 2013 22:41:09 
Встал на лапы
Аватар пользователя

Зарегистрирован: Сб окт 20, 2012 14:07:16
Сообщений: 124
Рейтинг сообщения: 0
я делал так:
Спойлер
Код:
#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 
Родился

Зарегистрирован: Вт июн 26, 2012 20:45:39
Сообщений: 17
Рейтинг сообщения: 0
спасибо, только это мало чем помогло, прошил этим кодом, считал еепром, подменил значения, теперь давление 1150, темп. тоже самое 118
мега16, 8мгц

:100000001E1FFC25C6A57C4F5CDF576B157A00329E
:100010008000D4BD0980FFFFFFFFFFFFFFFFFFFF50


Вложения:
METEO_BMP085.rar [126.39 KiB]
Скачиваний: 305
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: DHT11 трудности использования в CodeVisionAVR
СообщениеДобавлено: Сб апр 13, 2013 20:28:03 
Встал на лапы
Аватар пользователя

Зарегистрирован: Сб окт 20, 2012 14:07:16
Сообщений: 124
Рейтинг сообщения: 0
А показания меняются от нагревания, скажем? Допускаю, что компиляторы по разному где-то интерпретируют - там в формулах куча отрицательных значений, оаперации с разными типами... ужос. В даташите на датчик есть диаграмма вычислений с цифрами. Попробуйте забить их и посмотреть как считает прога. Я когда отлаживал, тоже каких только давлений не видел) Но выложенный код у меня работает, релиз так сказать.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y