1-wire bus stm32

  • 13 Replies
  • 3504 Views
*

Online tha

  • *****
  • 1036
    • View Profile
Re: 1-wire bus stm32
« Reply #8 on: January 11, 2015, 06:14:32 pm »
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 แทนกลับไม่มีปัญหาอะไร ก็งงอยู่เหมือนกัน ท่านอื่นมีความคิดเห็นเป็นเช่นไรกันบ้าง?

*

Online tha

  • *****
  • 1036
    • View Profile
Re: 1-wire bus stm32
« Reply #9 on: January 12, 2015, 04:13:25 am »
ขอโทษทีครับ ที่ upload ผิด file มึนไปหน่อย  ;D
https://mega.co.nz/#!5IMnjbiS!RCDO2yesP8NyMsZDOYjSrg0q4hANo-isfHmdmDH9khY

*

Online tha

  • *****
  • 1036
    • View Profile
Re: 1-wire bus stm32
« Reply #10 on: January 12, 2015, 05:52:54 am »
ที่ file main.h แก้ตรงจุดนี้ด้วยครับ พอดีผมแก้ไฟล์ไปแล้วครึ่งนึง แล้วนึกขึ้นได้แล้วก๊อบปี้โปรแกรมแยกกันไว้เป็นเวอร์ชั่น แล้วแก้ผิดไฟล์มั่วไปหน่อย  ;D
//void Delay1(vu32 nCount);
void P_OW_Delay_us(uint32_t delay);

*

Online tha

  • *****
  • 1036
    • View Profile
Re: 1-wire bus stm32
« Reply #11 on: January 12, 2015, 11:10:50 am »
ผมใช้ 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

Code: [Select]
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);
}

*

Online tha

  • *****
  • 1036
    • View Profile
Re: 1-wire bus stm32
« Reply #12 on: January 13, 2015, 10:47:52 am »
ถ้าใช้ TIM2 แล้วให้ interrupt ครั้งเดียวต่อการเข้าฟังชั่น delay อย่างนี้สามารถทำงานได้ครับ
https://mega.co.nz/#!MZUECA7b!H78UmD2rmFASheRAPc2uQlesJ34Fblvwww-Sdj3FjUc

*

Online tha

  • *****
  • 1036
    • View Profile
Re: 1-wire bus stm32
« Reply #13 on: January 13, 2015, 12:24:59 pm »
เสร็จแล้วครับ อ่าน temp ได้แล้ว ต้องขอขอบคุณ คุณ ubecker ที่ทำโปรแกรมดีๆให้ได้เรียนรู้ (อะไรๆง่ายขึ้นเยอะเลย)  :)
https://mega.co.nz/#!UZllHZTB!eipTZRxu7K8gx-pkHVBdbCl6-FOAh-h7HOyHCpXyEgY