اطلاعیه

Collapse
No announcement yet.

twi ?!?

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

    #16
    پاسخ : twi ?!?

    سلام

    ممنون از لطفتون

    شرمنده کردین :">

    با عرض پوزش یه سوال دیگه داشتم؟!! :redface:

    من یه ماژول دارم که پروتکل I2C خروجی میده!

    اسم ماژول هست BH1750FVI

    شاید بگم حدود 12 تا برنامه تا حالا براش نوشتم و جواب نگرفتم!دیگه اینجوری شدم @-)

    میخواد آدرسش (SLAVE) براش ارسال بشه و بعدش دوتا بایت ازش خونده بشه و بعد این دوتا بایت به متغیر float تبدیل بشه که بشه محاسبات روش انجام داد و بعدم روی LCD چاپش کرد.

    من در نهایت تونستم یه برنامه براش گیر بیارم که به زبان آردوینو بود.

    به خیال خودم اونو به کدویژن تبدیل کردم. :rolleyes:

    الان سه هفته ای هست که بهش ور میرم. :cry:

    میشه یه نگاه بندازین ببینین مشکل از کجاست؟ ممنون میشم. :redface:

    کد:
    //Chip type        : ATmega32
    //Program type      : Application
    //AVR Core Clock frequency: 8.000000 MHz
    #include <mega32.h>
    #include <i2c.h>
    #include <alcd.h>
    #include <delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void BH1750_Init(int address);
    int BH1750_read(int address);
    
    int BH1750_address=0x23;
    unsigned char BUFF[2], buf[16];
    int DEC;
    void main(void)
    {
    PORTA=0x00;
    DDRA=0x00;
    PORTB=0x00;
    DDRB=0x00; 
    PORTC=0x00;
    DDRC=0x00;
    PORTD=0x00;
    DDRD=0x00;
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    MCUCR=0x00;
    MCUCSR=0x00;
    TIMSK=0x00;
    UCSRB=0x00;
    ACSR=0x80;
    SFIOR=0x00;
    ADCSRA=0x00;
    SPCR=0x00;
    TWCR=0x00;
    
    // I2C Port: PORTA
    // 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();
    
    // RS - PORTD Bit 0
    // RD - PORTD Bit 1
    // EN - PORTD Bit 2
    // D4 - PORTD Bit 3
    // D5 - PORTD Bit 4
    // D6 - PORTD Bit 5
    // D7 - PORTD Bit 6
    // Characters/line: 16
    lcd_init(16);
    
    i2c_start();
    BH1750_Init(BH1750_address);
    delay_ms(200);
    lcd_clear();
    lcd_putsf("START");
    while (1)
       {
       float valf=0;
       if(BH1750_read(BH1750_address)==2){
       valf=atof(BUFF);
       valf=valf/1.2;
        if(valf<0){
        lcd_clear();
        lcd_putsf(">65535 lx");
        }
        else{
        DEC=valf;
        lcd_clear();
        sprintf(buf,"%d lx",DEC);
        lcd_puts(buf);
        }
       delay_ms(1000);
       }
    
      }
    }
    
    //*****************************************
    
    int BH1750_read(int address){
    int i=0;
    i2c_start();
    i2c_write(address);
    i2c_start();
    i2c_write(address|1);
    BUFF[i]=i2c_read(1);
    i++;
    BUFF[i]=i2c_read(0);
    i++;
    i2c_stop();
    return i;}
    
    //******************************************
    
    void BH1750_Init(int address){
    i2c_start();
    i2c_write(address);
    i2c_write(0x10);
    i2c_stop();
    }
    اینم برنامه آردوینو

    کد:
    #include <Wire.h>
    
    int BH1750_address = 0x23; // i2c Addresse
    byte buff[2];
    
    void setup(){
     
     Wire.begin();
     BH1750_Init(BH1750_address);
     
     delay(200);
     Serial.begin(9600);
     Serial.println("Start");
    }
    
    void loop(){
     
     float valf=0;
    
     if(BH1750_Read(BH1750_address)==2){
      
      valf=((buff[0]<<8)|buff[1])/1.2;
      
      if(valf<0)Serial.print("> 65535");
      else Serial.print((int)valf,DEC); 
      
      Serial.println(" lx"); 
     }
     delay(1000);
    }
    
    void BH1750_Init(int address){
     
     Wire.beginTransmission(address);
     Wire.write(0x10); // 1 [lux] resolution
     Wire.endTransmission();
    }
    
    byte BH1750_Read(int address){
     
     byte i=0;
     Wire.beginTransmission(address);
     Wire.requestFrom(address, 2);
     while(Wire.available()){
      buff[i] = Wire.read(); 
      i++;
     }
     Wire.endTransmission(); 
     return i;
    }
    لطفا اگر مسیری که میرم اشتباهه، بهم بگین و مسیر درست را هم بهم راهنمایی کنید. با سپاس فراوان @};-

    دیدگاه


      #17
      پاسخ : twi ?!?

      نوشته اصلی توسط ok20
      سلام
      ممنون از لطفتون
      شرمنده کردین :">
      با عرض پوزش یه سوال دیگه داشتم؟!! :redface:
      من یه ماژول دارم که پروتکل I2C خروجی میده!
      اسم ماژول هست BH1750FVI
      شاید بگم حدود 12 تا برنامه تا حالا براش نوشتم و جواب نگرفتم!دیگه اینجوری شدم @-)
      میخواد آدرسش (SLAVE) براش ارسال بشه و بعدش دوتا بایت ازش خونده بشه و بعد این دوتا بایت به متغیر float تبدیل بشه که بشه محاسبات روش انجام داد و بعدم روی LCD چاپش کرد.
      من در نهایت تونستم یه برنامه براش گیر بیارم که به زبان آردوینو بود.
      به خیال خودم اونو به کدویژن تبدیل کردم. :rolleyes:
      الان سه هفته ای هست که بهش ور میرم. :cry:
      میشه یه نگاه بندازین ببینین مشکل از کجاست؟ ممنون میشم. :redface:
      کد:
      //Chip type        : ATmega32
      //Program type      : Application
      //AVR Core Clock frequency: 8.000000 MHz
      #include <mega32.h>
      #include <i2c.h>
      #include <alcd.h>
      #include <delay.h>
      #include <stdio.h>
      #include <stdlib.h>
      
      void BH1750_Init(int address);
      int BH1750_read(int address);
      
      int BH1750_address=0x23;
      unsigned char BUFF[2], buf[16];
      int DEC;
      void main(void)
      {
      PORTA=0x00;
      DDRA=0x00;
      PORTB=0x00;
      DDRB=0x00; 
      PORTC=0x00;
      DDRC=0x00;
      PORTD=0x00;
      DDRD=0x00;
      TCCR0=0x00;
      TCNT0=0x00;
      OCR0=0x00;
      TCCR1A=0x00;
      TCCR1B=0x00;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;
      MCUCR=0x00;
      MCUCSR=0x00;
      TIMSK=0x00;
      UCSRB=0x00;
      ACSR=0x80;
      SFIOR=0x00;
      ADCSRA=0x00;
      SPCR=0x00;
      TWCR=0x00;
      
      // I2C Port: PORTA
      // 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();
      
      // RS - PORTD Bit 0
      // RD - PORTD Bit 1
      // EN - PORTD Bit 2
      // D4 - PORTD Bit 3
      // D5 - PORTD Bit 4
      // D6 - PORTD Bit 5
      // D7 - PORTD Bit 6
      // Characters/line: 16
      lcd_init(16);
      
      i2c_start();
      BH1750_Init(BH1750_address);
      delay_ms(200);
      lcd_clear();
      lcd_putsf("START");
      while (1)
         {
         float valf=0;
         if(BH1750_read(BH1750_address)==2){
         valf=atof(BUFF);
         valf=valf/1.2;
          if(valf<0){
          lcd_clear();
          lcd_putsf(">65535 lx");
          }
          else{
          DEC=valf;
          lcd_clear();
          sprintf(buf,"%d lx",DEC);
          lcd_puts(buf);
          }
         delay_ms(1000);
         }
      
        }
      }
      
      //*****************************************
      
      int BH1750_read(int address){
      int i=0;
      i2c_start();
      i2c_write(address);
      i2c_start();
      i2c_write(address|1);
      BUFF[i]=i2c_read(1);
      i++;
      BUFF[i]=i2c_read(0);
      i++;
      i2c_stop();
      return i;}
      
      //******************************************
      
      void BH1750_Init(int address){
      i2c_start();
      i2c_write(address);
      i2c_write(0x10);
      i2c_stop();
      }
      اینم برنامه آردوینو

      کد:
      #include <Wire.h>
      
      int BH1750_address = 0x23; // i2c Addresse
      byte buff[2];
      
      void setup(){
       
       Wire.begin();
       BH1750_Init(BH1750_address);
       
       delay(200);
       Serial.begin(9600);
       Serial.println("Start");
      }
      
      void loop(){
       
       float valf=0;
      
       if(BH1750_Read(BH1750_address)==2){
        
        valf=((buff[0]<<8)|buff[1])/1.2;
        
        if(valf<0)Serial.print("> 65535");
        else Serial.print((int)valf,DEC); 
        
        Serial.println(" lx"); 
       }
       delay(1000);
      }
      
      void BH1750_Init(int address){
       
       Wire.beginTransmission(address);
       Wire.write(0x10); // 1 [lux] resolution
       Wire.endTransmission();
      }
      
      byte BH1750_Read(int address){
       
       byte i=0;
       Wire.beginTransmission(address);
       Wire.requestFrom(address, 2);
       while(Wire.available()){
        buff[i] = Wire.read(); 
        i++;
       }
       Wire.endTransmission(); 
       return i;
      }
      لطفا اگر مسیری که میرم اشتباهه، بهم بگین و مسیر درست را هم بهم راهنمایی کنید. با سپاس فراوان @};-
      سلام
      ببخشید من تو این روزا سرم شلوغه ...
      در اولین فرصت دیتاشیتش رو میخونم و نتیجه رو بهتون اعلام میکنم ...

      دوستان اگر کسی میتونه کمک دوستمون کنه دریغ نکنید ... ممنون

      موفق باشید
      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
      معرفی نرم افزار Codewizard PWM
      با من بیشتر آشنا شوید

      دیدگاه


        #18
        پاسخ : twi ?!?

        سلام

        کسی نبود به ما کمک کنه؟؟؟ :sad:

        دیدگاه


          #19
          پاسخ : twi ?!?

          سلام

          دوستان من مشکلم حل شد :-bd

          از همگی ممنونم :rolleyes:

          مخصوصا از آقا سامان که لطف زیادی به من کردن @};-

          سپاس

          دیدگاه


            #20
            پاسخ : twi ?!?

            نوشته اصلی توسط ok20
            سلام

            دوستان من مشکلم حل شد :-bd

            از همگی ممنونم :rolleyes:

            مخصوصا از آقا سامان که لطف زیادی به من کردن @};-

            سپاس
            آقا من شرمندم خیلی دیر میام ... :sad:
            کاری نکردم ...
            همش کار خودتون بوده
            خدا رو شکر که مشکلتون حل شد

            اگر جواب گرفتید یک نمونه برنامه برای دوستان بگذارید تا بقیه هم استفاده کنند
            ممنون
            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
            معرفی نرم افزار Codewizard PWM
            با من بیشتر آشنا شوید

            دیدگاه


              #21
              پاسخ : twi ?!?

              سلام
              من ماژول bh1750 رو گرفتم دیتاشیت رو خوندم یکم گیج شدم
              از دوستان که از این سنسور جواب گرفتن تقاضا دارم لطف کنن
              مرحله به مرحله الگوریتم ارسال دیتا و دریافت دیتا رو بنویسن تا با هر زیونی بشه نوشتش
              ممنون میشم

              دیدگاه


                #22
                پاسخ : twi ?!?

                سلام

                اول اینکه میکرو باید مستر باشه

                دوم اینکه بیت ریت باید 100 کیلو رهتز باشه

                سوم اینکه این سنسور چندتا رزولوشن و چند مد داره

                1- H-Resolution شامل مد 1 و مد2
                2- L-Resolution

                مورد شماره یک : دقت در مد 1 برابر 1 لوکس و در مد 2 برابر نیم لوکس می باشد

                مورد شماره دو: دقت 4 لوکس

                توی دیتاشیت صفحه 5 برای هر مد و هر رزولوشن یک opecode داده

                قابلیت اینو داره که هر بار که می خوای بخونی رزولوشن را تغییر بدی یا اینکه در کل برنامه با یه رزولوشن کار کنی.

                اگر رزولوشن از نوع H بود باید پایه ADD را به زمین وصل کنی و اگر L بود به VCC


                طبق مثال 1 صفحه 7 دیتاشیت داریم:

                ابتدا مستر در مد استارت قرار می گیره و سپس آدرس ماژول که 0X23 هست را میفرستیم برای ماژول به اضافه بیت رایت و سپ منتظر میکرو منتظر دریافت بیت ACK از سمت ماژول میشیم که نمایانگر آمادگی ماژول برای دریافت اطلاعات است.
                سپس کد opecode مربوط به رزولوشن دلخواه را ارسال می کنیم و باز منتظر دریافت ACK از سمت ماژول می باشیم.
                اینک مستر را در حالت Stop قرار می دهیم.

                اینک به منظور خواندن اطلاعات از سنسور به صورت زیر عمل می کنیم.

                اطلاعات به صورت دو بایت 8 بیتی از ماژول دریافت میشه.

                ابتدا میکرو را در مد استار قرار میدهیم و سپس آدرس ماژول را ارسال می کنیم و سپس بیت خواندن را ارسال میکنیم و سپس منتظر دریافت ACK از ماژول می شویم.

                پس از دریافت ACK از ماژول ، بایت پر ارزش ارسال میشه و پس از دریافت این بایت باید برای ماژول ACK ارسال بشه و بعد از آن بایت کم ارزش دریافت میشه و پس از دریافت باید Not ACK از میکرو برای ماژول ارسال بشه و بعد از اون مستر در مد stop میدیم.

                بعد بایت پر ارزش را در 256 ضرب کرده و با بایت کم ارزش جمع میکنیم و حاصل را بر 1.2 تقسیم میکنیم .پ

                مقدار به دست آمده لوکس می باشد.

                دیدگاه


                  #23
                  پاسخ : twi ?!?

                  مرسی :wow: :wow: :wow: :wow:
                  خیلی کامل و جامع بود :applause:
                  متاسفانه یکم سرم شلوغ شده ولی حتما تو یکی دو روز آینده تستش می کنم و نتیجه رو اینجا میزارم باز هم خیلی مرسی

                  دیدگاه


                    #24
                    پاسخ : twi ?!?

                    من اومدم ماژول رو تست کنم حواسم نبود بهش 5 ولت دادم :sad: :sad: :sad:
                    حالا نمیدونم ماژ<ل سوخته با نه همش دیتا 255 بر میگردونه
                    شما یک برنامه واسه تست نداری لطف کنی بزاری اینجا ؟

                    دیدگاه


                      #25
                      پاسخ : twi ?!?

                      ولتاژ ورودیش 5 ولته!

                      16 بیتیه! نباید 255 برگردونه!

                      یه جایی داری اشتباه میکنی!

                      برنامه ات را بزار ببینم چیکار کردی!

                      دیدگاه


                        #26
                        پاسخ : twi ?!?

                        دو تا 255 میداد
                        یکی واسه بایت پر ارزش یکی برا بایت کم ارزش

                        مشکلم حل شد
                        تو دستور اول به جای 23 هگز 46 هگز رو فرستادم اکی شد .
                        چفدر دقت داره این سنسور من لوکس متر دمه دستم نیست
                        آیا نیاز به کالیبراسیون هم داره
                        ؟

                        دیدگاه


                          #27
                          پاسخ : twi ?!?

                          آره. درسته!

                          باید آدرسش 46 باشه

                          دقتش بد نیست

                          من با لوکس متر LMT چک کردم.

                          اون مقدار 1.2 تقریبا اشتباهه
                          من با تغییر این مقدار به دقت خوبی رسیدم.

                          بعدشم کالیبراسیون لوکس متر توی ایران من سراغ ندارم

                          اگه شما میدونید به منم بگید.

                          دیدگاه


                            #28
                            پاسخ : twi ?!?

                            سلام دوستان من تازه وارد هستم

                            دیدگاه


                              #29
                              پاسخ : twi ?!?

                              // TWI slave initialization
                              // match_any_addr - if true, the slave match address logic responds to all received addresses
                              // addr - 7 bit address of the TWI slave
                              // rx_buffer - pointer to the slave receive buffer
                              // rx_buffer_size - size of the slave receive buffer
                              // tx_buffer - pointer to the slave transmit buffer
                              // slave_rx_handler - pointer to the TWI slave receive processing function
                              // slave_tx_handler - pointer to the TWI slave transmit processing function
                              void twi_slave_init(
                              bool match_any_addr,
                              unsigned char addr,
                              unsigned char *rx_buffer,
                              unsigned char rx_buffer_size,
                              unsigned char *tx_buffer,
                              bool (*slave_rx_handler)(bool rx_complete),
                              unsigned char (*slave_tx_handler)(bool tx_complete)
                              );
                              آقا اون دوتا پارامتر اخر چیه باید چی و وارد کنیم اینجا . ؟؟؟

                              دیدگاه

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