Atmega328P Datasheet 14. PM - Power Management and Sleep Modes

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

Previous topic - Next topic

tha

ไปเจอตัวอย่างมา เยอะเลย
http://exploreembedded.com/wiki/Interfacing_Seven_Segment_Displays_with_AVR
https://github.com/maxEmbedded/avr-code-gallery
ท่านใดเจออะไรดีๆมาบอกกันด้วยนะ

az

เพราะแสวงหา..  มิใช่เพราะรอคอย
เพราะเชี่ยวชาญ..  มิใช่เพราะโอกาส
เพราะสามารถ..  มิใช่เพราะโชคช่วย
ดังนี้แล้ว "ลิขิตฟ้า  หรือจะสู้มานะตน..."

tha



tha

อ่านมาหลายปีสำนวณไมโครฯ มีคำศัพย์ไม่กี่ตัวหรอก แต่ไม่ต้องเปิดดิกนี่ก็เล่นเอาแก่สี่สิบห้าสิบไปเหมือนกัน ;D

รูปประโยคก็เป็น passive voice มีซะเป็นส่วนมาก
                                           ประธาน + verb to be + verb(กริยา) ช่องที่ 3 อาจมี by(โดย) ใครหรืออะไร ระบุต่อท้ายด้วย

ก็จะเป็นรูปประโยคที่เน้นว่าประธานเป็นผู็ถูกกระทำ อาจมีระบุว่าถูกกระทำโดยใครหรืออะไรต่อท้ายด้วย

tha

กำลังไล่ทบทวน ก็มาเจอจุดที่ผิด เขาบอกว่า สัญญานนาฬิกาของ ADC ต้องไม่เกิน 200khz ใช่ใหม แต่ก่อนผมทำไว้ใช้ต้อง 1Mhz ก็แก้เป็น
ADC Clock Prescale = 128  ได้เท่าไหร่หล่ะ เอา 16M/128 = 125khz ก็ถึงจะใช้ได้ ถ้าอยากได้ 200khz เป๊ะๆ ก็ต้องเปลี่ยน crystal เอานะ ให้เป็นเท่าไหร่ก็คำนวณเอานะ ชักจะงงๆ
Quote
  ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));            // ADC Clock Prescale = 128

pin ไหนถ้าเราใช้เป็นขา ADC แล้ว เราก็ปิดการใช้งาน Digital Input pin นั้นเสีย เพื่อประหยัดพลังงาน
Quote
DIDR0 |= (1<<ADC0D);                                      // ADC5...0 Digital Input Disable

อีกอย่างใน ADC interrupt service routine เราก็ไม่ต้องเช็คบิทเคลียร์บิทอินเตอรับท์แฟลก ADIF แล้ว ในดาต้าชีทเขาบอกว่า มันถูกเคลียร์โดยฮาร์ดแวร์ตอนที่เข้า ADC interrupt service routine แล้ว

http://www.mediafire.com/file/egi9k4gj3p3b7jn/adc_usart3%25283%2529.rar/file

tha

ดันขายหนังสือไมโครฯ AVR ไป เลยต้องซื้อมาใหม่ อ่านแต่ภาษาอังกฤษอย่างเดียวกลัวว่าจะจับต้นชนปลายไม่ถูก ได้อ่านภาษาไทยก่อนให้รู้ภาพรวมก่อน แล้วค่อยอ่านภาษาอังกฤษก็จะเข้าใจดีขึ้น ไม่ติดขัด

อ่านภาษาอังกฤษอย่างเดียวไม่ไหวหรอก ร้อนแล้วจะไปไม่เป็นเลย ภาษาไทยก็เหอะ พอร้อนแล้วก็อ่านไม่ไหวแล้ว เวลาอ่านหนังสือต้องหาที่เย็นๆเอาไว้นะ หรืออ่านตอนที่เย็นๆอย่างตีสี่ตีห้านะพวกเรา บ่ายๆมานี่ผมต้องจอดป้ายทุกที ต่อให้เก่งแค่ไหนอีก

พวกโซนหนาวอย่างญี่ปุ่นจีนเกาหลียุโรปเขาถึงเจริญทางด้านเทคโนโลยี่ได้ ก็ประเทศเขาหนาวเย็นนี่ใช่ใหม

ประชาธิปไตยอีก ร้อนมันอ่านหนังสือไม่ได้ ทำคนส่วนใหญ่ไม่มีความรู้ ไม่ฉลาด เลือกกันแต่เจ้าพ่อเจ้าแม่เสี่ยนั้นเสี่ยนี้คนขายหวย คราวนี้เขาจะทำอะไรกันก็ได้ ชาวบ้านไม่มีปัญญาจะรู้ทันเลย ปัจจัยอยู่ที่เงิน ก็จะหากันแต่เงิน ร้อนก็โทสะจะแรง ก็จะใช้แต่อารมณ์ ใช้แต่คำพูดทะเลาะกันไปมา เลยทำให้ไม่เจริญกันหนักไปอีกใช่หใม ร้อน ประชาธิปไตยเลยล้มเหลว ต้องปฏิวัติกันอีก ไม่สามารถทรงตัวพัฒนาไปได้เลย

tha

เช้ายังเย็นพอได้อยู่ สายบ่ายมาก็ต้องจอดป้าย  >:(
มาต่อกันดีกว่า คราวนี้มาลองดีบักดู AVR Studio 4.17 นี้ดีบักแบบ simulator ได้ โดยเวลาที่เรา built ก็จะได้ไฟล์ .elf ด้วย ซึ่งไฟล์ตัวนี้จะใช้ในการดีบักแบบ simulator ไม่ต้องโปรแกรมลงในตัว mcu ดีบักลอยๆได้เลย ก็สามารถดูการทำงานของมันได้ ดูรีจีสเตอร์ดูสถานะของบิทต่างๆได้ว่าเปลี่ยนแปลงไปเช่นไร

คราวนี้เรามาดีบักดูการทำงานของ ADC ดู ก็จะดูที่บิท ADSC: ADC Start Conversion กับบิท ADIF: ADC Interrupt Flag ในรีจีสเตอร์ ADCSRA – ADC Control and Status Register A ว่าเปลี่ยนแปลงไปอย่างตอนเรา

เขียนโปรแกรมเสร็จแล้วเราก็ built โปรแกรมได้เลย แล้วถึง start debug
แล้วเราติ๊กที่ AD Converter ทางช่องด้านขวาบน ให้รีจีสเตอร์ ADC มาแสดงทางช่องด้านล่าง แล้วเราก็ติ๊กที่ ADCSRA เพื่อจะดูบิท ADSC กับบิท ADIF
คราวนี้เราก็กด step into ไปจนถึงแถว

Quotewhile (!(ADCSRA &(1<<ADIF)));    // Wait Coversion completes

ก็จะค้างอยู่อย่างนั้น คราวนี้เรามาตั้งเบรคพ้อยท์ที่แถว

QuoteADCResult = ADCW;                           // Get 10 Bit Result

แล้วกด run ไป คราวนี้ก็จะผ่านแถวเช็ค ADIF มาได้ คือ ADC conversion เสร็จ สังเกตเห็นว่าบิท ADIF จะติดเป็น "1"
คราวนี้เราก็มากด step into ใหม่วนมาแถว

QuoteADCSRA |= (1<<ADSC);                  // Start ADC Conversion

พอ step into ผ่านแถวนี้ไป บิท ADSC ก็จะเป็น "1" แล้วบิท ADIF จะดับเป็น "0" สลับกัน



บิท ADSC เราเขียนให้เป็น "1" ตอนที่เราต้องการ start ADC conversion บิทนี้จะค้างเป็น "1" ไปจนกว่า ADC conversion จะเสร็จลง ADC data register มีข้อมูล
ส่วนบิท ADIF จะเป็น "1" เมื่อ  ADC conversion เสร็จลง ADC data register มีข้อมูล และจะเป็น "0" เมื่อบิท ADSC ถูกเขียนให้เป็น "1" ใหม่

เราจะใช้

Quote//while(ADCSRA & (1<<ADSC));                  // Wait ADC Complete

แทน

Quotewhile (!(ADCSRA &(1<<ADIF)));    // Wait Coversion completes

เพื่อเช็คว่าการ ADC coversion ทำงานเสร็จแล้วได้ด้วยเหมือนกัน

http://www.mediafire.com/file/j7g18me7y8iptjd/adc_usart3_1.rar/file


ปล. ท่านใดอยากเป็น ARM Cortex-M ต้องรอให้ AVR ATmega328p เสร็จก่อนนะ ปีนึงเสร็จใหมนี่  :'(




tha

http://www.mediafire.com/file/j6173ottig2hj6p/sleep3%25282%2529.rar/file

ลองดูโปรแกรมนี้ให้หน่อยครับ มันทำงานได้นะ แต่จะงงๆที่จุดนี้ ว่ามันทำงานได้อย่างไร

Quotewhile(a);       

ถ้า a เป็น 0 มันน่าจะผ่านใช่ใหม แต่กลับค้างอยู่ พอ interrupt พอ a เป็น 1 กลับผ่านทำให้ PD6 กระพริบมาได้ แต่พอเอาฟังชั่น sleep ออก  ก็กลับกันไปอีก งง

อีกอย่าง ตัวแปร bool ทำใมประกาศไม่ได้หล่ะ built แล้วจะ error

ปล. ใครเอารูปโป้ออกไปไหนหล่ะ ยังไม่ได้ดูเลย  :o