สารบัญ:

ATtiny84/85 พินอินเทอร์เฟซ SPI นำมาใช้ใหม่: 6 ขั้นตอน
ATtiny84/85 พินอินเทอร์เฟซ SPI นำมาใช้ใหม่: 6 ขั้นตอน

วีดีโอ: ATtiny84/85 พินอินเทอร์เฟซ SPI นำมาใช้ใหม่: 6 ขั้นตอน

วีดีโอ: ATtiny84/85 พินอินเทอร์เฟซ SPI นำมาใช้ใหม่: 6 ขั้นตอน
วีดีโอ: Start using Digispark USB ATtiny85 Arduino board with blink and relay example | Robojax 2024, พฤศจิกายน
Anonim
ATtiny84/85 พินอินเทอร์เฟซ SPI นำมาใช้ใหม่
ATtiny84/85 พินอินเทอร์เฟซ SPI นำมาใช้ใหม่

คำแนะนำนี้เป็นการติดตาม "ATtiny84/85 In-circuit Debugging พร้อม Serial Output" ที่สอนได้และขยายการกำหนดค่าฮาร์ดแวร์และซอฟต์แวร์นั้นเพื่อแก้ไขปัญหาการใช้พินดาวน์โหลดการเขียนโปรแกรมซ้ำโดยโปรแกรมแอปพลิเคชัน โดยรวมแล้ว ระหว่างสิ่งนี้กับส่วนที่ 1 ที่สอนได้ มีการอภิปราย/สาธิตหัวข้อต่อไปนี้:

หัวข้อ ATtiny84 ATtiny85
การสื่อสารแบบอนุกรมโดยใช้คลาส SoftwareSerial NS NS
การแชร์พินอุปกรณ์ระหว่างแอปพลิเคชันและการดาวน์โหลด NS NS
ปักหมุด เปลี่ยน อินเตอร์รัปต์ NS
ขัดจังหวะภายนอก NS
สลีปในโหมด POWER_DOWN; ตื่นมาขัดจังหวะ NS
วิธีแก้ปัญหาสำหรับข้อผิดพลาดลิงก์เวกเตอร์ขัดจังหวะ "กำหนดแบบทวีคูณ" ที่เกี่ยวข้องกับ SoftwareSerial NS
แก้ไข, ดาวน์โหลด, ดีบัก, … วงจรการพัฒนาสำหรับอุปกรณ์ ATtiny NS NS

การเพิ่มส่วนประกอบฮาร์ดแวร์ I/O ให้กับหมุดตัวใดตัวหนึ่งที่ทุ่มเทให้กับอินเทอร์เฟซการเขียนโปรแกรม SPI ในบางครั้งอาจทำได้ แต่บางครั้งก็ไม่ ตัวอย่างเช่น การเพิ่ม LED ให้กับ MISO จะทำให้ LED กะพริบระหว่างการดาวน์โหลด และจากนั้นจะพร้อมใช้งานสำหรับแอปพลิเคชัน อย่างไรก็ตาม การเพิ่ม Piezo Buzzer ให้กับ MISO จะส่งผลให้มีเสียงกรี๊ดที่น่ากลัวตามมาด้วยการดาวน์โหลดล้มเหลว

คำแนะนำนี้จะอธิบายวิธีใช้มัลติเพล็กเซอร์ 4x2:1 เพื่อ "กู้คืน" การใช้พินที่กำหนดให้กับสัญญาณอินเทอร์เฟซ SPI MISO, MOSI และ SCK โดยการป้องกันระหว่างการดาวน์โหลด การใช้พิน RESET ซ้ำต้องมีการเปลี่ยนฟิวส์และไม่ครอบคลุมในแนวทางนี้ การกำหนดพินแบบคู่ทำได้โดยใช้มัลติเพล็กเซอร์เพื่อสลับระหว่างแอปพลิเคชันและอินพุตการเขียนโปรแกรมขึ้นอยู่กับว่ากำลังดาวน์โหลดอยู่หรือไม่ มีโค้ดและแผนผังสำหรับทั้ง ATtiny84 และ ATtiny85 การกำหนดค่า ATiny84 ได้รับการแก้ไขก่อน เนื่องจากมีพอร์ต I/O สองพอร์ต และสามารถใช้เพื่อแสดงปัญหา/วิธีแก้ไขเพิ่มเติม หลังจากการสนทนาของ tiny84 ได้มีการพูดถึงสถานการณ์เดียวกันสำหรับ ATtiny85

ขั้นตอนที่ 1: ฮาร์ดแวร์ที่จำเป็น

ภาพ
ภาพ

ฮาร์ดแวร์ที่จำเป็นส่วนใหญ่แสดงอยู่ในส่วนที่ 1 ที่สอนได้ ดังนั้นเฉพาะฮาร์ดแวร์ใหม่ที่ระบุไว้ด้านล่าง

ชื่อ แหล่งที่เป็นไปได้ ใช้อย่างไร
4x2:1 มัลติเพล็กเซอร์ Mouser ประกอบด้วยสวิตช์ 2 อินพุต 1 เอาต์พุต 4 ตัว ซึ่งเป็นกลไกที่ใช้สัญญาณอินเทอร์เฟซ SPI และ I/O ของแอปพลิเคชันร่วมกัน
สวิตช์ SPST สวิตช์ประเภทใดก็ได้ (ชั่วขณะหรือสลัก) จะทำงาน สวิตช์นี้ใช้เพื่อแสดงการแชร์พินสำหรับอินพุตแอปพลิเคชัน
ตัวต้านทาน 10K ตัวต้านทานแบบดึงลงสำหรับสวิตช์ SPST เพื่อหลีกเลี่ยงอินพุตแบบลอยตัว
ภาพ
ภาพ
ภาพ
ภาพ

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

เข็มหมุด ชื่อ การทำงาน
15 NS ตามที่ระบุไว้ในตารางความจริง มัลติเพล็กเซอร์จะทำงานเมื่อพินเปิดใช้งาน G ต่ำเท่านั้น เนื่องจากเราไม่ต้องการปิดใช้งานมัลติเพล็กเซอร์โดยสิ้นเชิง พิน 15 จะเชื่อมต่อโดยตรงกับกราวด์
2-4; 5-7; 9-11;12-14 A(อินพุต), B (อินพุต), Y(เอาต์พุต) มี 4 อินพุต 2 ตัว; สวิตช์ 1 เอาต์พุตโดยแต่ละกลุ่มมี 3 พินที่มีหมายเลขเรียงตามลำดับ A (อินพุต), B (อินพุต), Y (เอาต์พุต) เช่น สำหรับสวิตช์ 1; พิน 2=1A; พิน 3=1B; พิน 4=1Y.
1 เลือก เมื่อ Select ต่ำ สวิตช์อินพุต A จะเชื่อมต่อกับพินเอาต์พุตของสวิตช์ที่เกี่ยวข้อง Y เมื่อตัวเลือกสูง สวิตช์อินพุต B จะเชื่อมต่อกับเอาต์พุตแทน สวิตช์ควบคุมพร้อมกันโดยสัญญาณ Select และทำงานเหมือนกันหมด
8 GND มัลติเพล็กเซอร์ IC กราวด์
16 VCC เพาเวอร์ไอซีมัลติเพล็กเซอร์

ขั้นตอนที่ 2: ภาพรวมของกรณีทดสอบ

ภาพ
ภาพ
ภาพ
ภาพ

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

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

  1. กรณีเอาต์พุต: เอาต์พุต LED จาก ATtiny84 พิน 4 (SCK) ถูกแยกโดยใช้สวิตช์มัลติเพล็กเซอร์ 2

    • เชื่อมต่อมัลติเพล็กเซอร์พิน 2A กับกราวด์
    • เชื่อมต่อมัลติเพล็กเซอร์พิน 2B กับ ATtiny85 พิน 4
    • เชื่อมต่อเอาต์พุต 2Y กับ LED anode

      • ผลลัพธ์ที่คาดหวัง:

        • ไฟ LED ดับระหว่างการดาวน์โหลดเนื่องจากเชื่อมต่อกับ 2A กราวด์
        • LED ติดอยู่กับเอาต์พุตของแอปพลิเคชั่นพิน 4 หลังจากดาวน์โหลดผ่าน 2B และเริ่มกะพริบ
  2. กรณีอินพุต: อินพุตสวิตช์ SPST เป็น ATtiny84 พิน 6 (MOSI) ถูกแยกโดยใช้สวิตช์มัลติเพล็กเซอร์ 3

    • ลวดตะกั่ว MOSI จากส่วนหัวของโปรแกรมเมอร์ AVR ถูกย้ายไปที่ 3A
    • สวิตช์อินพุต 3B เชื่อมต่อกับเอาต์พุต SPST
    • เอาต์พุต 3Y เชื่อมต่อกับ ATtiny84 พิน 6

      • 3A, MOSI, เชื่อมต่อกับพิน 6 ระหว่างการดาวน์โหลด
      • 3B, เอาต์พุต SPST, เชื่อมต่อกับพิน 6 หลังจากดาวน์โหลด

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

กรณีที่ 2 สำเร็จหากสัญญาณ MOSI ถูกส่งต่อไปยัง ATtiny84 ระหว่างการดาวน์โหลด นั่นคือ การดาวน์โหลดไม่ล้มเหลว และ LED จะตอบสนองต่อการเปิด/ปิด SPST หลังจากดาวน์โหลด กรณีที่ 2 ป้องกันความล้มเหลวในการดาวน์โหลดที่ไม่น่าจะเกิดขึ้นได้ หากไม่มีการแยก สวิตช์ SPST จะทำให้เกิดความล้มเหลวหาก 1) ใช้สวิตช์แบบสลัก และ 2) สวิตช์ถูกปล่อยไว้ที่ตำแหน่งเปิดระหว่างการดาวน์โหลด เมื่อแยกโดยมัลติเพล็กเซอร์ สวิตช์จะไม่ทำให้การดาวน์โหลดล้มเหลวไม่ว่าในกรณีใดๆ ยาวหน่อยแต่ก็สบายใจสำหรับคนแก่อย่างเรา

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

ขั้นตอนที่ 3: ATtiny84 กรณีที่ 1 - แยกเอาต์พุตแอปพลิเคชัน

ภาพ
ภาพ

ขั้นตอนนี้อธิบายการตั้งค่าสำหรับการแชร์พินเอาต์พุตของแอปพลิเคชันพร้อมสัญญาณดาวน์โหลด ตัวอย่างที่ใช้คือ LED ที่ต่อกับพิน 4 (SCK) การใช้ LED ที่มีอยู่เป็นตัวอย่างช่วยให้เน้นการเพิ่มมัลติเพล็กเซอร์ไปยังสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์ส่วนที่ 1

  • ฮาร์ดแวร์

    • เพิ่มมัลติเพล็กเซอร์ไปที่เขียงหั่นขนมในตำแหน่งสัมพัทธ์ที่แสดงในแผนภาพด้านบน มัลติเพล็กเซอร์อยู่ในตำแหน่งตรงกลางเพื่อให้มีที่ว่างสำหรับสวิตช์ SPST ที่จำเป็นสำหรับกรณีที่ 2
    • ขยายสัญญาณ RESET ไปยังมัลติเพล็กเซอร์โดยเพิ่มสายตะกั่ว (แนะนำสีเหลือง) จาก ATtiny84 พิน 11 ไปยังมัลติเพล็กเซอร์พิน 1
    • การตั้งค่าฮาร์ดแวร์ที่เหลือเป็นไปตามขั้นตอนที่2

      • เชื่อมต่อมัลติเพล็กเซอร์พิน 2A โดยตรงกับกราวด์
      • เชื่อมต่อพิน 2B กับ ATtiny84 พิน 4
      • เชื่อมต่อเอาต์พุต 2Y กับ LED anode

        • ผลลัพธ์ที่คาดหวัง:

          • ระหว่างการดาวน์โหลด 2Y เชื่อมต่อกับกราวด์ (2A) ดังนั้น LED ยังคงดับอยู่
          • หลังจากดาวน์โหลด 2Y เชื่อมต่อกับ ATtiny84 pin 4 - แอปพลิเคชั่น LED control
  • ซอฟต์แวร์

    • รหัสส่วนที่ 1 ถูกนำมาใช้ซ้ำ ได้จากส่วนที่ 1 สอนได้มากกว่าทำซ้ำที่นี่
    • โหลดและคอมไพล์โปรแกรมส่วนที่ 1 ใน Arduino IDE
    • เสียบโปรแกรมเมอร์ Tiny AVR เข้ากับพอร์ต USB ของ PC
    • เสียบสาย Adafruit USB เข้ากับสาย Serial เข้ากับพอร์ต USB ตัวที่สอง

      • พอร์ต COM ถูกสร้างขึ้นและพร้อมใช้งานโดยอัตโนมัติในรายการพอร์ต IDE
      • เปิดหน้าต่าง COM
    • ดาวน์โหลดโค้ดที่คอมไพล์ไปยัง ATtiny84

ผลลัพธ์ของโปรแกรมแอปพลิเคชันเหมือนกับส่วนที่ 1 เนื่องจากการเปลี่ยนแปลงเพียงอย่างเดียวคือการย้าย LED ไปยังตำแหน่งที่ "มีการป้องกัน": ไฟ LED จะกะพริบทุกๆ 2 วินาที; เอาต์พุตแบบอนุกรมจะเหมือนกัน ข้อแตกต่างประการหนึ่งที่ควรเกิดขึ้นคือ LED จะไม่กะพริบอีกต่อไประหว่างการดาวน์โหลด เนื่องจากในระหว่างนั้น ไฟ LED จะเชื่อมต่อกับกราวด์ผ่านพินมัลติเพล็กเซอร์ 2A

ภาพ
ภาพ

ขั้นตอนที่ 4: ATtiny84 กรณีที่ 2 - แยกอินพุตแอปพลิเคชัน

ภาพ
ภาพ

ขั้นตอนนี้สร้างขึ้นจากการตั้งค่าสำหรับกรณีการแยกเอาต์พุตก่อนหน้า การเปลี่ยนแปลงฮาร์ดแวร์ประกอบด้วยการติดตั้งสวิตช์ SPST กับ ATtiny84 พิน 6 (MOSI) ผ่านมัลติเพล็กเซอร์ ดังนั้นการเปลี่ยนแปลงฮาร์ดแวร์จึงมีน้อย แต่มีการเปลี่ยนแปลงซอฟต์แวร์หลายอย่างเพื่อให้สวิตช์ SPST ควบคุม LED โดยใช้การขัดจังหวะการเปลี่ยนพิน รหัสที่อัปเดตจะอยู่ที่ด้านล่างของส่วนนี้ ควรคัดลอกโค้ดลงใน Arduino IDE แนะนำให้บันทึกภายใต้ชื่อ Multiplexer_Input (ฉันขอโทษสำหรับความยาวของส่วนนี้ แต่มันเป็นหัวใจของจุดประสงค์ของผู้สอนและคิดว่ามันอ่านได้ดีกว่าเป็นเสาหินมากกว่าที่จะแทรกตัวแบ่งเทียม)

อัปเดต ที่ตั้ง วัตถุประสงค์
รวมซอฟต์แวร์ "ถูกแฮ็ก" คลาสซีเรียล รวมมาตรา ตอนนี้ LED ถูกควบคุมโดยสวิตช์ SPST ผ่านการขัดจังหวะการเปลี่ยนพิน ต้องแก้ไขคลาส SoftwareSerial มิฉะนั้นจะจัดสรรเวกเตอร์ขัดจังหวะการเปลี่ยนพินทั้งหมด ซึ่งทำให้เกิดข้อผิดพลาดในการเชื่อมโยง "หลายคำจำกัดความ" สำหรับเวกเตอร์ (พอร์ต 0) ที่กำหนดให้กับสวิตช์ SPST ควรวางเวอร์ชัน SoftwareSerial ที่ถูกแฮ็กไว้ในไดเร็กทอรีเดียวกันกับโปรแกรม เพื่อให้มีผลกับแอปพลิเคชันนี้เท่านั้น
คำจำกัดความของพินอินพุต SPST รวม/ส่วนคำจำกัดความ การกำหนดอินพุต SPST ให้กับพินอุปกรณ์ พินเป็นอุปกรณ์เฉพาะจึงถูกเพิ่มไปยังส่วน #ifdef ATtiny8x
โหมดพินอินพุต SPST ฟังก์ชั่นการตั้งค่า พิน SPST ได้รับการกำหนดค่าเป็น INPUT
กำหนดค่าการขัดจังหวะพิน SPST ฟังก์ชั่นการตั้งค่า เวกเตอร์ขัดจังหวะถูกกำหนดให้กับพินอินพุต SPST เพื่อให้การเปลี่ยนแปลงสถานะสวิตช์ทำให้เกิดการขัดจังหวะ การลงทะเบียนการกำหนดค่าและประเภทการขัดจังหวะเป็นอุปกรณ์เฉพาะ เพื่อให้โค้ดตรงไปตรงมาที่สุด ความแตกต่างจะได้รับการจัดการภายในส่วน #if ที่กำหนดไว้
ตั้งค่าข้อความซีเรียลที่สมบูรณ์ ฟังก์ชั่นการตั้งค่า ข้อความเอาต์พุตอนุกรมที่สมบูรณ์ของการตั้งค่ามีการเปลี่ยนแปลงเพื่อสะท้อนถึงแอปพลิเคชัน Multiplexer Input
เพิ่มฟังก์ชัน ISR ของสวิตช์ SPST ส่วนรหัส มีการเพิ่ม ISR สำหรับการขัดจังหวะการเปลี่ยนพิน SPST รหัสเป็นเรื่องปกติ แต่เวกเตอร์ที่ใช้เป็นอุปกรณ์เฉพาะและถูกกำหนดไว้ในส่วนที่ขึ้นกับอุปกรณ์ที่ด้านบนของโปรแกรม เพื่อตรวจสอบว่า ISR เปิดใช้งานอยู่ สถานะ LED จะเปลี่ยนไป แม้ว่าจะไม่มีการห้ามในแอปพลิเคชันจริง แต่ข้อความเอาต์พุตแบบอนุกรมจะถูกสร้างขึ้นเพื่อสะท้อนถึงสถานะ LED ใหม่
แก้ไขการประมวลผลแบบวนซ้ำ ฟังก์ชันลูป ตอนนี้ ISR ควบคุมการเปิดและปิดไฟ LED เพื่อให้ฟังก์ชันถูกลบออกจากรูทีนลูป เพิ่มการเรียกรูทีนการนอนหลับสำหรับ ATtiny84 เป็น "พิเศษ" สำหรับแอปพลิเคชันนี้ การนอนหลับของ ATtiny85 จะไม่ทำงาน อาจเป็นเพราะการรบกวนของคลาส Software Serial เนื่องจากมันทำงานกับ SoftwareSerial ที่ถูกลบออก
เพิ่มกิจวัตรการนอนหลับ ส่วนรหัส ฟังก์ชันสลีปไม่จำเป็นต้องสาธิตการใช้มัลติเพล็กเซอร์ เพิ่งเพิ่มเข้ามาเพราะโดยปกติแล้วจะต้องการรออินพุตในโหมด POWER_DOWN เพื่อประหยัดพลังงานแทนที่จะทำงานต่อไปผ่านลูปโปรแกรมไม่ทำอะไรเลยจนกว่าอินพุตจะเกิดขึ้น

แก้ไขรหัสคลาส SoftwareSerial

ต้องเปลี่ยนคลาส SoftwareSerial เพื่อไม่ให้พินเปลี่ยนพอร์ตขัดจังหวะทั้งหมด รหัสคลาส SoftwareSerial อยู่ที่

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src

ค้นหาบน PCINT0_vect ใน SoftwareSerial.cpp เพื่อค้นหาตำแหน่งเริ่มต้นสำหรับการเปลี่ยนแปลงโค้ด เพิ่มโค้ดต่อไปนี้ก่อนคำสั่ง #if ที่กำหนดไว้ (PCINT0_vect) ที่มีอยู่

#if กำหนดไว้ (_AVR_ATtiny84_)

#define MYPORT PCINT1_vect #elif กำหนด (_AVR_ATtiny85_) #define MYPORT PCINT0_vect #endif ISR (MYPORT) { SoftwareSerial::handle_interrupt (); }

ตอนนี้แสดงความคิดเห็นในบล็อกของรหัสที่มีอยู่ซึ่งจัดสรรเวกเตอร์ขัดจังหวะพอร์ตตามที่ระบุด้านล่าง (เพียงเพิ่มสัญลักษณ์ความคิดเห็นเริ่มต้นและสิ้นสุดบล็อก /* และ */):

/*

#if กำหนด (PCINT0_vect) ISR (PCINT0_vect) { SoftwareSerial:: handle_interrupt (); } #endif #if กำหนด (PCINT1_vect) ISR (PCINT1_vect) { //SoftwareSerial:: handle_interrupt (); ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); } #endif #if กำหนด (PCINT2_vect) ISR (PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); #endif #if กำหนด (PCINT3_vect) ISR (PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); #เอนดิฟ */

กำหนดค่าฮาร์ดแวร์

สวิตช์ SPST ต่ออยู่กับ ATtiny84 pin 6 (MOSI) ตามที่ระบุไว้ในขั้นตอนที่ 2 ขั้นตอนนี้จะทำซ้ำที่นี่เพื่อความสะดวก

  • เชื่อมต่อสวิตช์อินพุต 3A กับส่วนหัวของโปรแกรมเมอร์ Tiny AVR MOSI lead
  • เชื่อมต่อ 3B กับสวิตช์ SPST บนพินเอาต์พุต
  • เชื่อมต่อ 3Y กับ ATtiny84 พิน 6

    • ผลลัพธ์:

      • 3A, MOSI จะถูก gate ผ่าน ATtiny84 pin 6 ระหว่างการดาวน์โหลด
      • 3B, เอาต์พุต SPST จะถูกเชื่อมต่อกับพิน 6 หลังจากดาวน์โหลด

เรียกใช้โปรแกรม

ก่อนวิ่ง ให้วางสวิตช์ SPST ไว้ที่ตำแหน่งปิด มิฉะนั้น LED จะเปิดขึ้นเมื่อปิดสวิตช์และในทางกลับกัน ทำตามขั้นตอนสำหรับขั้นตอนที่ 3 เพื่อโหลด คอมไพล์ และดาวน์โหลดแอพพลิเคชั่นอินพุตโปรแกรมโดยใช้ Arduino IDE ดังเช่นเมื่อก่อน ไฟ LED ไม่ควรกะพริบระหว่างการดาวน์โหลด ดังนั้นการบ่งชี้เพียงอย่างเดียวว่าโปรแกรมกำลังทำงานอยู่จะเป็นข้อความซีเรียลเมื่อสิ้นสุดขั้นตอนการตั้งค่า: SETUP Complete - Input Example

ณ จุดนี้โปรแกรมกำลังรออินพุตจากสวิตช์ SPST การวางสวิตช์ในตำแหน่งเปิดจะทำให้ไฟ LED เปิดขึ้น การเปลี่ยนกลับเป็นตำแหน่งปิดจะทำให้ LED ดับลง ข้อความเอาต์พุตตรวจสอบว่า ISR ถูกเรียกใช้ (ISR: Led HIGH, ISR: Led LOW) สังเกตลำดับของข้อความอนุกรมคือ GO TO SLEEP ก่อนรอการเปลี่ยนแปลงสถานะสวิตช์ เมื่อได้รับอินพุตสวิตช์ ISR จะถูกเรียกใช้ สลับ LED และบันทึกการเปลี่ยนแปลง จากนั้นการประมวลผลจะรับสายหลังจากการเรียกสลีปเนื่องจากการขัดจังหวะปลุกโปรเซสเซอร์

ภาพ
ภาพ

โปรแกรมสำหรับคำแนะนำนี้:

//************************************************************************

// ส่วนที่ 2: แอปพลิเคชัน/ดาวน์โหลดการแชร์พินอุปกรณ์ //. แก้ไขโค้ดส่วนที่ 1 เพื่อรองรับการใช้พินซ้ำของแอปพลิเคชัน // กำหนดให้กับอินเทอร์เฟซการเขียนโปรแกรม SPI // รหัส "Comon" สำหรับ ATtiny85 และ ATtiny84 //****************************************** ******************************** #include "SoftwareSerial.h" // Modified Arduino SoftwareSerial class #include // ในขณะที่ รหัสการประมวลผลเป็นเรื่องปกติ พินที่ใช้เป็นอุปกรณ์เฉพาะ #if กำหนด (_AVR_ATtiny84_) || กำหนด (_AVR_ATtiny84A_) #define ledPin 4 // สลับเพื่อเปิด/ปิด Led ที่เชื่อมต่อ #define rxPin 9 // พินที่ใช้สำหรับ Serial รับ #define txPin 10 // พินที่ใช้สำหรับการส่งแบบอนุกรม #define SpstPin 6 // อินพุตจากสวิตช์ SPST (MOSI) #define ISR_VECT PCINT0_vect // สวิตช์ SPST Pin เปลี่ยนเวกเตอร์ขัดจังหวะ #elif ที่กำหนด (_AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // อินพุตจากสวิตช์ SPST (INT0) #define ISR_VECT INT0_vect // SPST switch Pin เปลี่ยนเวกเตอร์ขัดจังหวะ #else #error โปรเจ็กต์นี้รองรับ ATiny84 และ ATtiny85 เท่านั้น #endif // สร้างอินสแตนซ์ของ Software Serial class ที่ระบุอุปกรณ์ // พินที่จะใช้สำหรับรับและส่ง SoftwareSerial mySerial (rxPin), txPin); //------------------------------------------------ ------------------------ // เริ่มต้นทรัพยากรการประมวลผล //-------------------------------- -------------------------------------------------- --- การตั้งค่าเป็นโมฆะ () { mySerial.begin (9600); // เริ่มการหน่วงเวลาการประมวลผลแบบอนุกรม (2000); // ให้เวลาพอร์ต Serial Com เพื่อเริ่มต้นใช้งานให้เสร็จสิ้น // มิฉะนั้น เอาต์พุตที่ 1 อาจหายไปหรือ pinMode ที่อ่านไม่ออก (ledPin, OUTPUT); // กำหนดค่าพินนำสำหรับ OUTPUT pinMode (SpstPin, INPUT); // กำหนดค่าพินสวิตช์ SPST เป็น INPUT #if กำหนดไว้ (_AVR_ATtiny84_) || (_AVR_ATtiny84A_) // ตั้งค่าการขัดจังหวะการเปลี่ยนพินเพื่อจัดการอินพุตสวิตช์บนพิน 6 (MOSI) GIMSK |= (1<

ขั้นตอนที่ 5: ATtiny85 Case 1 - แยกเอาต์พุตแอปพลิเคชัน

ภาพ
ภาพ

แทนที่จะสร้างการตั้งค่าฮาร์ดแวร์ที่ซ้ำกันสำหรับ ATtiny85 มันอาจจะง่ายกว่าที่จะเริ่มต้นด้วยการกำหนดค่าเสร็จสิ้นสำหรับ ATtiny84 จากขั้นตอนที่ 4 และแทนที่ชิป tiny84 ด้วย tiny85 ฮาร์ดแวร์ที่จำเป็นทั้งหมดมีอยู่แล้ว หากใช้วิธีนี้ ให้หาตำแหน่ง tiny85 เพื่อให้พิน 3 และ 4 เข้าแถวกับสายเคเบิลอนุกรม tx และรับสายไฟ จากนั้นจึงเป็นเรื่องของการย้ายสายตะกั่วอินเทอร์เฟซ SPI เพื่อให้ตรงกับตำแหน่งที่จำเป็นสำหรับ ATtiny85

หากเริ่มจากศูนย์ เพียงทำตามขั้นตอนทั่วไปจากขั้นตอนที่ 3 และแผนภาพด้านบน รหัสเหมือนกับที่ใช้กับ ATtiny84 ในขั้นตอนที่ 3 โดยคาดหวังผลลัพธ์แบบเดียวกัน - ไม่มีการสั่นไหวระหว่างการดาวน์โหลด เมื่อใช้งาน LED จะกะพริบทุกๆ 2 วินาที และข้อความเอาต์พุตแบบอนุกรมจะเป็นไปตามสถานะ LED

ภาพ
ภาพ

ขั้นตอนที่ 6: ATtiny85 กรณีที่ 2 - แยกอินพุตแอปพลิเคชัน

ภาพ
ภาพ

สำหรับการตั้งค่าฮาร์ดแวร์ ให้เริ่มด้วยการกำหนดค่าจากขั้นตอนที่ 5 และเพิ่มสวิตช์ SPST ตามที่ระบุไว้ในแผนภาพด้านบน ฉันใช้สวิตช์ชั่วขณะสำหรับรุ่น tiny85 และทำให้การตรวจสอบง่ายขึ้นเล็กน้อย สังเกตว่าเอาต์พุตของสวิตช์หมุน 180 องศาจากการกำหนดค่า ATtiny84 การเปลี่ยนแปลงนี้ทำให้กำหนดเส้นทางสายเชื่อมต่อได้ง่ายขึ้น เนื่องจากสัญญาณ SPI ทั้ง 3 ตัวอยู่ด้านเดียวกันสำหรับ ATtiny85

ใช้โปรแกรมเดียวกับ ATtiny84 ขั้นตอนที่ 4 คาดหวังผลลัพธ์ทั่วไปเหมือนกัน - LED เปลี่ยนสถานะเมื่อเปิด/ปิดสวิตช์ SPST และข้อความเอาต์พุตแบบอนุกรมบันทึกการเปลี่ยนแปลง ข้อความ GO TO SLEEP หายไป เนื่องจากไม่ได้เรียกใช้ฟังก์ชันการนอนหลับสำหรับ ATtiny85 แม้ว่าจะใช้โปรแกรมเดียวกัน แต่ก็มีความแตกต่างกันอย่างมากในการดำเนินการ เนื่องจาก ATtiny85 มีเพียงหนึ่งพอร์ตรีจิสเตอร์ (พอร์ต 0):

  1. SoftwareSerial ตอนนี้จัดสรรพอร์ต 0 พินเปลี่ยนการขัดจังหวะสำหรับการสื่อสารแบบอนุกรม (จำได้ว่าเราสามารถใช้พอร์ต 1 สำหรับ ATtiny84)
  2. การขัดจังหวะสวิตช์ SPST จะต้องใช้กับการขัดจังหวะภายนอก 0 (INT0) เนื่องจาก SoftwareSerial จัดสรรหนึ่งและตัวเดียวเท่านั้นที่ขัดจังหวะการเปลี่ยนพิน สิ่งนี้แสดงให้เห็นจุดที่การขัดจังหวะการเปลี่ยนพินและการขัดจังหวะภายนอกมีความเป็นอิสระทางตรรกะและสามารถใช้ได้ภายในพอร์ตรีจิสเตอร์เดียวกัน
  3. ไม่มีอะไรได้มาโดยการใช้ SoftwareSerial เวอร์ชันดัดแปลง - มีเพียงพอร์ตเดียวและคลาส SoftwareSerial จะคว้ามันไว้ อย่างไรก็ตาม คลาสที่ถูกดัดแปลงยังคงถูกใช้เพื่อหลีกเลี่ยงการเปลี่ยนแปลงที่ไม่เกี่ยวข้องโดยตรงกับเป้าหมายของขั้นตอนนี้

แนะนำ: