Atmega328P Datasheet 17. External Interrupt

Started by tha, August 09, 2019, 01:36:22 PM

Previous topic - Next topic

tha

http://www.mediafire.com/file/ukm4zb51sldrdhe/INT.rar/file

อันนี้ INT1 Interrupt แล้วจะปลุกขึ้นจาก sleep mode ก็จะตั้ง INT1 Interrupt ตรวจจับแบบ low level(ระดับสัญญานเป็น "0") ที่ไม่ต้องใช้สัญญานนาฬิกา IO clock (มีเพียง Idle Mode ใช่ไหมที่ไม่หยุด IO clock ก็จะตั้งเป็นขอบขาขึ้น ขอบขาลงและทั้งสองขอบขาได้อีก)

อันนี้ลองมาทั้ง 5 sleep mode เลย ก็สามารถทำงานปลุกให้ตื่นจาก sleep mode ได้

Quote
   //set_sleep_mode(SLEEP_MODE_IDLE);           // see detail in sleep.h
   //set_sleep_mode(SLEEP_MODE_PWR_DOWN);
   //set_sleep_mode(SLEEP_MODE_PWR_SAVE);
   //set_sleep_mode(SLEEP_MODE_STANDBY);
   set_sleep_mode(SLEEP_MODE_EXT_STANDBY);

เอา sleep mode ไว้ใช้ในตอน เราใช้ถ่านกับบอร์ด ตอนที่เราไม่ต้องการให้บอร์ดทำงาน เราก็ให้บอร์ดเข้า sleep mode พอเราอยากให้บอร์ดกลับมาทำงาน เราก็กดสวิทช์ INT1 interrupt ปลุกให้บอร์ดตื่น ทำอย่างนี้เพื่อประหยัดพลังงานถ่านไฟ

ปล. พอดีเน็ตล่มเลยหยุดไปสองวัน ตกลงให้ไปช้าๆใช่ไหม ก็ดีเหมือนกันนะ คนที่กำลังตามจะได้ตามทัน คนที่ตามทันแล้วจะได้แน่นๆ คนที่เก่งแล้วจะได้นำหน้าไปก่อน

ว่าไปวัตถุเทคโนโลยี่ก็เป็นดาบสองคมเหมือนกัน ดูอย่างมือถือสิ
หนังโป้กามราคะก็มีให้ดูกันอย่างง่ายๆ ทำเด็กสาวมีลูกก่อนวัยอันควร
ดูข่าวการเมืองก็กระตุ้นโทสะกันได้บ่อยๆ
ความอยากได้อยากมีอยากเป็นก็ถูกกระตุ้นกันอยู่บ่อยๆ ก็เพราะเราเห็นสิ่งของอะไรต่างๆที่อยากได้ ได้ง่ายๆในมือถือนี่แหละ
อย่างข่าวลูกจ้างคนฆ่าแม่ตัวเองหวังฮุบสมบัตินี่ สมัยก่อนไม่มีหรอก มีในสมัยนี้นี่แหละ
จิตใจคนไม่ดีเลย มือถือทำคนกิเลสหนาตัณหาจัด ใช่ป่าว

ได้อ่านหนังสือ "เมฆเหิน น้ำไหล" ที่พระเทพทรงแปล ก็ว่าการเร่งทำให้วัตถุเทคโนโลยี่เจริญอย่างรวดเร็ว ทำให้คนจิตใจไม่ดีเลย ทำให้คนรุ่นใหม่มีนิสัยเห็นแก่ตัวจัด หลอกลวงคตโกง แก่งแย่งแข่งขัน ทำอะไรก็ได้ ขอให้ได้ ขอให้ชนะ

ตกลงไปช้าๆเอานะพวกเรา ช้าไปเร็วไปก็บอกกันได้นะ
แต่อย่างไรประเทศเราเป็นเมืองร้อน พอร้อนก็อ่านหนังสือไม่ได้แล้ว
ถึงอย่างไรเราก็ตามเขาอยู่ไกล ได้สัก 10% ของจีนของอเมริกาได้หรือเปล่าครับ

tha

17.2.4. Pin Change Interrupt Control Register



Bit 2 – PCIE2: Pin Change Interrupt Enable 2
เมื่อบิท PCIE2 ถูกเซทและบิท I-bit ใน Status Register (SREG) ถูกเซท, pin change interrupt 2 จะถูกเปิดการใช้งาน การเปลี่ยน(ทั้งขึ้นทั้งลง)บนขาใดขาหนึ่งของ PCINT[23:16] pin ที่ enable ไว้ จะเป็นเหตุให้เกิดการ interrupt. The corresponding(ที่ตรงกัน) interrupt ของ Pin Change Interrupt Request จะถูกปฏิบัติจาก PCI2 Interrupt Vector. PCINT[23:16] pins ถูก enabled เป็นรายขาโดย PCMSK2 Register

Bit 1 – PCIE1: Pin Change Interrupt Enable 1
เมื่อบิท PCIE1 ถูกเซทและบิท I-bit ใน Status Register (SREG) ถูกเซท, pin change interrupt 1 จะถูกเปิดการใช้งาน การเปลี่ยน(ทั้งขึ้นทั้งลง)บนขาใดขาหนึ่งของ PCINT[14:8] pin ที่ enable ไว้ จะเป็นเหตุให้เกิดการ interrupt. The corresponding(ที่ตรงกัน) interrupt ของ Pin Change Interrupt Request จะถูกปฏิบัติจาก PCI1 Interrupt Vector. PCINT[14:8] pins ถูก enabled เป็นรายขาโดย PCMSK1 Register
.
Bit 0 – PCIE0: Pin Change Interrupt Enable 0
เมื่อบิท PCIE0 ถูกเซทและบิท I-bit ใน Status Register (SREG) ถูกเซท, pin change interrupt 0 จะถูกเปิดการใช้งาน การเปลี่ยน(ทั้งขึ้นทั้งลง)บนขาใดขาหนึ่งของ PCINT[7:0] pin ที่ enable ไว้ จะเป็นเหตุให้เกิดการ interrupt. The corresponding(ที่ตรงกัน) interrupt ของ Pin Change Interrupt Request จะถูกปฏิบัติจาก PCI0 Interrupt Vector. PCINT[7:0] pins ถูก enabled เป็นรายขาโดย PCMSK0 Register

ปล. สงสัยในตอนต้นของบทนี้ผมจะเข้าใจผิด(บอกมาผิดด้วย ต้องกลับไปแก้ไหม) อันนี้ไม่ใช่ระดับสัญญญานเป็น "0" แต่จะเป็น any change (เปลี่ยนไป ก็คือทั้งขึ้นทั้งลง) แต่จะตรวจจับแบบไมประสานเวลา(asynchronously) คือ ไม่ต้องใช้สัญญานนาฬิกา IO clock (CLKio) ก็ได้ ก็จะมีการ sense ได้อย่างเดียว ก็เลยไม่มีบิทเลือกขอบขาให้ตั้ง

tha

17.2.5. Pin Change Interrupt Flag Register
เมื่อระบุตำแหน่ง I/O Registers เป็น data space โดยใช้คำสั่ง LD(load) และ ST(store) instructions, the provided offset(ค่าจากจุดเริ่มต้น) จะต้องถูกใช้. เมื่อใช้คำสั่ง the I/O specific commands IN and OUT, the offset จะถูลดลงไป 0x20, ผลคือ I/O address offset จะอยู่ในระหว่าง 0x00 - 0x3F.(ดู 12.3 SRAM Data Memory ประกอบด้วย)



Bit 2 – PCIF2: Pin Change Interrupt Flag 2
เมื่อลอจิกเปลี่ยน(ทั้งขึ้นทั้งลง)บนขาใดขาหนึ่งของขา PCINT[23:16] จะทริก interrupt request, PCIF2 ก็จะถูกเซท ถ้า I-bit ใน SREG และบิท PCIE2 ใน PCICR ถูกเซท, MCU ก็จะกระโดดไปยัง corresponding Interrupt Vector. flag นี้จะถูกเคลียร์เมื่อโปรแกรมย่อยบริการอินเตอร์รัพท์ถูกปฏิบัติ อีกทางเลือกหนึ่ง flag นี้สามารถถูกเคลียร์โดยการเขียน '1' ไปยังบิทนี้

Bit 1 – PCIF1: Pin Change Interrupt Flag 1
เมื่อลอจิกเปลี่ยน(ทั้งขึ้นทั้งลง)บนขาใดขาหนึ่งของขา PCINT[14:8]] จะทริก interrupt request, PCIF1 ก็จะถูกเซท ถ้า I-bit ใน SREG และบิท PCIE1 ใน PCICR ถูกเซท, MCU ก็จะกระโดดไปยัง corresponding Interrupt Vector. flag นี้จะถูกเคลียร์เมื่อโปรแกรมย่อยบริการอินเตอร์รัพท์ถูกปฏิบัติ อีกทางเลือกหนึ่ง flag นี้สามารถถูกเคลียร์โดยการเขียน '1' ไปยังบิทนี้

Bit 0 – PCIF0: Pin Change Interrupt Flag 0
เมื่อลอจิกเปลี่ยน(ทั้งขึ้นทั้งลง)บนขาใดขาหนึ่งของขา PCINT[7:0] จะทริก interrupt request, PCIF0 ก็จะถูกเซท ถ้า I-bit ใน SREG และบิท PCIE0 ใน PCICR ถูกเซท, MCU ก็จะกระโดดไปยัง corresponding Interrupt Vector. flag นี้จะถูกเคลียร์เมื่อโปรแกรมย่อยบริการอินเตอร์รัพท์ถูกปฏิบัติ อีกทางเลือกหนึ่ง flag นี้สามารถถูกเคลียร์โดยการเขียน '1' ไปยังบิทนี้


tha

17.2.6. Pin Change Mask Register 2



Bits 0, 1, 2, 3, 4, 5, 6, 7 – PCINT16, PCINT17, PCINT18, PCINT19, PCINT20, PCINT21, PCINT22, PCINT23: Pin Change Enable Mask
แต่ละบิท PCINT[23:16]-bit เลือกได้ว่า pin change interrupt ใดถูก enable บนขา the corresponding I/O pin. ถ้าบิท PCINT[23:16] ใดถูกเซทและบิท PCIE2 ใน PCICR ถูกเซท, pin change interrupt ก็จะถูก enable บนขา corresponding I/O pin. ถ้าบิท PCINT[23:16] ใดถูกเคลียร์ pin change interrupt บนขา corresponding I/O pin ก็จะถูกปิดการใช้งาน

17.2.7. Pin Change Mask Register 1



Bits 0, 1, 2, 3, 4, 5, 6 – PCINT8, PCINT9, PCINT10, PCINT11, PCINT12, PCINT13, PCINT14: Pin Change Enable Mask
แต่ละบิท PCINT[15:8]-bit เลือกได้ว่า pin change interrupt ใดถูก enable บนขา the corresponding I/O pin. ถ้าบิท PCINT[15:8] ใดถูกเซทและบิท PCIE1 ใน PCICR ถูกเซท, pin change interrupt ก็จะถูก enable บนขา corresponding I/O pin. ถ้าบิท PCINT[15:8] ใดถูกเคลียร์ pin change interrupt บนขา corresponding I/O pin ก็จะถูกปิดการใช้งาน

17.2.8. Pin Change Mask Register 0



Bits 7:0 – PCINTn: Pin Change Enable Mask [n = 7:0]
แต่ละบิท PCINT[7:0]-bit เลือกได้ว่า pin change interrupt ใดถูก enable บนขา the corresponding I/O pin. ถ้าบิท PCINT[7:0] ใดถูกเซทและบิท PCIE0 ใน PCICR ถูกเซท, pin change interrupt ก็จะถูก enable บนขา corresponding I/O pin. ถ้าบิท PCINT[7:0] ใดถูกเคลียร์ pin change interrupt บนขา corresponding I/O pin ก็จะถูกปิดการใช้งาน

ปล. เดี๋ยวจะทำตัวอย่างดูนะ เปลี่ยนลอจิกทั้งขึ้นทั้งลงเลยใช่ไหม จะใช้สวิทช์ปุ่มกดไม่ได้แล้ว ต้องใช้สวิทช์ปิดเปิดแทน
วันนี้ครึ้มฟ้าครึ้มฝนนะ ช่วงบ่ายเลยได้ ถ้าวันไหนแดดออก ไม่ได้เลยนะ สู้ไม่ไหวหรอก ร้อน ทำอะไรไม่ได้เลย

tha

http://www.mediafire.com/file/f0o8928aysf7hmf/PCINT.rar/file

อันนี้ต้องไม่ optimize code นะ (optimization = -O0) เพราะเดี๋ยวจะไม่เห็น flag a

ก็เอาสวิทช์ปิดเปิดมาต่อคร่อมสวิทช์ปุ่มกดเลย(เฉพาะบอร์ดผมนะ) คราวนี้ปิดก็ interrupt เปิดก็ interrupt (interrupt ทั้งขึ้นทั้งลง)ได้ทั้งสองสวิทช์เลย แต่ interrupt เดียวกัน อย่างนี้ก็จะใช้ทั้ง ๘ สวิทช์ก็ได้นะ ใน interrupt เดียวกัน



ปล. จะเอาตัวอย่างอีกไหม sleep mode ก็คงจะเหมือนกัน

tha

http://www.mediafire.com/file/k6zisr0vtvwdmdv/PCINT_1.rar/file

อันนี้ pin change interrupt ใช้ปลุก (wake-up) จาก sleep mode ของทุกๆโหมด ก็ได้เหมือนกัน
อะไรเป็นอะไร ก็ลองไล่ดูในไฟล์ iom328p.h ดูเอานะ อยู่ตรงไหนก็ดูได้ในโปรแกรม คอมเม้นต์บอกที่อยู่เอาไว้ให้แล้วครับ

ปล. เคยยกลูกเหล็กได้เป็นพันชั่ง(stm32 32บิท)มาแล้ว ทำใมจะยกปุยนุ่น(ATmega328p)ไม่ได้หล่ะ  ;D
ทำเก่งไป เดี๋ยวเจอวันที่แดดออก มีสิทธิ์เดี้ยง ต่อให้เก่งแค่ไหนอีก  :'(
ย่อมาซะวันเดียวเสร็จเลย ตามกันทันมั๊ยหล่ะท่าน แล้วพรุ่งนี้จะทำอะไรดีหล่ะ อ่าน IO-Port ก่อนนะ เดี๋ยวจะเริ่มใหม่หมดเลยนะเรื่อง IO Port ลืมไปแล้วเหมือนกัน

tha

http://www.mediafire.com/file/940561uujf4wava/PCINT_2.rar/file

ลอง PCIE1: Pin Change Interrupt Enable 1 ดูบ้าง ใช้สวิทช์ 2 ตัวต่อเข้า PC0(PCINT8), PC1(PCINT9) เปิดปิดหลอด LED (PD6) ตัวเดียวกัน ของผมบางทีก็เปิดได้ปิดได้ บางทีก็เปิดไม่ได้ปิดไม่ได้ ไม่แน่นอนเอาเสียเลย คิดว่าน่าจะเป็นที่สวิทช์ปิดเปิด พวกคุณลองดูที ว่าเป็นที่อะไร

tha

เปลี่ยนมาใช้แบบนี้ ก็มีความแน่นอนขึ้น แต่ก็ไม่ร้อยเปอร์เซ็น น่าจะมาจากสวิทช์มีการบร๊าวท์(เรียกไม่ถูกแล้วลืม) แล้วให้มัน toggle อย่างในโปรแกรม PCINT2 นั้นคงจะไม่สมบรูณ์



แต่ถ้าเราแยกโปรแกรมปิดก็อยู่ส่วน เปิดก็อยู่ส่วน อย่างนี้ก็จะแน่นอนครับ

http://www.mediafire.com/file/t7gxpqbjdir5irx/PCINT_3.rar/file

ปล. จะให้ยกตัวอย่างอีกไหม เดี๋ยวจะอ่าน IO-Port อีกสักสองสามวัน คงจะได้ขึ้นนะ