Atmega328P Datasheet 14. PM - Power Management and Sleep Modes

Started by tha, November 01, 2017, 11:51:44 AM

Previous topic - Next topic

tha

พรายกระซิบบอก ให้ลองทำตัวอย่าง ADC Noise Reduction Mode ดู เอ๊ะแล้วในเน็ตมีมั๊ยนี่ ทำยังไงหล่ะทีนี้ ลองเช็คตัวอย่างของ ETT กับของหนังสือ การเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร์ AVR ด้วยภาษา C กับ WinAVR (C Complier) ดู คงต้องร่ายจาก usart ไป adc แล้วถึงจะทำ ADC Noise Reduction Mode ได้ ลุยไปหลายบทเลยนะ data sheet นี่ก็ดันเอาเรื่องยากขึ้นก่อน ม๊ะ มาลองดูกัน เช็คบิทกันเวียนหัวเลย แต่ arm 32 bit ก็ผ่านมาแล้ว 8 bit เลยกลายเป็นของหมูๆ  ;D

tha

เลยต้องทำ usart ไปด้วย เพื่อที่จะเอาค่า adc มาแสดง ได้ตัวอย่างของ ETT มา เลยเร็วหน่อย ตัวอย่าง usart ของหนังสือดูค่อนข้างยากเพราะใช้ stdio file ยังไม่ได้ไล่เช็ค library เลยงงหน่อย ต้องขอขอบคุณทั้งสองจ้าวมา ณ ที่นี้ด้วย ไม่ว่ากันนะที่เอาตัวอย่างมาแสดง  :D

http://www.mediafire.com/file/jf9a49odcvwewc9/usart1.rar

ระวังตั้งค่า hyper terminal ด้วยเพราะบิท stop มี 2 bits

tha

ดูตัวอย่างนี้แล้ว น่าจะตรงหน่อย (ยังดูไม่จบ) เลยเก็บเอาไว้ก่อนครับ

https://www.youtube.com/v/ad7gD7WHm0E


tha

ลองทำตัวอย่าง adc แสดงใน usart ก่อน ก็ทำงานได้ บอร์ด atmega328p รายละเอียดดูในหนังสือกับตัวอย่างของ ETT กับลิ้งค์นี่ก็ดีครับ
http://maxembedded.com/2011/06/the-adc-of-the-avr/

http://www.mediafire.com/file/i276ln9767u6cu3/adc_usart1.rar

tha

คราวนี้ทำ ADC Noise Reduction Mode บอร์ด atmega328p เข้า sleep mode ครั้งแรกมันสามารถแปลง ADC ได้พร้อมทั้ง wake up เอาค่ามาแสดงผลได้ พอวนกลับมา sleep mode ครั้งที่สอง มันเงียบไปเลย ไม่ wake up มาแสดงผลเลย ไม่รู้เป็นไร ต้อง reset เอาถึงจะแปลงที ช่วยเช็คดูให้หน่อยครับ มึนแล้ว

http://www.mediafire.com/file/ac6xd7zjc9nwxa8/adc_usart2.rar

tha

พบจุดที่ผิดแล้วครับ มันเป็นความเข้าใจผิดของผมเอง ที่ต้องการให้บิทไหนเป็น "0" แล้วทำแบบนี้
// Interrupt ADC
ISR (ADC_vect)
{
   ADCSRA &= (0<<ADIF);  // clear interupt flag
}
ถ้าทำแบบนี้แล้ว หมายถึงทั้ง register ถูก and ด้วย "0" ทั้งหมด ที่จริงต้องกลับเฉพาะบิทนั้นเป็น "0" ส่วนบิทอื่นเป็น "1" แล้วค่อย and อย่างนี้
// Interrupt ADC
ISR (ADC_vect)
{
   ADCSRA &= ~(1<<ADIF);  // clear interupt flag
}
ถึงจะกระทบเพียงบิทเดียว อย่างนี้ถูกต้องใหมครับ  ;D
คราวนี้ก็ได้แล้ว ADC Noise Reduction Mode ลดสัญญานรบกวนขณะทำการแปลง adc พอเข้า sleep mode แล้วปิด clock ที่ไม่จำเป็น แล้วทำการแปลง adc เมื่อเสร็จแล้ว ก็ ADC interrupt complete แล้ว wake up เข้า code ส่วนแสดงผล
http://www.mediafire.com/file/5a745ea1zc8t6n5/adc_usart2%282%29.rar

tha

ติดพันทำ adc เลยทำแบบ adc interrupt complete ด้วย เวลาได้แล้วได้หมด ลองเอาไปดูกันครับ ข้ามเรื่องไปแล้ว  :)
http://www.mediafire.com/file/jsxqad2xaafsj2d/adc_usart3.rar

ROM

ติดตามผลงานท่าน tha ตลอดเลยครับ ได้ข้อมูลที่ดีมากขึ้นเรื่อยๆ ขอบคุณมากครับ
แต่ท่าน tha ลองใช้ Github ( https://github.com ) ทำการจัดการ source code ดูซิครับ จะได้ไม่ต้อง ฝาก file หลายครั้ง
และได้งานเป็นที่ง่ายต่อการจัดการมากกว่านะครับ รวมถึงอาจมีคนอื่นๆมาช่วยท่านได้ง่ายขึ้นครับ