คำถามติดแท็ก interrupt

3
ฟังก์ชั่นสามารถเรียกใช้โดยอัตโนมัติเมื่ออินพุทเปลี่ยนแปลงได้หรือไม่?
ขณะนี้ร่างของฉันกำลังตรวจสอบพินอินพุตทุกครั้งที่วนรอบลูปหลัก หากตรวจพบการเปลี่ยนแปลงจะเรียกใช้ฟังก์ชันที่กำหนดเองเพื่อตอบสนองต่อการเปลี่ยนแปลงนั้น นี่คือรหัส (ตัดลงไปที่จำเป็น): int pinValue = LOW; void pinChanged() { //... } void setup() { pinMode(2, INPUT); } void loop() { // Read current input int newValue = digitalRead(2); // Has the input changed? if (newValue != pinValue) { pinValue = newValue; pinChanged(); } } น่าเสียดายที่สิ่งนี้ไม่ได้ทำงานอย่างถูกต้องเสมอไปสำหรับการเปลี่ยนแปลงสั้น ๆ ในอินพุต (เช่นพัลส์สั้น …
21 pins  interrupt  isr 

2
Uno สามารถจัดการพินขัดจังหวะได้กี่อัน?
ฉันกำลังมองหาการใช้ตัวรับสัญญาณ RC 7 ช่องด้วย Arduino Uno R3 ในเอกสารประกอบมีการกล่าวถึงหมุดอินเตอร์รัปต์สูงสุด 2 อันในขณะที่ในบล็อกอื่น ๆ ที่ฉันได้เห็นการใช้อินเทอร์รัปต์มากถึง 20 พินโดยมีไลบรารี PinChangeInt ดังนั้น Arduino สามารถขัดจังหวะได้กี่ตัว และนี่แตกต่างจากจำนวนที่สามารถจัดการกับการสนับสนุนซอฟต์แวร์เช่น PinChangeInt ได้หรือไม่

2
ฉันจะทำให้ Arduino ใช้ตัวเข้ารหัสแบบหมุนได้แม่นยำแค่ไหน
มอเตอร์สเต็ปเปอร์มักจะมีราคาแพงสำหรับมอเตอร์ขนาดใหญ่ อย่างไรก็ตามด้วยมอเตอร์กระแสตรงที่ทรงพลังและเข้ารหัสแบบหมุนคุณสามารถ "จำลอง" สเต็ปเปอร์มอเตอร์ เครื่องเข้ารหัส Rotary กับ Arduino มีความแม่นยำเพียงใดกับวงวนพื้นฐานและโค้ดอื่น ๆ ไม่มาก? มันจะ "คิดถึงการเต้นของชีพจร" และบันทึกการหมุนไม่เพียงพอหรือไม่? ฉันจะจัดการกับโค้ดนี้ได้มากขึ้นได้อย่างไร มีวิธีที่ดีกว่าในการทำเช่นนี้? การขัดจังหวะจะช่วยไหม มีวงจรบางประเภทที่จะช่วยแก้ไขปัญหานี้หรือไม่? หมายเหตุ: อาจจะไม่เกิน 4 รอบการหมุนต่อวินาที ... (อาจเป็นจำนวนมาก แต่ถ้าคุณกำลังทำกลไกแบบสกรูนำที่จะเป็น 24 นิ้วต่อนาทีเท่านั้นหากมีการหมุนเชิงเส้น 10 ครั้งต่อนิ้ว )

3
ใช้ millis () และ micros () ภายในรูทีน interrupt
เอกสารสำหรับattachInterrupt()พูดว่า: ... millis()อาศัยการขัดจังหวะในการนับดังนั้นมันจะไม่เพิ่มขึ้นภายใน ISR เนื่องจากdelay()ต้องการการขัดจังหวะในการทำงานมันจะไม่ทำงานหากเรียกภายใน ISR micros()ทำงานในขั้นต้น แต่จะเริ่มทำงานผิดปกติหลังจาก 1-2 ms ... วิธีการที่ไม่micros()แตกต่างจากmillis()(ยกเว้นของหลักสูตรเพื่อความแม่นยำของพวกเขา)? คำเตือนข้างต้นหมายความว่าการใช้micros()ภายในรูทีนการขัดจังหวะเป็นความคิดที่ไม่ดีอยู่เสมอ บริบท - ฉันต้องการวัดอัตราการเต้นของชีพจรต่ำดังนั้นฉันจึงต้องทริกเกอร์รูทีนเมื่อสัญญาณอินพุทของฉันเปลี่ยนแปลงและบันทึกเวลาปัจจุบัน

2
ฟังก์ชั่นการกำหนดตัวชี้อะตอมใน Arduino?
ตัวอย่างต่อไปนี้มาจากซอร์สโค้ดของ TimerOne : // TimerOne.h: void (*isrCallback)(); // TimerOne.cpp: ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt { Timer1.isrCallback(); } // TimerOne.cpp: void TimerOne::attachInterrupt(void (*isr)(), long microseconds) { if(microseconds > 0) setPeriod(microseconds); isrCallback = isr; // register the user's callback with the real ISR …

1
การขัดจังหวะทำงานบน Arduino Uno และบอร์ดที่คล้ายกันอย่างไร
โปรดอธิบายวิธีการขัดจังหวะการทำงานกับ Arduino Uno และบอร์ดที่เกี่ยวข้องโดยใช้โปรเซสเซอร์ ATmega328P บอร์ดเช่น: Uno มินิ นาโน Pro Mini Lilypad โดยเฉพาะอย่างยิ่งโปรดหารือ: สิ่งที่จะใช้ขัดจังหวะ วิธีการเขียน Interrupt Service Routine (ISR) ปัญหาเรื่องเวลา ส่วนที่สำคัญ การเข้าถึงข้อมูลของอะตอม หมายเหตุ: นี่เป็นคำถามอ้างอิง

1
การนับพัลส์ด้วยการขัดจังหวะ
ฉันพยายามนับพัลส์จากคลื่นสี่เหลี่ยม 12,500 Hz เพื่อกระตุ้นการส่งออก นี่คือรหัสที่ฉันมี เมื่อรีเซ็ต Arduino แล้วมันจะพิมพ์ 315 ไปยังซีเรียลในตัวอย่าง 25 มิลลิวินาที 315 x 40 = 12600 ซึ่งดูเหมือนว่าฉันจะทำงานได้อย่างสมบูรณ์ ปัญหาเดียวของฉันคือมันคืนค่าหมายเลขนี้เพียงครั้งเดียวเมื่อรีเซ็ตบอร์ด ตอนนี้ถ้าฉันย้ายรหัสเดียวกันนั้นลงไปvoid loopมันนับได้ว่าให้ผลตอบแทนที่ไม่แน่นอน ฉันไม่เข้าใจสิ่งที่ฉันต้องใส่ในส่วนวนซ้ำเพื่อให้ฉันสามารถนับซ้ำ ๆ ได้อย่างถูกต้องและนับจำนวนการสลับของขาอินพุตที่ฉันได้รับในช่วงระยะเวลาหนึ่ง สัญญาณเฮิรตซ์หรือไม่ volatile int IRQcount; int pin = 2; int pin_irq = 0; //IRQ that matches to pin 2 void setup() { // Put your setup code …
10 interrupt 

1
จำเป็นต้องมีความผันผวนหรือไม่เมื่อเข้าถึงตัวแปรจาก> 1 ISR แต่ไม่แชร์ภายนอก ISR
มีการบันทึกไว้อย่างชัดเจนว่าเมื่อมีการแบ่งปันข้อมูลทั่วโลกกับ ISR และโปรแกรมหลักข้อมูลจะต้องประกาศvolatileเพื่อรับประกันการมองเห็นหน่วยความจำ (และนั่นเพียงพอสำหรับข้อมูล 1 ไบต์เท่านั้นสิ่งที่ใหญ่กว่าต้องมีการจัดการพิเศษเพื่อรับประกันอะตอม . ที่นี่เรามีกฎระเบียบที่ดี: ตัวแปรที่ใช้ภายนอก ISR เท่านั้นไม่ควรเปลี่ยนแปลงได้ ตัวแปรที่ใช้ภายใน ISR เท่านั้นไม่ควรเปลี่ยนแปลงได้ ตัวแปรที่ใช้ทั้งภายในและภายนอก ISR ควรมีความผันผวน แต่volatileจำเป็นเมื่อมีการเข้าถึงตัวแปรจาก> 1 ISR แต่ไม่ได้ใช้ร่วมกันนอก ISR ตัวอย่างเช่นฉันมีฟังก์ชั่นที่รักษาสถานะภายในโดยใช้staticตัวแปร: void func() { static volatile long counter; // volatile or not? // Do stuff with counter etc. } ฟังก์ชั่นนั้นเรียกว่าสองวิธี: จากการขัดจังหวะด้วยพินและจากไลบรารี TimerOne : attachInterrupt(0, func, CHANGE); Timer1.attachInterrupt(func); ไม่มีปัญหา …
9 interrupt  timers  isr 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.