สารบัญ:
- เสบียง
- ขั้นตอนที่ 1: เซอร์คัท
- ขั้นตอนที่ 2: ไดอะแกรมกำหนดเวลา
- ขั้นตอนที่ 3: การเขียนโปรแกรม มาโครและคำจำกัดความ
- ขั้นตอนที่ 4: การเขียนโปรแกรม วงหลัก
- ขั้นตอนที่ 5: การเขียนโปรแกรม ฟังก์ชั่นเสริม
- ขั้นตอนที่ 6: การเขียนโปรแกรม กิจวัตร Protothread
- ขั้นตอนที่ 7: Internals
วีดีโอ: Attiny85 การเขียนโปรแกรมพร้อมกันหรือฟักทองด้วยดวงตาหลากสี: 7 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
โดย jumbleviewJumbleview.infoติดตามเพิ่มเติมโดยผู้เขียน:
เกี่ยวกับ: ฉันทำงานเป็นวิศวกรซอฟต์แวร์ในบริษัทแห่งหนึ่งใน Bay Area (แคลิฟอร์เนีย) เมื่อใดก็ตามที่ฉันมีเวลา ฉันชอบเขียนโปรแกรมไมโครคอนโทรลเลอร์ สร้างของเล่นกลไก และทำโครงการปรับปรุงบ้าน เพิ่มเติมเกี่ยวกับ jumbleview »
โปรเจ็กต์นี้แสดงวิธีควบคุม LED แอโนดสามสีขนาด 10 มม. สองดวง (ดวงตาหลากสีของ Pumpkin Halloween Glitter) ด้วยชิป Attiny85 เป้าหมายของโครงการคือการแนะนำผู้อ่านเกี่ยวกับศิลปะของการเขียนโปรแกรมพร้อมกันและการใช้ไลบรารีโปรโตเธรดของ Adam Dunkels โปรเจ็กต์นี้อนุมานว่าผู้อ่านรู้เกี่ยวกับคอนโทรลเลอร์ AVR 8 บิต สามารถเขียนโปรแกรม C และมีประสบการณ์กับ Atmel studio บ้าง
รหัสโครงการเผยแพร่บน GitHub:
เสบียง
ก่อนการเขียนโปรแกรมยังต้องสร้างวงจร นี่คือส่วนประกอบ:
- ตัวควบคุม Attiny85 (ซัพพลายเออร์อิเล็กทรอนิกส์ใด ๆ)
- ไฟ LED ขนาด 10 มม. สามสีสามดวงพร้อมขั้วบวกทั่วไป Adafruit LEDs
- ตัวต้านทาน 100 โอห์ม 120 โอห์ม 150 โอห์ม 0.125 หรือ 0.250 วัตต์ (ผู้จำหน่ายอุปกรณ์อิเล็กทรอนิกส์รายใดก็ได้)
- ส่วนหัวหกพินสำหรับอินเทอร์เฟซ AVR ISP สามารถทำจากเฮดเดอร์ Adafruit นี้ได้
- กระดานขนมปังหรือแผ่นแม่แบบที่พิมพ์ออกมา ฉันใช้อันนี้
- อินเทอร์เฟซ AVR ISP MKII และ Atmel Studio 6.1 (เวอร์ชันต่อมาควรใช้งานได้เช่นกัน)
ขั้นตอนที่ 1: เซอร์คัท
การออกแบบใช้หมุดชิปห้าตัว:
- สองพินที่ใช้ควบคุมแอโนด: แอโนด LED แต่ละอันที่ต่ออยู่กับพินเฉพาะ
- ติดสามพิน (ผ่านตัวต้านทาน) กับแคโทด LED (แคโทดสีเดียวกันของไฟ LED แต่ละตัวที่ติดอยู่กับพินเดียวกัน)
มีคนถามว่า: ทำไมไม่ใช้พินอิน/เอาท์ทั้งหกของชิป ดังนั้น LED anodes จะเชื่อมต่อโดยตรงกับ +5 v และแคโทดแต่ละตัวจะมีพินเฉพาะ ซึ่งจะทำให้การเขียนโปรแกรมตรงไปตรงมา อนิจจา มีปัญหา: พิน PB5 (RESET) เป็นพินที่อ่อนแอซึ่งสามารถจ่ายกระแสได้เพียง ~2 mA ในขณะที่จำเป็นต้องมี ~20 mA
แน่นอน เราสามารถสร้างแอมพลิฟายเออร์ทรานซิสเตอร์สำหรับพินที่อ่อนแอนี้ได้ แต่ตัวฉันเองต้องการแก้ปัญหาด้วยรหัสทุกครั้งที่ทำได้
ขั้นตอนที่ 2: ไดอะแกรมกำหนดเวลา
ไดอะแกรมกำหนดเวลาช่วยให้เราเข้าใจว่าเราต้องการโปรแกรมอะไร
สองแถวบนสุดบนไดอะแกรมแสดงการเปลี่ยนแปลงแรงดันไฟบนแอโนด LED แรงดันไฟบนพินที่เชื่อมต่อกับแอโนด LED จะสั่นด้วยความถี่ ~ 250 Hz การสั่นของแรงดันไฟฟ้าสำหรับ LED ด้านซ้ายนี้ตรงกันข้ามกับการสั่นของ LED ด้านขวา เมื่อแรงดันไฟฟ้าบนขั้วบวกสูง LED ที่สอดคล้องกันสามารถสว่างได้ เมื่อไฟ LED ต่ำที่สอดคล้องกันจะมืด นั่นหมายความว่า LED แต่ละดวงอาจสว่างในช่วงเวลา 2 มิลลิวินาที และมืดในช่วงอีก 2 มิลลิวินาที เนื่องจากตามนุษย์มีความเฉื่อยอยู่บ้าง ผู้สังเกตการณ์จึงไม่สังเกตเห็นการกะพริบ 250 Hz ด้านล่างสามแถวบนแผนภาพแสดงการเปลี่ยนแปลงของแรงดันไฟฟ้าบนพินที่เชื่อมต่อกับแคโทด LED ให้เราดูในคอลัมน์ไดอะแกรมแรก แสดงกรณีที่ LED ด้านซ้ายเป็นสีแดงและ LED ด้านขวาเป็นสีเขียว ที่นี่แคโทดสีแดงจะต่ำในขณะที่แอโนดด้านซ้ายสูง แคโทดสีเขียวจะต่ำในขณะที่แอโนดด้านขวาสูง และแคโทดสีน้ำเงินจะต่ำตลอดเวลา คอลัมน์อื่นๆ ในแผนภาพแสดงการรวมกันของแรงดันแคโทดและแอโนดสำหรับสีต่างๆ
อย่างที่เราเห็นมีการพึ่งพาซึ่งกันและกันในสถานะหมุด หากไม่มีกรอบการทำงานบางอย่าง ก็คงจะไม่ง่ายที่จะแก้ไข และนั่นคือที่มาของไลบรารี protothread
ขั้นตอนที่ 3: การเขียนโปรแกรม มาโครและคำจำกัดความ
ตัวอย่างในขั้นตอนการเขียนโปรแกรมแสดงเวอร์ชันที่เรียบง่ายเล็กน้อย โปรแกรมสั้นลง และคำจำกัดความเชิงสัญลักษณ์บางอย่างถูกแทนที่ด้วยค่าคงที่ที่ชัดเจน
ให้เราเริ่มจากจุดเริ่มต้น โปรแกรมรวมถึงไฟล์ที่มาพร้อมกับ Atmel Studio และส่วนหัวของไลบรารีโปรโตเธรด ถัดมา มีมาโครสองตัวเพื่อจัดการระดับพินและคำจำกัดความบางอย่างเพื่อตั้งชื่อตรรกะให้กับสัญญาณพิน จนถึงตอนนี้ไม่มีอะไรพิเศษ
ขั้นตอนที่ 4: การเขียนโปรแกรม วงหลัก
จากนั้นให้เราดูที่ส่วนท้ายเพื่อดูว่ามีขั้นตอนหลักใดบ้าง
ฟังก์ชันหลักหลังจากเริ่มต้นบางส่วนจะอยู่ในลูปตลอดไป ในลูปนั้นจะทำขั้นตอนต่อไป:
- เรียกใช้รูทีน protothread สำหรับ LED ด้านซ้าย มันเปลี่ยนแรงดันพินบางส่วน
- ทำให้สองมิลลิวินาทีล่าช้า ไม่มีการเปลี่ยนแปลงในแรงดันพิน
- เรียกใช้ protothread สำหรับ LED ที่ถูกต้อง มันเปลี่ยนแรงดันพินบางส่วน
- ทำให้ล่าช้า 2 MS ไม่มีการเปลี่ยนแปลงในแรงดันพิน
ขั้นตอนที่ 5: การเขียนโปรแกรม ฟังก์ชั่นเสริม
ก่อนที่เราจะเริ่มพูดถึง protothreads เราต้องดูฟังก์ชันตัวช่วยบางอย่างก่อน อันดับแรกมีฟังก์ชันสำหรับกำหนดสีเฉพาะ พวกเขาตรงไปตรงมา มีฟังก์ชันต่างๆ เช่น จำนวนสีที่รองรับ (เจ็ด) และอีกหนึ่งฟังก์ชันเพื่อตั้งค่า LED ให้มืด (NoColor)
และยังมีอีกหนึ่งฟังก์ชันที่จะเรียกใช้โดยตรงโดยรูทีนโปรโตเธรด ชื่อของมันคือ DoAndCountdown()
การใช้งานในทางเทคนิคของฟังก์ชันดังกล่าวไม่จำเป็น แต่ฉันพบว่าสะดวก มันมีสามอาร์กิวเมนต์:
- ตัวชี้ไปยังฟังก์ชันการตั้งค่าสี LED (เช่น RedColor หรือ GreenColor หรืออื่น ๆ)
- ค่าเริ่มต้นของตัวนับย้อนกลับ: จำนวนครั้งที่ต้องเรียกใช้ฟังก์ชันนี้ที่สเตจโปรโตเธรดโดยเฉพาะ
- ตัวชี้เพื่อย้อนกลับตัวนับ สันนิษฐานว่าเมื่อมีการเปลี่ยนแปลงในสีที่ตัวนับย้อนกลับเป็น 0 ดังนั้นรหัสการวนซ้ำครั้งแรกจะกำหนดให้กับค่าเริ่มต้นของตัวนับนั้น หลังจากที่ตัวนับการวนซ้ำแต่ละครั้งลดลง
ฟังก์ชัน DoAndCountdown() ส่งคืนค่าของตัวนับย้อนกลับ
ขั้นตอนที่ 6: การเขียนโปรแกรม กิจวัตร Protothread
และนี่คือเฟรมเวิร์กคอร์: รูทีนโปรโตเธรด เพื่อความเรียบง่าย ตัวอย่างจำกัดเพียงสามขั้นตอน: สำหรับการเปลี่ยนสีเป็นสีแดง เป็นสีเขียว และสีน้ำเงิน
ฟังก์ชั่นถูกเรียกใช้ด้วยสองอาร์กิวเมนต์:
- ตัวชี้ไปยังโครงสร้างโปรโตเธรด โครงสร้างนั้นเริ่มต้นโดย main ก่อนที่ลูปหลักจะเริ่มต้น
- ตัวชี้เพื่อย้อนกลับตัวนับ มันถูกตั้งค่าเป็น 0 โดย main ก่อนที่ลูปหลักจะเริ่มขึ้น
ฟังก์ชันตั้งค่าแรงดันไฟฟ้าเพื่อให้ LED ด้านซ้ายทำงาน และจากนั้นเริ่มส่วนโปรโตเธรด ส่วนนี้อยู่ระหว่างมาโคร PT_BEGIN และ PT_END ข้างในมีรหัสบางอย่างซึ่งในกรณีของเราทำซ้ำมาโคร PT_WAIT_UNTIL เท่านั้น มาโครนี้ดำเนินการต่อไป:
- การเรียกใช้ฟังก์ชัน DoAndCountdown ที่ตั้งค่าแรงดันไฟฟ้าบนแคโทด LED เพื่อปล่อยสีเฉพาะ
- ส่งคืนผลลัพธ์เมื่อเปรียบเทียบกับ 0 หากเงื่อนไขเป็น 'เท็จ' ฟังก์ชัน protothread จะส่งกลับทันทีและให้การควบคุมไปยังลูปหลัก
- เมื่อเรียกใช้ protothread ในครั้งถัดไป ระบบจะเรียกใช้โค้ดอีกครั้งก่อน PT_BEGIN จากนั้นจะข้ามโดยตรงภายในมาโคร PT_WAIT_UNTIL ที่ส่งกลับครั้งล่าสุด
- การกระทำดังกล่าวเกิดขึ้นซ้ำๆ จนกระทั่งผลลัพธ์ของ DoAndCountdown เป็น 0 ในกรณีนี้ จะไม่มีการส่งคืน โปรแกรมจะอยู่ใน protothread และรันบรรทัดถัดไปของโค้ด ในกรณีของเราคือ PT_WAIT_UNTIL ถัดไป แต่โดยทั่วไปแล้ว อาจเป็นรหัส C เกือบทุกชนิด
- ที่การดำเนินการเริ่มต้นของตัวนับย้อนกลับ PT_WAIT_UNTIL ที่สองคือ 0 ดังนั้นขั้นตอน DoAndCountdown() ให้ตั้งค่าเป็นค่าเริ่มต้น มาโครที่สองอีกครั้งจะถูกดำเนินการ 250 ครั้งจนกว่าตัวนับการย้อนกลับจะถึง 0
- สถานะของ struct pt จะถูกรีเซ็ตทันทีที่การควบคุมไปถึงมาโคร PT_END เมื่อเรียกใช้ฟังก์ชัน protothread ในครั้งต่อไป เซ็กเมนต์ protothread จะเริ่มรันบรรทัดของโค้ดทันทีหลังจาก PT_BEGIN
มีรูทีน protothread ที่คล้ายกันสำหรับ LED ด้านขวา ในตัวอย่างของเรา มันบังคับใช้ลำดับของสีที่ต่างกัน แต่ถ้าเราอาจทำให้มันแตกต่างไปจากเดิมอย่างสิ้นเชิง: ไม่มีการจับคู่ที่แน่นแฟ้นระหว่างรูทีน LED ด้านซ้ายและขวา
ขั้นตอนที่ 7: Internals
โปรแกรมทั้งหมดมีโค้ดน้อยกว่า 200 บรรทัด (พร้อมความคิดเห็นและบรรทัดว่าง) และใช้หน่วยความจำโค้ด Attiny85 น้อยกว่า 20% หากจำเป็น คุณสามารถใช้รูทีนโปรโตเธรดเพิ่มเติมหลายรูทีนที่นี่ และกำหนดตรรกะที่ซับซ้อนมากขึ้นให้กับรูทีนเหล่านี้
ไลบรารี Protothreads เป็นรูปแบบที่ง่ายที่สุดของการเขียนโปรแกรมคอมพิวเตอร์พร้อมกัน การเขียนโปรแกรมพร้อมกันเป็นวิธีการที่แบ่งโปรแกรมออกเป็นส่วน ๆ ทางตรรกะ: บางครั้งเรียกว่า coroutines, บางครั้งเธรด, บางครั้งงาน หลักการคือแต่ละงานดังกล่าวสามารถแบ่งปันพลังของโปรเซสเซอร์ที่เหมือนกันในขณะที่รักษาโค้ดให้เป็นเส้นตรงไม่มากก็น้อยและเป็นอิสระจากส่วนอื่น ๆ งานจากมุมมองเชิงตรรกะอาจถูกดำเนินการพร้อมกัน
สำหรับการควบคุมระบบขั้นสูงของงานดังกล่าวที่ดำเนินการโดยเคอร์เนลของระบบปฏิบัติการหรือโดยรันไทม์ของภาษาที่ฝังอยู่ในไฟล์สั่งการโดยคอมไพเลอร์ แต่ในกรณีของโปรแกรมเมอร์แอ็พพลิเคชัน protothreads ควบคุมด้วยตนเองโดยใช้ไลบรารีแมโคร protothreads ในรูทีนงานและเรียกใช้รูทีนดังกล่าว (โดยปกติออกจากลูปหลัก)
คุณอาจต้องการทราบว่า protothread ทำงานอย่างไร? เวทมนตร์ที่ซ่อนอยู่ที่ไหน? Protothreads อาศัยคุณลักษณะภาษา C พิเศษ: ข้อเท็จจริงที่ว่าคำสั่ง C switch case อาจถูกฝังลงใน if หรือบล็อกอื่นๆ (เช่น while หรือ for) รายละเอียดที่คุณสามารถพบได้บนเว็บไซต์ Adam Dunkels
อุปกรณ์อิเล็กทรอนิกส์ภายในของโครงการนี้ง่ายมาก ภาพด้านบนช่วยให้คุณมีเงื่อนงำ ฉันแน่ใจว่าคุณทำได้ดีกว่านี้
แนะนำ:
Christmas Star Neopixel Attiny85 ที่ใหญ่ขึ้นและปรับปรุง: 3 ขั้นตอน (พร้อมรูปภาพ)
ดาวคริสต์มาสที่ใหญ่ขึ้นและปรับปรุงให้ดีขึ้น Neopixel Attiny85: ปีที่แล้วฉันสร้างดาวคริสต์มาสที่พิมพ์ 3 มิติขนาดเล็ก ดู https://www.instructables.com/id/Christmas-Star-LE…ปีนี้ฉันสร้างดาวที่ใหญ่ขึ้นจากเกลียวคลื่น ที่ 50 Neopixels (5V WS2811) ดาวดวงที่ใหญ่กว่านี้มีรูปแบบมากขึ้น (ฉันยังคงเพิ่มและด้นสด
ลดการใช้พลังงานแบตเตอรี่สำหรับ Digispark ATtiny85: 7 ขั้นตอน
ลดการใช้พลังงานแบตเตอรี่สำหรับ Digispark ATtiny85: หรือ: ใช้งาน Arduino กับเซลล์แบบเหรียญ 2032 เป็นเวลา 2 ปี การใช้บอร์ด Arduino Digispark ของคุณออกจากกล่องพร้อมกับโปรแกรม Arduino จะดึงกระแส 20 mA ที่ 5 โวลต์ด้วยพาวเวอร์แบงค์ 5 โวลต์ของ 2000 mAh ใช้งานได้เพียง 4 วัน
ATTiny85 Capacitor Meter: 4 ขั้นตอน
ATTiny85 Capacitor Meter: คำแนะนำนี้ใช้สำหรับเครื่องวัดตัวเก็บประจุตาม ATTiny85 พร้อมคุณสมบัติดังต่อไปนี้ อิงจาก ATTiny85 (DigiStamp) SSD1306 0.96" จอแสดงผล OLED การวัดความถี่สำหรับตัวเก็บประจุค่าต่ำ 1pF - 1uF โดยใช้ออสซิลเลเตอร์ 555 ตัววัดเวลาชาร์จ
AtTiny85 แอดเดรส LED Strip: 10 ขั้นตอน
AtTiny85 Addressable LED Strip: เป้าหมายของฉันคือทำโคมไฟตั้งโต๊ะจาก LED ฉันต้องการให้มันปรับได้ ดังนั้นจึงสามารถใช้ได้ทั้งกลางวันและกลางคืน ในครั้งแรกที่ฉันทำ ฉันใช้แถบ LED ธรรมดาและ MOS ขนาดใหญ่ FET เพื่อขับที่ 12v ครั้งนี้ฉันเลือก LED ที่สามารถระบุตำแหน่งได้ซึ่งให้กำลัง
ATtiny85 การติดตามกิจกรรมการสั่นที่สวมใส่ได้นาฬิกาและการเขียนโปรแกรม ATtiny85 พร้อม Arduino Uno: 4 ขั้นตอน (พร้อมรูปภาพ)
ATtiny85 Wearable Vibrating Activity Tracking Watch & Programming ATtiny85 With Arduino Uno: จะสร้างนาฬิกาติดตามกิจกรรมที่สวมใส่ได้อย่างไร? นี่คืออุปกรณ์สวมใส่ที่ออกแบบมาเพื่อให้สั่นเมื่อตรวจพบการหยุดนิ่ง คุณใช้เวลาส่วนใหญ่กับคอมพิวเตอร์เหมือนฉันหรือเปล่า คุณนั่งเป็นชั่วโมงโดยไม่รู้ตัวหรือไม่? จากนั้นอุปกรณ์นี้จะเ