اطلاعیه

Collapse
No announcement yet.

مشکل عجیب با optimiz avr studio

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

    مشکل عجیب با optimiz avr studio

    سلام
    من به یه چیز عجیب برخورد کردم لطفا به کد پایین توجه کنین ، محتوی کد مهم نیست برنامه راه اندازی ds18b20 هست، ادامه ی داستان مهمه :mrgreen: :



    uint8_t OW_read_byte(uint8_t bit_mask)
    {
    uint8_t byte = 0;
    OW_PORT_OUT &= ~bit_mask;
    for(int i=0;i<8;i++)
    {
    cli();
    OW_PORT_DIR |= bit_mask;
    _delay_us(10);
    OW_PORT_DIR &= ~bit_mask;
    _delay_us(15);
    byte=((OW_PORT_IN & bit_mask?1:0)<<7)|(byte>>1);
    _delay_us(50);
    sei();
    }
    return byte;
    }
    /*----------------------------------------------------------------------------*/

    uint8_t DS18B20_get_temp(uint16_t *temperature)
    {
    if(0==OW_reset())return 0;
    OW_write_byte(SKIP_ROM,OW_DQ);
    OW_write_byte(CONVERT_T,OW_DQ);
    _delay_ms(1000);
    if(0==OW_reset())return 0;
    OW_write_byte(SKIP_ROM,OW_DQ);
    OW_write_byte(READ_SCRATCHPAD,OW_DQ);
    *temperature = OW_read_byte(OW_DQ);
    uint8_t temp = OW_read_byte(OW_DQ);

    *temperature|=(temp<<8);
    return 1;
    }

    optimiz روی حالت none هست
    این دو دستور مقدار بازگشتی تابع read رو برمیگردونه که واسم مهمه
    کد:
     *temperature = OW_read_byte(OW_DQ);
     uint8_t temp = OW_read_byte(OW_DQ);
    جالب اینجاست که مقدار بازگشتی توی temperature درست هست ولی خط بعد که دوباره این تابع فراخوانی میشه مقدار 255 فقط بر میگردونه و همیشه ثابته ...
    یعنی بار اول تابع درست کار میکنه ولی بار دوم به بعدخیر ...

    حالا optimize رو میزارم روی O1 optimaze- درست میشه


    یک بار اینکارو امتحان کردم : توی حالت optimze none

    از تابع read کپی گرفتم و آخرش یه _2 اضافه کردم یعنی دوتا تابع read دارم ... خط اولی از تابع اولی و خط بعدی از _2 استفاده کردم دوتا تابع جدا
    و دیدم که مقدار درست رو برگردوند ...
    یعنی توی optimize more وقتی تابع read یکبار اجرا میشه یه اتفاقی میوفته که من نمیدونم چیه که بار دوم اجرا بشه درست عمل نمیکنه
    *temperature = OW_read_byte(OW_DQ);
    uint8_t temp = OW_read_byte_2(OW_DQ);


    واقعا چرا ؟؟ من همیشه روی optimize none کد مینویسم ... یعنی ممکن از این مشکلا زیاد پیش ااومده و متوجه نشدم....یکی توضیح میده ؟
    تشکر




    #2
    پاسخ : مشکل عجیب با optimiz avr studio

    کسی نظری نداره ؟
    optimizer روی حالت none مگه کاری میکنه ؟
    چرت کد من توی O1 optimaze- درست کار مکنه فقط ...

    دیدگاه

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