اطلاعیه

Collapse
No announcement yet.

راهآ‌اندازی سنسور HP03SA

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

    راهآ‌اندازی سنسور HP03SA

    سلام دوستان
    من میخوام سنسور HP03SA رو که یک سنسور فشار و دما با خروجی دیجیتال و با ارتباط I2C هست رو راهآ‌اندازی کنم.
    برنامهآ‌ی خواندن ضرایب از EEPROM داخلی سنسور و خواندن دیتا از واحد ADC سنسور رو نوشتم(فقط فشار رو نیاز داشتم).علاوه بر این برنامه محاسباتی فشار نهایی رو هم نوشتم اما صد درصد از برنامهآ‌ای که نوشتم مطمئن نیستم و یه قسمتآ‌هایی داره که متوجه نمیشم باید چکار کنم مثل پایهآ‌های MCLK و XCLR .دوستان امیدوارم کمک کنن ^^
    دیتاشیت سنسور رو میذارم
    http://www.datasheetlib.com/datashee...html#datasheet
    اینم برنامهآ‌ای که نوشتم
    کد:
    #include <mega32.h>
    
    // I2C Bus functions
    #asm
      .equ __i2c_port=0x1B ;PORTA
      .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 <delay.h>
    #include <math.h>
    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    // Place your code here
    
    }
    
    // Declare your global variables here
    signed int C1,C2,C3,C4,C5,C6,C7,A,B,C,D,D1,D2;
    long float DUT,OFF,SENS,X,Press;
    float MD1,MD2,MD3;
    char z[30];
    unsigned char read_cal_data(void);
    unsigned int readPressureAD(void);
    long float CalculatePressure(unsigned int);
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=T State0=T 
    PORTA=0x00;
    DDRA=0x0C;
    
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTB=0x00;
    DDRB=0x00;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Low level
    // INT1: Off
    // INT2: Off
    GICR|=0x40;
    MCUCR=0x00;
    MCUCSR=0x00;
    GIFR=0x40;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // 2 Wire Bus initialization
    // Generate Acknowledge Pulse: On
    // 2 Wire Bus Slave Address: 0h
    // General Call Recognition: Off
    // Bit Rate: 62.500 kHz
    TWSR=0x00;
    TWBR=0x00;
    TWAR=0x00;
    TWCR=0x44;
    
    // I2C Bus initialization
    i2c_init();
    
    // LCD module initialization
    lcd_init(16);
    
    // Global enable interrupts
    #asm("sei")
    read_cal_data();
    while (1)
       {
       // Place your code here
       readPressureAD();
       CalculatePressure();
       delay_ms(300);
       };
    }
    unsigned char read_cal_data(void) // tabe khandan C1,C1,...,C,D. ravesh khandan eeprom bsorat khandan motevali ast
    {
     unsigned char ucValue;
     i2c_start();
     i2c_write(0xa0); // device address
     i2c_write(16); // word address
     i2c_start();
     i2c_write(0xa1); // device address
     ucValue=i2c_read(1); // meghdar 1 ba dalil sader shodan ACK pas az khandan 1 bay ast(ba tavajoh ba gha'ede khandan motevali)
     C1=ucValue;
     ucValue=i2c_read(1);
     C1<<=8; // 8 bit ka aval daryaft shode ra 8 ta ba chap shift madahim ta MSB shavad
     C1|=ucValue; // C1=C1+ucValue
     
     
     ucValue=i2c_read(1);
     C2=ucValue;
     ucValue=i2c_read(1);
     C2<<=8;
     C2|=ucValue;
     
     ucValue=i2c_read(1);
     C3=ucValue;
     ucValue=i2c_read(1);
     C3<<=8;
     C3|=ucValue;
     
     ucValue=i2c_read(1);
     C4=ucValue;
     ucValue=i2c_read(1);
     C4<<=8;
     C4|=ucValue;
     
     ucValue=i2c_read(1);
     C5=ucValue;
     ucValue=i2c_read(1);
     C5<<=8;
     C5|=ucValue;
     
     ucValue=i2c_read(1);
     C6=ucValue;
     ucValue=i2c_read(1);
     C6<<=8;
     C6|=ucValue;
     
     ucValue=i2c_read(1);
     C7=ucValue;
     ucValue=i2c_read(1);
     C7<<=8;
     C7|=ucValue;
     
     ucValue=i2c_read(1);
     A=ucValue;
     
     ucValue=i2c_read(1);
     B=ucValue;
     
     ucValue=i2c_read(1);
     C=ucValue;
     
     ucValue=i2c_read(1);
     D=ucValue;
    }
    unsigned int readPressureAD(void) // tabe khandan D1 az ADC
    {
     unsigned char ucData;
     i2c_start();
     i2c_write(0xee);
     i2c_write(0xff);
     i2c_write(0xf0);
     i2c_stop();
     delay_ms(40);
     i2c_start();
     i2c_write(0xee);
     i2c_write(0xfd);
     i2c_start();
     i2c_write(0xef);
     
     D1=i2c_read(1);
     D1<<=8; // khandan MSB
     ucData=i2c_read(0); // da in halat bayad 0 nevesht chon bayad NACK ersal shvad
     i2c_stop();
     D1|=ucData;
     
     return D1;
     }
    long float CalculatePressure(void) // tabe mohasebat
    {
    if(D2<C5)
     {
     MD1=D2-C5;
     MD2=MD1/pow(2,7);
     MD3=(MD2*B)/pow(2,C);
     dUT=MD1-(MD2*MD3);
     }
    else // D2>=C5
     {
     MD1=D2-C5;
     MD2=MD1/pow(2,7);
     MD3=(MD2*A)/pow(2,C);
     dUT=MD1-(MD2*MD3);
     }
    //calculate OFF
    OFF=(C2+((C4-1024)*dUT/pow(2,14)))*4;
    //calculate SENS
    SENS=C1+(C3*dUT)/pow(2,10);
    //calculate X
    X=(SENS*(D1-7168)/pow(2,14))-OFF;
    //calculate Press
    Press=(X*10/pow(2,5))+C7;
    lcd_init(16);
    lcd_gotoxy(0,0);
    sprintf(z,"pressure is %6.2f",Press);
    lcd_puts(z);
     }

    #2
    پاسخ : راهآ‌اندازی سنسور HP03SA

    سلام
    توابعی که برای اون دو پایه بود رو بذار
    گفت که دیوانه نهی لایق این خانه نهی

    دیدگاه


      #3
      پاسخ : راهآ‌اندازی سنسور HP03SA

      نوشته اصلی توسط Finder_
      سلام
      توابعی که برای اون دو پایه بود رو بذار
      MCLK رو به پایه P3^5 و P3^4 رو به XCLR داده
      مشکل اصلیم روی MCLK هست
      این لینک pdf کامل اون برنامه هست
      https://www.pollin.de/shop/downloads/D810119D.PDF
      کد:
      void MCLKOn(void)
      {
      TMOD=0x12;
      TH0=0xf8;
      TL0=0xf8;
      ET0=0;
      EA=1;
      PT0=1;
      TR0=1;
      }
      //==================
      void MCLKOff(void)
      { TR0=0;
      ET=0;
      }
      //===================
      void vect_Timer0(void)interrupt 1 using 1
      {
      MCLK=~MCLK;
      //================
      void i2c_XCLR_LOW(void)
      {
      XCLR=0;
      }
      //=================
      void i2c_XCLR_HIGH(voi)
      {
      XCLR=1;
      }
      }

      دیدگاه


        #4
        پاسخ : راهآ‌اندازی سنسور HP03SA

        این برنامه اومده یه پالس 32 کیلو روی پایه Mclk درست کرده
        فرکانس میکروت چنده؟
        گفت که دیوانه نهی لایق این خانه نهی

        دیدگاه


          #5
          پاسخ : راهآ‌اندازی سنسور HP03SA

          نوشته اصلی توسط Finder_
          این برنامه اومده یه پالس 32 کیلو روی پایه Mclk درست کرده
          فرکانس میکروت چنده؟
          چون نمیدونستم که فرکانس میکرو باید با این پالس هماهنگ باشه یا نه،هنوز فرکانسی رو واسه میکرو تعیین نکردم

          دیدگاه


            #6
            پاسخ : راهآ‌اندازی سنسور HP03SA

            فرکانس با وقفه تایمر ساخته میشه. مثلا فرکانس میکرو رو بذار 8مگا.
            کد:
            void timer0_init(void)
            {
            // Timer/Counter 0 initialization
            // Clock source: System Clock
            // Clock value: 8000.000 kHz
            TCCR0=0x01;
            TCNT0=0x00;
            }
            این تابع کانفیگ تایمر 0

            کد:
            // Timer 0 overflow interrupt service routine
            interrupt [TIM0_OVF] void timer0_ovf_isr(void)
            {
            TCNT0=131; //256-125=131 Step
            Mclk=~Mclk
            }
            این هم روتین اینتراپت
            گفت که دیوانه نهی لایق این خانه نهی

            دیدگاه


              #7
              پاسخ : راهآ‌اندازی سنسور HP03SA

              نوشته اصلی توسط Finder_
              فرکانس با وقفه تایمر ساخته میشه. مثلا فرکانس میکرو رو بذار 8مگا.
              کد:
              void timer0_init(void)
              {
              // Timer/Counter 0 initialization
              // Clock source: System Clock
              // Clock value: 8000.000 kHz
              TCCR0=0x01;
              TCNT0=0x00;
              }
              این تابع کانفیگ تایمر 0

              کد:
              // Timer 0 overflow interrupt service routine
              interrupt [TIM0_OVF] void timer0_ovf_isr(void)
              {
              TCNT0=131; //256-125=131 Step
              Mclk=~Mclk
              }
              این هم روتین اینتراپت
              پس من باید بعد از انتخاب فرکانس 8مگا برای میکرو،تایمر یک رو فعال کنم بعد تو زیر روال وقفه 32کیلو رو ایجاد کنم اونوقت از تابع زیر روال وقفه تو برنامهآ‌ی اصلی استفاده کنم.درست متوجه شدم یا چیزایه دیگهآ‌ای هم هست؟

              دیدگاه


                #8
                پاسخ : راهآ‌اندازی سنسور HP03SA

                فرکانس 8 روانتخاب کن.
                وقفه مربوط به تایمر صفر رو فعال کن.
                تابع timer0_init رو هم قبل از while(1) فراخوانی کن.
                داخل روتین اینتراپت ایجاد شده وضعیت پایه رو Toggle کن
                گفت که دیوانه نهی لایق این خانه نهی

                دیدگاه


                  #9
                  پاسخ : راهآ‌اندازی سنسور HP03SA

                  نوشته اصلی توسط Finder_
                  فرکانس 8 روانتخاب کن.
                  وقفه مربوط به تایمر صفر رو فعال کن.
                  تابع timer0_init رو هم قبل از while(1) فراخوانی کن.
                  داخل روتین اینتراپت ایجاد شده وضعیت پایه رو Toggle کن
                  ممنونم که وقت میذارید
                  اگه امکان داره برنامهآ‌هایی رو که واسه فراخوانی از eeprom سنسور و واحد ADC سنسور رو نوشتم یه نگاه بندازید و نظرتون رو بگید.(برنامهآ‌ها رو با توجه به کاتالوگ و برنامهآ‌ی 8051 نوشتم)

                  دیدگاه


                    #10
                    پاسخ : راهآ‌اندازی سنسور HP03SA

                    خواهش میکنم.
                    برنامه هاتونو بذارید
                    گفت که دیوانه نهی لایق این خانه نهی

                    دیدگاه


                      #11
                      پاسخ : راهآ‌اندازی سنسور HP03SA

                      نوشته اصلی توسط Finder_
                      خواهش میکنم.
                      برنامه هاتونو بذارید
                      :nice:
                      برنامهآ‌ها رو تو کامنت اول گذاشتم.لینک برنامهآ‌ی 8051 این سنسور رو هم تو کامنتآ‌های بعدیش وجود داره

                      دیدگاه


                        #12
                        پاسخ : راهآ‌اندازی سنسور HP03SA

                        نوشته اصلی توسط Finder_
                        خواهش میکنم.
                        برنامه هاتونو بذارید
                        سلام.من برنامه های میکرو رو نوشتم فقط به جای تایمر (برای ایجاد 32 کیلو روی پایه MCLK) از کریستال خارجی میخوام استفاده کنم.تو اینترنت خیلی برای تغییر فیوز بیتآ‌های میکرو گشتم.با اینکه مطلب خیلی بود اما همه برام مبهم بودن و کلا گیج شدم. :eek: oo:
                        میشه راهنمایی کنید که فیوز بیت ها رو چجوری روی کریستال خارجی تنظیم کنم؟

                        دیدگاه


                          #13
                          پاسخ : راهآ‌اندازی سنسور HP03SA

                          باید برید تو بخش Fuse bit پروگرمرتون و از اونجا کریستال خارجی رو انتخاب کنید
                          گفت که دیوانه نهی لایق این خانه نهی

                          دیدگاه

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