Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Takkykun

#1
ที่จริงผมก็อยากใช้ SPI นะครับ (เพราะผมซื้อบอร์ดสำเร็จมาแล้วเลยขี้เกียจหาซื้อใหม่  ;D)

แต่ผมยังหาพวกโค๊ดตัวอย่างไม่เจอเลยครับ หรือว่าต้องมาใช้ SDIO จริงๆ
#2
ผมใช้บอร์ด STM32F4 Discovery อยู่ครับ ทีนี้คือระบบของผมจะต้องสามารถจดจำการเปลี่ยนแปลงข้อมูลครั้งล่าสุดก่อนระบบจะถูกตัดไฟได้ (ประมาณว่าหากปิดระบบหรือไฟดับอะไรแบบนี้อะครับ) และพอเปิดเครื่องมาใหม่จะต้องจดจำการเปลี่ยนแปลงค่าล่าสุดได้โดยไม่ต้องทำการคอลไพล์จากคอมพิวเตอร์ เช่น ใช้ปุ่มกดปรับค่า A ให้เป็น 20 แล้วพอไฟดับแล้วเปิดเครื่องมาใหม่ ระบบก็จะจดจำค่า A = 20 แล้วนำมาใช้ได้ ทีนี้สอบถามพี่ๆ ที่รู้จักกันเขาบอกให้ใช้วิธี EEPROM ครับ เลยอยากทราบว่าใครพอจะมีโค๊ดตัวอย่างหรือมี EEPROM ตัวไหนแนะนำบ้างครับ และอยากทราบว่าหากไม่ใช้ EEPROM แล้วจะมีวิธีการไหนที่น่าสนใจบ้างครับ ขอบคุณครับ
#3
ผมกำลังจะทำ Data Logging ลงบน SD Card โดยเขียนแบบ SPI ครับ (เพราะบอร์ด SD Card ที่ผมมีมันเป็นแบบ SPI)

ตอนนี้มีพอร์ต 3 พอร์ตที่ผมหาเจอในเว็บ คือ PBx PCx PDx จากโค๊ดตัวอย่างที่ผมเห็นเขาใช้พอร์ต PD0 PD1 PD2 PD3 แต่เห็นจากคอมเม้นที่เขาเม้นกันเขาบอกว่าน่าจะใช้พวกพอร์ต PBx หรือ PCx แทน จึงอยากสอบถามว่าแต่ละพอร์ตสามารถใช้ได้เหมือนกันหมดไหมครับ หรือควรเลือกใช้พอร์ตไหน หรือผมแค่คิดมากไปเอง และอยากถามว่าระหว่าง SPI และ SDIO อย่างไหนใช้ดีหรือใช้ง่ายกว่ากันครับ ขอบคุณครับ

ตอนนี้ผมใช้พอร์ต PD0 PD1 PD2 PD3 อยู่ครับ แต่ยังไม่ได้ลองใช้งานเนื่องจากยังหาโค๊ดสำหรับ Data Logging ไม่ได้ แหะๆ
#4
ตอนนี้กำลังศึกษาข้อมูลสำหรับการเขียน Data Logging (ข้อมูลจาก ADC) ลงใน SD Card อยู่ครับ

ทีนี้ ตัวอย่างที่มี มีแต่การใช้ USART แต่บอร์ด SD Card ที่ผมใช้ เป็นแบบ SPI ครับ

ไม่ทราบว่าใครพอมีไฟล์ตัวอย่างบ้างไหมครับ

และอยากทราบว่า การใช้งาน FatFS จำเป็นต้องกำหนดโมดูลก่อนหรือเปล่าครับ หรือว่าสามารถนำมาใช้ได้เลย

และจำเป็นต้องใช้ FatFS ในการเขียนข้อมูลลง SD Card ไหมครับ

ขอบคุณครับ
#5
ตอนนี้ผมกำลังศึกษาเรื่องของ TIM อยู่เลยครับ (ผมมือใหม่หัดเล่นครับ เพิ่งมาเขียนจริงๆ จังๆ แค่เดือนเดียวนี่เอง) ตอนนี้อยากทราบว่า การทำงานของ TIM นั้นเป็นการกำหนดสัญญาณพัลส์เพื่อทำการทริกการทำงาน ถูกไหมครับ แล้วทีนี้ผมต้องการนำสัญญาณทริกนั้นไปกำกับการทำงานของ ADC อยากทราบว่า ถ้าสมมติผมตั้งค่า TIM3 ดังคำสั่งนี้

uint16_t PrescalerValue = 0;

/**********************************************************************************************************************/
void TIM3_Configuration(void)
/**********************************************************************************************************************/
{

   
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   TIM_OCInitTypeDef  TIM_OCInitStructure;
   
  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 6000000) - 1;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 20;
  TIM_TimeBaseStructure.TIM_Prescaler = 167;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* Prescaler configuration */
  TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);

  /* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 10;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
   

  /* Output Compare Timing Mode configuration: Channel2 */
  /*TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* Output Compare Timing Mode configuration: Channel3 */
  /*TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OC3Init(TIM3, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* Output Compare Timing Mode configuration: Channel4 */
  /*TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

  TIM_OC4Init(TIM3, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
   
  /* TIM Interrupts enable */
  TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);
   
    /* Connect TIM3 pins to AF2 */ 
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3);
   


}

อยากทราบว่า

1. พัลส์ของ Channel ไหนที่จะไปทริกการทำงานของ ADC ครับ
2. NVIC ต้องตั้งค่าเพื่อกำกับ TIM3 แล้วต้องตั้งค่าเพื่อกำกับ ADC และ DMA ด้วยหรือเปล่าครับ
3. ผมต้องการนับสัญญาณการทริกจาก TIM3 ไม่ทราบว่าจะมีวิธีการอย่างไรครับ เนื่องจากฟังก์ชั่น TIM ไม่ใช่ลูปของ Interrupt จึงไม่สามารถใส่ตัวแปรเพื่อทำการนับค่า count ในนั้นได้ ทีนี้ไม่ทราบว่าหากผมทำการส่งสัญญาณ Pulse ไปที่พอร์ตๆ หนึ่ง แล้วนับจังหวะที่พอร์ตนั้นส่งออกสัญญาณ pulse ซึ่งจะมีค่า logic == 1 และทำการตรวจจับโลจิคนั้นเป็นการ count หนึ่งค่า ไม่ทราบว่าพอจะเป็นไปได้ไหมครับ เพราะผมกลัวว่าการทำงานนับค่า count ซึ่งอยู่ใน main loop นั้น จะไม่ทันสัญญาณการทริก

ขอบคุณครับ
#6
Quote from: pa_ul on February 18, 2013, 07:37:21 AM
{
Interrupt_Routine()
{
    output_array[index++] = sampling();
}
...
...

main()
{
   ...
   ...
   while(index < 10000)
      {}
    // ถ้าโปรแกรมทำงานถึงตรงนี้ แสดงว่า sampling ได้แล้ว 10000 ค่า
   ...

}


ถ้าตามที่ถามมา มันไม่เห็นจำเป็นที่จะต้องแสดงค่า N ทีละค่า แต่แสดงแค่ว่าได้ครบทุกค่าก็ใช้ได้แล้ว
แต่ถ้าเป็นผม ผมจะทดสอบการทำงานทีละส่วนก่อน เช่นทดสอบ Interrupt_Routine ว่าทำงานถูกต้องแน่ๆ โดยการให้มันทำงานทุกๆ วินาทีก่อนก็ได้ เมื่อทุกอย่างถูกต้อง
จึงค่อยปรับค่าระยะเวลาการอินเตอร์รัพให้เร็วขึ้นจากทุกๆ 1 วินาทีขึ้นมาเป็นทุกๆ 20 uS ซึ่งสามารถทำได้ง่ายๆโดยการปรับค่า timer

ตอนนี้ผมใช้แค่ Interrupt TIM3 เป็นตัวกำหนดการทำงานอยู่ครับ ไม่ทราบว่า

Interrupt_Routine()
{
    output_array[index++] = sampling();
}

เป็นฟังก์ชั่นที่ต้องสร้างขึ้นมาใหม่หรือเป็นฟังก์ชั่นในตัว Interrupt ครับ
#7
ตอนนี้แก้ไขเรื่อง LCD ติดดีเลได้แล้วครับ แต่ตอนนี้ผมต้องการนับจำนวนครั้งการแซมปลิ้ง -> แสดงผล และเอาค่าที่แซมปลิ้งได้ทุกค่า ทุกๆ 20us มาบันทึกลงใน array แต่ละค่า เป็นจำนวน 10000 ค่าครับ ซึ่งขั้นต้นผมใช้การ count N ใน main loop แต่ดูเหมือนจะใช้แทนค่าจำนวนการแซมปลิ้งไม่ได้ครับ เพราะผมต้องบันทึกค่าลงใน array แล้วคำนวนค่า rms ซึ่งการนับ N ในเมนลูปทำให้การบันทึกค่าไม่สอดคล้องกับการแซมปลิ้ง ค่า rms ที่ได้เลยเพี้ยนบานเลยครับ ไม่ทราบว่าใครพอจะมีไอเดียในการจับค่าของการแซมปลิ้งทีละครั้งบ้างไหมครับ
#8
พอดีฟังก์ชั่นการเขียนข้อมูลของ LCD มันมีดีเลย์ด้วยครับ ทีน้จะทำอย่างไรดีที่จะให้สามารถแสดงผลบนจอ LCD โดยไม่กระทบต่อการทำงานครับ