اطلاعیه

Collapse
No announcement yet.

سوال : نحوه راه اندازی TSL2561 در کدویژن

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سوال : نحوه راه اندازی TSL2561 در کدویژن

    سلام دوستان عزیز
    من دارم یه سنسور لوکس متر رو راه میندازم TSL2561 هست
    اینا کدهاش هست . ولی ارور داره . میتونید راهنماییم کنید ؟ ممنون
    این کد برنامه اصلی :


    /*****************************************************
    Chip type : ATmega16A
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    *****************************************************/


    #include <mega16a.h>
    #include <i2c.h>
    #include <alcd.h>
    #include <math.h>
    #include <stdlib.h>
    #include <tsl2561.h>
    #include <delay.h>
    #include <stdio.h>




    double Lux = 0;
    char str[50];
    float LUX;


    void main(void)
    {




    tsl2561_init();
    TSL2561_config();




    // I2C Bus initialization
    // I2C Port: PORTC
    // I2C SDA bit: 1
    // I2C SCL bit: 0
    // Bit Rate: 100 kHz
    // Note: I2C settings are specified in the
    // Project|Configure|C Compiler|Libraries|I2C menu.
    i2c_init();


    // Alphanumeric LCD initialization
    // Connections are specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTD Bit 0
    // RD - PORTD Bit 1
    // EN - PORTD Bit 2
    // D4 - PORTD Bit 4
    // D5 - PORTD Bit 5
    // D6 - PORTD Bit 6
    // D7 - PORTD Bit 7
    // Characters/line: 20
    lcd_init(20);



    while (1)
    {
    LUX=ReadLuxes();
    lcd_clear();
    sprintf(str,"LUX=%0.1f ",LUX);
    lcd_puts(str);
    delay_ms(1000);


    }
    }





    و اینم کد کتابخونش :



    #define ControlRegister 0x80
    #define TurnOnBits 0x03
    #define TimingRegister 0x02 // 0x00 = 13.7ms / 0x01 = 101ms / 0x02 = 402ms (default)
    #define IntegrationTimeGain 0x10 // 0x00 = 1x Gain (default) / 0x10 = 16x Gain


    #define Data0LowByteMode 0x8C //Address the Ch0 lower data register
    #define Data0HighByteMode 0x8D //Address the Ch0 upper data register
    #define Data1LowByteMode 0x8E //Address the Ch1 lower data register
    #define Data1HighByteMode 0x8F //Address the Ch1 upper data register


    #define addr 0x52


    void tsl2561_init(void)
    {
    int TSL2561AddressWrite_Float = 0x39<<1;
    i2c_start();
    i2c_write(addr);
    i2c_write(ControlRegister);
    i2c_write(TurnOnBits);
    i2c_stop();
    }




    //-------------------------------------
    // Configuration TSL2561
    //-------------------------------------
    void TSL2561_config(void)
    {
    i2c_start();
    i2c_write(addr);
    i2c_write(0x81);
    i2c_write(TimingRegister);
    //i2c_stop();
    //i2c_start();
    //i2c_write(0x39);
    //i2c_write(0x81);
    i2c_write(IntegrationTimeGain);
    i2c_stop();
    }


    //-------------------------------------
    // Read one byte from TSL2561
    //-------------------------------------
    unsigned char ReadByteTSL2561(unsigned char RegisterAddress)
    {
    unsigned char Data;
    i2c_start();
    i2c_write(addr);
    i2c_write(RegisterAddress);
    i2c_start(); // restart I2c
    i2c_write(addr+1);// address + 1 is the read mode
    Data = i2c_read(0); // read one byte from EEPROM
    i2c_stop();


    return Data;
    }
    void Power_On()
    {
    i2c_start();
    i2c_write(addr);
    i2c_write(0x80);
    i2c_write(0x03);
    i2c_stop();
    }


    //-------------------------------------
    // Read lux value from TSL2561
    //-------------------------------------


    double Calculate(unsigned char,unsigned char,unsigned char,unsigned char);
    void ReadLuxes()
    {
    char tmp[20];
    unsigned char Data0Low_uchar=0;
    unsigned char Data0High_uchar=0;
    unsigned char Data1Low_uchar=0;
    unsigned char Data1High_uchar=0;

    Data0Low_uchar = ReadByteTSL2561(Data0LowByteMode);
    Data0High_uchar = ReadByteTSL2561(Data0HighByteMode);
    Data1Low_uchar = ReadByteTSL2561(Data1LowByteMode);
    Data1High_uchar = ReadByteTSL2561(Data1HighByteMode);

    Lux = Calculate(Data0Low_uchar,Data0High_uchar,Data1Low_uchar,Data1High_uchar); //Lux as a double value
    }
    //-------------------------------------
    // Calculate luxes from TSL2561
    //-------------------------------------
    double Calculate(unsigned char Data0Low_uchar,unsigned char Data0High_uchar,unsigned char Data1Low_uchar,unsigned char Data1High_uchar)
    {
    unsigned int Channel0_uint;
    unsigned int Channel1_uint;
    unsigned int Data0Low_uint;
    unsigned int Data0High_uint;
    unsigned int Data1Low_uint;
    unsigned int Data1High_uint;
    float Channel0_float;
    float Channel1_float;
    float ChannelsRatio_float;
    double Channel0_double;
    double Channel1_double;
    double ChannelsRatio_double;
    double Lux = 0;

    Data0Low_uint = (unsigned int)Data0Low_uchar;
    Data0High_uint = (unsigned int)Data0High_uchar;
    Data1Low_uint = (unsigned int)Data1Low_uchar;
    Data1High_uint = (unsigned int)Data1High_uchar;

    Channel0_uint = (unsigned int)256 * Data0High_uint + Data0Low_uint; //Shift Data0High to upper byte
    Channel1_uint = (unsigned int)256 * Data1High_uint + Data1Low_uint; //Shift Data1High to upper byte

    Channel0_float = (float)Channel0_uint;
    Channel1_float = (float)Channel1_uint;
    ChannelsRatio_float = Channel1_float / Channel0_float;

    ChannelsRatio_double = (double)ChannelsRatio_float;
    Channel0_double = (double)Channel0_float;
    Channel1_double = (double)Channel1_float;





    if ((ChannelsRatio_double <= (double)0.50) && (ChannelsRatio_double > (double)0))
    {
    Lux = (double)0.0304 * Channel0_double - (double)0.062 * Channel0_double * (pow(ChannelsRatio_double, 1.4));
    }
    else if((ChannelsRatio_double <= (double)0.61) && (ChannelsRatio_double > (double)0.50))
    {
    Lux = (double)0.0224 * Channel0_double - (double)0.031 * Channel1_double;
    }
    else if((ChannelsRatio_double <= (double)0.80) && (ChannelsRatio_double > (double)0.61))
    {
    Lux = (double)0.0128 * Channel0_double -(double) 0.0153 * Channel1_double;
    }
    else if((ChannelsRatio_double <= (double)1.30) && (ChannelsRatio_double > (double)0.80))
    {
    Lux = (double)0.00146 * Channel0_double - (double)0.00112 * Channel1_double;
    }
    else if(ChannelsRatio_double > (double)1.30)
    {
    Lux = 0;
    }
    return Lux;
    }
    //-------------------------------------
    // End of TSL2561 support
    //------------------------------------
    جدیدترین ویرایش توسط shadi7092; ۱۸:۳۵ ۱۳۹۵/۱۲/۰۷.

    #2
    پاسخ : سوال : نحوه راه اندازی TSL2561 در کدویژن

    متن خطا کو ؟؟
    ! Life doesn't get easier , you just get stronger

    دیدگاه


      #3
      پاسخ : سوال : نحوه راه اندازی TSL2561 در کدویژن

      نوشته اصلی توسط Amirlopez نمایش پست ها
      متن خطا کو ؟؟
      سلام.نتونستم.بزارمش

      دیدگاه


        #4
        پاسخ : سوال : نحوه راه اندازی TSL2561 در کدویژن

        من اون خطا رو حل کردم اما مشکلی که دارم الان اینه که یه عدد ثابت رو روی LCD میبینم
        ینی برنامه درسته . ولی نحوه محاسبه فک میکنم اشتباهه . کد کتابخونه هم خوندم ولی راستش متوجه نشدم
        کدش رو اینجا میزارم . دوستان اگه امکانش هست راهنمایی بفرمایید
        مچکرم


        این قسمت برای خوندن شدت نور یا همون LUX هست :


        //-------------------------------------
        // Read lux value from TSL2561
        //-------------------------------------


        double Calculate(unsigned char,unsigned char,unsigned char,unsigned char);
        double ReadLuxes()
        {
        double Lux;
        char tmp[20];
        unsigned char Data0Low_uchar=0;
        unsigned char Data0High_uchar=0;
        unsigned char Data1Low_uchar=0;
        unsigned char Data1High_uchar=0;

        Data0Low_uchar = ReadByteTSL2561(Data0LowByteMode);
        Data0High_uchar = ReadByteTSL2561(Data0HighByteMode);
        Data1Low_uchar = ReadByteTSL2561(Data1LowByteMode);
        Data1High_uchar = ReadByteTSL2561(Data1HighByteMode);

        Lux = Calculate(Data0Low_uchar,Data0High_uchar,Data1Low_uchar,Data1High_uchar); //Lux as a double value
        return Lux;
        }
        [SIZE=5][/SIZE]


        این هم قسمت محاسبه LUX توسط سنسور TSL2561 هست :


        //-------------------------------------
        // Calculate luxes from TSL2561
        //-------------------------------------
        double Calculate(unsigned char Data0Low_uchar,unsigned char Data0High_uchar,unsigned char Data1Low_uchar,unsigned char Data1High_uchar)
        {
        unsigned int Channel0_uint;
        unsigned int Channel1_uint;
        unsigned int Data0Low_uint;
        unsigned int Data0High_uint;
        unsigned int Data1Low_uint;
        unsigned int Data1High_uint;
        float Channel0_float;
        float Channel1_float;
        float ChannelsRatio_float;
        double Channel0_double;
        double Channel1_double;
        double ChannelsRatio_double;
        double Lux = 0;

        Data0Low_uint = (unsigned int)Data0Low_uchar;
        Data0High_uint = (unsigned int)Data0High_uchar;
        Data1Low_uint = (unsigned int)Data1Low_uchar;
        Data1High_uint = (unsigned int)Data1High_uchar;

        Channel0_uint = (unsigned int)256 * Data0High_uint + Data0Low_uint; //Shift Data0High to upper byte
        Channel1_uint = (unsigned int)256 * Data1High_uint + Data1Low_uint; //Shift Data1High to upper byte

        Channel0_float = (float)Channel0_uint;
        Channel1_float = (float)Channel1_uint;
        ChannelsRatio_float = Channel1_float / Channel0_float;

        ChannelsRatio_double = (double)ChannelsRatio_float;
        Channel0_double = (double)Channel0_float;
        Channel1_double = (double)Channel1_float;





        if ((ChannelsRatio_double <= (double)0.50) && (ChannelsRatio_double > (double)0))
        {
        Lux = (double)0.0304 * Channel0_double - (double)0.062 * Channel0_double * (pow(ChannelsRatio_double, 1.4));
        }
        else if((ChannelsRatio_double <= (double)0.61) && (ChannelsRatio_double > (double)0.50))
        {
        Lux = (double)0.0224 * Channel0_double - (double)0.031 * Channel1_double;
        }
        else if((ChannelsRatio_double <= (double)0.80) && (ChannelsRatio_double > (double)0.61))
        {
        Lux = (double)0.0128 * Channel0_double -(double) 0.0153 * Channel1_double;
        }
        else if((ChannelsRatio_double <= (double)1.30) && (ChannelsRatio_double > (double)0.80))
        {
        Lux = (double)0.00146 * Channel0_double - (double)0.00112 * Channel1_double;
        }
        else if(ChannelsRatio_double > (double)1.30)
        {
        Lux = 0;
        }
        return Lux;
        }
        [SIZE=5][/SIZE]


        یک دنیا ممنون از راهنماییتون


        دلیل: ادغام دو پست برای جلوگیری از اسپم

        نوشته اصلی توسط shadi7092 نمایش پست ها
        من اون خطا رو حل کردم اما مشکلی که دارم الان اینه که یه عدد ثابت رو روی LCD میبینم
        ینی برنامه درسته . ولی نحوه محاسبه فک میکنم اشتباهه . کد کتابخونه هم خوندم ولی راستش متوجه نشدم
        کدش رو اینجا میزارم . دوستان اگه امکانش هست راهنمایی بفرمایید
        مچکرم


        این قسمت برای خوندن شدت نور یا همون LUX هست :


        //-------------------------------------
        // Read lux value from TSL2561
        //-------------------------------------


        double Calculate(unsigned char,unsigned char,unsigned char,unsigned char);
        double ReadLuxes()
        {
        double Lux;
        char tmp[20];
        unsigned char Data0Low_uchar=0;
        unsigned char Data0High_uchar=0;
        unsigned char Data1Low_uchar=0;
        unsigned char Data1High_uchar=0;

        Data0Low_uchar = ReadByteTSL2561(Data0LowByteMode);
        Data0High_uchar = ReadByteTSL2561(Data0HighByteMode);
        Data1Low_uchar = ReadByteTSL2561(Data1LowByteMode);
        Data1High_uchar = ReadByteTSL2561(Data1HighByteMode);

        Lux = Calculate(Data0Low_uchar,Data0High_uchar,Data1Low_uchar,Data1High_uchar); //Lux as a double value
        return Lux;
        }
        [SIZE=5][/SIZE]


        این هم قسمت محاسبه LUX توسط سنسور TSL2561 هست :


        //-------------------------------------
        // Calculate luxes from TSL2561
        //-------------------------------------
        double Calculate(unsigned char Data0Low_uchar,unsigned char Data0High_uchar,unsigned char Data1Low_uchar,unsigned char Data1High_uchar)
        {
        unsigned int Channel0_uint;
        unsigned int Channel1_uint;
        unsigned int Data0Low_uint;
        unsigned int Data0High_uint;
        unsigned int Data1Low_uint;
        unsigned int Data1High_uint;
        float Channel0_float;
        float Channel1_float;
        float ChannelsRatio_float;
        double Channel0_double;
        double Channel1_double;
        double ChannelsRatio_double;
        double Lux = 0;

        Data0Low_uint = (unsigned int)Data0Low_uchar;
        Data0High_uint = (unsigned int)Data0High_uchar;
        Data1Low_uint = (unsigned int)Data1Low_uchar;
        Data1High_uint = (unsigned int)Data1High_uchar;

        Channel0_uint = (unsigned int)256 * Data0High_uint + Data0Low_uint; //Shift Data0High to upper byte
        Channel1_uint = (unsigned int)256 * Data1High_uint + Data1Low_uint; //Shift Data1High to upper byte

        Channel0_float = (float)Channel0_uint;
        Channel1_float = (float)Channel1_uint;
        ChannelsRatio_float = Channel1_float / Channel0_float;

        ChannelsRatio_double = (double)ChannelsRatio_float;
        Channel0_double = (double)Channel0_float;
        Channel1_double = (double)Channel1_float;





        if ((ChannelsRatio_double <= (double)0.50) && (ChannelsRatio_double > (double)0))
        {
        Lux = (double)0.0304 * Channel0_double - (double)0.062 * Channel0_double * (pow(ChannelsRatio_double, 1.4));
        }
        else if((ChannelsRatio_double <= (double)0.61) && (ChannelsRatio_double > (double)0.50))
        {
        Lux = (double)0.0224 * Channel0_double - (double)0.031 * Channel1_double;
        }
        else if((ChannelsRatio_double <= (double)0.80) && (ChannelsRatio_double > (double)0.61))
        {
        Lux = (double)0.0128 * Channel0_double -(double) 0.0153 * Channel1_double;
        }
        else if((ChannelsRatio_double <= (double)1.30) && (ChannelsRatio_double > (double)0.80))
        {
        Lux = (double)0.00146 * Channel0_double - (double)0.00112 * Channel1_double;
        }
        else if(ChannelsRatio_double > (double)1.30)
        {
        Lux = 0;
        }
        return Lux;
        }
        [SIZE=5][/SIZE]


        یک دنیا ممنون از راهنماییتون

        این کد فقط عدد 22.3 رو بمن نشون میده . هرچقدر هم میزان نور تغییر میکنه همچنان 22.3 ثابت هست

        دیدگاه

        لطفا صبر کنید...
        X