วัตถุประสงค์: วัตถุประสงค์ของโครงการนี้คือการใช้โปรแกรม Assembly ซึ่งจะฝังอยู่ในสภาพแวดล้อม Arduino C แต่ยังได้รับการแนะนำให้รู้จักกับการทำอินพุตและเอาท์พุตจากบอร์ด Arduino อินพุตจะเป็นสวิตช์เพื่อเริ่มโปรแกรมด้วยตัวต้านทานแบบดึงขึ้นหรือแบบดึงลง และเอาต์พุตจะขับ LED กะพริบ SOS ในรหัสมอร์ส ดูเหมือนว่าจะซับซ้อน แต่คุณจะได้รับเบาะแสทุกขั้นตอน และคุณสามารถใช้ฟังก์ชันการหน่วงเวลาของห้องปฏิบัติการก่อนหน้าและ R16 สำหรับเวลาหน่วงที่แตกต่างกันได้
ในช่วงเวลาของโทรเลขและวิทยุโทรเลข ก่อนและหลังการเข้ารหัสเสียง วิธีการสื่อสารคือการใช้ 'กรีด' หรือสวิตช์ที่ดูหรูหรา โดยใช้รหัสมอร์ส โดยผู้ส่งสามารถแตะข้อความโดยใช้ยาวและสั้น ระยะเวลาหรือ 'ก๊อก' ฝั่งรับจะเป็นเสียงรีเลย์หรือโทนเสียงที่จะแตะซ้ำเพื่อให้ได้ยินและแปลกลับเป็นคำพูด ในรหัสมอร์ส ตัวอักษร S จะถูกเข้ารหัสด้วยจุดหรือระยะเวลาสั้นๆ 3 จุด และ O จะถูกเข้ารหัสด้วยขีดกลางหรือระยะเวลายาวสามจุด รหัสมอร์สสำหรับ Mayday หรือ Help คือ SOS ซึ่งมีลักษณะดังนี้ …---… …---… และอื่นๆ
ห้องปฏิบัติการนี้จะส่ง SOS ในรหัสมอร์สไปยัง LED เมื่อสวิตช์เปิดอยู่ และจะหยุดหลังจากส่ง SOS ที่สมบูรณ์เมื่อสวิตช์ปิดอยู่
นี่คือตัวอย่างสิ่งที่ควรมีเสียง: https://www.youtube.com/watch?v=Zsb7stKelq4
การสร้างอินพุตสำหรับสวิตช์ การดำเนินการที่ดูเหมือนเรียบง่ายเช่นนี้ต้องอาศัยการพิจารณาเมื่อดำเนินการบนไมโครโปรเซสเซอร์
ต่อไปนี้เป็นขั้นตอนทั่วไปในการป้อนข้อมูล:
อ้างอิงเอกสารข้อมูล AVR ส่วนที่ 14 เกี่ยวกับพอร์ต I/O หมายเหตุด้านล่างฮาร์ดแวร์สำหรับพิน I/O หนึ่งพินใน AVR
ฮาร์ดแวร์ภายในสำหรับพิน I/O ใน AVR
ฮาร์ดแวร์ทั้งหมดนี้จำเป็นเพื่อให้สามารถกำหนดค่าพินเป็นอินพุตหรือเอาต์พุตได้ รวมถึงคุณสมบัติอื่นๆ เช่น ตัวต้านทานแบบดึงขึ้นภายใน โหมดสลีป และการซิงโครไนซ์กับนาฬิกา เห็นได้ชัดว่าพิน I/O ไม่ใช่เรื่องง่าย แต่เราจะเกี่ยวข้องกับแล็บนี้ที่มีอินพุตหรือเอาต์พุตธรรมดาเท่านั้น สำหรับสิ่งนี้ เราจำเป็นต้องมีการลงทะเบียน DDR และพอร์ตสำหรับอินพุตหรือเอาต์พุตที่เราจะใช้
ก่อนหน้านี้เราได้เห็นว่าเอาต์พุตได้รับการกำหนดค่าอย่างไรเพื่อให้ LED บน PORTB บิต 5 กะพริบ
คุณสามารถเลือกพินพอร์ตใดก็ได้ที่มีสำหรับสิ่งนี้บน Arduino ของคุณ แต่คุณต้องกำหนดพอร์ตและบิตของมัน
เอาท์พุต: PORTB, รีจิสเตอร์ 5, บิต 5 ถูกใช้ภายในสำหรับ LED และยังถูกนำออกไปยังตัวเชื่อมต่อ (พิน 13 บน UNO) แต่อย่าใช้ภายนอก เนื่องจากไม่มีความสามารถในปัจจุบันเพียงพอที่จะขับเคลื่อน LED สองตัว
• คำแนะนำ: ใช้ PORTB, ลงทะเบียน 5 บิต 4 (พิน 12 บน UNO) สำหรับเอาต์พุต
อินพุต: มีตัวเลือกอื่นๆ มากมายที่คุณสามารถใช้ได้ (ยกเว้นอย่าใช้พิน I/O 0 หรือ 1 เนื่องจากจำเป็นต้องใช้ในการสื่อสารกับคอมพิวเตอร์) • คำแนะนำ: PORTB, รีจิสเตอร์ 5 บิต 3 (พิน 11 บน UNO) สามารถใช้เป็นอินพุตได้
การตั้งค่าทั่วไป: คุณเลือกพินสำหรับอินพุตและเอาต์พุต
การอ่านอินพุต: หากต้องการอ่านอินพุตที่รู้จักพอร์ต คุณจะต้องใช้คำสั่ง IN ที่แสดงด้านล่างและที่อยู่พินสำหรับพอร์ตที่คุณใช้ ตัวอย่างเช่น หากต้องการอ่าน PORTB บิต 4 (พิน 18 ของ UNO) คุณจะต้องใช้คำสั่งนี้เพื่ออ่านพอร์ต
ห่วง:
ที่ r17, 0x03; // อ่านพิน PORTB ในรีจิสเตอร์ 17
ตอนนี้คุณต้องเลือกบิต 4 โดย ANDing ด้วย 0x10 เพื่อปกปิดบิตอื่นๆ ทั้งหมด หลังจากนี้จะขึ้นอยู่กับการกำหนดค่าอินพุตของคุณและไม่ว่าคุณจะใช้การดึงขึ้นหรือดึงลง ที่นี่เราใช้ตัวต้านทานแบบดึงลง
หากคุณใช้ตัวต้านทานแบบดึงขึ้น การปิดสวิตช์จะส่งผลให้เป็น 0 มิฉะนั้นจะเป็น 1 ดังนั้นคุณจึงสามารถดำเนินการตามคำสั่ง AND แล้วแยกสาขาหากเป็นศูนย์
แอนดี้ r17, 0x08; // และ r17 ด้วย 08 ชม
BRNE เริ่มต้น; //ถ้าสวิตช์ไม่ได้ปิด (เช่น 1) ให้ย้อนกลับและวนซ้ำ
หากใช้ตัวต้านทานแบบดึงลง การปิดสวิตช์จะส่งผลให้เป็น 1 มิฉะนั้นจะเป็น 0:
แอนดี้ r17, 0x08; // และ r16 ด้วย 08h
BREQ เริ่มต้น; //ถ้าสวิตช์ไม่ได้ปิด (เช่น 0) ให้ย้อนกลับและวนซ้ำ
การสร้างเอาต์พุตจะคล้ายกับการสร้างอินพุตมาก คุณต้องตั้งค่าพินพอร์ตให้เป็นเอาต์พุต จากนั้นคุณสามารถใช้ CBI หรือ SBI เพื่อทำให้เป็นศูนย์หรือหนึ่งได้
ต่อไปนี้เป็นขั้นตอนทั่วไปในการสร้างเอาต์พุต:
การออกแบบโปรแกรม แล็บนี้คล้ายกับแล็บก่อนหน้ามากสำหรับไฟ LED กะพริบ ร่างนั้นแนบมาเป็นฐานให้คุณเริ่มต้น คุณเพียงแค่ต้องเปลี่ยนโครงสร้างเพื่อสร้าง SOS ตามกฎข้างต้น และใช้อินพุตสำหรับสวิตช์เพื่อเรียกใช้ SOS และเอาต์พุตเพื่อขับเคลื่อน LED ใช้รูทีนย่อยการหน่วงเวลาเพื่อตั้งค่าการหน่วงเวลาต่างๆ สำหรับจุด ขีดกลาง ฯลฯ ดังที่แสดงด้านล่างในกล่อง
ดูเอกสารที่กำหนดความสัมพันธ์ด้านเวลาและปฏิบัติตามกฎเหล่านี้เมื่อออกแบบโปรแกรมของคุณสำหรับรหัสมอร์ส SOS