سلام
من به یه چیز عجیب برخورد کردم لطفا به کد پایین توجه کنین ، محتوی کد مهم نیست برنامه راه اندازی 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 درست هست ولی خط بعد که دوباره این تابع فراخوانی میشه مقدار 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 کد مینویسم ... یعنی ممکن از این مشکلا زیاد پیش ااومده و متوجه نشدم....یکی توضیح میده ؟
تشکر
من به یه چیز عجیب برخورد کردم لطفا به کد پایین توجه کنین ، محتوی کد مهم نیست برنامه راه اندازی 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);
یعنی بار اول تابع درست کار میکنه ولی بار دوم به بعدخیر ...
حالا 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 کد مینویسم ... یعنی ممکن از این مشکلا زیاد پیش ااومده و متوجه نشدم....یکی توضیح میده ؟
تشکر
دیدگاه