Atmega328P Datasheet 17. External Interrupt

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

Previous topic - Next topic

tha

17. EXINT - External Interrupts
The External Interrupts ถูกทริกโดย INT pins หรือพินใดพินหนึ่งของ PCINT pins. สังเกตได้ว่าถ้า enable แล้ว interrupts จะถูกทริก ถึงแม้ว่า INT หรือ PCINT pins ถูกกำหนดให้เป็น outputs ก็ตาม คุณสมบัติอย่างนี้จัดให้มีวิธีการสร้าง software interrupt

The Pin Change Interrupt Request 2 (PCI2) จะถูกทริก ถ้าพินใดพินหนึ่งใน PCINT[23:16] pin ที่ถูก enable มีการ toggles,  Pin Change Interrupt Request 1 (PCI1) จะถูกทริก ถ้าพินใดพินหนึ่งใน PCINT[14:8] pin ที่ถูก enable มีการ toggles,  Pin Change Interrupt Request 0 (PCI0) จะถูกทริก ถ้าพินใดพินหนึ่งใน PCINT[7:0] pin ที่ถูก enable มีการ toggles รีจีสเตอร์ PCMSK2, PCMSK1 และ PCMSK0 Registers ควบคุมว่าพินไหนบ้างที่ถูกทำให้เป็น pin change interrupts. Pin change interrupts บน PCINT ถูกตรวจจับแบบไมประสานเวลา(asynchronously) นี้หมายความว่า interrupts เหล่านี้สามารถใช้สำหรับปลุก(waking) sleep modes อื่นๆได้นอกเหนือจาก Idle mode
(ก็จะปลุก sleep mode แบบ power-down mode, power-save mode, standby mode ที่หยุด IO clock(CLKio) ด้วย ได้ด้วย ซึ่งทำให้ตรวจจับระดับสัญญานเป็น "0" ได้เท่านั้น (asynchronously) ไม่สามารถตรวจจับ ขอบขาขึ้น ขอบขาลง ที่ต้องใช้ IO clock ได้)

ปล. ดูตาราง sleep mode ร่วมด้วยนะ ว่า sleep mode แบบไหนหยุด IO clock(CLKio) บ้าง
ผมไม่ได้อยู่แอร์นะ วันนี้ครึ้มฟ้าครึ้มฝนอยู่ ก็ได้นิดหน่อยนะ พอดีช่วงเช้าไปธุระด้วย เลยได้แค่นี้  :D

tha

External Interrupts (INT) สามารถถูกทริกโดยขอบขาลงหรือขอบขาขึ้นหรือระดับสัญญานเป็น "0" นี้สามารถเซทอัฟได้ดังที่แสดงในสเปคของ External Interrupt Control Register A (EICRA). เมื่อ External Interrupts ถูก enable และถูกกำหนดให้ระดับสัญญานเป็น "0" แล้วทริก interrupt จะถูกทริกตราบเท่าที่พินนั้นถูกทำให้อยู่ในระดับสัญญานเป็น "0" อยู่ บันทึกไว้ว่า การรู้ได้ของขอบขาลงหรือขอบขาขึ้น interrupt  บน INT นั้น ต้องการการมีอยู่ของสัญญานนาฬิกา IO clock ระดับสัญญานเป็น "0" interrupt  บน INT ถูกตรวจจับแบบไม่ประสานเวลา นี้หมายความว่า interrupts เหล่านี้สามารถใช้สำหรับปลุก(waking) sleep modes อื่นๆได้นอกเหนือจาก Idle mode,  I/O clock จะถูกหยุดในทุก sleep mode ยกเว้น Idle Mode

Note : ถ้าระดับสัญญานเป็น "0" ที่ทริก interrupt นั้น ถูกใช้สำหรับ wake-up จาก power-down mode ระดับสัญญานเป็น "0" ที่ต้องการนี้ จะต้องทำให้ยาวนานเพียงพอสำหรับ MCU wake-up เสร็จแล้วถึงจะทริก level interrupt ต่อ ถ้าระดับสัญญานเป็น "0" หายไปก่อนการสิ้นสุดของ start-up time, MCU จะยังคง wake-up แต่ interrupt จะไม่เกิดขึ้น start-up time นี้ถูกกำหนดโดย SUT และ CKSEL Fuses

ปล. วันนี้พอแค่นี้นะ พักสักหน่อย แล้วก็จะมาคิดเรื่องจิตใจบ้าง เรื่องธรรมะ ทำจิตใจให้ดีงาม นั่งสมาธิบ้างถ้าไม่ตึงเกินไป ใจสงบก็สุขไปอีกแบบ ดีกว่าความสุขแบบปกติสังคมเป็น อย่างดูฟุตบอลฟังเพลงเที่ยวกินเหล้าเที่ยวผู้หญิงฯลฯ

tha

17.1. Pin Change Interrupt Timing
ตัวอย่างของ timing ของ pin change interrupt ถูกแสดงในรูปต่อไปนี้



ปล. ลองดูนะครับ ผมก็ไม่เป็นเท่าไหร่ ลืมไปบ้างแล้วลอจิก ก็ดูกราฟ timing พอผ่านๆ อย่างใช้เวลาไป 3 clock แล้ว PCIF ถึงเซท


tha

17.2. Register Description

17.2.1. External Interrupt Control Register A
External Interrupt Control Register A บรรจุ control bits สำหรับ interrupt sense control.



Bits 3:2 – ISC1n: Interrupt Sense Control 1 [n = 1:0]
The External Interrupt 1 ถูกกระตุ้นให้ทำงาน(activate) โดยขา external pin INT1 ถ้า the SREG I-flag(Global Interrupt) และ the corresponding(ที่ตรงกัน) interrupt mask ถูกเซท ระดับสัญญานเป็น "0" และขอบขา(ขึ้น-ลง)บนขา external INT1 pin ที่กระตุ้นให้  interrupt ทำงาน ถูกกำหนดในตารางข้างล่างนี้ ค่าบนขา INT1 จะถูกสุ่มตรวจจับก่อนที่จะตรวจพบขอบขา(ขึ้น-ลง) ถ้าขอบขา(ขึ้น-ลง) หรือการสลับ(ทั้งขึ้นทั้งลง) interrupt ถูกเลือก สัญญาน pulses ที่นานกว่า 1 clock period จะเกิดการ interrupt  สัญญาน pulses ที่สั้นกว่า (1 clock period) ไม่การันตีว่าจะเกิดการ interrupt ถ้าระดับสัญญานเป็น "0" ถูกเลือก ระดับสัญญานเป็น "0"ต้องถูกทำให้ยืนนาน
จนกระทั่งเสร็จการปฏิบัติคำสั่งปัจจุบันถึงจะเกิดการ interrupt



Bits 1:0 – ISC0n: Interrupt Sense Control 0 [n = 1:0]
The External Interrupt 0 ถูกกระตุ้นให้ทำงาน(activate) โดยขา external pin INT0 ถ้า the SREG I-flag(Global Interrupt) และ the corresponding(ที่ตรงกัน) interrupt mask ถูกเซท ระดับสัญญานเป็น "0" และขอบขา(ขึ้น-ลง)บนขา external INT0 pin ที่กระตุ้นให้  interrupt ทำงาน ถูกกำหนดในตารางข้างล่างนี้ ค่าบนขา INT0 จะถูกสุ่มตรวจจับก่อนที่จะตรวจพบขอบขา(ขึ้น-ลง) ถ้าขอบขา(ขึ้น-ลง) หรือการสลับ(ทั้งขึ้นทั้งลง) interrupt ถูกเลือก สัญญาน pulses ที่นานกว่า 1 clock period จะเกิดการ interrupt  สัญญาน pulses ที่สั้นกว่า (1 clock period) ไม่การันตีว่าจะเกิดการ interrupt ถ้าระดับสัญญานเป็น "0" ถูกเลือก ระดับสัญญานเป็น "0"ต้องถูกทำให้ยืนนาน
จนกระทั่งเสร็จการปฏิบัติคำสั่งปัจจุบันถึงจะเกิดการ interrupt



ปล.   00 = ระดับสัญญานเป็น "0"
        01 = ทั้งขอบขาขึ้นขอบขาลง
        10 = ขอบขาลง
        11 = ขอบขาขึ้น

tha

17.2.2. External Interrupt Mask 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 1 – INT1: External Interrupt Request 1 Enable
เมื่อบิท INT1 ถูกเซทและบิท I-bit(global interrupt) ใน Status Register (SREG) ถูกเซทด้วย, the external pin interrupt จะถูก enable. The Interrupt Sense Control1 bits 1/0 (ISC11 and ISC10) ใน the External Interrupt Control Register A (EICRA) จะเป็นตัวกำหนดว่า external interrupt จะถูกกระตุ้นให้ทำงานที่ขอบขาขึ้นและหรือขอบขาลงของขา INT1 หรือระดับสัญญานเป็น "0" การกระตุ้นให้ทำงานบนขานี้จะเป็นเหตุให้เกิด interrupt request ถึงแม้ว่า INT1 ถูกกำหนดให้เป็น output ก็ตาม

Bit 0 – INT0: External Interrupt Request 0 Enable
เมื่อบิท INT0 ถูกเซทและบิท I-bit(global interrupt) ใน Status Register (SREG) ถูกเซทด้วย, the external pin interrupt จะถูก enable. The Interrupt Sense Control0 bits 1/0 (ISC01 and ISC00) ใน the External Interrupt Control Register A (EICRA) จะเป็นตัวกำหนดว่า external interrupt จะถูกกระตุ้นให้ทำงานที่ขอบขาขึ้นและหรือขอบขาลงของขา INT1 หรือระดับสัญญานเป็น "0" การกระตุ้นให้ทำงานบนขานี้จะเป็นเหตุให้เกิด interrupt request ถึงแม้ว่า INT0 ถูกกำหนดให้เป็น output ก็ตาม

tha

17.2.3. External 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 1 – INTF1: External Interrupt Flag 1
เมื่อขอบขา(ขึ้น-ลง)หรือขอบขา(ทั้งขึ้นทั้งลง)เปลี่ยนบนขา INT1 จะทริก interrupt request, INTF1 ก็จะถูกเซท ถ้า I-bit ใน SREG และบิท INT1 ใน EIMSK ถูกเซท MCU ก็จะกระโดดไปยัง corresponding(ที่ตรงกัน) Interrupt Vector, flag นี้จะถูกเคลียร์เมื่อโปรแกรมย่อยบริการอินเตอร์รัพท์ถูกปฏิบัติ อีกทางเลือกหนึ่ง flag นี้สามารถถูกเคลียร์โดยการเขียน "1" ไปยังบิทนี้ flag นี้จะถูกเคลียร์อย่างถาวรเมื่อ INT1 ถูกกำหนดให้เป็น level interrupt (ระดับสัญญานเป็น "0")

Bit 0 – INTF0: External Interrupt Flag 0
เมื่อขอบขา(ขึ้น-ลง)หรือขอบขา(ทั้งขึ้นทั้งลง)เปลี่ยนบนขา INT0 จะทริก interrupt request, INTF0 ก็จะถูกเซท ถ้า I-bit ใน SREG และบิท INT0 ใน EIMSK ถูกเซท MCU ก็จะกระโดดไปยัง corresponding(ที่ตรงกัน) Interrupt Vector, flag นี้จะถูกเคลียร์เมื่อโปรแกรมย่อยบริการอินเตอร์รัพท์ถูกปฏิบัติ อีกทางเลือกหนึ่ง flag นี้สามารถถูกเคลียร์โดยการเขียน "1" ไปยังบิทนี้ flag นี้จะถูกเคลียร์อย่างถาวรเมื่อ INT0 ถูกกำหนดให้เป็น level interrupt (ระดับสัญญานเป็น "0")

tha

ดู 12.3. SRAM Data Memory ที่นี่ ว่ารีจีสเตอร์ที่เราดูอยู่แอสเดรสไหนกันบ้าง
http://www.electoday.com/index.php/topic,15827.msg38057.html#msg38057

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

พรุ่งนี้ก็จะยกตัวอย่าง มะรืนวันแม่ก็จะหยุดกันสักวัน

tha

http://www.mediafire.com/file/hgrxcd3ijntxslb/INT_1.rar/file

อันนี้ตัวอย่าง INT1 interrupt เวลาอินเตอร์รัพท์แล้วเซท flag a เอา แต่เวลา build ในแบบบีบอัด(Optimization = -Os) จะไม่ทำงาน(ไม่เซท flag a) แต่เวลาไม่บีบอัด(Optimization = -O0) ก็จะทำงานได้ แต่ code size จะใหญ่ ก็ลอง build ดูได้ทั้ง winavr และ avr8 gnu toolchain เลย ก็จะเหมือนกันกับนี่แหละ http://www.electoday.com/index.php?topic=16901.8