Например TDA7294

Форум РадиоКот :: Просмотр темы - DHT11 трудности использования в CodeVisionAVR
Форум РадиоКот
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

Да как-то ничего не получается , головоломку из этого могу сделать )))
вот проект в котором кручу верчу, а компилятор это не принимает.....
Вложение:
DHT-11.rar [28.85 KiB]
Скачиваний: 428

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

Дальше надо проверять
Вложение:
DHT11_m.ZIP [52.77 KiB]
Скачиваний: 450

Автор:  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

Дальше придется самому
Вложение:
DHT11_m2.ZIP [59.38 KiB]
Скачиваний: 458

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

Автор:  Garin [ Ср янв 02, 2013 23:03:13 ]
Заголовок сообщения:  Re: DHT11 трудности использования в CodeVisionAVR

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

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

Попробуйте код отсюда, там без прерываний.

Вложения:
METEO_BMP085_DHT11.zip [5.89 KiB]
Скачиваний: 758

Автор:  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

Вложения:
METEO_BMP085.rar [126.39 KiB]
Скачиваний: 305

Автор:  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/