สารบัญ:

Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์): 10 ขั้นตอน
Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์): 10 ขั้นตอน

วีดีโอ: Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์): 10 ขั้นตอน

วีดีโอ: Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์): 10 ขั้นตอน
วีดีโอ: ธาติทองโยชิ🤭 #ธาตุทองซาวด์ [kajrsp.ankh] 2024, พฤศจิกายน
Anonim
Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์)
Arduino Tone Generator ที่ไม่มีไลบรารี่หรือฟังก์ชั่นแบบอนุกรม (พร้อมอินเตอร์รัปต์)

นี่ไม่ใช่สิ่งที่ฉันมักจะสอนได้ ฉันชอบงานโลหะมากกว่า แต่เนื่องจากฉันเป็นนักศึกษาวิศวกรรมไฟฟ้าและต้องเรียนวิชาเกี่ยวกับไมโครคอนโทรลเลอร์ (การออกแบบระบบฝังตัว) ฉันคิดว่าฉันจะสอนได้ หนึ่งในโครงการของฉัน เมื่อตอนแรกฉันสร้างโปรเจ็กต์และอื่น ๆ สำหรับคลาสนี้ ฉันพบว่ามีบทช่วยสอนน้อยมากหรือไม่มีเลยที่ไม่ได้ใช้ฟังก์ชันไลบรารี Arduino หรือฟังก์ชันซีเรียล ซึ่งเป็นอีกเหตุผลที่ฉันคิดว่านี่จะเป็นบทเรียนที่ดี

รหัสนี้ออกแบบมาสำหรับไมโครคอนโทรลเลอร์ Atmega 2560 ดังนั้นหากคุณต้องการนำไปใช้กับบอร์ดอื่น คุณจะต้องเปลี่ยนการลงทะเบียนที่อยู่ในโค้ดตามคู่มือผู้ใช้คอนโทรลเลอร์ของคุณ แนวคิดพื้นฐานเบื้องหลังโค้ดคือเมื่อใดก็ตามที่คุณป้อนคีย์บนแป้นพิมพ์ลงในจอภาพแบบอนุกรม Arduino mega จะส่งสัญญาณความถี่ที่แน่นอนตามคีย์ที่คุณกด โดย "q" จะรีเซ็ตมัน ฉันสร้างมันขึ้นมาเพื่อให้ "a" ส่งออกความถี่ A แบบแบน และ "A" จะส่งความถี่ A แบบชาร์ป "b" ส่งออกค่า B แบบแบน "c" สำหรับ C แบบแบน "C" สำหรับ C แบบชาร์ป และอื่นๆ โค้ดเต็มจะถูกอัปโหลดในตอนท้าย แต่แต่ละขั้นตอนจะแบ่งโค้ดออกเป็นชิ้นๆ เพื่อให้อธิบายได้ง่ายขึ้น

ขั้นตอนที่ 1: การกำหนดที่อยู่ลงทะเบียน

การกำหนดที่อยู่ลงทะเบียน
การกำหนดที่อยู่ลงทะเบียน

ขั้นตอนนี้ง่าย ถ้าคุณใช้ atmega 2560 คุณเพียงแค่ต้องใช้ที่อยู่ที่ฉันใช้ แม้ว่าคุณจะใช้บอร์ดที่มีชิปตัวอื่น คุณจะต้องค้นหาที่อยู่สำหรับการลงทะเบียนแต่ละรายการเหล่านี้ใน คู่มือผู้ใช้ชิป คำจำกัดความที่ด้านบนเป็นเพียงค่าคงที่ที่จะใช้สำหรับฟังก์ชันของเราในภายหลัง เราระบุที่อยู่ว่าไม่ได้ลงนามเนื่องจากเราไม่ต้องการให้คอมไพเลอร์ยุ่งกับมัน

ขั้นตอนที่ 2: อาร์เรย์และตัวแปรส่วนกลาง

อาร์เรย์และตัวแปรส่วนกลาง
อาร์เรย์และตัวแปรส่วนกลาง
อาร์เรย์และตัวแปรร่วม
อาร์เรย์และตัวแปรร่วม
อาร์เรย์และตัวแปรร่วม
อาร์เรย์และตัวแปรร่วม

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

ขั้นตอนที่ 3: ฟังก์ชัน "serial.begin"

NS
NS

เราจะเรียกฟังก์ชันแบบกำหนดเองของเราที่จำลองฟังก์ชัน "serial.begin" U0init() ใช้บอดเรตที่ต้องการเป็นอินพุตและเริ่มพอร์ตอนุกรมที่บอดเรตนั้น

ขั้นตอนที่ 4: ฟังก์ชัน "serial.available"

NS
NS

เราจะเรียกฟังก์ชันที่เลียนแบบ "serial.available" U0kbhit() ไม่รับอินพุต แต่จะตรวจพบว่ามีการเปลี่ยนแปลงบนแป้นพิมพ์โดยใช้บิตสถานะ RDA หรือไม่ และคืนค่าเป็น จริง เมื่อตรวจพบการเปลี่ยนแปลง

ขั้นตอนที่ 5: ฟังก์ชัน "serial.read"

NS
NS

เราจะเรียกฟังก์ชันที่เลียนแบบฟังก์ชัน "serial.read" U0getchar() ซึ่งไม่รับอินพุตและเอาต์พุตใดๆ ที่เปลี่ยนแปลงบนแป้นพิมพ์ ซึ่งเก็บไว้ในรีจิสเตอร์ UDR0

ขั้นตอนที่ 6: ฟังก์ชัน "serial.write"

NS
NS

เราจะเรียกใช้ฟังก์ชันที่เลียนแบบ "serial.write" U0putchar() ซึ่งรับข้อมูลจากการลงทะเบียน UDR0 ในขณะที่ตรวจพบและจัดเก็บการเปลี่ยนแปลง และเอาต์พุตที่เปลี่ยนกลับเป็นจอภาพแบบอนุกรม

ขั้นตอนที่ 7: ฟังก์ชันการตั้งค่า

ฟังก์ชันการตั้งค่า
ฟังก์ชันการตั้งค่า

นี่คือฟังก์ชันการตั้งค่าพื้นฐานที่จะใช้การเลียนแบบ "serial.begin" เพื่อเริ่มต้นพอร์ตอนุกรม และจะเริ่มต้นการตั้งค่าบิตของเราสำหรับการลงทะเบียนตัวจับเวลา และตั้งค่า PB6 ให้ส่งสัญญาณเสียงของเรา

ขั้นตอนที่ 8: ฟังก์ชันลูปและ ISR

ฟังก์ชันลูปและ ISR
ฟังก์ชันลูปและ ISR

วนรอบทำงานดังนี้: หากตรวจพบการเปลี่ยนแปลงด้วยฟังก์ชัน "serial.available" ฟังก์ชัน "serial.read" ของเราจะเก็บการเปลี่ยนแปลงนั้นไว้ และฟังก์ชัน "serial.write" ของเราจะใส่การเปลี่ยนแปลงนั้นลงในมอนิเตอร์แบบอนุกรม ตราบใดที่ตัวแปร i น้อยกว่าขนาดของอาร์เรย์ความถี่ มันจะตั้งค่าเอาต์พุตให้เป็นตำแหน่งของ i ในอาร์เรย์นั้น เอาต์พุตความถี่ที่ตำแหน่งนั้น ISR ทำหน้าที่เป็นการรีเซ็ต โดยหากตำแหน่งอาร์เรย์ความถี่ไม่เท่ากับ 0 (หรืออีกนัยหนึ่งถ้าไม่ได้กด "q") จะส่งเอาต์พุตความถี่ออก แต่เมื่อกด "q" ระบบจะรีเซ็ตโปรดทราบ: รหัสนี้ใช้การขัดจังหวะ แต่สามารถทำได้โดยปิดใช้งานการขัดจังหวะ ฉันจะโพสต์โค้ดโดยไม่ขัดจังหวะหากได้รับคำขอใดๆ ฉันคิดว่าเวอร์ชันอินเตอร์รัปต์สนุกกว่า

ขั้นตอนที่ 9: การเดินสายไฟ

การเดินสายไฟ
การเดินสายไฟ

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

ขั้นตอนที่ 10: รวมทุกอย่างเข้าด้วยกัน

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

โปรดลงคะแนนให้สิ่งนี้ในการแข่งขันไมโครคอนโทรลเลอร์:D

แนะนำ: