اطلاعیه

Collapse
No announcement yet.

راه اندازی BMP085 سنسور دما و فشار

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

    #16
    پاسخ : راه اندازی BMP085 سنسور دما و فشار

    این سنسور یک سنسور فشار به همراه یک دماسنج داخلی هست
    راه اندازی آن درصورتی که طبق روال توضیحات دیتا شیت استفاده کنین ساده هست
    الان برنامه ش همراه من نیست که اینجا بذارم ولی اگه مشکل داشتید میتونم نمونه کد راه اندازی دماسنج و فشار سنج اون رو براتون بذارم
    [br /][hr]http://pcenter.ir[hr][br /]

    دیدگاه


      #17
      پاسخ : راه اندازی BMP085 سنسور دما و فشار

      سلام
      هنوز لازمه
      من یک کتابخانه از این سنسور تو همین سایت قبلا گداشتم.این ادرس
      http://www.eca.ir/forum2/index.php?topic=91173.0

      دیدگاه


        #18
        پاسخ : راه اندازی BMP085 سنسور دما و فشار

        خب خدا رو شکر با عنایت و لطف خدا موفق شدم این سنسور رو راه اندازی کنم
        سورس کدهاش هم واسه استفاده دوستان قرار میدم
        یه عکس هم ازش می ذارم..... برنامه ای که نوشتم: دما- فشار و ارتفاع از سطح دریا رو نشون میده
        نحوه اتصال پایه های سنسور و ال سی دی به میکرو رو توی فایل اصلی توضیح دادم.... اگه با این برنامه میخواین اجراش کنید باید نحوه اتصالش منطبق با اون باشه مگر اینکه تعریف پایه هاش رو عوض کنید....... در ضمن برنامه با کد ویژن و به زبان C نوشته شده
        فقط قبلش از دوستان به خاطر کیفیت پایین عکسها عذر خواهی میکنم.... ببخشید دیگه در حد بضاعت بنده است

        http://uplod.ir/fh5ri25h4mv5/BMP085.rar.htm
        http://uplod.ir/f93lgd43zcvl/20140602748.jpg.htm
        http://uplod.ir/1za9vh1guncp/20140602747.jpg.htm

        دیدگاه


          #19
          پاسخ : راه اندازی BMP085 سنسور دما و فشار

          سلام saeed-66 عزیز
          من برای انجام پروژه ای باید bmp180 رو راه اندازی کنم.همه جا نوشته که کاملا شبیه bmp085 است.
          کد شمارو دانلود کردم و اجرا کردم ولی اول از همه به TWINT گیر میداد(undefined symbol 'TWINT&#039 که TWCR رو به صورت عدد هگز مقدار دهی کردم(بر اساس رجیستر های برنامه)
          نهایتا وقتی برنامه رو پروگرام می کنم مقادیر ac1, ac2, ac3 و ... رو صفر می دهد(در شروع) و نهایتا دما رو صفر نشون می ده و همچنین برای فشار هم مقدار ثابتی نشون میده(که از فرمول میاد ). میشه لطف کنی کمکم کنی؟

          دیدگاه


            #20
            پاسخ : راه اندازی BMP085 سنسور دما و فشار

            سلام علی آقا
            خب چندتا مسئله هست
            اول اینکه شما با کد ویژن کامپایل میکنی یا چیز دیگه؟
            دوم اینکه من خودم با bmp180 کار نکردم ولی ظاهرا خیلی شبیه هستن، اما تفاوتهاش میتونه خیلی مهم باشه: مثل آدرس وسیله موقع خوندن و نوشتن، محاسبات پارامترهای تصحیحش و ..... من توی برنامم دوتا led واسه پایه های PB2 و PB3 تعریف کردم که اگه هر خطایی رخ بده روشن میشن.... البته دفعه اول منم خروجی همه رو صفر گرفتم که وقتی توی برنامم گشتم دیدم آدرس وسیله رو اشتباه دادم فکر کنم حتی led ها هم روشن نشدن :redface: :redface:. پس حتما حتما دیتاشیت سنسور رو کامل مطالعه کن و هرجا با برنامه متفاوت هست باید ویرایش کنی.
            سوم TWINT نمیدونم چرا نشناخته این غیر طبیعیه :cry: :cry: چون جزء رجیسترهای خود mega16 هست و اصلا نیازی به تعریف قبلی نداره.... مگه اینکه توی هدر فایلش دست بره باشی و کامپایلرت مشکل داشته باشه.
            ولی همین که صفحه خوش آمد رو نشون میده یعنی 90 درصد کار درسته :job: :job: و فقط میکرو نمیتونه درست با سنسور ارتباط برقرار کنه...
            و چهارم هم آدرس رجیسترهایی که دما و فشار رو از اونجا میخونی هم خیلی مهمه (آدرس کنترل رجیسترهای فشار و دما) ممکنه توی سنسور شما با مال من متفاوت باشه..
            این موارد رو چک کن انشا.. که برطرف میشه :applause: :applause: :applause:.... اگه شد خبر بده اگه هم نشد بازم کمکی بتونم در خدمتم
            یا حق

            دیدگاه


              #21
              پاسخ : راه اندازی BMP085 سنسور دما و فشار

              سلام
              تشکر از پاسخ و توجهتون
              کامپایلرم کدویژن هست و برای خودم هم عجیب است که TWINT رو نمیشناسه. جالبه که TWEA,TWSTA,TWSTO,TWWC,TWEN,TWIE ها رو میشناسه.
              آدرس هارو در دیتاشیتش چک کردم کاملا شبیه هم بودند. :cry:
              هنوز به قسمت رجیستر های دما و فشار نرسیدم. فعلا در قسمت اول یعنی خواندن مقادیر کالیبراسیون هستم.

              همان اول کار اشتباها به vcc آن 5 ولت وصل کردم، آیا ممکنه صدمه دیده باشه؟ تو دیتاشیتش ماکسیمم ولتاژ قابل تحمل رو زده 4.2 ولت.

              با کد زیر مقدار 255 رو برای پارامتر های کالیبراسیون میگیرم. به نظرتون ایرادش در کجاست؟ در خود دیتا شیتش نوشته نباید 0 یا 255 بگیرید.
              کد:
              unsigned char eeprom_read(unsigned char address) {
              unsigned char data;
              i2c_start();
              i2c_write(0xEF);
              //i2c_write(0);
              i2c_write(address);
              i2c_start();
              i2c_write(0xEE);
              data=i2c_read(0);
              i2c_stop();
              return data;
              }
              باز هم تشکر از توجهتون

              دیدگاه


                #22
                پاسخ : راه اندازی BMP085 سنسور دما و فشار

                نوشته اصلی توسط ali3170
                سلام
                تشکر از پاسخ و توجهتون
                کامپایلرم کدویژن هست و برای خودم هم عجیب است که TWINT رو نمیشناسه. جالبه که TWEA,TWSTA,TWSTO,TWWC,TWEN,TWIE ها رو میشناسه.
                آدرس هارو در دیتاشیتش چک کردم کاملا شبیه هم بودند. :cry:
                هنوز به قسمت رجیستر های دما و فشار نرسیدم. فعلا در قسمت اول یعنی خواندن مقادیر کالیبراسیون هستم.

                همان اول کار اشتباها به vcc آن 5 ولت وصل کردم، آیا ممکنه صدمه دیده باشه؟ تو دیتاشیتش ماکسیمم ولتاژ قابل تحمل رو زده 4.2 ولت.

                با کد زیر مقدار 255 رو برای پارامتر های کالیبراسیون میگیرم. به نظرتون ایرادش در کجاست؟ در خود دیتا شیتش نوشته نباید 0 یا 255 بگیرید.
                کد:
                unsigned char eeprom_read(unsigned char address) {
                unsigned char data;
                i2c_start();
                i2c_write(0xEF);
                //i2c_write(0);
                i2c_write(address);
                i2c_start();
                i2c_write(0xEE);
                data=i2c_read(0);
                i2c_stop();
                return data;
                }
                باز هم تشکر از توجهتون
                خواهش میکنم
                در مورد ولتاژ، خب احتمالش هست که آسیب دید ه باشه ولی من بعید میدونم چون همین که داره کار میکنه خودش نشونه خوبیه هر چند که جواب نادرست بده.
                من توصیه میکنم اول دیتاشیت رو کامل بخونید بعد روی برنامه نویسیش وقت بذارید...... چون حتی اگه آدرس رجیستر ها رو یه بیت هم اشتباه بدید نتیجه اش میشه خروجی نادرست سنسور........ که به تصورم اصول برنامه نویسی درسته و فقط کافیه آدرس ها رو چک کنید

                دیدگاه


                  #23
                  پاسخ : راه اندازی BMP085 سنسور دما و فشار

                  سلام
                  باز هم تشکر
                  با همین کد بالا بالاخره خوندمش.(جای 0xEE و 0xEF رو جابه جا نوشته بودم)
                  خروجی دماش خیلی خوب و دقیق هست (با دقت دو رقم اعشار) ولی خروجی فشارش درست نیست.(با اینکه رجیستر OSS(high resulution) رو 3 می گذارم))
                  یعنی فشار هوا با فشار هوای شهر ما یکی نیست. ارتفاع هم که از این فشار بدست میارم 200 متر اختلاف داره
                  و وقتی خلا روش اعمال می کنم مقدارش به 10000 که می رسه یک دفعه میشه 18000 دوباره شروع می کنه به کم شدن تا به 1100 برسه دوباره همین کارو می کنه.

                  ممنون می شوم راهنماییم کنید.

                  دیدگاه


                    #24
                    پاسخ : راه اندازی BMP085 سنسور دما و فشار

                    نوشته اصلی توسط ali3170
                    سلام
                    باز هم تشکر
                    با همین کد بالا بالاخره خوندمش.(جای 0xEE و 0xEF رو جابه جا نوشته بودم)
                    خروجی دماش خیلی خوب و دقیق هست (با دقت دو رقم اعشار) ولی خروجی فشارش درست نیست.(با اینکه رجیستر OSS(high resulution) رو 3 می گذارم))
                    یعنی فشار هوا با فشار هوای شهر ما یکی نیست. ارتفاع هم که از این فشار بدست میارم 200 متر اختلاف داره
                    و وقتی خلا روش اعمال می کنم مقدارش به 10000 که می رسه یک دفعه میشه 18000 دوباره شروع می کنه به کم شدن تا به 1100 برسه دوباره همین کارو می کنه.

                    ممنون می شوم راهنماییم کنید.
                    خب اگه از کدهای من استفاده میکنی باید بگم من خودم هم وقتی oss رو چیزی غیر از صفر میدادم خروجی کاملا عوض میشد و فقط روی مقدار صفر جواب مناسبی میداد..........( بهتره بذاری صفر باشه چون روی دقت جواب که فکر نکنم موثر باشه)
                    اما در مورد فشار باید بگم من وسیله ای نداشتم که تستش کنم ولی به این نکته توجه کن که توی چه بازه ای کار میکنه.... BMP085 که حداقل فشار رو نوشته بود 300 هکتوپاسکال که میشه 30000 پاسکال... پس قاعدتا نمیتونه فشار 10000 رو نشون بده...
                    ولی دما رو که تست کردم فقط تا دمای 50 درجه خیلی خوب جواب میداد و بعدش مقدارهای منفی روی فشار و دما نشون میداد ( گرچه توی دیتاشیت تا حدود 80 درجه نوشته بود)---- راستش نمیدونم شایدم مشکل از برنامم بوده ولی چون تا همون مقدار واسم کفایت میکرد دیگه روی علت خطاش دقیق نشدم...

                    دیدگاه


                      #25
                      پاسخ : راه اندازی BMP085 سنسور دما و فشار

                      بار هم تشکر از راهنماییتون. :smile:

                      دیدگاه


                        #26
                        BMP180

                        دوستان با BMP180 دارم کار میکنم... :read: oo: :surprised:
                        نظری... چیزی؟؟؟ نبود...؟

                        دیدگاه


                          #27
                          پاسخ : BMP180

                          نوشته اصلی توسط Amir.H.A
                          دوستان با BMP180 دارم کار میکنم... :read: oo: :surprised:
                          نظری... چیزی؟؟؟ نبود...؟

                          لطف کنید برنامتونو بذارید ببینیم.

                          دیدگاه


                            #28
                            پاسخ : راه اندازی BMP085 سنسور دما و فشار

                            سلام دوستان

                            من سی بلد نیستم

                            میشه لطف کنین که به زبان بیسیک بنویسین که من چطوری اطلاعات این ماژول رو بخونم

                            با تشکر

                            دیدگاه


                              #29
                              پاسخ : راه اندازی BMP085 سنسور دما و فشار

                              کسی نیست کمکم کنه؟

                              دیدگاه


                                #30
                                پاسخ : راه اندازی BMP085 سنسور دما و فشار

                                سلام.
                                من با این کد bmp180 رو راه انداختم.
                                ولی دقت بدی داره و رزولوشن بالا رو که انتخاب میکنم ، محاسبات اشتباه میشه...
                                ثابت oss برای انتخاب دقت سنسوره. که در صفر دقت خوبی نداره و در حالات دیکه اعداد اشتباهند...

                                [hr]

                                [tt]/************************************************** ***
                                [glow=red,2,300]This program was produced by the

                                www.ECA.ir



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

                                #include <mega16.h>

                                // I2C Bus functions
                                #asm
                                .equ __i2c_port=0x15 ;PORTC
                                .equ __sda_bit=0
                                .equ __scl_bit=1
                                #endasm
                                #include <i2c.h>

                                // Alphanumeric LCD Module functions
                                #asm
                                .equ __lcd_port=0x12 ;PORTD
                                #endasm
                                #include <lcd.h>


                                //#include <BMP085.h> این فایل ذر برنامه اصلی فراخوانی شده بود برای نوع دیگری از سنسور است
                                #include <delay.h>
                                #include <stdio.h>
                                #include <stdlib.h>
                                #include <math.h>

                                //آدرس رجیستر های کنترلی سنسور
                                #define DEVICE_address_write 0xEE
                                #define DEVICE_address_read 0xEF
                                #define PT_writeAddress_register 0xF4
                                #define PT_resultAddress_register 0xF6
                                #define T_control_register 0x2E
                                #define oss 0
                                #define P_control_register (0x34+(oss<<6))
                                #define P0 101325
                                #define ACK 1
                                #define NOACK 0


                                //آدرس رجیستر های داخلی این سنسور که باتوجه به دیتاشیت تعریف کرده ام
                                //مقادیر این رجیستر ها برای کالیبره کردن مقادیر دما و فشار لازم است
                                #define AC1 0XAA
                                #define AC2 0XAC
                                #define AC3 0XAE
                                #define AC4 0XB0
                                #define AC5 0XB2
                                #define AC6 0XB4

                                #define B1 0XB6
                                #define B2 0XB8
                                #define MB 0XBA
                                #define MC 0XBC
                                #define MD 0XBE

                                char os=78;
                                //فراخوانی توابع
                                unsigned char write_to_device(unsigned char ,unsigned char ) ;
                                unsigned char read_from_device(unsigned char , unsigned char *) ;
                                int power(int,int);


                                //تابع اصلی
                                void main (){
                                //**********-----------متغیر های محلی--------**********
                                short int ac1,ac2,ac3,b1,b2,mb,md;
                                unsigned short int ac4,ac5,ac6;
                                long int mc;
                                long UT,UP,T,P,x1,x2,x3,b3,b5,b6;
                                unsigned long int b4,b7;
                                unsigned char k, *data=0;

                                int i, n1,n2,n3;
                                float alt;
                                char str[16] ,lcd[16];

                                //**********------------تنطیمات ارتباط سریال دوسیمه------*********
                                // FOSC=4 MHz FSCL = 200kHz
                                TWSR = 0x00;
                                TWBR = 2; // 4000000/(16+2*2) = 200 KHz
                                #asm ("sei&quot

                                //*********-----------پیام خوش آمد گویی----------------**********
                                lcd_init(16); //تعریف تعداد ستون های ال سی دی
                                lcd_clear();
                                lcd_putsf("Hello! Welcome"



                                //چشمک زدن ال ای دی بر روی پورت B
                                DDRB=(1<<DDB7)|(1<<DDB1)|(1<<DDB 0)|(1<<DDB2)|(1<<DDB3);
                                for(i=0;i<5;i++){
                                PORTB=(1<<PORTB7);
                                delay_ms(100);
                                PORTB=(0<<PORTB7);
                                delay_ms(100);
                                }


                                //*******---خواندن متغیر های کالیبراسیون و نمایش آنها----*******
                                i=150;
                                lcd_clear();
                                k=read_from_device(AC1, data); if(!k) PORTB.3=1;
                                ac1=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"ac1= %d ",ac1); lcd_gotoxy(0,0); lcd_puts(str); delay_ms(i);

                                k=read_from_device(AC2, data); if(!k) PORTB.3=1;
                                ac2=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"ac2= %d",ac2); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(i);
                                delay_ms(i);delay_ms(i);lcd_clear();
                                k=read_from_device(AC3, data); if(!k) PORTB.3=1;
                                ac3=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"ac3= %d",ac3); lcd_gotoxy(0,0); lcd_puts(str); delay_ms(i);

                                k=read_from_device(AC4, data); if(!k) PORTB.3=1;
                                ac4=(unsigned short int)(data[0]<<8)+data[1];
                                sprintf(str,"ac4= %d",ac4); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(i);
                                delay_ms(i);delay_ms(i);lcd_clear();
                                k=read_from_device(AC5, data); if(!k) PORTB.3=1;
                                ac5=(unsigned short int)(data[0]<<8)+data[1];
                                sprintf(str,"ac5= %d",ac5); lcd_gotoxy(0,0); lcd_puts(str); delay_ms(i);

                                k=read_from_device(AC6, data); if(!k) PORTB.3=1;
                                ac6=(unsigned short int)(data[0]<<8)+data[1];
                                sprintf(str,"ac6= %d",ac6); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(i);
                                delay_ms(i);delay_ms(i);lcd_clear();
                                k=read_from_device(B1, data); if(!k) PORTB.3=1;
                                b1=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"b1= %d",b1); lcd_gotoxy(0,0); lcd_puts(str); delay_ms(i);

                                k=read_from_device(B2, data); if(!k) PORTB.3=1;
                                b2=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"b2= %d",b2); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(i*2);
                                delay_ms(i);delay_ms(i);

                                //delay_ms(i);delay_ms(i);delay_ms(i);delay_ms(i);de lay_ms(i);
                                lcd_clear();

                                k=read_from_device(MB, data); if(!k) PORTB.3=1;
                                mb=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"mb= %d",mb); lcd_gotoxy(0,0); lcd_puts(str); delay_ms(i);

                                k=read_from_device(MC, data); if(!k) PORTB.3=1;
                                mc=(long int)(data[0]<<8)+data[1];
                                sprintf(str,"mc= %d",mc); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(i);

                                k=read_from_device(MD, data); if(!k) PORTB.3=1;
                                md=(short int)(data[0]<<8)+data[1];
                                sprintf(str,"md= %d",md); lcd_gotoxy(0,2); lcd_puts(str); delay_ms(i);

                                delay_ms(i);delay_ms(i);delay_ms(i);


                                while(1){

                                //*****---------محاسبه دما ---------*******
                                k= write_to_device(PT_writeAddress_register, T_control_register);
                                if(!k) PORTB.2=1; else PORTB.2=0;
                                delay_ms(5);
                                delay_ms(os);
                                k= read_from_device(0xf6, data) ;
                                if(!k) PORTB.3=1; else PORTB.3=0;

                                UT=(long)((data[0]<<8)+data[1]);
                                x1=(UT-ac6)*ac5/(0x02<<14);
                                x2= mc*(0x02<<10)/(x1+md) ; // (0x02<<10) = 2 power 11
                                b5=x1+x2;
                                T=(b5+8)/(0x02<<3);
                                n1=T/10; n2=T%10;

                                // lcd_clear();
                                //lcd_gotoxy(0,0);
                                /*
                                sprintf(str,"UT= %u",UT);
                                lcd_puts(str);
                                delay_ms(1000);
                                lcd_gotoxy(0,1);
                                */
                                lcd_gotoxy(0,0);
                                lcd_putsf(" "
                                lcd_gotoxy(0,0);
                                sprintf(str,"T: %d.%d \xdfC",n1,n2);
                                lcd_puts(str);
                                //delay_ms(500);


                                //********---------محاسبه فشار هوا ---------**********
                                k= write_to_device(PT_writeAddress_register , P_control_register);
                                if(!k) PORTB.2=1; else PORTB.2=0;
                                //delay_ms(5+power(3,oss));
                                delay_ms(os);
                                k=read_from_device(0xf6, data);
                                if(!k) PORTB.3=1; else PORTB.3=0;

                                UP=(long) ((data[0]<<8) +data[1]);
                                //UP=(long) ( ( (data[0]<<16) + (data[1]<<8) + (data[2]) ) >> (8-oss) ) ;
                                b6=b5-4000;
                                x1=(b2*(b6*b6/(0x02<<11)))/(0x02<<10);
                                x2=ac2*b6/(0x02<<10);
                                x3=x1+x2;

                                b3=((ac1*4+x3)<< oss +2)/4;
                                x1=ac3*b6/(0x02<<12);
                                x2=(b1*(b6*b6/(0x02<<12)))/(0x02<<15);
                                x3=((x1+x2)+2)/(0x02<<1);

                                b4=ac4*(unsigned long)(x3+32768)/(0x02<<14);
                                b7=((unsigned long)UP-b3)*(50000>>oss);
                                if(b7 < 0x80000000){P=(b7*2)/b4;}
                                else {P=(b7/b4)*2;}
                                x1=(P/(0x02<<7))*(P/(0x02<<7));
                                x1=(x1*3038)/(0x02<<15);
                                x2=(-7357*P)/(0x02<<15);
                                P=P+(x1+x2+3791)/(0x02<<3);
                                n1=P/10000; n2=P%10000;


                                /*
                                lcd_clear();
                                sprintf(str,"UP= %u",UP);
                                lcd_puts(str);
                                delay_ms(1000);
                                */
                                sprintf(str,"P: %d%d pa",n1,n2);
                                lcd_gotoxy(0,1);
                                lcd_putsf(" "
                                lcd_gotoxy(0,1);
                                lcd_puts(str);
                                delay_ms(700);


                                //********---------محاسبه ی ارتفاع از سطح دریا بر حسب فشار هوا ---------**********
                                alt=pow(P,(1/5.255));
                                alt=alt/(pow(P0,(1/5.255)));
                                alt=44330*(1-alt);
                                //lcd_clear();
                                //lcd_putsf("Height above Sea"
                                //delay_ms(200);
                                ftoa(alt,1,str);
                                sprintf(lcd,"Alt: %s m",str);
                                lcd_gotoxy(0,0);
                                lcd_putsf(" "
                                lcd_gotoxy(0,0);
                                lcd_puts(lcd);
                                delay_ms(500);


                                }// End of while
                                } // End of main

                                //*********** ********************سایر توابع برنامه******************************************** ****
                                //--------------------------------------------------------------------------------

                                void TWI_start(void)
                                {
                                TWCR = (1<<TWINT)|(0<<TWEA)|(1<<TWSTA)| (0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|( 0<<TWIE);
                                while ((TWCR & (1<<TWINT)) == 0);
                                }

                                //--------------------------------------------------------------------------------

                                void TWI_stop(void)
                                {
                                TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)| (1<<TWSTO)|(0<<TWWC)|(1<<TWEN)|( 0<<TWIE);
                                }

                                //--------------------------------------------------------------------------------

                                void TWI_data_transmit(unsigned char data)
                                {
                                TWDR = data;
                                TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)| (0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|( 0<<TWIE);
                                while ((TWCR & (1<<TWINT)) == 0);
                                }

                                //--------------------------------------------------------------------------------

                                unsigned char TWI_data_receive(unsigned char ack)
                                {
                                if(ack)TWCR = (1<<TWINT)|(1<<TWEA)|(0<<TWSTA)| (0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|( 0<<TWIE);
                                else TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)| (0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|( 0<<TWIE);
                                while ((TWCR & (1<<TWINT)) == 0);
                                return TWDR;
                                }

                                //--------------------------------------------------------------------------------

                                unsigned char status(void)
                                {
                                return(TWSR & 0xf8);
                                }

                                //--------------------------------------------------------------------------------
                                unsigned char write_to_device(unsigned char address_register ,unsigned char control_register)
                                {

                                TWI_start();
                                if (status() != 0x08) {TWI_stop(); return 0;}
                                TWI_data_transmit(DEVICE_address_write);
                                if (status() != 0x18) {TWI_stop(); return 0;}
                                TWI_data_transmit(address_register);
                                if (status() != 0x28) {TWI_stop(); return 0;}
                                TWI_data_transmit(control_register);
                                if (status() != 0x28) {TWI_stop(); return 0;}
                                TWI_stop();
                                return 1;
                                }

                                //-----------------------------------------------------------------------------------
                                unsigned char read_from_device(unsigned char address_register , unsigned char *data)
                                {

                                TWI_start();
                                if (status() != 0x08) {TWI_stop(); return 0;}
                                TWI_data_transmit(DEVICE_address_write);
                                if (status() != 0x18) {TWI_stop(); return 0;}
                                TWI_data_transmit(address_register);
                                if (status() != 0x28) {TWI_stop(); return 0;}
                                TWI_start(); //Repeated start to read from eeprom
                                if (status() != 0x10) {TWI_stop(); return 0;}
                                TWI_data_transmit(DEVICE_address_read);
                                if (status() != 0x40) {TWI_stop(); return 0;}
                                *data=TWI_data_receive(ACK); // OR data[0]=....
                                if (status() != 0x50) {TWI_stop(); return 0;}
                                *(data+1)=TWI_data_receive(ACK);
                                if (status() != 0x50) {TWI_stop(); return 0;}
                                *(data+2)=TWI_data_receive(NOACK);
                                if (status() != 0x58) {TWI_stop(); return 0;}
                                TWI_stop();
                                return 1;

                                }
                                //-----------------------------------------------------------------------------------
                                int power(int i , int j)
                                {
                                int k=0,r=1;
                                for(k=0;k<j;k++){
                                r=r*i;
                                }
                                return r;
                                }[/tt][/glow]

                                دیدگاه

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