สารบัญ:

สวิตช์การอ่านด้วย ATtiny2313: 9 ขั้นตอน
สวิตช์การอ่านด้วย ATtiny2313: 9 ขั้นตอน

วีดีโอ: สวิตช์การอ่านด้วย ATtiny2313: 9 ขั้นตอน

วีดีโอ: สวิตช์การอ่านด้วย ATtiny2313: 9 ขั้นตอน
วีดีโอ: How to program the ATtiny 841 using the Arduino IDE 2024, กรกฎาคม
Anonim
สวิตช์อ่านด้วย ATtiny2313
สวิตช์อ่านด้วย ATtiny2313

มี Instructables หลายตัวที่เกี่ยวข้องกับเอาต์พุตจาก ATtiny2313 และอุปกรณ์ AVR ที่คล้ายกัน ตัวอย่างเช่น https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-with-an-AVR-ไมโครโปรเซสเซอร์/. การทำงานล่าสุดจาก The Real Elliot ซึ่งแสดงวิธีควบคุมสเต็ปเปอร์มอเตอร์ ฉันพบว่าการเรียกใช้ส่วนอื่นของโค้ดในโปรแกรมเดียวกันจะช่วยได้มาก ดังนั้นฉันจึงไม่ต้องตั้งโปรแกรม ATtiny2313 ใหม่ทีละรายการ เวลาที่ฉันต้องการลองใช้โค้ดรูปแบบต่างๆ เล็กน้อย (เช่น การก้าวครึ่งก้าวหรือการวิ่งถอยหลัง) แม้ว่าจะเป็นเรื่องง่ายที่จะเขียนโค้ดโดยใช้คำสั่ง switch/case เพื่อให้สามารถเลือกรูปแบบอื่นได้ แต่จำเป็นต้องมีวิธีการบางอย่างในการเลือกเคส นั่นหมายความว่าต้องอ่านอุปกรณ์อินพุตบางประเภทเพื่อควบคุมเคส โชคดีที่ ATtiny2313 มีพิน I/O มากมาย และได้รับการออกแบบมาอย่างดีสำหรับการอ่านอินพุตจากสวิตช์ คำแนะนำนี้จะแสดงวิธีการอ่านอินพุตและตัดสินใจตามสถานะของพวกเขา เนื่องจากเพียงอย่างเดียวจะทำให้เป็นคำสั่งที่ค่อนข้างน่าเบื่อ ฉันจะอธิบายวิธีง่ายๆ ในการใช้ความสามารถของตัวจับเวลา/ตัวนับของ ATtiny2313 เพื่อขับลำโพงขนาดเล็กเป็นเสียงบี๊บ นอกจากนี้ยังจะมีการพูดนอกเรื่องเล็กน้อยเกี่ยวกับเทคนิคการดีบักอย่างง่าย

ขั้นตอนที่ 1: อุปกรณ์อินพุต

อุปกรณ์อินพุต
อุปกรณ์อินพุต
อุปกรณ์อินพุต
อุปกรณ์อินพุต

คำแนะนำนี้สร้างขึ้นจากงานที่ยอดเยี่ยมของ The Real Elliot และใช้ระบบการพัฒนา ATtiny2313 Ghetto ที่เขาอธิบาย แผ่นข้อมูล ATtiny2313 จาก Atmel เป็นข้อมูลอ้างอิงที่ดีที่สุดสำหรับฟังก์ชันทั้งหมด แต่ไม่จำเป็นต้องอ่านง่าย https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (ลิงก์มีเอกสารข้อมูล AVR ทั้งหมด ค้นหา 2313) รูปภาพแสดงชุดสวิตช์อินพุตอย่างง่าย นี่เป็นเพียงชุดสวิตช์เปิด/ปิดสี่ชุด เรียกอีกอย่างว่าเสาเดี่ยวสวิตช์ขว้างเดี่ยว (SPST) โดยปกติ การเชื่อมต่อหนึ่งหรือเสาของสวิตช์แต่ละตัวจะผูกกับกราวด์ในขณะที่การเชื่อมต่ออีกอันหนึ่งถูกดึงสูงผ่านตัวต้านทานจำกัดกระแส (10K หรือมากกว่านั้น) อินพุตไมโครคอนโทรลเลอร์เชื่อมต่อกับขั้วด้วยตัวต้านทาน หากสวิตช์เปิดอยู่ ไมโครคอนโทรลเลอร์จะอ่านอินพุตเป็น HI หากปิดสวิตช์ ไมโครคอนโทรลเลอร์จะอ่านอินพุต LO ดูรายละเอียดในแผนผัง ATtiny2313 ช่วยลดความซับซ้อนของสิ่งต่างๆ โดยการจัดเตรียมตัวต้านทานแบบดึงขึ้นที่ตั้งโปรแกรมได้บนพิน I/O เมื่อกำหนดค่าเป็นอินพุต ซึ่งหมายความว่าสวิตช์สามารถมีเสาหนึ่งผูกติดกับกราวด์ (LO) และอีกขั้วหนึ่งเชื่อมต่อกับอินพุตของโปรเซสเซอร์ ตัวอย่างแรกแสดงสวิตช์เพียงสองตัวเท่านั้น สวิตช์ถูกอ่านและกำหนดค่าด้วยรหัสต่อไปนี้ กำหนดค่าสวิตช์เป็นอินพุต: (ไม่ต้องใช้รหัส นี่เป็นค่าเริ่มต้น) เปิดตัวต้านทานแบบดึงขึ้น: PORTB = _BV(PB0) | _BV(PB1);อ่านอินพุต: but1 = ~PINB & 0x03; หมายเหตุการใช้การผกผันและการกำบังเพื่อให้ได้ค่าที่ถูกต้อง

ขั้นตอนที่ 2: ไฟกะพริบสำหรับสัญญาณ

เราจะใช้สวิตช์ทั้งสองนี้เพื่อกะพริบไฟ LED จำนวนครั้งที่ตั้งโปรแกรมได้ ไฟ LED ที่เราจะใช้จะเป็นไฟกะพริบที่ The Real Elliot สร้างชื่อเสียง สวิตช์ 1 และ 2 จะถือเป็นเลขฐานสองสองหลัก ดังนั้นการรวมกันสามารถแทนตัวเลข 0, 1, 2 และ 3 โปรแกรมของเราจะอ่านสวิตช์ทั้งสองและกะพริบ LED จำนวนครั้งที่เหมาะสม แต่เฉพาะในกรณีที่สวิตช์ มีการเปลี่ยนแปลงการตั้งค่า สวิตช์ถูก debounce เป็นเวลา 500 มิลลิวินาที (ไม่ได้รับการปรับให้เหมาะสม) อัลกอริธึม debounce ค่อนข้างง่าย สวิตช์ถูกอ่านและบันทึกการอ่าน หากแตกต่างจากค่า oldBut (ค่าที่บันทึกไว้ล่าสุด) แสดงว่าโปรแกรมล่าช้า 500 มิลลิวินาทีและจะอ่านสวิตช์อีกครั้ง หากค่าเท่ากับที่อ่านก่อนหน้านี้ ค่าของ oldแต่จะได้รับการอัปเดตและไฟ LED จะกะพริบเป็นจำนวนครั้งโดยนัยโดยค่าไบนารีของสวิตช์ทั้งสอง สังเกตการผกผันของค่าเนื่องจากสวิตช์ที่ "เปิด" อ่านว่า LO สวิตช์จะถูกสแกนอย่างต่อเนื่องสำหรับการเปลี่ยนแปลงเพิ่มเติม โปรดดูคำแนะนำก่อนหน้าโดย The Real Elliot เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับไฟกะพริบ ดูที่ https://www.ganssle.com/debouncing.pdf นี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการดีบาวซ์สวิตช์ นี่คือโค้ด ATtiny2313 สำหรับตัวอย่างนี้ ในการทำงาน โปรแกรมนี้จะกะพริบ LED บน PB4 (ขาทางกายภาพ 8) สองครั้งเพื่อแสดงว่าเริ่มต้นได้ จากนั้นจะอ่านสวิตช์หนึ่งและสอง และกะพริบหนึ่งถึงสามครั้งขึ้นอยู่กับการตั้งค่าสวิตช์ทุกครั้งที่มีการเปลี่ยนแปลง เมื่อสวิตช์ไม่เปลี่ยนแปลง ไฟ LED จะกะพริบช้าๆ หากต้องการเรียกใช้โค้ดนี้ ให้สร้างไดเร็กทอรีใหม่ (เรียกว่า "พื้นฐาน" หากต้องการ) และดาวน์โหลดไฟล์โค้ด C ต่อไปนี้และ makefile ลงไป เปลี่ยนชื่อ Makefile1.txt เป็น Makefile ใช้ WinAVR คอมไพล์โปรแกรมและโหลดลงใน ATtiny2313 ของคุณ

ขั้นตอนที่ 3: การพูดนอกเรื่องเล็กน้อยเกี่ยวกับการดีบัก

หากคุณเป็นเหมือนฉัน (และโปรแกรมเมอร์คนอื่นๆ ในโลก) คุณอาจเคยประสบกับช่วงเวลาที่โค้ด "ปราศจากข้อผิดพลาด" ที่คุณพิมพ์และคอมไพล์อย่างระมัดระวังไม่ทำในสิ่งที่คุณคาดหวัง บางทีมันอาจจะไม่ทำอะไรเลย! แล้วปัญหาคืออะไร? คุณจะไปรู้ได้อย่างไร? โชคดีที่มีหลายวิธีในการทำให้สิ่งต่างๆ ทำงานได้ (รับหนังสือเล่มนี้สำหรับการรักษาที่ยอดเยี่ยมในหัวข้อการดีบัก https://www.debuggingrules.com/) ฉันต้องการเสนอคำแนะนำง่ายๆ สองสามข้อเกี่ยวกับหัวข้อของการดีบักแอปพลิเคชันไมโครคอนโทรลเลอร์ ขั้นตอนที่หนึ่งคือการสร้างต่อ สิ่งที่คุณรู้. หากคุณได้รับไฟกะพริบเพื่อทำงานเพียงครั้งเดียว ให้ใช้อีกครั้งเพื่อดูว่าคุณอยู่ที่ไหนในโปรแกรมของคุณ ฉันชอบให้ไฟ LED กะพริบสองครั้งเพื่อส่งสัญญาณการเริ่มต้นโปรแกรม คุณสามารถใส่รหัสเพื่อทำสิ่งนี้ในตอนแรกเมื่อเริ่มต้นโปรแกรมของคุณ เมื่อคุณรู้ว่าฮาร์ดแวร์ของคุณไม่มีอะไรผิดปกติ ให้สร้างฟังก์ชันเพื่อทำการกะพริบ นี่คือฟังก์ชันที่ฉันใช้/*------------------------------------------ ------------------------------** blinkEm - ฟังก์ชั่นการกะพริบ LED โดยใช้ PD4** PD4 จะต้องได้รับการกำหนดค่าเป็นเอาต์พุต ** ------------------------------------------------ ---------------------*/เป็นโมฆะ blinkEm (uint8_t นับ){ ในขณะที่ (นับ > 0){ PORTD = _BV(PD4); _delay_ms(1000); PORTD = ~_BV(PD4); _delay_ms(1000); นับ--; }}ตอนนี้คุณสามารถใช้ฟังก์ชันนี้ในจุดต่างๆ ในโค้ดของคุณเป็นสัญญาณว่าโค้ดได้ดำเนินการแล้วจนถึงตอนนี้ การรู้ว่าโค้ดกำลังทำงานอยู่หมายความว่าคุณสามารถตรวจสอบแต่ละส่วนที่มีการรันได้อย่างละเอียด แต่ไม่ได้ทำตามที่คุณคาดไว้ เพื่อค้นหาข้อผิดพลาด การเปลี่ยนแปลงทีละอย่างเป็นเทคนิคหลักสำหรับการดีบักด้วย (อธิบายไว้ในข้อมูลอ้างอิงด้านบน) วิธีการแบบคลาสสิกนี้ทำงานร่วมกับ "การแบ่งแยกและพิชิต": ทำตามขั้นตอนของทารกเพื่อเพิ่มฟังก์ชันการทำงานทีละน้อย นี่อาจดูเหมือนเป็นแนวทางที่ช้า แต่ก็ไม่ได้เกือบจะช้าเท่ากับการพยายามดีบักส่วนใหญ่ของโค้ดที่ไม่ทำงานพร้อมกันทั้งหมด

ขั้นตอนที่ 4: การดีบักเพิ่มเติม

มีหลายครั้งที่เราต้องการตรวจสอบส่วนของรหัสโดยข้ามบรรทัดส่วนใหญ่ในนั้น จากนั้นเปิดใช้งานทีละส่วนในขณะที่เราตรวจสอบการทำงานแต่ละส่วน โดยปกติ เราทำสิ่งนี้โดย "แสดงความคิดเห็น" บรรทัดที่เราต้องการข้าม ส่วนขยายของเทคนิคนี้คือการตัดและวางบล็อกของโค้ด แสดงความคิดเห็นในต้นฉบับ (เพื่อไม่ให้พลาด) และแฮ็กไปที่สำเนา C มีสี่วิธีง่ายๆ ในการแสดงความคิดเห็นในบรรทัด การใส่ "//" ไว้หน้าบรรทัดแสดงความคิดเห็นในบรรทัดนั้น การใส่บรรทัดใน "/*" และ "*/" อย่างน้อย 1 บรรทัดจะเป็นการใส่ความคิดเห็นทั้งส่วน เพื่อให้วิธีนี้ทำงานได้อย่างมีประสิทธิภาพ จะต้องไม่มี "*/" อื่นในบล็อคโค้ด (นอกเหนือจากอันสุดท้าย) ดังนั้น วินัยที่มีประสิทธิภาพคือการใช้ // สำหรับความคิดเห็นภายในบล็อคของโค้ด และสงวน /* */ โครงสร้างสำหรับบล็อกความคิดเห็นและสำหรับการแสดงความคิดเห็นในส่วนต่างๆ ของโค้ด การวาง "#if 0" ที่จุดเริ่มต้นของบล็อกเพื่อแสดงความคิดเห็น และสิ้นสุดส่วนด้วย "#endif" สามารถควบคุมแบบเลือกได้มากกว่าโดยใช้ "#ifdef (ตัวระบุ)" ที่จุดเริ่มต้นของบล็อกและ "#endif" ในตอนท้าย หากคุณต้องการคอมไพล์บล็อก ให้ใช้ "#define (ตัวระบุ)" ก่อนหน้าในโปรแกรม หมายเหตุ เครื่องหมายคำพูดมีไว้เพื่อการเน้นเท่านั้นและไม่ควรรวม การรวมเทคนิคเหล่านี้ควรให้แนวทางที่เป็นประโยชน์ในการดีบักโปรแกรม ATtiny2313 ของคุณ คุณอาจพบว่าเครื่องมือเหล่านี้มีประโยชน์เมื่อเราดำเนินการตามคำแนะนำนี้

ขั้นตอนที่ 5: การใช้ตัวจับเวลา/ตัวนับ 0 สำหรับเสียงบี๊บ

การใช้ตัวจับเวลา/ตัวนับ 0 สำหรับเสียงบี๊บ
การใช้ตัวจับเวลา/ตัวนับ 0 สำหรับเสียงบี๊บ

ATtiny2313 มีทรัพยากรตัวจับเวลา/ตัวนับที่ทรงพลังสองอย่าง: 8 บิตหนึ่งตัวและ 16 บิตหนึ่งตัว สิ่งเหล่านี้อาจถูกกำหนดค่าเป็นเครื่องกำเนิดความถี่ ตัวควบคุมมอดูเลตความกว้างพัลส์ตัวแปร และรีจิสเตอร์เปรียบเทียบเอาต์พุต การทำงานเต็มรูปแบบของสิ่งเหล่านี้ได้อธิบายไว้ใน 49 หน้าของแผ่นข้อมูล อย่างไรก็ตาม เราจะใช้กรณีง่ายๆ จะใช้ตัวจับเวลา/ตัวนับ 0 เท่านั้น (ตัว 8 บิต) และจะใช้เป็นตัวสร้างความถี่อย่างง่าย ความถี่จะถูกส่งไปยังลำโพงขนาดเล็กเพื่อสร้างเสียงบี๊บ ตัวจับเวลา/ตัวนับ 0 อธิบายไว้อย่างครบถ้วนในหน้า 66 ถึง 83 ของแผ่นข้อมูล ATtiny2313 การอ่านเนื้อหานี้อย่างใกล้ชิดจะช่วยให้เข้าใจเวลา/ตัวนับ 0 ได้อย่างสมบูรณ์ โชคดีที่โหมดที่ค่อนข้างเรียบง่าย Clear Timer on Compare (CTC) คือสิ่งที่จำเป็นในการสร้างเสียงบี๊บที่เราต้องการ

สำหรับโหมดที่เราจะใช้ การทำงานของตัวจับเวลา/ตัวนับนั้นตรงไปตรงมา เมื่อเลือกสัญญาณนาฬิกา ตัวนับจะเริ่มที่ศูนย์และเพิ่มแต่ละพัลส์นาฬิกา เมื่อค่าตัวนับถึงค่าใน Output Compare Register (TOP) ตัวนับจะรีเซ็ตเป็นศูนย์และเริ่มนับใหม่อีกครั้ง บิตเอาต์พุตที่เกี่ยวข้องกับตัวจับเวลา/ตัวนับถูกสลับเพื่อสร้างเอาต์พุตคลื่นสี่เหลี่ยม สิ่งนี้จะขับตัวแปลงสัญญาณเสียงโดยตรงเพื่อสร้างเสียงบี๊บ TDK Audio Transducer ขนาดเล็กจะส่งเสียงบี๊บ หน่วยที่เหมาะสมคือ Digikey 445-2530-ND, TDK SD1209T3-A1 (ฉันใช้เวอร์ชันก่อนหน้า) นี้เป็นรุ่น 3 โวลต์; รุ่น 5 โวลต์ก็ใช้งานได้เช่นกัน ฉันขับมันโดยตรงจากพอร์ตเอาท์พุตของ Attiny2313 และดูเหมือนว่าจะทำงานได้ดี Sparkfun มีอุปกรณ์ที่คล้ายกัน

ขั้นตอนที่ 6: การกำหนดค่าตัวจับเวลา/ตัวนับ 0

โหมด CTC สามารถใช้เพื่อสลับเอาต์พุต OC0A บนพิน 2, พอร์ต B (พินจริง 14) หากต้องการเปิดใช้งานเอาต์พุตบนพินนี้ ต้องตั้งค่า DDRB อย่างเหมาะสม รหัส C สำหรับสิ่งนี้เหมือนกับการตั้งค่าเอาต์พุตสำหรับไฟกะพริบ DDRB = _BV(PB2); // Port B2 เป็นเอาต์พุต ขั้นตอนต่อไปคือการจัดหาสัญญาณนาฬิกาและโหลดเอาต์พุตเปรียบเทียบการลงทะเบียนเพื่อสร้างรูปคลื่นเป็นความถี่ สมการของความถี่ผลลัพธ์แสดงไว้ในแผ่นข้อมูล (หน้า 72) คำศัพท์ในสมการจะอธิบายไว้ด้านล่าง สมการต่อไปนี้คือ fOC0A = fclk_I/O / 2*N*(1+OCR0A) โดยที่ fOC0A:= ความถี่เอาต์พุต fclk_I/O:= ความถี่ของสัญญาณนาฬิกา N:= clock prescale factor OCR0A:= ค่าในเอาต์พุตเปรียบเทียบการลงทะเบียนสำหรับตัวจับเวลา/ Counter 0A. Clock Source Frequency, fclk_I/Oนี่คือความถี่ของนาฬิการะบบ ค่าเริ่มต้นคือ 1MHz บิต CS00, CS01 และ CS02 ของ TCCR0B ควบคุมการเลือกนี้ เนื่องจากบิตเหล่านี้ยังเลือกค่าของ N จึงมีการอธิบายต่อไป ค่าพรีสเกลเลอร์ NN คือค่าที่ใช้ในการหารหรือพรีสเกลนาฬิกาของระบบ บิต CS00, CS01 และ CS02 ของ TCCR0B ควบคุมการเลือกนี้ ตารางที่ 41 ในหน้า 81 ของเอกสารข้อมูล ATtiny2313 อธิบายการรวมกัน เนื่องจากต้องการความถี่ใกล้ 1kHz บิต CS00 และ CS01 ของ TCCR0B จะถูกตั้งค่า โปรดทราบว่าการตั้งค่าทั้งสามบิตเป็น 0 จึงไม่เลือกแหล่งสัญญาณนาฬิกา จะหยุดเอาต์พุตได้อย่างมีประสิทธิภาพ นี่คือวิธีที่จะใช้เพื่อเริ่มและหยุดเสียงบี๊บ ค่า TOP, OCR0A ค่านี้เป็นค่า TOP สำหรับตัวนับซึ่งโหลดลงใน Output Compare Register สำหรับ Timer/Counter 0A เมื่อถึงค่านี้ ตัวนับจะถูกรีเซ็ตเป็นศูนย์ และการนับจะเริ่มต้นอีกครั้งจนกว่าจะถึง TOP และรอบจะทำซ้ำ TOP ปรับเปลี่ยนได้ง่าย ดังนั้นความถี่ของเสียงบี๊บจึงเปลี่ยนได้ง่าย เนื่องจากต้องการความถี่ใกล้ 1kHz TOP จึงตั้งค่าเป็น 7 (โปรดทราบว่าตัวปรับล่วงหน้าสามารถตั้งค่าเป็น 8 และ TOP ตั้งค่าเป็น 63 ได้ ผลลัพธ์เดียวกัน - ตัวเลือกของคุณ) ความถี่เอาต์พุต fOC0AUใช้สมการเพื่อคำนวณผลลัพธ์ความถี่เอาต์พุต ใน: fOC0A = 1, 000, 000 / 2 * 64 * (1+7) fOC0A = 977Hzใกล้พอแล้ว! นี่คือรหัสสำหรับโหลด Output Compare Register และ Timer Counter Control Register 0B โปรดดูรหัสโปรแกรมจริงเพื่อทำความเข้าใจวิธีการใช้งาน OCR0A = 7; // ค่าเวลา TCCR0B = _BV(CS01) | _BV(CS00); // เลือกนาฬิกาภายใน & พรีสเกล=8 TCCR0B = 0; // ไม่มีแหล่งสัญญาณนาฬิกาปิดเสียงการตั้งค่าโหมดเวลา/ตัวนับเป็นรายละเอียดสุดท้าย เราจะระบุโหมดตัวจับเวลา/ตัวนับที่เราต้องการโดยการตั้งค่าบิตที่เหมาะสมใน Timer/Counter Control Register 0A โหมด CTC ถูกเลือกโดยการตั้งค่าบิต WGM01 ตามที่อธิบายไว้ในตารางที่ 40 หน้า 79 ของแผ่นข้อมูล เนื่องจากเราต้องการให้เอาต์พุตสลับในแต่ละรอบ บิต COM0A0 จึงต้องตั้งค่าตามที่อธิบายไว้ในตารางที่ 34 ในหน้า 77 นี่คือรหัส: TCCR0A = _BV(COM0A0) | _BV(WGM01); // CTC สลับโหมด

ขั้นตอนที่ 7: การใช้สี่สวิตช์

ขณะที่เราใช้เสียงบี๊บ เรามาขยายฮาร์ดแวร์และซอฟต์แวร์ของเราเพื่อจัดการกับสวิตช์สี่ตัว เนื่องจากเอาต์พุตของ Timer Counter 0A อยู่ที่ Port B, pin 2 เราจึงไม่สามารถขอสวิตช์เพิ่มเติมตามลำดับไปยัง Port B ได้ วิธีแก้ปัญหาง่ายๆ คือการใช้ Port D แต่ให้พอร์ตนั้นพร้อมใช้งานสำหรับฟังก์ชันอื่นๆ (บางที สเต็ปเปอร์มอเตอร์) เรามาลองเชื่อมต่อสวิตช์เพิ่มเติมกับ PB3 และ PB4 กันดีกว่า การอ่านสวิตช์ส่วนใหญ่ไม่เปลี่ยนแปลง ค่ามาสก์เปลี่ยนเป็น 0x1B (00011011 ไบนารี) เป็นมาสก์บิต 2 พร้อมกับ 5, 6 และ 7 เคล็ดลับเพิ่มเติมอีกประการหนึ่งคือใช้เพื่อสร้างเลขฐานสอง 4 บิต เปลี่ยนบิต 3 และ 4 ไปทางขวาหนึ่งบิตและรวมเข้ากับบิต 0 และ 1 เป็นเลขฐานสอง 4 บิต นี่คือไวยากรณ์ C มาตรฐานสำหรับการขยับและการรวมบิต แต่มือใหม่อาจไม่ค่อยรู้จัก but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 มีการอ่านสวิตช์ ในการทำงาน โปรแกรมจะกะพริบสองครั้งและส่งเสียงบี๊บสองครั้งเพื่อส่งสัญญาณการเริ่มต้น ทุกครั้งที่เปลี่ยนสวิตช์ ระบบจะส่งเสียงบี๊บหมายเลขที่แสดง เมื่อสวิตช์ไม่เปลี่ยนแปลง ไฟ LED จะกะพริบ ในการเรียกใช้รหัสนี้ ให้สร้างไดเร็กทอรีใหม่ (เรียกมันว่า Beep ถ้าคุณต้องการ) และดาวน์โหลดไฟล์โค้ด C ต่อไปนี้และ makefile ลงในไดเร็กทอรี เปลี่ยนชื่อ Makefile2.txt เป็น Makefile ใช้ WinAVR คอมไพล์โปรแกรมและโหลดลงใน Attiny2313 ของคุณ

ขั้นตอนที่ 8: การใช้ Switch/case Construct

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

ในการรันโค้ดนี้ ให้สร้างไดเร็กทอรีใหม่ (เรียกมันว่า Switch หากคุณต้องการ) และดาวน์โหลดไฟล์โค้ด C ต่อไปนี้และ makefile ลงในไดเร็กทอรี เปลี่ยนชื่อ Makefile3.txt เป็น Makefile ใช้ WinAVR คอมไพล์โปรแกรมและโหลดลงใน Attiny2313 ของคุณ

ขั้นตอนที่ 9: สรุป

บทสรุป
บทสรุป

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

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

แนะนำ: