การใช้อินเตอร์รัปต์ภายนอกหลายรายการใน PIC


9

ฉันใช้PIC16F877( แผ่นข้อมูล ) สำหรับหลายโครงการ สำหรับการขัดจังหวะการเปลี่ยนพินภายนอกเดียวคุณสามารถใช้PORTB0อินเตอร์รัปต์ แต่ตอนนี้ฉันต้องการสนับสนุนการขัดจังหวะการเปลี่ยนพินภายนอก 8 อิสระในวงจรเดียว

ในแผ่นข้อมูลมีข้อความระบุว่ามีอินเทอร์รัปต์ 15 รายการPIC16F877แต่ฉันเดาว่าจะนับรวมการขัดจังหวะตัวจับเวลาและอื่น ๆ ... ซึ่งไร้ประโยชน์ในกรณีนี้

นี่คือสิ่งที่แผ่นข้อมูลพูดเกี่ยวกับการINTCONลงทะเบียน

ป้อนคำอธิบายรูปภาพที่นี่

ฉันสามารถใช้อินเทอร์รัปต์ 4 รายการโดยใช้ bit0 ได้RBIFหรือไม่ PB7:PB4มันหมายถึงการเปลี่ยนแปลงใน ฉันจะระบุพินที่เปลี่ยนแปลงได้อย่างไรโดยการอ่านค่าพอร์ตในรูทีนการขัดจังหวะ

แม้ว่าฉันจะได้รับคำตอบในเชิงบวกจากข้างต้น แต่ฉันต้องการการขัดจังหวะ 8 ครั้ง แน่นอนฉันยังคงสามารถใช้INTEสำหรับPORTB0การเปลี่ยนแปลง ถ้าอย่างนั้น4 + 1 = 5อีก 3 คนล่ะ? (อย่างไรก็ตามการที่อินเตอร์รัปต์ทั้ง 8 เหตุการณ์นั้นเป็นประเภทเดียวกัน4 + 1 + 3 = 8สิ่งที่ดูน่าเกลียดใช่มั้ย)

ไม่มีงานหนักอื่น ๆ ที่คาดหวังจากตัวควบคุมไมโครอื่น ๆ ที่ตรวจสอบ 8 พิน (เมื่อพูดถึงงานอื่น ๆ มันจะต้องรักษาชุดของตัวนับที่แยกต่างหากและส่งผ่านบ่อยครั้งประมาณ 4 ไบต์ไปยังพีซีตามลำดับ)

ข้อเสนอแนะใด ๆ ยินดีต้อนรับ แม้ว่ามันจะเกี่ยวกับการเปลี่ยนไมโครคอนโทรลเลอร์สำหรับอันที่เหมาะสมกว่า (แต่เอ่อ .. อย่าบอกให้ฉันไปจากPICs)


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

1
หากคุณใช้ RBIE อินเตอร์รัปต์คุณสามารถบัฟเฟอร์ค่าก่อนหน้าในแต่ละครั้งและ XOR เพื่อค้นหาสิ่งที่เปลี่ยนแปลง ควรจะดำเนินการอย่างรวดเร็วสวย
PeterJJ

@ PeterJ ฉันไม่เข้าใจเลย บัฟเฟอร์ค่าใด
ชื่อรหัส SC

@PeterJ ยอดเยี่ยม! กำลังรอ ...
ชื่อรหัส SC

1
วิธีหนึ่งคือการใช้เกตสัญญาณอินพุต 8 ภายนอก (เช่น 74LS30 ในสมัยก่อน) เพื่อรวมสัญญาณภายนอกเข้ากับอินเตอร์รัปต์ขาเดียว เนื่องจาก 74 (HC) 30 เป็นเกต NAND คุณจะต้องใช้อินพุตทั้งหมดในสถานะที่นิ่ง - พวกเขาจะต้องเชื่อมต่อกับหมุดพอร์ตเพื่อให้คุณสามารถระบุว่าอินเตอร์รัปต์ใดที่ทำงานอยู่โดยการอ่านพอร์ต
Brian Drummond

คำตอบ:


3

นี่คือรหัสหลอกเพื่ออธิบายแนวคิดหนึ่ง มันใช้และเอกสิทธิ์เฉพาะบุคคล OR เพื่อคำนวณว่าหมุดใดมีการเปลี่ยนแปลงและจะเรียกใช้ตัวจัดการที่แตกต่างกันภายใน RBIE อินเทอรัลด์เดียว ขึ้นอยู่กับว่าแอพพลิเคชั่นสำคัญขนาดไหนคุณอาจต้องการตรวจสอบว่า PIC จัดการกับสถานการณ์เช่นพอร์ตที่เปลี่ยนแปลงไปอย่างไรขณะที่อินเทอร์รัปต์กำลังดำเนินการเพื่อให้แน่ใจว่าคุณจะไม่พลาดเหตุการณ์ใด ๆ

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}

ฉันเข้าใจแล้วขอบคุณ! แต่นั่นไม่ใช่คำตอบที่แน่นอนที่ฉันต้องการ ด้วยวิธีนี้คุณสามารถตรวจสอบRB7:RB44 ขาเท่านั้น แต่ฉันขอวิธีตรวจสอบ 8 พิน ข้อเสนอแนะใด ๆ
รหัสชื่อ SC

ฉันเดาว่ามีเหตุผลที่คุณไม่สามารถใช้ RB0 - RB7 ข้างต้นได้ ไม่เช่นนั้นฉันก็ไม่สามารถคิดถึงวิธีการใด ๆ ได้หากทริกเกอร์รหัสอย่างรวดเร็วนั้นไม่สำคัญคุณสามารถใช้รูปแบบของโค้ดด้านบนในการขัดจังหวะตัวจับเวลา (หรือเพียงแค่วนรอบหลัก)
PeterJJ

สำหรับ PIC นั้นถ้าคุณจำเป็นต้องใช้อินเทอร์รัปต์เพื่อทำสิ่งนี้เคล็ดลับ XOR บน RB4: RB7 และอินเทอร์รัปต์สี่รายการสำหรับ RB0: RB3 เป็นวิธีที่จะดำเนินการ หากคุณไม่ต้องการการขัดจังหวะเพียงแค่สำรวจพอร์ตทั้งหมดในรหัสของคุณหรือใช้ตัวขัดจังหวะตัวจับเวลาเพื่อจัดการการลงคะแนนถ้าคุณต้องการอัตราตัวอย่างที่ยาก
Scott Seidman

and four interrupts for the RB0:RB3? PIC16F877 ไม่รองรับการขัดจังหวะใด ๆRB1:RB3ใช่มั้ย?
รหัสชื่อ SC

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

1

ส่วนนั้นมีการขัดจังหวะการเปลี่ยนขา 4 ครั้งและอีกสองสามอย่างที่คุณสามารถตั้งค่าบนขอบที่เลือก กลยุทธ์หนึ่งคือการตรวจจับการเปลี่ยนแปลงในค่า 8 บิตจากภายนอกจากนั้นขัดจังหวะการไม่ตรงกัน นั่นทำให้ฮาร์ดแวร์ยุ่ง แต่จะเป็นอย่างที่คุณต้องการ

พารามิเตอร์ที่สำคัญที่คุณไม่ได้ระบุไว้คือความเร็วในการตอบสนองต่อการเปลี่ยนพินของคุณและเวลาที่น้อยที่สุดที่การเปลี่ยนพินจะยังคงมีผลอยู่ ขึ้นอยู่กับคำตอบที่คุณสามารถสำรวจความคิดเห็นตามขัดจังหวะปกติในเฟิร์มแวร์ 16F877 สามารถทำงานที่ 5 MHz อัตราการสอนและการตรวจสอบการเปลี่ยนแปลงจะใช้เวลาเพียงไม่กี่คำสั่ง สมมติว่าคุณตั้งค่าการขัดจังหวะทุก 50 คำสั่ง นั่นจะทำให้ส่วนที่ดีของเวลาตัวประมวลผลเป็นโค้ดเบื้องหน้า อัตราการขัดจังหวะจะเป็น 100 kHz และระยะเวลา 10 .s แน่นอนว่ารหัสเบื้องหน้ายังคงต้องการเห็นการเปลี่ยนแปลงสถานะและทำอะไรกับมันดังนั้นเวลาตอบสนองจะมากกว่า 10 ,s แต่คุณไม่ได้พูดอะไรเกี่ยวกับสิ่งที่คุณต้องทำเมื่อตรวจพบการเปลี่ยนแปลง หากนี่เป็นเพียงการตอบสนองในเวลาของมนุษย์


ขออภัยเกี่ยวกับรายละเอียดที่ขาดหายไป เนื่องจากอัตราการตอบสนองที่คาดว่าonce per secondจะเพียงพอ เมื่อตรวจพบการเปลี่ยนแปลงของพิน (ตรวจพบว่าเพิ่มขึ้นเพียงขอบเดียว) ตัวนับ (ตัวแปร) จะต้องเพิ่มขึ้น ในลูปหลักนั้นจะต้องตรวจสอบค่าตัวนับและเมื่อได้รับสูงกว่าค่าที่แน่นอนจะต้องส่งสี่ไบต์ผ่านทางUSARTพีซี จากนั้นรีเซ็ตค่าตัวนับที่เกี่ยวข้องเป็นศูนย์ เรียบง่ายเหมือนที่ ฉันเดาว่าตัวเลือกการลงคะแนนจะไปได้ดีไหม
รหัสชื่อ SC

2
หนึ่งครั้งต่อวินาที ! ดังนั้นสิ่งที่ทนทุกข์ทรมานมากกว่าขัดจังหวะเพื่ออะไร วิธีนี้ทำได้ง่ายด้วยการสำรวจความคิดเห็นเป็นระยะ แล้วปัญหาคืออะไร
Olin Lathrop

อืม ... ฉันแม้ว่ามันจะดีที่สุดเนื่องจากมี 8 ในนั้นและยังไม่สามารถคาดการณ์การตอบสนองได้ (แต่ค่านั้นสามารถถือว่าเป็นค่าต่ำสุด) เฮ้! ผู้คนสามารถทำผิดได้ถูกต้อง .. :(
ชื่อรหัสเซาท์แคโรไลนา

1

คุณสามารถใช้เกท 8-input gate NAND ตามที่ระบุโดย @Brian Drummond เพื่อเพิ่มการขัดจังหวะผ่านพิน INT และเชื่อมต่อแหล่งขัดจังหวะของคุณกับ 8-Bit Parallel-In / Serial-Out Shift Register เช่น "74HC165N" ดังนั้นคุณจะต้อง เพียงแค่อ่านข้อมูลจาก Shift Register หลังจากที่ขัดจังหวะและจะให้ข้อมูลเกี่ยวกับแหล่งขัดจังหวะที่แท้จริงของคุณ ... มันอาจไม่ใช่วิธีที่เร็วที่สุด แต่ง่ายต่อการขยายและจะใช้ไม่เกิน 5 พินและ หากคุณเพิ่มระบบควบคุมที่อยู่ (MUX, LATCH, ... ) จากนั้นคุณจะต้องใช้สนเดียวสำหรับการแจ้งเตือนขัดจังหวะและหมุดอื่น ๆ อาจถูกนำมาใช้ใหม่ในเวลาที่ต่างกันสำหรับทรัพยากรที่แตกต่างกัน;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.