اطلاعیه

Collapse
No announcement yet.

مشکل در نمایش در سون سگمنت؟

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

    مشکل در نمایش در سون سگمنت؟

    با سلام
    برنامه راه اندازی سنسور sht75 رو با کدویژن و سون سگمنت رو نوشتم ولی هر کار میکنم پرش اعداد روی سون سگمنت خیلی زیاده ؟
    راه حلش چیه و چه جوری بنویسم؟ ممنون
    این قسمت نمایش دما

    کد:
     b=a%10;
        c=a/10;
        c=c%10;
        d=a/100;
        d=d%10;
        e=a/1000;
         
        
        PORTC.0=1;
        PORTD=seg[e];
        delay_ms(10);
        PORTC.0=0;
        PORTC.1=1;
        PORTD=seg[d];
        delay_ms(10);
        PORTC.1=0;
        PORTC.2=1;
        PORTD=seg[c];
        delay_ms(10);
        PORTC.2=0;
        PORTC.3=1;
        PORTD=seg[b];
        delay_ms(10);
        PORTC.3=0;
       delay_ms(1);
        
    این تمام برنامه
    
    #include <mega16.h> 
    #include <stdio.h>
    #include <delay.h>
    #include <math.h>
    #include <stdlib.h>
    /*
    #asm
      .equ __lcd_port=0x12
    #endasm  
    #include <lcd.h> 
        */
     
    typedef union
    { unsigned int i; float f;} value; 
     
    int a;            
    int b=0;
    int c=0;
    int d=0;
    int e=0;
    //float f,g,h,ff,gg,hh;
    char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; 
     
    enum {TEMP,HUMI};
     
    sfrb  PINB = 0x16;
    sfrb  PORTB = 0x18;
    sfrb  DDRB = 0x17;
       
    #define   SHT_DATA_OUT      DDRB.0
    #define   SHT_DATA_IN   PINB.0
    #define   SHT_SCK     PORTB.1
    #define   noACK  0
    #define   ACK  1
                  //adr command r/w
    #define STATUS_REG_W 0x06  //000  0011  0
    #define STATUS_REG_R 0x07  //000  0011  1
    #define MEASURE_TEMP 0x03  //000  0001  1
    #define MEASURE_HUMI 0x05  //000  0010  1
    #define RESET    0x1e  //000  1111  0 
     
         
        char str_hum_temp[100]; 
        /*
    const float C1=-4.0;       // for 12 Bit
    const float C2=+0.0405;      // for 12 Bit
    const float C3=-0.0000028;    // for 12 Bit
    const float T1=+0.01;       // for 14 Bit @ 5V
    const float T2=+0.00008;     // for 14 Bit @ 5V  
               */
     
     float C1=-4.0;       // for 12 Bit
    float C2=+0.0405;      // for 12 Bit
     float C3=-0.0000028;    // for 12 Bit
     float T1=+0.01;       // for 14 Bit @ 5V
     float T2=+0.00008;     // for 14 Bit @ 5V 
         
      char v;
    float dew_point;      
    //SHT Functions
    char SHT_WriteByte(unsigned char value);
    char SHT_ReadByte(unsigned char ack);
    void s_transstart(void);
    void s_connectionreset(void);
    //void setting(void);
    
    char s_softreset(void);
    char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
    void calc_sth11(float *p_humidity ,float *p_temperature);
    float calc_dewpoint(float h,float t);
    //void set(void);
     /*
    unsigned char key=16,uch_TempTime_Number=0;
    int intTemp1=0,intTime1=0,intTemp2=0,intTime2=0,intTemp3=0,intTime3=0;
    int intTemp4=0,intTime4=0,intTemp5=0,intTime5=0,intTemp6=0,intTime6=0;
      */
     
      
        value humi_val, temp_val;
    
    
    void print_temp_humy (void)
    { 
    //int a;            
    //int b=0;
    //int c=0;
    //int d=0;
    //int e=0;
    //float f,g,h,ff,gg,hh;
    //char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; 
        
        unsigned char error, checksum;// status;
        
        a=humi_val.f*100;
            
      error=0;
      error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
      error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);
      if(error!=0) s_connectionreset();
      else{
        humi_val.f=(float)humi_val.i;          //converts integer to float
         temp_val.f=(float)temp_val.i;          //converts integer to float
         calc_sth11(&humi_val.f,&temp_val.f);      //calculate humidity, temperature
         dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
      } 
     #asm("wdr");  
       
        
        b=a%10;
        c=a/10;
        c=c%10;
        d=a/100;
        d=d%10;
        e=a/1000;
         
        
        PORTC.0=1;
        PORTD=seg[e];
        delay_ms(10);
        PORTC.0=0;
        PORTC.1=1;
        PORTD=seg[d];
        delay_ms(10);
        PORTC.1=0;
        PORTC.2=1;
        PORTD=seg[c];
        delay_ms(10);
        PORTC.2=0;
        PORTC.3=1;
        PORTD=seg[b];
        delay_ms(10);
        PORTC.3=0;
       delay_ms(1);
        
         
      
      
     #asm("wdr"); 
     
     
            if(temp_val.f>limit_temp)
            {
               delay_ms(300);
               PORTA.6=1;
               PORTA.4=1;
            }
            if(humi_val.f>limit_humi)
            {
               PORTA.7=1;
               PORTA.5=1;
            } 
            
            
            //********//**
            
            if(temp_val.f<limit_temp-0.3)
            {
               PORTA.6=0;
               PORTA.4=0;
            }
            if(humi_val.f<limit_humi-1)
            {
               PORTA.7=0;
               PORTA.5=0;
            }
                    
    }
    
    void main(void)
    {
    PORTA=0xff;
    DDRA=0xf0;
    
    PORTB=32;
    DDRB=0x00;
    
    PORTC=0x00;
    DDRC=0xFF;
    PORTD=0x00;
    DDRD=0xFF; 
      
    TCCR0=0x00;
    TCNT0=0x00;
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    ASSR=0x08;
    TCCR2=0x05;
    TCNT2=0x00;
    OCR2=0x00;
    //GIMSK=0x00;
    MCUCR=0x00;
    TIMSK=0x40;
    ACSR=0x80;
     
    // Setup Sensibus Pins
    
    PORTB.1  = 0;  // ClockLow
    DDRB.1 = 1;  // SCK is an output
    
    PORTB.0 = 0;  // Always Zero
       // Toggle DDRB.0 for Data 
      
    // LCD module initialization
    //lcd_init(16);
    
    //Start:
        
    WDTCR=0x1E;
    WDTCR=0x0E;
    
    s_softreset(); 
    print_temp_humy();
    
    while (1)
     {  
       /*
        b=a%10;
        c=a/10;
        c=c%10;
        d=a/100;
        d=d%10;
        e=a/1000;
         
        
        PORTC.0=1;
        PORTD=seg[e];
        delay_ms(4);
        PORTC.0=0;
        PORTC.1=1;
        PORTD=seg[d];
        delay_ms(4);
        PORTC.1=0;
        PORTC.2=1;
        PORTD=seg[c];
        delay_ms(4);
        PORTC.2=0;
        PORTC.3=1;
        PORTD=seg[b];
        delay_ms(4);
        PORTC.3=0;
        delay_ms(4);
        
          */
      if(PINB.5==0){
              delay_ms(200);
             // setting();
             }
             else{
     
               delay_ms(500);
               #asm("wdr"); 
               print_temp_humy();
               s_softreset();
               }
      
      } 
          
    }  
    
    char SHT_WriteByte(unsigned char value) 
    { 
     unsigned char i,error=0; 
     for (i=0x80;i>0;i/=2)        
       { 
       if (i & value)  SHT_DATA_OUT=0;  
      else SHT_DATA_OUT=1;            
      SHT_SCK=1;             
      delay_us(5);     //pulswith approx. 5 us   
      SHT_SCK=0;
       }
     SHT_DATA_OUT=0;            //release DATA-line
     SHT_SCK=1;              //clk #9 for ack 
     error=SHT_DATA_IN;          //check ack (DATA will be pulled down by SHT11)
     SHT_SCK=0;    
     return error;
     #asm("wdr");             //error=1 in case of no acknowledge
    }
    
    //----------------------------------------------------------------------------------
    // baca byte dari SHT, dan berikan ACK
    //----------------------------------------------------------------------------------
    char SHT_ReadByte(unsigned char ack) 
    { 
     unsigned char i,val=0;
     SHT_DATA_OUT=0;          //release DATA-line
     for (i=0x80;i>0;i/=2)        
      { 
      SHT_SCK=1;        
      if (SHT_DATA_IN) val=(val | i);   //read bit 
      SHT_SCK=0;         
       }
     SHT_DATA_OUT=ack;         //in case of "ack==1" pull down DATA-Line
     SHT_SCK=1;              //clk #9 for ack
     delay_us(5);         //pulswith approx. 5 us 
     SHT_SCK=0;           
     SHT_DATA_OUT=0;          //release DATA-line
     return val;
     #asm("wdr"); 
    }
    
    //----------------------------------------------------------------------------------
    // kondisi start
    //    _____     ________
    // DATA:   |_______|
    //      ___   ___
    // SCK : ___|  |___|  |______
    //----------------------------------------------------------------------------------
    //----------------------------------------------------------------------------------
    // reset koneksi, 9 clock diikuti dengan kondisi start
    //    _____________________________________________________     ________
    // DATA:                           |_______|
    //     _  _  _  _  _  _  _  _  _    ___   ___
    // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|  |___|  |______
    //----------------------------------------------------------------------------------
    
    void s_connectionreset(void)
    { 
     unsigned char i; 
     SHT_DATA_OUT=0; SHT_SCK=0;      //Initial state
     for(i=0;i<9;i++)           //9 SCK cycles
       { 
       SHT_SCK=1;
       delay_us(4);
      SHT_SCK=0;
     #asm("wdr"); 
     }
     s_transstart();            //transmission start
    }
    
    //----------------------------------------------------------------------------------
    // reset SHT-nya !!
    //----------------------------------------------------------------------------------
     
    char s_softreset(void)
    { 
     unsigned char error=0; 
     s_connectionreset();       //reset communication
     error+=SHT_WriteByte(RESET);   //send RESET-command to sensor
     return error; 
     
     #asm("wdr");           //error=1 in case of no response form the sensor
    }
    
    //----------------------------------------------------------------------------------
    // pengukuran data
    //----------------------------------------------------------------------------------
    char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
    { 
     unsigned error=0;
     unsigned int i;
    
     s_transstart();          //transmission start
     switch(mode){           //send command to sensor
      case TEMP  : error+=SHT_WriteByte(MEASURE_TEMP); break;
      case HUMI  : error+=SHT_WriteByte(MEASURE_HUMI); break;
      default   : break;  
     } 
     #asm("wdr"); 
     for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement
     if(SHT_DATA_IN) error+=1;        // or timeout (~2 sec.) is reached
     *(p_value+1) =SHT_ReadByte(ACK);  //read the first byte (MSB)
     *(p_value) =SHT_ReadByte(ACK);  //read the second byte (LSB)
     *p_checksum =SHT_ReadByte(noACK); //read checksum
     return error;
    }  
    
    //----------------------------------------------------------------------------------------
    // hitung temperature [°C] and humidity [%RH] 
    // input : humi [Ticks] (12 bit) 
    //     temp [Ticks] (14 bit)
    // output: humi [%RH]
    //     temp [°C] 
    //----------------------------------------------------------------------------------------
    
    void calc_sth11(float *p_humidity ,float *p_temperature)
    { 
     
     //float rh=*p_humidity;       // rh:   Humidity [Ticks] 12 Bit 
     //float t=*p_temperature;      // t:    Temperature [Ticks] 14 Bit
     float rh_lin;           // rh_lin: Humidity linear
     float rh_true;          // rh_true: Temperature compensated humidity
     float t_C;            // t_C  : Temperature [°C]
    
     t_C=*p_temperature*0.01 - 40;         //calc. temperature from ticks to [°C]
     rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1;   //calc. humidity from ticks to [%RH]
     rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin;  //calc. temperature compensated humidity [%RH]
     if(rh_true>100)rh_true=100;    //cut if the value is outside of
     if(rh_true<0.1)rh_true=0.1;    //the physical possible range
    
     *p_temperature=t_C;        //return temperature [°C]
     *p_humidity=rh_true;       //return humidity[%RH]
     #asm("wdr"); 
    }
    
    //--------------------------------------------------------------------
    // calculates dew point
    // input:  humidity [%RH], temperature [°C]
    // output: dew point [°C]
    //--------------------------------------------------------------------
    
    float calc_dewpoint(float h,float t)
    { 
     float logEx,dew_point;
     logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
     dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
     return dew_point;
     #asm("wdr"); 
    }

    #2
    پاسخ : مشکل در نمایش در سون سگمنت؟

    نوشته اصلی توسط میکرو الکترونیک
    با سلام
    برنامه راه اندازی سنسور sht75 رو با کدویژن و سون سگمنت رو نوشتم ولی هر کار میکنم پرش اعداد روی سون سگمنت خیلی زیاده ؟
    راه حلش چیه و چه جوری بنویسم؟ ممنون
    کد:
    این قسمت نمایش دما
    
        b=a%10;
        c=a/10;
        c=c%10;
        d=a/100;
        d=d%10;
        e=a/1000;
         
        
        PORTC.0=1;
        PORTD=seg[e];
        delay_ms(10);
        PORTC.0=0;
        PORTC.1=1;
        PORTD=seg[d];
        delay_ms(10);
        PORTC.1=0;
        PORTC.2=1;
        PORTD=seg[c];
        delay_ms(10);
        PORTC.2=0;
        PORTC.3=1;
        PORTD=seg[b];
        delay_ms(10);
        PORTC.3=0;
       delay_ms(1);
        
    این تمام برنامه
    
    #include <mega16.h> 
    #include <stdio.h>
    #include <delay.h>
    #include <math.h>
    #include <stdlib.h>
    /*
    #asm
      .equ __lcd_port=0x12
    #endasm  
    #include <lcd.h> 
        */
     
    typedef union
    { unsigned int i; float f;} value; 
     
    int a;            
    int b=0;
    int c=0;
    int d=0;
    int e=0;
    //float f,g,h,ff,gg,hh;
    char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; 
     
    enum {TEMP,HUMI};
     
    sfrb  PINB = 0x16;
    sfrb  PORTB = 0x18;
    sfrb  DDRB = 0x17;
       
    #define   SHT_DATA_OUT      DDRB.0
    #define   SHT_DATA_IN   PINB.0
    #define   SHT_SCK     PORTB.1
    #define   noACK  0
    #define   ACK  1
                  //adr command r/w
    #define STATUS_REG_W 0x06  //000  0011  0
    #define STATUS_REG_R 0x07  //000  0011  1
    #define MEASURE_TEMP 0x03  //000  0001  1
    #define MEASURE_HUMI 0x05  //000  0010  1
    #define RESET    0x1e  //000  1111  0 
     
         
        char str_hum_temp[100]; 
        /*
    const float C1=-4.0;       // for 12 Bit
    const float C2=+0.0405;      // for 12 Bit
    const float C3=-0.0000028;    // for 12 Bit
    const float T1=+0.01;       // for 14 Bit @ 5V
    const float T2=+0.00008;     // for 14 Bit @ 5V  
               */
     
     float C1=-4.0;       // for 12 Bit
    float C2=+0.0405;      // for 12 Bit
     float C3=-0.0000028;    // for 12 Bit
     float T1=+0.01;       // for 14 Bit @ 5V
     float T2=+0.00008;     // for 14 Bit @ 5V 
         
      char v;
    float dew_point;      
    //SHT Functions
    char SHT_WriteByte(unsigned char value);
    char SHT_ReadByte(unsigned char ack);
    void s_transstart(void);
    void s_connectionreset(void);
    //void setting(void);
    
    char s_softreset(void);
    char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
    void calc_sth11(float *p_humidity ,float *p_temperature);
    float calc_dewpoint(float h,float t);
    //void set(void);
     /*
    unsigned char key=16,uch_TempTime_Number=0;
    int intTemp1=0,intTime1=0,intTemp2=0,intTime2=0,intTemp3=0,intTime3=0;
    int intTemp4=0,intTime4=0,intTemp5=0,intTime5=0,intTemp6=0,intTime6=0;
      */
     
      
        value humi_val, temp_val;
    
    
    void print_temp_humy (void)
    { 
    //int a;            
    //int b=0;
    //int c=0;
    //int d=0;
    //int e=0;
    //float f,g,h,ff,gg,hh;
    //char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; 
        
        unsigned char error, checksum;// status;
        
        a=humi_val.f*100;
            
      error=0;
      error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI);
      error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP);
      if(error!=0) s_connectionreset();
      else{
        humi_val.f=(float)humi_val.i;          //converts integer to float
         temp_val.f=(float)temp_val.i;          //converts integer to float
         calc_sth11(&humi_val.f,&temp_val.f);      //calculate humidity, temperature
         dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
      } 
     #asm("wdr");  
       
        
        b=a%10;
        c=a/10;
        c=c%10;
        d=a/100;
        d=d%10;
        e=a/1000;
         
        
        PORTC.0=1;
        PORTD=seg[e];
        delay_ms(10);
        PORTC.0=0;
        PORTC.1=1;
        PORTD=seg[d];
        delay_ms(10);
        PORTC.1=0;
        PORTC.2=1;
        PORTD=seg[c];
        delay_ms(10);
        PORTC.2=0;
        PORTC.3=1;
        PORTD=seg[b];
        delay_ms(10);
        PORTC.3=0;
       delay_ms(1);
        
         
      
      
     #asm("wdr"); 
     
     
            if(temp_val.f>limit_temp)
            {
               delay_ms(300);
               PORTA.6=1;
               PORTA.4=1;
            }
            if(humi_val.f>limit_humi)
            {
               PORTA.7=1;
               PORTA.5=1;
            } 
            
            
            //********//**
            
            if(temp_val.f<limit_temp-0.3)
            {
               PORTA.6=0;
               PORTA.4=0;
            }
            if(humi_val.f<limit_humi-1)
            {
               PORTA.7=0;
               PORTA.5=0;
            }
                    
    }
    
    void main(void)
    {
    PORTA=0xff;
    DDRA=0xf0;
    
    PORTB=32;
    DDRB=0x00;
    
    PORTC=0x00;
    DDRC=0xFF;
    PORTD=0x00;
    DDRD=0xFF; 
      
    TCCR0=0x00;
    TCNT0=0x00;
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    ASSR=0x08;
    TCCR2=0x05;
    TCNT2=0x00;
    OCR2=0x00;
    //GIMSK=0x00;
    MCUCR=0x00;
    TIMSK=0x40;
    ACSR=0x80;
     
    // Setup Sensibus Pins
    
    PORTB.1  = 0;  // ClockLow
    DDRB.1 = 1;  // SCK is an output
    
    PORTB.0 = 0;  // Always Zero
       // Toggle DDRB.0 for Data 
      
    // LCD module initialization
    //lcd_init(16);
    
    //Start:
        
    WDTCR=0x1E;
    WDTCR=0x0E;
    
    s_softreset(); 
    print_temp_humy();
    
    while (1)
     {  
       /*
        b=a%10;
        c=a/10;
        c=c%10;
        d=a/100;
        d=d%10;
        e=a/1000;
         
        
        PORTC.0=1;
        PORTD=seg[e];
        delay_ms(4);
        PORTC.0=0;
        PORTC.1=1;
        PORTD=seg[d];
        delay_ms(4);
        PORTC.1=0;
        PORTC.2=1;
        PORTD=seg[c];
        delay_ms(4);
        PORTC.2=0;
        PORTC.3=1;
        PORTD=seg[b];
        delay_ms(4);
        PORTC.3=0;
        delay_ms(4);
        
          */
      if(PINB.5==0){
              delay_ms(200);
             // setting();
             }
             else{
     
               delay_ms(500);
               #asm("wdr"); 
               print_temp_humy();
               s_softreset();
               }
      
      } 
          
    }  
    
    char SHT_WriteByte(unsigned char value) 
    { 
     unsigned char i,error=0; 
     for (i=0x80;i>0;i/=2)        
       { 
       if (i & value)  SHT_DATA_OUT=0;  
      else SHT_DATA_OUT=1;            
      SHT_SCK=1;             
      delay_us(5);     //pulswith approx. 5 us   
      SHT_SCK=0;
       }
     SHT_DATA_OUT=0;            //release DATA-line
     SHT_SCK=1;              //clk #9 for ack 
     error=SHT_DATA_IN;          //check ack (DATA will be pulled down by SHT11)
     SHT_SCK=0;    
     return error;
     #asm("wdr");             //error=1 in case of no acknowledge
    }
    
    //----------------------------------------------------------------------------------
    // baca byte dari SHT, dan berikan ACK
    //----------------------------------------------------------------------------------
    char SHT_ReadByte(unsigned char ack) 
    { 
     unsigned char i,val=0;
     SHT_DATA_OUT=0;          //release DATA-line
     for (i=0x80;i>0;i/=2)        
      { 
      SHT_SCK=1;        
      if (SHT_DATA_IN) val=(val | i);   //read bit 
      SHT_SCK=0;         
       }
     SHT_DATA_OUT=ack;         //in case of "ack==1" pull down DATA-Line
     SHT_SCK=1;              //clk #9 for ack
     delay_us(5);         //pulswith approx. 5 us 
     SHT_SCK=0;           
     SHT_DATA_OUT=0;          //release DATA-line
     return val;
     #asm("wdr"); 
    }
    
    //----------------------------------------------------------------------------------
    // kondisi start
    //    _____     ________
    // DATA:   |_______|
    //      ___   ___
    // SCK : ___|  |___|  |______
    //----------------------------------------------------------------------------------
    //----------------------------------------------------------------------------------
    // reset koneksi, 9 clock diikuti dengan kondisi start
    //    _____________________________________________________     ________
    // DATA:                           |_______|
    //     _  _  _  _  _  _  _  _  _    ___   ___
    // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|  |___|  |______
    //----------------------------------------------------------------------------------
    
    void s_connectionreset(void)
    { 
     unsigned char i; 
     SHT_DATA_OUT=0; SHT_SCK=0;      //Initial state
     for(i=0;i<9;i++)           //9 SCK cycles
       { 
       SHT_SCK=1;
       delay_us(4);
      SHT_SCK=0;
     #asm("wdr"); 
     }
     s_transstart();            //transmission start
    }
    
    //----------------------------------------------------------------------------------
    // reset SHT-nya !!
    //----------------------------------------------------------------------------------
     
    char s_softreset(void)
    { 
     unsigned char error=0; 
     s_connectionreset();       //reset communication
     error+=SHT_WriteByte(RESET);   //send RESET-command to sensor
     return error; 
     
     #asm("wdr");           //error=1 in case of no response form the sensor
    }
    
    //----------------------------------------------------------------------------------
    // pengukuran data
    //----------------------------------------------------------------------------------
    char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
    { 
     unsigned error=0;
     unsigned int i;
    
     s_transstart();          //transmission start
     switch(mode){           //send command to sensor
      case TEMP  : error+=SHT_WriteByte(MEASURE_TEMP); break;
      case HUMI  : error+=SHT_WriteByte(MEASURE_HUMI); break;
      default   : break;  
     } 
     #asm("wdr"); 
     for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement
     if(SHT_DATA_IN) error+=1;        // or timeout (~2 sec.) is reached
     *(p_value+1) =SHT_ReadByte(ACK);  //read the first byte (MSB)
     *(p_value) =SHT_ReadByte(ACK);  //read the second byte (LSB)
     *p_checksum =SHT_ReadByte(noACK); //read checksum
     return error;
    }  
    
    //----------------------------------------------------------------------------------------
    // hitung temperature [°C] and humidity [%RH] 
    // input : humi [Ticks] (12 bit) 
    //     temp [Ticks] (14 bit)
    // output: humi [%RH]
    //     temp [°C] 
    //----------------------------------------------------------------------------------------
    
    void calc_sth11(float *p_humidity ,float *p_temperature)
    { 
     
     //float rh=*p_humidity;       // rh:   Humidity [Ticks] 12 Bit 
     //float t=*p_temperature;      // t:    Temperature [Ticks] 14 Bit
     float rh_lin;           // rh_lin: Humidity linear
     float rh_true;          // rh_true: Temperature compensated humidity
     float t_C;            // t_C  : Temperature [°C]
    
     t_C=*p_temperature*0.01 - 40;         //calc. temperature from ticks to [°C]
     rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1;   //calc. humidity from ticks to [%RH]
     rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin;  //calc. temperature compensated humidity [%RH]
     if(rh_true>100)rh_true=100;    //cut if the value is outside of
     if(rh_true<0.1)rh_true=0.1;    //the physical possible range
    
     *p_temperature=t_C;        //return temperature [°C]
     *p_humidity=rh_true;       //return humidity[%RH]
     #asm("wdr"); 
    }
    
    //--------------------------------------------------------------------
    // calculates dew point
    // input:  humidity [%RH], temperature [°C]
    // output: dew point [°C]
    //--------------------------------------------------------------------
    
    float calc_dewpoint(float h,float t)
    { 
     float logEx,dew_point;
     logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
     dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
     return dew_point;
     #asm("wdr"); 
    }
    پرش روی اعداد به خاطر زمان رفرش زیاده
    من فرصت نمیکنم برنامتو کامل بخونم
    ولی خودت میدونی چیکار کردی دیگه!!!
    یه جوری سون سگمنتهاتو درایو کن که تک تک سون سگمنت هات زمان خاموش بودنشون زیر 25 میلی ثانیه باشه

    دیدگاه


      #3
      پاسخ : مشکل در نمایش در سون سگمنت؟

      هرچی برنامه رو عوض میکنم درست نمیشه؟ برنامه نمایش رو به صورت تابع نوشتم و در حلقه های مختلف برنامه فراخوان کردم با زمان های متغیر ولی بازم پرشش زیاده ؟ کرستال داخلی رو تا 8 مگا افزایش دادم ولی بازم تغییر چندانی نمیکنه. برنامه رفرش سگمنت دها به این صورته. درسته؟؟

      کد:
      void display (void)
      {
          b=a%10;
          c=a/10;
          c=c%10;
          d=a/100;
          d=d%10;
          e=a/1000;
           
          PORTC.0=1;
          PORTD=seg[e];
          delay_ms(3);
          PORTC.0=0;
          PORTC.1=1;
          PORTD=seg[d];
          delay_ms(3);
          PORTC.1=0;
          PORTC.2=1;
          PORTD=seg[c];
          delay_ms(3);
          PORTC.2=0;
          PORTC.3=1;
          PORTD=seg[b];
          delay_ms(3);
          PORTC.3=0;
        // delay_ms(300);
          
           
      }

      دیدگاه


        #4
        پاسخ : مشکل در نمایش در سون سگمنت؟

        کدهاتون رو داخل تگ کدبزارید ک بشه خوندش...
        کلا واسه رفرش کردن فرکانس رفرش نباید کمتر از 20 هرتز بشه...یعنی مجموع زمانی که حلقه داره طی میکنه و خاموش و روشن کردن سگمنت ها رو انجام میده نباید بیشتر از 50میلی ثانیه بشه وگرنه چشم میتونه تشخیصش بده....
        یه مشکل دیگه هم دارید...شما یه سگمنت رو فعال میکنید ، دیتا رو روی پینها میذارید یه مدت زمان صبر میکنید و بعدش اون سگمنت رو غیر فعال میکنید و بعدش سگمنت بعدی رو فعال میکنید درحالی که دیتای قبلی هنو روی پورت مشاهده میشه و دیتای جدید نیومده روی پورت....!!!!!!!!این باعث میشه که یه لحظه دیتای قبلی مشاهده بشه و به نوبه خودش اختلال در نمایش محسوب میشه....
        اول دیتا رو بزارید بعد سگمنت رو فعال کنید بعد تاخیر بزارید بعدش سگمنت رو غیر فعال کنید بعدش دیتای جدید بزارید بعدش سگمنت بعدی رو فعال کنید...
        این روند رفرش کردنه...
        تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

        www.intelart.ir


        ساخت کنترلر دما PID فازي با AVR [آموزشی]

        دیدگاه


          #5
          پاسخ : مشکل در نمایش در سون سگمنت؟

          برنامه رو اینجوری نوشتم با زمان های تاخیر مختلف ولی بازم پرش داره. فعلا تو پروتئوس امتحانش میکنم

          void display (void)
          {


          b=a%10;
          c=a/10;
          c=c%10;
          d=a/100;
          d=d%10;
          e=a/1000;

          PORTD=seg[e];
          PORTC.0=1;
          delay_ms(r);
          PORTC.0=0;
          PORTD=seg[d];
          PORTC.1=1;
          delay_ms(r);
          PORTC.1=0;
          PORTD=seg[c];
          PORTC.2=1;
          delay_ms(r);
          PORTC.2=0;
          PORTD=seg[b];
          PORTC.3=1;
          delay_ms(r);
          PORTC.3=0;



          }

          دیدگاه


            #6
            پاسخ : مشکل در نمایش در سون سگمنت؟

            با سلام اینجوری با delay نمیشه بهتره برای رفرش از اینتراپت تایمر در حالت compare match استفاده کنید که همیشه سر زمان معین سگمنت را رفرش کنه و زمانها کم و زیاد نشه

            دیدگاه


              #7
              پاسخ : مشکل در نمایش در سون سگمنت؟

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

              void display (void)
              {


              b=a%10;
              c=a/10;
              c=c%10;
              d=a/100;
              d=d%10;
              e=a/1000;

              PORTD=seg[e];
              PORTC.0=1;
              delay_ms(r);
              PORTC.0=0;
              PORTD=seg[d];
              PORTC.1=1;
              delay_ms(r);
              PORTC.1=0;
              PORTD=seg[c];
              PORTC.2=1;
              delay_ms(r);
              PORTC.2=0;
              PORTD=seg[b];
              PORTC.3=1;
              delay_ms(r);
              PORTC.3=0;



              }
              سعی کن تو برنامه نویسی تا جایی که میتونی از delay استفاده نکنی. تاخیرهاتو با وقفه های تایمر بساز
              اینجا هم زمان رفرش رو با وقفه تایمر بساز
              ولی یه نکته دیگه اینکه سعی کن تو زیر برنامه وقفه زیاد کد نویسی نکنی
              بهترین حالت اینه که فقط یه خط بنویسی و یه متغیر رو زیاد کنی، همین! بعد از مقدار متغیر برای عملکرد اصلی استفاده کنی
              البته بعضی برنامه ها باید تو زیر برنامه وقفه نوشته بشن
              ولی یه همچین برنامه ای بهتره تو بدنه اصلی نوشته بشه
              مثلا اینجا 4 تا سون سگمنت داری پس زمان رفرشت باید حدود 5 میلی ثانیه باشه!
              پس وقفه تایمرت رو فعال کن و تو زیر برنامش یه متغر مثلا x رو زیاد کن
              دفعه اول که تایمرت وقفه بده، x میشه 1
              اگه در نظر بگیری این x شماره سون سگمنتت باشه، پس خروجی باید data شماره 1 روبده بیرون و ترانزیستور شماره 1 هم روشن بشه که سون سگمنت شماره 1، اطلاعات خودشو نشون بده
              دفعه بعد که تایمر وقفه زد، x میشه 2 و همون مراحل رو برای سون سگمنت شماره 2 انجام بده
              و در آخرین مرحله که x ، چهار شد و مراحلشم انجام دادی، دوباره x رو 0 کن که با وقفه بعدی، مراحل سون سگمنت 1 انجام بشه

              دیدگاه


                #8
                پاسخ : مشکل در نمایش در سون سگمنت؟

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

                interrupt [TIM0_COMP] void timer0_comp_isr(void)
                {
                r++;
                if (r>=5) r=0;
                b=a%10; c=a/10; c=c%10; d=a/100; d=d%10; e=a/1000;
                if(r==1){PORTC.7=0; PORTD=seg[e]; PORTC.0=1;}

                if (r==2){PORTC.0=0; PORTD=seg[d]; PORTC.1=1;}

                if (r==3){ PORTC.1=0; PORTD=seg[c];PORTC.2=1;}

                if (r==4){ PORTC.2=0; PORTD=seg[b];PORTC.3=1; }
                }

                دیدگاه

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