สารบัญ:

วิธีตีความทิศทางการหมุนจากสวิตช์โรตารีดิจิทัลด้วย PIC: 5 ขั้นตอน
วิธีตีความทิศทางการหมุนจากสวิตช์โรตารีดิจิทัลด้วย PIC: 5 ขั้นตอน

วีดีโอ: วิธีตีความทิศทางการหมุนจากสวิตช์โรตารีดิจิทัลด้วย PIC: 5 ขั้นตอน

วีดีโอ: วิธีตีความทิศทางการหมุนจากสวิตช์โรตารีดิจิทัลด้วย PIC: 5 ขั้นตอน
วีดีโอ: #shorts #หินปูนเกาะหนามาก #scaling 2024, กรกฎาคม
Anonim
วิธีตีความทิศทางการหมุนจากสวิตช์โรตารีดิจิทัลด้วย PIC
วิธีตีความทิศทางการหมุนจากสวิตช์โรตารีดิจิทัลด้วย PIC

วัตถุประสงค์สำหรับคำแนะนำนี้คือเพื่อแสดงวิธีเชื่อมต่อสวิตช์โรตารี่ดิจิทัล (รหัสสี่เหลี่ยมจัตุรัส) กับไมโครคอนโทรลเลอร์ ไม่ต้องกังวล ฉันจะอธิบายว่ารหัสพื้นที่สี่เหลี่ยมมีความหมายอย่างไรสำหรับเรา อินเทอร์เฟซนี้และซอฟต์แวร์ที่ให้มาจะช่วยให้ไมโครคอนโทรลเลอร์รู้จักทิศทางการหมุนของการเคลื่อนที่แต่ละครั้งจากจุดกักตัวหนึ่งไปยังอีกจุดหนึ่ง ฉันเพิ่งใช้สวิตช์ประเภทนี้ในโครงการไมโครคอนโทรลเลอร์ที่ต้องการจุดตั้งค่าแรงดันเพื่อป้อนโดยใช้ปุ่มที่มีปุ่ม 16 ยึดแทนปุ่มขึ้น/ลง แนวคิดคือการอนุญาตให้ผู้ใช้ "หมุน" ความดันที่ต้องการ เป็นผลให้เราต้องพัฒนารูทีนซอฟต์แวร์เพื่อรับข้อมูลตำแหน่งจากสวิตช์และอนุมานทิศทางการหมุนเพื่อเพิ่มหรือลดจุดตั้งค่าแรงดันสำหรับระบบหลัก ในคำแนะนำนี้ ฉันจะครอบคลุมส่วนต่อประสานทางกายภาพ ไปจนถึงไมโครคอนโทรลเลอร์ ทฤษฎีการทำงานของสวิตช์โรตารี่ ทฤษฎีการทำงานของซอฟต์แวร์ ตลอดจนรูทีนการหักเงิน สุดท้ายนี้ ฉันจะแสดงให้คุณเห็นถึงการสมัครขั้นตอนการหักเงินของฉัน ในขณะที่เราดำเนินไป ฉันจะพยายามรักษาสิ่งที่ค่อนข้างทั่วไปเพื่อให้แนวคิดนี้สามารถนำไปใช้กับแพลตฟอร์มได้มากที่สุดเท่าที่เป็นไปได้ แต่ฉันจะแบ่งปันสิ่งที่ฉันทำเพื่อให้คุณเห็นแอปพลิเคชันเฉพาะ

ขั้นตอนที่ 1: อะไหล่

อะไหล่
อะไหล่

ในการดำเนินการนี้ คุณจะต้องมี:สวิตช์โรตารี่ (รหัสสี่เหลี่ยม)ดึงตัวต้านทานขึ้น แพลตฟอร์มไมโครคอนโทรลเลอร์ที่เหมาะสมสำหรับโครงการของฉัน ฉันใช้ตัวเข้ารหัสออปติคัล Grayhill 61C22-01-04-02 แผ่นข้อมูลสำหรับสวิตช์โรตารี่เรียกร้องให้ดึงตัวต้านทาน 8.2k โอห์มบนสายข้อมูลสองเส้นที่มาจากสวิตช์ คุณจะต้องตรวจสอบแผ่นข้อมูลสำหรับตัวเข้ารหัสที่คุณเลือกใช้ สวิตช์โรตารี่ที่ฉันใช้สามารถสั่งซื้อได้ด้วยสวิตช์ปุ่มกดตามแนวแกน เป็นคุณลักษณะที่มีประโยชน์สำหรับการเลือกที่โทรออก ฯลฯ แต่ฉันจะไม่พูดถึงอินเทอร์เฟซที่นี่ ฉันมี "แพลตฟอร์มไมโครคอนโทรลเลอร์ที่เหมาะสม" อยู่ในรายการเพราะ (ฉันคิดว่า) สิ่งนี้สามารถนำไปใช้ได้มากกว่าหนึ่งแพลตฟอร์ม ฉันเคยเห็นผู้คนจำนวนมากใช้ไมโครคอนโทรลเลอร์ตัวอื่นสำหรับ Instructables ดังนั้นฉันจึงต้องการแสดงแนวทางทั่วไปเช่นกัน ฉันเขียนโค้ดทั้งหมดใน PIC Basic Pro สำหรับใช้กับ Microchip PIC16F877A จริงๆ แล้ว สิ่งสำคัญที่คุณต้องการบนไมโครคอนโทรลเลอร์คือความสามารถในการขัดจังหวะเมื่อมีการเปลี่ยนแปลงลอจิกบนหมุดสองตัว บน PIC16F877A สิ่งนี้เรียกว่าการขัดจังหวะการเปลี่ยนแปลง PORTB อาจมีชื่ออื่นสำหรับคอนโทรลเลอร์อื่น คุณลักษณะขัดจังหวะไมโครคอนโทรลเลอร์นี้เป็นส่วนหนึ่งของสิ่งที่ทำให้การใช้งานนี้มีความสง่างาม

ขั้นตอนที่ 2: ส่วนต่อประสานฮาร์ดแวร์

อินเทอร์เฟซฮาร์ดแวร์
อินเทอร์เฟซฮาร์ดแวร์

วิธีแก้ปัญหา "ง่าย ๆ " คือการมีสวิตช์ "ขั้วเดียว-16 โยน" ที่มีการเชื่อมต่อ 16 ตัวกับไมโครคอนโทรลเลอร์ เอาต์พุตของสวิตช์แต่ละตัวจะถูกผูกไว้กับพินบนไมโครคอนโทรลเลอร์ เพื่อให้ไมโครคอนโทรลเลอร์ตรวจสอบตำแหน่งการหมุนทุกตำแหน่งได้ นี่เป็นการใช้พิน I/O มากเกินไป สิ่งต่างๆ จะยิ่งแย่ลงไปอีกถ้าเราต้องการตำแหน่ง (กักขัง) มากกว่า 16 ตำแหน่งสำหรับเราบนสวิตช์ แต่ละตำแหน่งพิเศษบนสวิตช์จะต้องมีอินพุตเพิ่มเติมสำหรับไมโครคอนโทรลเลอร์ การดำเนินการนี้กลายเป็นการใช้อินพุตบนไมโครคอนโทรลเลอร์ที่ไม่มีประสิทธิภาพอย่างรวดเร็ว สัมผัสความสวยงามของสวิตช์โรตารี่ สวิตช์โรตารีมีเพียงสองเอาต์พุตไปยังไมโครคอนโทรลเลอร์ที่ระบุเป็น A และ B บนแผ่นข้อมูล มีเพียงสี่ระดับตรรกะที่เป็นไปได้ที่เส้นเหล่านี้สามารถรับได้: AB = 00, 01, 10 และ 11 ซึ่งจะช่วยลดจำนวนสายอินพุตที่คุณต้องใช้ในการเชื่อมต่อสวิตช์กับไมโครคอนโทรลเลอร์ ดังนั้นเราจึงลดจำนวนบรรทัดอินพุตลงเหลือเพียงสองบรรทัด ตอนนี้อะไร? ดูเหมือนว่าเราต้องการ 16 สถานะที่แตกต่างกันจริงๆ แต่สวิตช์ใหม่นี้มีเพียงสี่สถานะเท่านั้น เรายิงตัวเองที่เท้าหรือไม่? ไม่. อ่านต่อ. เราจะอธิบายทฤษฎีเบื้องหลังการทำงานของสวิตช์แบบหมุนเล็กน้อยเพื่ออธิบาย

ขั้นตอนที่ 3: ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน

ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน
ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน
ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน
ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน
ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน
ทฤษฎีฮาร์ดแวร์ของการดำเนินงาน

การตรวจจับทิศทางการหมุนสามารถทำได้โดยใช้สวิตช์ "single pole-16 throw" ดังกล่าว แต่ใช้อินพุตจำนวนมากบนไมโครคอนโทรลเลอร์ การใช้สวิตช์โรตารี่จะลดจำนวนอินพุตไปยังไมโครคอนโทรลเลอร์ แต่ตอนนี้ เราต้องตีความสัญญาณที่มาจากสวิตช์และแปลสัญญาณเหล่านั้นเป็นทิศทางการหมุน นี่เป็นหนึ่งในความสง่างามที่สำคัญในโซลูชันนี้ ซึ่งหมายความว่ามีรหัส 2 บิตที่สวิตช์ให้ซึ่งสอดคล้องกับตำแหน่งของสวิตช์ คุณอาจกำลังคิดว่า: "หากมีอินพุตสองบิตในไมโครคอนโทรลเลอร์ เราจะแสดงตำแหน่งทั้ง 16 ตำแหน่งได้อย่างไร" นั่นเป็นคำถามที่ดี เราไม่ได้เป็นตัวแทนของพวกเขาทั้งหมด เราแค่ต้องรู้ตำแหน่งสัมพัทธ์ของปุ่มเพื่อกำหนดทิศทางการหมุน ตำแหน่งที่แน่นอนของลูกบิดไม่เกี่ยวข้อง สำหรับการหมุนตามเข็มนาฬิกา รหัสที่สวิตช์ให้ซ้ำทุก ๆ สี่กักและเป็นรหัสสีเทา รหัสสีเทาหมายความว่ามีการเปลี่ยนแปลงเพียงบิตเดียวสำหรับการเปลี่ยนแปลงทุกตำแหน่ง แทนที่จะเป็นอินพุต AB ที่นับสำหรับการหมุนตามเข็มนาฬิกาในไบนารีดังนี้: 00, 01, 10, 11 จะเปลี่ยนไปดังนี้: 00, 10, 11, 01 โปรดสังเกตว่าสำหรับรูปแบบหลัง มีเพียงหนึ่งอินพุตที่เปลี่ยนระหว่าง ชุด ค่าทวนเข็มนาฬิกาสำหรับอินพุต AB ไปยังไมโครคอนโทรลเลอร์จะมีลักษณะดังนี้: 00, 01, 11, 10 นี่เป็นเพียงการย้อนกลับของรูปแบบตามเข็มนาฬิกาโดยแสดง AB = 00 ก่อน ดูแผนภาพเพื่อดูคำอธิบายเพิ่มเติม.

ขั้นตอนที่ 4: ทฤษฎีซอฟต์แวร์ของการดำเนินงาน

ทฤษฎีซอฟต์แวร์ของการดำเนินงาน
ทฤษฎีซอฟต์แวร์ของการดำเนินงาน

รูทีนที่อนุมานทิศทางการหมุนถูกขับเคลื่อนด้วยอินเตอร์รัปต์ ไมโครคอนโทรลเลอร์ที่คุณเลือกจะต้องสามารถขัดจังหวะได้ทุกเมื่อที่มีการเปลี่ยนแปลง (อย่างน้อย) สองพินเมื่อเปิดใช้งานการขัดจังหวะ สิ่งนี้เรียกว่าการขัดจังหวะการเปลี่ยนแปลง PORTB บน PIC16F877A ทุกครั้งที่หมุนสวิตช์ ไมโครคอนโทรลเลอร์จะถูกขัดจังหวะและการทำงานของโปรแกรมจะถูกส่งไปยัง Interrupt Service Routine (ISR) ISR จะทราบได้อย่างรวดเร็วว่าสวิตช์ถูกหมุนไปทางใด ตั้งค่าสถานะอย่างเหมาะสมและกลับสู่โปรแกรมหลักอย่างรวดเร็ว เราต้องการสิ่งนี้ให้เกิดขึ้นอย่างรวดเร็วในกรณีที่ผู้ใช้หมุนสวิตช์เร็วมาก เราทราบดีว่ารูปแบบ AB ที่เป็นรหัสสีเทาซ้ำทุกๆ สี่ตำแหน่ง ดังนั้นหากเราทำให้กิจวัตรทำงานสำหรับการเปลี่ยนระหว่างสี่ตำแหน่งนั้น มันจะใช้ได้กับตำแหน่งอื่นๆ ทั้งหมด สังเกตว่าในรอบสี่ตำแหน่งหนึ่ง มีสี่ขอบ ขอบที่เพิ่มขึ้นและขอบที่ลดลงสำหรับอินพุต A เช่นเดียวกับอินพุต B ไมโครโปรเซสเซอร์จะถูกขัดจังหวะทุกครั้งที่มีขอบ ซึ่งหมายความว่าไมโครคอนโทรลเลอร์จะถูกขัดจังหวะทุกครั้งที่หมุนปุ่ม ด้วยเหตุนี้ ISR จึงต้องค้นหาว่าลูกบิดถูกหมุนไปทางใด เพื่อช่วยเราหาวิธีการทำเช่นนี้ เราหันไปหารูปคลื่นเพื่อหมุนตามเข็มนาฬิกา สังเกตว่าทุกครั้งที่ A มีขอบ ค่าใหม่ของมันจะแตกต่างจากของ B เสมอ เมื่อลูกบิดเปลี่ยนจากตำแหน่ง 1 เป็น 2 A จะเปลี่ยนจากตรรกะ-0 เป็นตรรกะ-1 B ยังคงเป็น 0 สำหรับการเปลี่ยนแปลงนี้ และไม่ตรงกับค่าใหม่ของ A เมื่อปุ่มเปลี่ยนจากตำแหน่ง 3 เป็น 4 A จะมีขอบล้มในขณะที่ B ยังคงอยู่ที่ตรรกะ-1 โปรดสังเกตอีกครั้งว่า B และค่าใหม่ของ A ต่างกัน ตอนนี้ เราจะเห็นได้ว่าทุกครั้งที่ A ทำให้เกิดการขัดจังหวะระหว่างการหมุนตามเข็มนาฬิกา ค่าใหม่ของมันจะแตกต่างจากของ B ลองตรวจสอบ B เพื่อดูว่าเกิดอะไรขึ้น B มีขอบที่เพิ่มขึ้นเมื่อสวิตช์เปลี่ยนจากตำแหน่ง 2 เป็น 3 ในที่นี้ ค่าใหม่ของ B จะเหมือนกับ A เมื่อดูขอบสุดท้ายที่เหลือสำหรับการหมุนตามเข็มนาฬิกา B มีขอบที่ตกลงมาซึ่งเคลื่อนที่จากตำแหน่ง 4 เป็น 5 (ตำแหน่ง 5 เหมือนกับตำแหน่งที่ 1) ค่าใหม่ของ B ก็เหมือนกับ A ที่นี่เช่นกัน! ตอนนี้เราสามารถหักเงินได้แล้ว! ถ้า A ทำให้เกิดการขัดจังหวะและค่าใหม่ของ A แตกต่างจากของ B การหมุนตามเข็มนาฬิกา นอกจากนี้ หาก B ทำให้เกิดการขัดจังหวะและค่าใหม่ของ B เท่ากับ A การหมุนจะเป็นตามเข็มนาฬิกา ลองตรวจสอบกรณีของการหมุนทวนเข็มนาฬิกาอย่างรวดเร็ว เช่นเดียวกับการหมุนตามเข็มนาฬิกา การหมุนทวนเข็มนาฬิกาจะทำให้เกิดการขัดจังหวะสี่ครั้งในหนึ่งรอบ: สองครั้งสำหรับอินพุต A และสองรายการสำหรับอินพุต B อินพุต A มีขอบที่เพิ่มขึ้นเมื่อปุ่มเลื่อนจากตำแหน่ง 4 เป็น 3 และขอบที่ตกลงมาจะเคลื่อนที่จากตำแหน่ง 2 เป็น 1 เมื่อปุ่มเลื่อนจากตำแหน่ง 4 เป็น 3 ค่าใหม่ของ A จะเหมือนกับค่าของ B โปรดสังเกตว่าเมื่อ A ย้ายจากตำแหน่ง 2 ไปยัง 1 ค่าใหม่จะเหมือนกับค่าของ B เช่นกัน ตอนนี้ เราจะเห็นได้ว่าเมื่อ A ทำให้เกิดการขัดจังหวะและค่าใหม่ของมันตรงกับของ B การหมุนจะเป็นทวนเข็มนาฬิกา เราจะดูที่อินพุต B เพื่อยืนยันทุกอย่างอย่างรวดเร็ว B จะทำให้เกิดการขัดจังหวะเมื่อปุ่มเลื่อนจากตำแหน่ง 5 (ซึ่งเหมือนกับ 1) ถึง 4 และเมื่อปุ่มเลื่อนจากตำแหน่ง 3 เป็น 2 ในทั้งสองกรณีนี้ ค่าใหม่ของ B ไม่ตรงกับค่าที่มีอยู่ ของ A ซึ่งตรงข้ามกับกรณีที่ B ทำให้เกิดการขัดจังหวะสำหรับการหมุนตามเข็มนาฬิกา นี่เป็นข่าวดี ทุกอย่างตรวจสอบได้ตามที่ควร กล่าวโดยสรุป หาก A ทำให้เกิดการขัดจังหวะและค่าใหม่ของมันไม่ตรงกับค่าของ B หรือถ้า B ทำให้เกิดการขัดจังหวะ และค่าใหม่ของ B ตรงกับค่าของ A เรารู้ว่ามีการหมุนตามเข็มนาฬิกา เราสามารถตรวจสอบกรณีอื่นๆ สำหรับการหมุนทวนเข็มนาฬิกาในซอฟต์แวร์ หรืออาจสันนิษฐานได้ว่าเนื่องจากการหมุนตามเข็มนาฬิกาไม่ใช่การหมุนทวนเข็มนาฬิกา กิจวัตรของฉันเพียงแค่ตั้งสมมติฐาน

ขั้นตอนที่ 5: ซอฟต์แวร์

ซอฟต์แวร์
ซอฟต์แวร์
ซอฟต์แวร์
ซอฟต์แวร์

ฉันไม่ได้ใช้การขัดจังหวะในตัวใน PIC Basic Pro ฉันใช้ไฟล์สองสามไฟล์ที่รวมไว้ในโค้ดจาก Darrel Taylor เพื่อขับเคลื่อนกิจวัตร นี่คือที่ที่เครดิตของดาร์เรลเป็นอย่างมาก! ไฟล์นั้นฟรี เพียงเข้าไปที่เว็บไซต์ของเขาเพื่อดูข้อมูลเพิ่มเติม แอปพลิเคชันอื่นๆ และดาวน์โหลดไฟล์ คุณสามารถข้ามส่วนนี้หากคุณไม่ได้ใช้ PIC ที่มีการขัดจังหวะของ Darrel Taylor เพียงตั้งค่าการขัดจังหวะตามความจำเป็นบนแพลตฟอร์มที่คุณใช้ ในการตั้งค่าการขัดจังหวะของ Darrel Taylor (DT) มีสองสิ่งที่ต้องทำ:1) รวมไฟล์ DT_INTS-14.bas และ ReEnterPBP.bas ไว้ในไฟล์ของคุณ code.2.) คัดลอกและวางสิ่งนี้ลงในโค้ดของคุณ มาโคร ASMINT_LIST;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, ใช่ endm INT_CREATEENDASMแทรกแท็บและช่องว่าง เช่น กราฟิกที่ส่วนท้ายของ Instructable เพื่อให้คุณมองเห็นสิ่งต่างๆ ได้ง่ายขึ้นในโค้ดของคุณ คุณจะต้องปรับเปลี่ยนเล็กน้อยเพื่อให้เหมาะกับความต้องการของคุณ ภายใต้ ป้ายชื่อ แทนที่ ISR ด้วยชื่อของรูทีนย่อยที่เป็น ISR ของคุณ อย่าลืมขีดล่าง! คุณต้องการมัน!เพื่อให้อินเตอร์รัปต์ทำงาน มีอีกสองสิ่งที่ต้องทำ:1) เขียน ISR คุณจะเขียนสิ่งนี้เหมือนกับที่คุณจะเขียนรูทีนย่อย PBP ยกเว้นว่าคุณจะต้องแทรก @ INT_RETURN ที่ส่วนท้ายของรูทีนย่อยแทน RETURN การดำเนินการนี้จะรับทราบการขัดจังหวะและส่งคืนการทำงานของโปรแกรมไปยังตำแหน่งที่เหลือในลูปหลัก ภายใน ISR คุณต้องล้างการตั้งค่าสถานะขัดจังหวะเพื่อไม่ให้โปรแกรมของคุณติดอยู่กับการขัดจังหวะแบบเรียกซ้ำ เพียงแค่อ่าน PORTB ก็ต้องทำเพื่อล้างแฟล็กขัดจังหวะบน PIC16F877A ไมโครคอนโทรลเลอร์แต่ละตัวมีวิธีการล้างแฟล็กขัดจังหวะที่แตกต่างกัน ตรวจสอบแผ่นข้อมูลสำหรับไมโครคอนโทรลเลอร์ของคุณ2.) เมื่อคุณถึงจุดในโค้ดที่คุณต้องการเปิดใช้งานการขัดจังหวะ ให้ใช้โค้ดบรรทัดนี้:@ INT_ENABLE RBC_INTเมื่อคุณต้องการปิดใช้งานการขัดจังหวะ ให้ใช้:@ INT_DISABLE RBC_INTมีมาก ของสิ่งที่บรรจุอยู่ในสิ่งที่ฉันเพิ่งพูดถึงดังนั้นฉันจะสรุปอย่างรวดเร็ว จนถึงตอนนี้ โปรแกรมของคุณควรมีลักษณะดังนี้:; การตั้งค่าหรือรหัสที่จำเป็นใด ๆ INCLUDE "DT_INTS-14.bas"INCLUDE "ReEnterPBP.bas"ASMINT_LIST macro;IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP ใช่แล้ว INT_CREATEENDASM; การตั้งค่าอื่น ๆ ที่จำเป็นหรือ code@ INT_ENABLE RBC_INT; รหัสที่ต้องการทราบว่าลูกบิดหมุนไปทางไหน@ INT_DISABLE RBC_INT; รหัสอื่นๆEND; สิ้นสุด programmyISR:;ISR code here@ INT_RETURN(Interrupt Handler Set Up Table) ฉันคิดว่านี่คือจุดที่ใครก็ตามที่ไม่ได้ใช้ PIC หรือ DT ขัดจังหวะสามารถเข้าร่วมได้อีกครั้ง ตอนนี้ เราต้องเขียน ISR จริงๆ เพื่อให้ไมโครคอนโทรลเลอร์รู้ว่าปุ่มหมุนไปทางไหน จำจากส่วนทฤษฎีซอฟต์แวร์ที่เราสามารถอนุมานทิศทางของการหมุนได้หากเราทราบอินพุตที่ทำให้เกิดการขัดจังหวะ ค่าใหม่ และค่าของอินพุตอื่น นี่คือ pseudocode: อ่าน PORTB เป็นตัวแปร scratch เพื่อล้างการตั้งค่าสถานะขัดจังหวะ ตรวจสอบว่า A ทำให้เกิดการขัดจังหวะหรือไม่ ถ้าเป็นจริง ให้เปรียบเทียบ A กับ B ตรวจสอบว่าต่างกันหรือไม่ ถ้าต่างกัน เป็นการหมุนตามเข็มนาฬิกา อย่างอื่น เป็นทวนเข็มนาฬิกา Endif ตรวจสอบว่า B ทำให้เกิดการขัดจังหวะหรือไม่ ถ้าจริง ให้เปรียบเทียบ A กับ B ตรวจสอบว่าต่างกันหรือไม่ ถ้าเหมือนกัน มันหมุนตามเข็มนาฬิกา อย่างอื่น เป็น Endif ทวนเข็มนาฬิกา กลับจากการขัดจังหวะ เราจะทราบได้อย่างไรว่าการเปลี่ยนแปลงใน A หรือ B ทำให้เกิดการขัดจังหวะ การค้นพบค่าใหม่ของอินพุตที่เปลี่ยนแปลงและอินพุตอื่น (ไม่เปลี่ยนแปลง) นั้นง่ายเพราะเราสามารถอ่านค่าเหล่านี้ภายใน ISR ได้ เราจำเป็นต้องรู้ว่าสถานะของแต่ละรายการเป็นอย่างไรก่อนที่จะส่งการดำเนินการไปยัง ISR สิ่งนี้เกิดขึ้นในรูทีนหลัก รูทีนหลักนั่งและรอตัวแปรไบต์ที่เราเรียกว่า CWflag เพื่อตั้งค่าเป็น 1 หรือล้างเป็น 0 โดย ISR หลังจากรับทราบการเปลี่ยนแปลงของปุ่มควบคุมแต่ละครั้ง หรือหากไม่มีกิจกรรมของปุ่ม ตัวแปรจะถูกตั้งค่าเป็น 5 เพื่อระบุสถานะไม่ได้ใช้งาน ถ้าแฟล็กได้รับการตั้งค่าหรือถูกล้าง รูทีนหลักจะเพิ่มหรือลดความดันจุดตั้งค่าทันทีตามการหมุนอย่างเหมาะสม จากนั้นตั้งค่าตัวแปร CWflag กลับเป็น 5 เนื่องจากตอนนี้ปุ่มไม่ได้ใช้งานอีกครั้ง เนื่องจากรูทีนหลักคือการตรวจสอบ CWflag จึงบันทึกสถานะของค่าสวิตช์แบบหมุน A และ B ด้วย สิ่งนี้เรียบง่ายจริงๆ และมีลักษณะดังนี้:oldA = AoldB = B ไม่มีอะไรที่แฟนซีสุด ๆ ที่นี่ เพียงรวมสองบรรทัดนั้นไว้ที่จุดเริ่มต้นของลูปที่ตรวจสอบ CWflag สำหรับการหมุน เรากำลังอัปเดตค่าตรรกะของอินพุตจากปุ่มหมุนภายในลูปการเพิ่ม/ลดในรูทีนหลัก เพื่อให้เราสามารถดูว่าอินพุตใดที่ทำให้เกิดการขัดจังหวะเมื่อ ISR ถูกดำเนินการ นี่คือรหัส ISR:ABchange: scratch = PORTB ' อ่าน PORTB เพื่อล้างแฟล็กการขัดจังหวะ ' หาก A ทำให้เกิดการขัดจังหวะ ให้ตรวจสอบ B สำหรับทิศทางของการหมุน IF oldA != A THEN ' หาก A และ B ต่างกัน ให้หมุนตามเข็มนาฬิกา IF A != B THEN GOTO CW ' มิฉะนั้น จะเป็นการหมุนทวนเข็มนาฬิกา ELSE GOTO CCW ENDIF ENDIF ' หาก B ทำให้เกิดการขัดจังหวะ ให้ตรวจสอบ A สำหรับทิศทางการหมุน IF oldB != B THEN ' หาก A และ B เหมือนกัน แสดงว่า คือการหมุนตามเข็มนาฬิกา IF A == B แล้ว GOTO CW ' มิฉะนั้น จะเป็นการหมุนทวนเข็มนาฬิกา ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI ได้รวมโค้ด ISR ไว้ในไฟล์ AB_ISR.bas เนื่องจาก แท็บในโค้ดไม่แสดงตามที่ควรจะเป็น ตอนนี้เนื่องจาก ISR มีค่าเก่าสำหรับอินพุต A และ B จึงสามารถระบุได้ว่าอินพุตใดทำให้เกิดการขัดจังหวะ เปรียบเทียบกับอินพุตอื่น (ไม่เปลี่ยนแปลง) และกำหนดทิศทาง ของการหมุน กิจวัตรหลักทั้งหมดที่ต้องทำคือตรวจสอบ CWflag เพื่อดูว่าปุ่มหมุนไปในทิศทางใด (ถ้ามี) และเพิ่มหรือลดตัวนับ จุดตั้ง หรืออะไรก็ตามที่คุณชอบหรือต้องการ ฉันหวังว่าสิ่งนี้จะช่วยได้และไม่ได้เป็นเช่นนั้น สับสน อินเทอร์เฟซประเภทนี้มีประโยชน์อย่างยิ่งหากระบบของคุณใช้อินเตอร์รัปต์อยู่แล้ว เนื่องจากเป็นการเพิ่มอินเทอร์รัปต์อีกหนึ่งรายการเท่านั้น สนุก!

แนะนำ: