สารบัญ:

Attiny85 การเขียนโปรแกรมพร้อมกันหรือฟักทองด้วยดวงตาหลากสี: 7 ขั้นตอน
Attiny85 การเขียนโปรแกรมพร้อมกันหรือฟักทองด้วยดวงตาหลากสี: 7 ขั้นตอน

วีดีโอ: Attiny85 การเขียนโปรแกรมพร้อมกันหรือฟักทองด้วยดวงตาหลากสี: 7 ขั้นตอน

วีดีโอ: Attiny85 การเขียนโปรแกรมพร้อมกันหรือฟักทองด้วยดวงตาหลากสี: 7 ขั้นตอน
วีดีโอ: Знакомство с Digispark ATtiny85. "Arduino для чайников" 2024, พฤศจิกายน
Anonim

โดย jumbleviewJumbleview.infoติดตามเพิ่มเติมโดยผู้เขียน:

กรี๊ด
กรี๊ด
กรี๊ด
กรี๊ด
การเปลี่ยนแบตเตอรี่ NiCd ด้วยแหล่งจ่ายไฟภายนอก
การเปลี่ยนแบตเตอรี่ NiCd ด้วยแหล่งจ่ายไฟภายนอก
การเปลี่ยนแบตเตอรี่ NiCd ด้วยแหล่งจ่ายไฟภายนอก
การเปลี่ยนแบตเตอรี่ NiCd ด้วยแหล่งจ่ายไฟภายนอก
ที่จับกล้องดิจิตอล
ที่จับกล้องดิจิตอล
ที่จับกล้องดิจิตอล
ที่จับกล้องดิจิตอล

เกี่ยวกับ: ฉันทำงานเป็นวิศวกรซอฟต์แวร์ในบริษัทแห่งหนึ่งใน 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

การเขียนโปรแกรม กิจวัตร Protothread
การเขียนโปรแกรม กิจวัตร 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

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

แนะนำ: