1-wire bus stm32

Started by tha, January 08, 2015, 09:16:36 AM

Previous topic - Next topic

tha

https://mega.co.nz/#!gYcDBKSb!Hv2ED59DHLItfgvRKGfOTs8V-XjbIY35J4sizkUs46s
    stm32f103rb ใช้ systick แทน TIM2 ในฟังชั่น delay ส่วน TIM2 ก็ยังใช้งานอยู่ในส่วนที่ delay systick ทำงานแทนไม่ได้ แต่ก็ได้แก้ใขเวลาในบางจุดเพราะรู้สึกว่าฟังชั่นที่ใช้งาน TIM2 จะทำงานได้ช้ากว่าปกติ ก็สามารถทำงานได้ครับ อ่าน rom code ออกมาได้ตรงกันกับที่ stm32f4discovery อ่านได้
    คิดว่าปัญหาคงมาจากการใช้งาน TIM2 interrupt ในช่วงเวลาที่สั้น(1uS)นี่แหละ กับ stm32f4discovery ไม่เป็นไรเป็นเพราะ clock เร็วกว่า พอเวลาใช้กับ stm32f103 ซึ่ง clock ช้ากว่าเลยมีโอเวอร์เฮ็ดมากกว่า เวลาที่สั้นเลยทำให้เพี้ยนไปได้มากกว่า แต่พอใช้ systick แทนกลับไม่มีปัญหาอะไร ก็งงอยู่เหมือนกัน ท่านอื่นมีความคิดเห็นเป็นเช่นไรกันบ้าง?

tha

ขอโทษทีครับ ที่ upload ผิด file มึนไปหน่อย  ;D
https://mega.co.nz/#!5IMnjbiS!RCDO2yesP8NyMsZDOYjSrg0q4hANo-isfHmdmDH9khY

tha

ที่ file main.h แก้ตรงจุดนี้ด้วยครับ พอดีผมแก้ไฟล์ไปแล้วครึ่งนึง แล้วนึกขึ้นได้แล้วก๊อบปี้โปรแกรมแยกกันไว้เป็นเวอร์ชั่น แล้วแก้ผิดไฟล์มั่วไปหน่อย  ;D
//void Delay1(vu32 nCount);
void P_OW_Delay_us(uint32_t delay);


tha

ผมใช้ logic Analyzer ตรวจจับขา DQ ดูช่วงฟังชั่น Reset เปรียบเทียบกันดูระหว่างการใช้ systick กับการใช้ TIM2 ยกมาเปรียบเทียบแค่ช่วง
P_OW_Delay_us(560); //  480<T<640
ใช้ systick วัดได้ 564us แต่ใช้ TIM2 วัดได้ 1408us ซึ่งจะเห็นได้ว่าใช้ TIM2 เวลาจะผิดไปมาก
เมื่อใช้ Logic analyzer วัดช่วงฟังชั่น reset ทำให้รู้เวลาช่วง DQ active low ตอบสนองแสดงว่ามีอุปกรณ์ต่ออยู่บนบัสได้ เลยสามารถจะตัดฟังชั่น P_OW_Mess_Lo_us(); ออกไปได้ ซึ่งใน APP162 ก็ไม่ได้ใช้ฟังชั่นนี้ แค่เช็คว่า DQ active low แค่นั้น(สงสัยฝรั่งทำเกิน อิอิ) เลยทำให้ตัดการใช้ TIM2 ไปได้ ใช้แต่ systick อย่างเดียว
https://mega.co.nz/#!lVtzyRJC!6HErTsE1B0QrsJcEFtntUF_GStlbGsFSR2ZGbTdkEgU


ErrorStatus UB_OneWire_ResetSequenz(void)
{
  ErrorStatus ret_wert=ERROR;
  //uint32_t lo_time=0;
  BitAction hi_pegel;
  BitAction lo_pegel;

  // Initialisierung-Sequenz
  P_OW_Delay_us(100);
  P_OW_DataLo();
  P_OW_Delay_us(560); //  480<T<640
  P_OW_DataHi();
  //P_OW_Delay_us(20);  // 15<T<60
  P_OW_Delay_us(80);  // 15<T<60
  //lo_time=P_OW_Mess_Lo_us(300); // messen vom presence puls 60<T<240
  lo_pegel=P_OW_DataRead(); // check 1-wire device is presence active low
  //P_OW_Delay_us(50);
  P_OW_Delay_us(80);
  hi_pegel=P_OW_DataRead(); // messen ob am ende wieder hi
  //P_OW_Delay_us(120);
  P_OW_Delay_us(50);


  // Auswertung ob ok
  //if((lo_time>30) && (hi_pegel==Bit_SET)) {
  if((lo_pegel==Bit_RESET) && (hi_pegel==Bit_SET)) {
    // der presence Puls vom Slave muss > 30 us sein
    ret_wert=SUCCESS;
  }

  return(ret_wert);
}

tha

ถ้าใช้ TIM2 แล้วให้ interrupt ครั้งเดียวต่อการเข้าฟังชั่น delay อย่างนี้สามารถทำงานได้ครับ
https://mega.co.nz/#!MZUECA7b!H78UmD2rmFASheRAPc2uQlesJ34Fblvwww-Sdj3FjUc

tha

เสร็จแล้วครับ อ่าน temp ได้แล้ว ต้องขอขอบคุณ คุณ ubecker ที่ทำโปรแกรมดีๆให้ได้เรียนรู้ (อะไรๆง่ายขึ้นเยอะเลย)  :)
https://mega.co.nz/#!UZllHZTB!eipTZRxu7K8gx-pkHVBdbCl6-FOAh-h7HOyHCpXyEgY