ขั้นตอนการเขียนโปรแกรมไมโครคอนโทรลเลอร์ AVR คำแนะนำสำหรับโปรแกรมเมอร์ไมโครคอนโทรลเลอร์มือใหม่ ชุดโปรแกรมที่จำเป็น

ดังนั้นเราจึงแยกแยะงานของเคอร์เนลเกี่ยวกับการเปลี่ยนและการกำหนดแอดเดรส ถึงเวลาหันความสนใจของเราไปยังพื้นที่อื่น - ความทรงจำ

มีสองประเภท (ไม่นับ EEPROM เนื่องจากโดยทั่วไปแล้วจะเป็นอุปกรณ์ต่อพ่วง แต่จะเพิ่มเติมในภายหลัง):

  • แรม - แรม
  • ROM - ROM หรือที่รู้จักในชื่อแฟลชหรือที่รู้จักในชื่อหน่วยความจำโปรแกรม

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

ให้ความสนใจกับที่อยู่ทันที! RON และรีจิสเตอร์ต่อพ่วง รวมถึง RAM อยู่ในพื้นที่ที่อยู่เดียวกัน เหล่านั้น. ที่อยู่ตั้งแต่ 0000 ถึง 001F ครอบครองการลงทะเบียนของเรา จากนั้นจนถึงที่อยู่ 005F จะมีเซลล์ I/O - พอร์ต ผ่านพอร์ตทุกอย่างที่อยู่บนบอร์ดคอนโทรลเลอร์จะได้รับการกำหนดค่า และเมื่อถึงเวลานั้น RAM ของเราก็มาถึงจากที่อยู่ 0060 ซึ่งเราสามารถใช้เพื่อวัตถุประสงค์ที่ต้องการได้

นอกจากนี้ โปรดทราบว่ารีจิสเตอร์ I/O ยังมีที่อยู่ของตัวเอง - พื้นที่ที่อยู่ของรีจิสเตอร์ I/O (ตั้งแต่ 00 ถึง 3F) ซึ่งระบุไว้ทางด้านซ้ายของภาพ IO/Register Block การกำหนดที่อยู่นี้ใช้งานได้เฉพาะในคำสั่ง OUT และ IN เท่านั้น คุณสมบัติที่น่าสนใจต่อจากนี้

สามารถเข้าถึงการลงทะเบียนอุปกรณ์ต่อพ่วงได้สองวิธี:

  • ผ่านคำสั่ง IN/OUT ที่อยู่แบบสั้นในพื้นที่ที่อยู่ I/O
  • ผ่านกลุ่มคำสั่ง LOAD/STORE ที่ที่อยู่แบบเต็มในพื้นที่ที่อยู่ RAM

ตัวอย่าง. ลองใช้การลงทะเบียนอินพุตของตัวรับส่งสัญญาณแบบอะซิงโครนัส UDR ซึ่งมีที่อยู่ 0x0C (0x2C) ที่อยู่ในช่องว่างที่อยู่ทั่วไปจะแสดงอยู่ในวงเล็บ

LDI R18.10; เราโหลดหมายเลข 10 ลงในรีจิสเตอร์ R18 เช่นเดียวกับนั้น OUT UDR,R18 ; อนุมานได้ด้วยวิธีแรกคือคอมไพเลอร์เอง แทนที่ค่า 0x0C แทน UDR STS 0x2C,R18 ; พวกเขาพาฉันออกไปทางที่สอง ผ่านคำสั่ง Store; โดยกรอกที่อยู่โดยตรง

ทั้งสองวิธีให้ผลลัพธ์ที่เหมือนกัน แต่! สิ่งที่ทำงานโดยระบุที่อยู่ในพื้นที่อินพุต/เอาท์พุต (OUT/IN) จะสั้นกว่าสองไบต์ สิ่งนี้สามารถเข้าใจได้ - ไม่จำเป็นต้องจัดเก็บที่อยู่แบบไบต์คู่ของเซลล์หน่วยความจำที่กำหนดเอง และที่อยู่แบบสั้นของพื้นที่อินพุต-เอาต์พุตจะพอดีกับโค้ดคำสั่งแบบไบต์คู่

จริงอยู่มีเรื่องตลกอีกเรื่องที่นี่ ความจริงก็คือในแต่ละปีมีหินจาก AVR ปรากฏขึ้นมากขึ้นเรื่อย ๆ และมีเนื้ออยู่ในนั้นมากขึ้นเรื่อย ๆ และเสียงแคร็กแต่ละครั้งจำเป็นต้องมีรีจิสเตอร์ I/O อุปกรณ์ต่อพ่วงของตัวเอง และตอนนี้ เราได้ข้อสรุปว่า ATMega88 (ซึ่งมาแทนที่ Mega8) มีอุปกรณ์ต่อพ่วงมากมายจนการลงทะเบียน I/O ไม่พอดีกับขีดจำกัดพื้นที่ที่อยู่ 3F อีกต่อไป

อ๊ะ พวกเขามาถึงแล้ว และนี่คือจุดที่ผู้ที่เปลี่ยนจากหินเก่าไปสู่หินใหม่เริ่มแสดงสีหน้างุนงง - เหตุใดคำสั่ง OUT/IN จึงทำงานบนรีจิสเตอร์ต่อพ่วงบางตัว แต่ไม่ใช่กับรีจิสเตอร์ตัวอื่น

และมันก็ง่ายมาก - มีความลึกบิตไม่เพียงพอ

แต่แกนกลางเป็นหนึ่งเดียว มันไม่สามารถสร้างใหม่ได้อีกต่อไป และที่นี่ชาว ATMEL ทำตัวมีไหวพริบ - พวกเขาแนะนำสิ่งที่เรียกว่าการลงทะเบียนแมปหน่วยความจำ เหล่านั้น. ขณะนี้การลงทะเบียนทั้งหมดที่ไม่พอดีกับขีดจำกัด 3F มีให้บริการในวิธีเดียวเท่านั้น - ผ่านการโหลด/จัดเก็บ

เป็นเรื่องตลก หากคุณเปิด m88def.inc ขึ้นมา คุณจะเห็นว่ารีจิสเตอร์ I/O ใดที่ “ถูกต้อง” และหน่วยความจำใดที่แมปไว้

จะมีอะไรแบบนี้:

; ***** คำจำกัดความการลงทะเบียน I/O ****************************************** ******** * ; บันทึก: ; คำจำกัดความที่ทำเครื่องหมายว่า "MEMORY MAPPED" คือพอร์ต I/O แบบขยาย ; และไม่สามารถใช้กับคำสั่ง IN/OUT ได้ .equ UDR0 = 0xc6 ; แมปหน่วยความจำ .equ UBRR0L = 0xc4 ; แมปหน่วยความจำ .equ UBRR0H = 0xc5 ; แมปหน่วยความจำ .equ UCSR0C = 0xc2 ; แมปหน่วยความจำ .equ UCSR0B = 0xc1 ; แมปหน่วยความจำ .equ UCSR0A = 0xc0 ; หน่วยความจำที่แมป บลา บลา บลา และอีกมากมาย.equ OSCCAL = 0x66 ; แมปหน่วยความจำ .equ PRR = 0x64 ; แมปหน่วยความจำ .equ CLKPR = 0x61 ; แมปหน่วยความจำ .equ WDTCSR = 0x60 ; แมปหน่วยความจำ .equ SREG = 0x3f ;<------ А тут пошли обычные.equ SPL = 0x3d .equ SPH = 0x3e .equ SPMCSR = 0x37 .equ MCUCR = 0x35 .equ MCUSR = 0x34 .equ SMCR = 0x33 .equ ACSR = 0x30

นี่คือพาย

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

อย่างไรก็ตามมีวิธีแก้ไข ภาษามาโคร! ไม่ชอบระบบคำสั่ง? แต่งหน้าของคุณเองด้วยแบล็คแจ็คและโสเภณี!
มาสร้างทีม UOUT ของเราเองเหมือน OUT สากลกันเถอะ

ในทำนองเดียวกันสำหรับคำสั่ง IN โดยทั่วไปด้วยมาโครดังกล่าวคุณสามารถกระจายแอสเซมเบลอร์ได้อย่างมากโดยเปลี่ยนให้เป็นภาษาโปรแกรมที่ทรงพลังซึ่งสามารถแยก C และ Pascal ทุกประเภทออกจากกันเหมือนเศษผ้า

ฉันกำลังพูดถึงอะไร... เกี่ยวกับ RAM

ดังนั้นเราจึงแยกแยะที่อยู่ออก ตอนนี้คุณรู้แล้วว่าจะหาที่อยู่หน่วยความจำที่เซลล์ RAM ของผู้ใช้เริ่มต้นได้ที่ไหน - ในแผ่นข้อมูลส่วน Memory Map แต่มีไว้อ้างอิงให้ทราบครับ.

และในโค้ดของเรา RAM เริ่มต้นด้วยคำสั่ง DSEG จำเทมเพลตของเราได้ไหม

รวม "m16def.inc" ; เราใช้ ATMega16 ;= เริ่ม macro.inc ============================== ; มาโครที่นี่;= สิ้นสุด macro.inc ================================= ; แรม ================================================= ============ .ดีเอสอีจี ; ส่วนแรม; แฟลช ================================================= ========== .ซีเอสอีจี ; ส่วนรหัส หน่วยความจำแบบEEPROM ================================================= ======== .ESEG ; ส่วน EEPROM

หลังจาก .DSEG เราสามารถตั้งค่าตัวแปรของเราได้ และที่นี่เราก็มีเซลล์จำนวนหนึ่ง - ครอบครองเซลล์ใดเซลล์หนึ่ง ใส่ที่อยู่แล้วมีความสุข แต่ทำไมต้องนับที่อยู่ด้วยตนเอง? ให้คอมไพเลอร์คิดตรงนี้

ดังนั้นเราจะรับและตั้งฉลาก

0x0060 ## ;Variables 0x0061 ## 0x0062 ## 0x0063 ## ;Variables2 0x0064 ## 0x0065 ## ;Variables4 สามารถเริ่มต้นได้ที่นี่

เป็น ## ไบต์ใดๆ ตามค่าเริ่มต้น FF แน่นอนว่า ไม่จำเป็นต้องพูดถึงการพิมพ์ตัวแปร การเริ่มต้น การควบคุมการล้น และความสุขของชนชั้นกลางอื่นๆ นี่คือสปาร์ตา! ฉันหมายถึงผู้ประกอบ ทั้งหมดด้วยมือ
ถ้าเราวาดความคล้ายคลึงกับ C มันก็เหมือนกับการทำงานกับหน่วยความจำผ่านพอยน์เตอร์โมฆะเพียงอย่างเดียว ชาวซิชนิกจะเข้าใจ พวกเขาจะเข้าใจและหวาดกลัว เพราะ โลกนี้โหดร้ายและทรยศ ฉันคำนวณดัชนีผิดเล็กน้อยและข้อมูลอื่นๆ สูญหาย และประณามคุณจะพบข้อผิดพลาดนี้หากไม่ปรากฏขึ้นทันที

ดังนั้นความสนใจ ความสนใจ และความสนใจอีกครั้ง เรารันการดำเนินการของหน่วยความจำทั้งหมดผ่านการติดตาม และไม่มีอะไรจะล้มเหลวหรือล้น

คำสั่ง .ORG ยังทำงานในส่วนข้อมูลอีกด้วย โดยทำงานในลักษณะเดียวกันทุกประการ โดยจะถ่ายโอนที่อยู่ ในกรณีนี้คือ จากที่นี่ไปยังจุดสิ้นสุดของหน่วยความจำ รายละเอียดปลีกย่อยเพียงอย่างเดียว - ORG 0000 จะให้จุดเริ่มต้นของ RAM แก่เราและนี่คือ R0 และการลงทะเบียนอื่น ๆ และ RAM เป็นศูนย์กิโลเมตรโดยใช้ Mega16 เป็นตัวอย่างจะให้ ORG 0x0060 และในคอนโทรลเลอร์อื่นๆ ก็มีค่าอื่นด้วย ขี้เกียจอ่านแผ่นข้อมูลทุกครั้ง ดังนั้นจึงมีคำจำกัดความของแมโครเช่น SRAM_START ซึ่งระบุการเริ่มต้น RAM สำหรับ MK ที่ระบุ

ดังนั้นหากเราต้องการให้จุดเริ่มต้นของ RAM เช่น 100 ไบต์เหลืออยู่ภายใต้บัฟเฟอร์ขยะบางประเภท เราก็ทำเคล็ดลับนี้

1 2 3 4 .DSEG .ORG SRAM_START+100 ตัวแปร: .byte 3

DSEG .ORG SRAM_START+100 ตัวแปร: .byte 3

เสร็จแล้ว เราได้เคลียร์เขตกันชนของเราตั้งแต่ต้นจนถึง 100

โอเค เราได้แยกที่อยู่ออกแล้ว วิธีการทำงานกับเซลล์หน่วยความจำ? และเพื่อจุดประสงค์เหล่านี้จึงมีคำสั่งสองกลุ่ม LOAD และ STORE เป็นกลุ่มคำสั่งที่ใหญ่ที่สุด

ความจริงก็คือว่าไม่สามารถทำอะไรกับเซลล์ RAM ได้นอกจากการโหลดไบต์จาก RON ลงในเซลล์ หรือยกเลิกการโหลดไบต์จากเซลล์ลงใน RON

คำสั่ง Store (ST**) ถูกเขียนไปยัง RAM และคำสั่ง Load (LD**) จะถูกอ่าน

การอ่านไปที่การลงทะเบียน R16…R31 และระบุที่อยู่ของเซลล์โดยตรงในคำสั่ง นี่เป็นตัวอย่างง่ายๆ มีตัวแปรตัวแปรสามไบต์ซึ่งจะต้องเพิ่มขึ้น 1 นั่นคือ ดำเนินการตัวแปร ++

ตัวแปร DSEG: .byte 3 ตัวแปร2: .byte 1 .CSEG ; ตัวแปรอยู่ในหน่วยความจำ ก่อนอื่นคุณต้องได้รับมัน โบถส์ R16, ตัวแปร ; อ่านไบต์ตัวแปรแรกใน R16 LDS R17, Variables+1 ; อ่านไบต์ตัวแปรที่สองใน R17 LDS R18, Variables+2 ; ไบต์ที่สามใน R18; ทีนี้ลองบวก 1 เข้าไป เพราะ AVR ไม่สามารถบวกด้วยค่าคงที่ได้เท่านั้น หากต้องการลบคุณต้องบิดเบือน อย่างไรก็ตาม มันไม่ได้ทำให้เกิดปัญหาใดๆ เป็นพิเศษ ซูบิ R16,(-1) ; โดยทั่วไป SUBI จะเป็นการลบ แต่ -(- ให้ + SBCI R17,(-1) ; และนี่คือการถ่ายโอนจะถูกนำมาพิจารณา แต่จะเพิ่มเติมในภายหลัง SBCI R18,(-1) ; คณิตศาสตร์ในแอสเซมเบลอร์คือ เรื่องที่แตกต่าง ตัวแปร STS, R16 ; บันทึกทุกอย่างเหมือนเดิม ตัวแปร STS+1,R17 ตัวแปร STS+2,R18

หรือคุณสามารถใช้วิธีอื่นได้ การบันทึกทางอ้อมผ่านการลงทะเบียนดัชนี

ตัวแปร DSEG: .byte 3 ตัวแปร2: .byte 1 .CSEG ; ใช้ที่อยู่ของตัวแปรของเรา LDI YL,ต่ำ(ตัวแปร) LDI YH,สูง(ตัวแปร) ; ตัวแปรอยู่ในหน่วยความจำ ก่อนอื่นคุณต้องได้รับมัน LD R16, Y+ ; อ่านไบต์ตัวแปรแรกใน R16 LD R17, Y+ ; อ่านไบต์ตัวแปรที่สองใน R17 LD R18, Y+ ; ไบต์ที่สามใน R18; ทีนี้ลองบวก 1 เข้าไป เพราะ AVR ไม่สามารถบวกด้วยค่าคงที่ได้เท่านั้น หากต้องการลบคุณต้องบิดเบือน อย่างไรก็ตาม มันไม่ได้ทำให้เกิดปัญหาใดๆ เป็นพิเศษ ซูบิ R16,(-1) ; จริงๆ แล้ว SUBI นั้นเป็นการลบ แต่ -(- ให้ + SBCI R17,(-1) ; และนี่คือการโอนย้ายมาพิจารณา แต่จะเพิ่มเติมในภายหลัง SBCI R18,(-1) ; คณิตศาสตร์ในแอสเซมเบลอร์เป็นอีกเรื่องหนึ่ง ST -Y,R18 ; เราเก็บทุกอย่างไว้เหมือนเดิม ST -Y,R17 ; แต่กลับลำดับ ST -Y,R16

การดำเนินการที่มีการเพิ่มขึ้นภายหลังและการลดลงล่วงหน้าถูกนำมาใช้ที่นี่แล้ว ในตอนแรก เราจะอ่านก่อน จากนั้นจึงบวก 1 ลงในที่อยู่ ในส่วนที่สอง เราจะลบ 1 ออกจากที่อยู่ก่อนแล้วจึงบันทึก

สะดวกในการใช้คำสั่งแบบเพิ่มหน่วยดังกล่าวเพื่อวนซ้ำผ่านอาร์เรย์ในหน่วยความจำหรือตาราง
และยังมี LDD/STD การเขียน/อ่านแบบสัมพันธ์ทางอ้อม และตัวเลือกอื่นๆ สำหรับดัชนีทั้งสามประเภท (X,Y,Z) โดยทั่วไป ควันเอกสารข้อมูลและระบบคำสั่ง

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

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

แล้วเรื่องสแต็คล่ะ มันคืออะไร? และนี่คือพื้นที่แห่งความทรงจำ ทำงานบนหลักการของสแต็ก เหล่านั้น. อันสุดท้ายที่เขาวางลงเขาก็เอาอันแรก

สแต็กมีตัวชี้ที่ชี้ไปที่ด้านบนของสแต็ก รีจิสเตอร์ SP พิเศษมีหน้าที่รับผิดชอบสำหรับตัวชี้สแต็ก หรือค่อนข้างจะเป็นคู่รีจิสเตอร์ SPL และ SPH แต่ในไมโครคอนโทรลเลอร์ที่มี RAM เพียงเล็กน้อย เช่น ใน Tini2313 มีเพียง SPL เท่านั้น

เมื่อคอนโทรลเลอร์เริ่มทำงาน โดยปกติแล้วสิ่งแรกที่พวกเขาทำคือเริ่มต้นสแต็ก โดยเขียนที่อยู่ด้านล่างของสแต็กใน SP จากตำแหน่งที่จะขยาย โดยปกติแล้วนี่คือจุดสิ้นสุดของ RAM และจะขยายไปจนถึงจุดเริ่มต้น

ทำได้ด้วยวิธีนี้ตั้งแต่เริ่มต้นโปรแกรม:

1 2 3 4 5 LDI R16, ต่ำ (RAMEND) ออก SPL, R16 LDI R16, สูง (RAMEND) ออก SPH, R16

LDI R16, ต่ำ (RAMEND) ออก SPL, R16 LDI R16, สูง (RAMEND) ออก SPH, R16

โดยที่ RAMEND คือคำจำกัดความของแมโครที่ระบุจุดสิ้นสุดของ RAM ใน MK ปัจจุบัน

เพียงเท่านี้สแต็คก็พร้อมที่จะไป ข้อมูลถูกพุชลงบนสแต็กโดยใช้คำสั่ง PUSH Rn และดึงข้อมูลผ่าน POP Rn
Rn คือค่าใดๆ ของ RON

คำสั่ง CALL, RCALL, ICALL, RET, RETI และการเรียกการขัดจังหวะยังใช้งานได้กับสแต็ก แต่จะเพิ่มเติมในภายหลัง

มาเล่นกับสแต็กเพื่อดูว่ามันทำงานอย่างไร เพื่อทำความเข้าใจว่ามันเคลื่อนไหวอย่างไรและที่ไหน

ใส่รหัสต่อไปนี้ลงในสตูดิโอ:

ซีเอสอีจี; ส่วนรหัส LDI R16,ต่ำ(RAMEND); การเริ่มต้นสแต็ก OUT SPL, R16 LDI R16, สูง (RAMEND) OUT SPH, R16 LDI R17,0; กำลังโหลดค่า LDI R18.1 LDI R19.2 LDI R20.3 LDI R21.4 LDI R22.5 LDI R23.6 LDI R24.7 LDI R25.8 LDI R26.9 PUSH R17 ; เราใส่ค่าลงบนสแต็ก PUSH R18 PUSH R19 PUSH R20 PUSH R21 PUSH R22 PUSH R23 PUSH R24 PUSH R25 PUSH R26 POP R0 ; ค่าป๊อปจากสแต็ก POP R1 POP R2 POP R3 POP R4 POP R5 POP R6 POP R7 POP R8 POP R9

ตอนนี้ดำเนินการสตูดิโอทีละขั้นตอนและดูว่า SP เปลี่ยนแปลงไปอย่างไร Stack Pointer สามารถเห็นได้ในสตูดิโอในตำแหน่งเดียวกับ Program Counter

ขั้นแรก เราเริ่มต้นสแต็กและโหลดรีจิสเตอร์พร้อมข้อมูล ผลลัพธ์จะเป็นภาพต่อไปนี้:

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

กด R16 กด R17 ป๊อป R16 ป๊อป R17

ตัวอย่างเช่นฉันได้พูดคุยเกี่ยวกับข้อ จำกัด ของ RON ที่ต่ำกว่าแล้ว - พวกเขาไม่อนุญาตให้คุณเขียนตัวเลขลงในตัวคุณเองโดยตรง ผ่านการลงทะเบียนของกลุ่มอาวุโสเท่านั้น แต่นี่ไม่สะดวก!

ปัญหาได้รับการแก้ไขโดยใช้มาโคร ฉันเรียกมันว่า LDIL - LDI ต่ำ

มาโคร LDIL PUSH R17; มาบันทึกค่าของรีจิสเตอร์ที่สูงกว่าตัวใดตัวหนึ่งลงในสแต็ก LDI R17,@1 ; ลองโหลดมูลค่าปัจจุบันของเรา MOV @0,R17 ลงไป มาโอนค่าไปที่รีจิสเตอร์ของกลุ่มต่ำกัน ป๊อป R17; มาคืนค่ารีจิสเตอร์สูงสุดจากสแต็กกัน .ENDM

ตอนนี้คุณสามารถใช้คำสั่งโฮมเมดของเราได้อย่างง่ายดาย

1 LDIL R0.18

เมื่อเวลาผ่านไปไฟล์ที่มีมาโครจะได้รับคำสั่งแบบโฮมเมดและการทำงานก็กลายเป็นเรื่องง่ายและน่าพึงพอใจ

ข้อผิดพลาดของสแต็ก
สแต็กขยายไปสู่ข้อมูล และตอนนี้ลองจินตนาการว่าเรามีตัวแปรสถานะในหน่วยความจำและอยู่ที่ที่อยู่ เช่น 0x0450 ใกล้ถึงยอดกองอย่างอันตราย ตัวแปรจะจัดเก็บ เช่น สถานะของเครื่องสถานะจำกัดซึ่งตรรกะเพิ่มเติมของโปรแกรมขึ้นอยู่กับ สมมติว่ามี 3 เราก็ไปทำอย่างหนึ่ง ถ้ามี 4 ก็อย่างอื่น ถ้ามี 5 ก็อย่างอื่น ไปเรื่อยๆ จนถึง 255 สถานะ และตามตรรกะของการทำงาน หลังจาก 3 ควรมี 4re แต่ไม่ใช่ 10

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

หรือตัวอย่างที่ตรงกันข้าม - สแต็กถูกผลักขึ้นไปที่ตัวแปร แต่ในขณะนั้น ตัวแปรได้รับการอัปเดตและเขียนทับข้อมูลสแต็ก เป็นผลให้มีบางอย่างผิดปกติถูกลบออกจากสแต็ก (โดยปกติจะเป็นที่อยู่ผู้ส่งที่คดเคี้ยว) และโปรแกรมขัดข้อง ตัวเลือกนี้ไม่เป็นอันตรายมากกว่ามากเพราะ... ในกรณีนี้ วงกบจะมองเห็นได้ทันที และไม่โผล่ขึ้นมาทันทีหลังจากที่พระเจ้าทรงทราบว่านานแค่ไหน

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

แอสเซมเบลอร์มักพบข้อผิดพลาดสแต็กอื่น ๆ ก่อนอื่นเลยการหลงลืม ฉันใส่บางอย่างเข้าไปแล้วลืมเอาออก หากปัญหาอยู่ในรูทีนย่อยหรือการขัดจังหวะ ที่อยู่ผู้ส่งจะบิดเบี้ยว (เพิ่มเติมในภายหลัง) สแตกจะถูกแยกออก และโปรแกรมจะพังทันที หรือไม่ตั้งใจ - ฉันบันทึกข้อมูลในลำดับหนึ่งและเรียกค้นอีกครั้ง อ๊ะ เนื้อหาของการลงทะเบียนได้ถูกแลกเปลี่ยนแล้ว

เพื่อหลีกเลี่ยงข้อผิดพลาดดังกล่าว ก่อนอื่นคุณต้องตรวจสอบสแต็กและประการที่สอง วางแผนการวางตำแหน่งของตัวแปรในหน่วยความจำอย่างถูกต้อง เก็บพื้นที่และตัวแปรที่สำคัญที่สุด (เช่น เครื่องสถานะหรือแฟล็กลอจิกโปรแกรม) ให้ห่างจากด้านบนของสแต็ก ใกล้กับจุดเริ่มต้นของหน่วยความจำ

บางคนอาจคิดว่าพวกเขาสามารถนำสแต็กและวางไว้ไม่ได้ที่ส่วนท้ายสุดของ RAM แต่อยู่ใกล้กว่านั้น โดยทิ้งกระเป๋าไว้สำหรับข้อมูลสำคัญไว้เบื้องหลัง ไม่ใช่ความคิดที่ดีจริงๆ ความจริงก็คือสแต็กสามารถผลักลงทั้งด้านล่างโดยใช้คำสั่ง PUSH และขึ้นไปโดยใช้คำสั่ง POP อย่างที่สองถึงแม้จะเกิดขึ้นไม่บ่อยนักเพราะ... นี่เป็นบาปของมือที่คดเคี้ยวมากกว่าอัลกอริทึมที่ยุ่งยาก แต่มันก็เกิดขึ้นเช่นกัน
แต่สิ่งสำคัญคือตัวสแต็กนั้นเป็นโครงสร้างที่สำคัญมาก กลไกทั้งหมดของรูทีนย่อยและฟังก์ชันทั้งหมดขึ้นอยู่กับกลไกนั้น ดังนั้นความล้มเหลวของสแต็กจึงเป็นเรื่องฉุกเฉินไม่ว่าในกรณีใด

ซ้อนวิปริต
หัวข้อที่ฉันชอบ =)))) แม้ว่าตัวชี้สแต็กจะถูกคำนวณในระหว่างคำสั่ง PUSH และ POP แต่ก็ไม่มีใครหยุดเราไม่ให้เลือกมันออกจาก SP และใช้ค่าของมันเพื่อคำนวณที่อยู่ของข้อมูลที่วางอยู่ด้วยตนเอง สแต็ก หรือแก้ไขข้อมูลสแต็กตามที่เราต้องการ
เพื่ออะไร? คุณจะพบแอปพลิเคชั่นมากมายหากคุณเครียดสมองและเริ่มคิดนอกกรอบ :))))

นอกจากนี้ พารามิเตอร์จะถูกส่งผ่านสแต็กใน C และ Pascal แบบคลาสสิกบนสถาปัตยกรรม x86 และการทำงานของตัวแปรภายในเครื่อง เหล่านั้น. ก่อนที่จะเรียกใช้ฟังก์ชัน ขั้นแรกตัวแปรทั้งหมดจะถูกผลักลงบนสแต็ก จากนั้นหลังจากการเรียกใช้ฟังก์ชัน ไบต์ของตัวแปรท้องถิ่นในอนาคตจะถูกผลักลงบนสแต็ก

จากนั้น เมื่อใช้ SP เป็นจุดอ้างอิง เราจะสามารถปฏิบัติต่อตัวแปรเหล่านี้ได้ตามต้องการ และเมื่อสแต็กถูกปลดปล่อยด้วยคำสั่ง POP สแต็กเหล่านั้นจะถูกทำลาย ทำให้หน่วยความจำว่างมากขึ้น

ใน AVR ทุกอย่างจะแตกต่างกันบ้าง (เห็นได้ชัดว่าเป็นเพราะหน่วยความจำจำนวนน้อย ซึ่งคุณไม่สามารถเจาะเข้าไปในสแต็กได้ แต่มี RON จำนวนมาก) แต่คุณสามารถลองใช้กลไกนี้ได้

จริงอยู่นี่คล้ายกับการผ่าตัดระบบประสาทอยู่แล้ว ฉันทำผิดพลาดเล็กน้อยและผู้ป่วยเสียชีวิต

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

หน่วยความจำแฟลช

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

เราจะเขียนมันลงไป แต่เราจะได้มันมาได้อย่างไร? ในการทำเช่นนี้คุณต้องใส่อะไรบางอย่างลงไปก่อน
ดังนั้น ให้เพิ่มป้ายกำกับที่ส่วนท้ายของโปรแกรม เช่น ภายในเซ็กเมนต์ .CSEG เช่น data จากนั้นจึงป้อนข้อมูลของคุณหลังจากนั้นโดยใช้ตัวดำเนินการ .db

ตัวดำเนินการ DB หมายความว่าเราใช้ไบต์สำหรับแต่ละค่าคงที่ นอกจากนี้ยังมีตัวดำเนินการที่ระบุค่าคงที่แบบไบต์คู่ DW (เช่นเดียวกับ DD และ DQ)

1 ข้อมูล: .db 12,34,45,23

ข้อมูล: .db 12,34,45,23

ตอนนี้ ป้ายข้อมูลชี้ไปยังที่อยู่ของไบต์แรกของอาร์เรย์ ไบต์ที่เหลือจะอยู่ในตำแหน่งออฟเซ็ต เพียงเพิ่มหนึ่งไบต์ลงในที่อยู่

รายละเอียดปลีกย่อยประการหนึ่งคือคอมไพลเลอร์แทนที่ที่อยู่มาร์ก และพิจารณาว่าเป็นที่อยู่การกระโดดสำหรับตัวนับโปรแกรม และถ้าคุณจำได้ว่าเขาจัดการกับคำแบบไบต์คู่ - ท้ายที่สุดแล้วความยาวของคำสั่งอาจเป็น 2 หรือ 4 ไบต์ก็ได้

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

หากต้องการโหลดข้อมูลจากหน่วยความจำโปรแกรม ให้ใช้คำสั่งจากกลุ่มโหลดหน่วยความจำโปรแกรม

ตัวอย่างเช่น LPM Rn,Z

มันจะเข้าสู่รีจิสเตอร์ Rn ซึ่งเป็นตัวเลขจากเซลล์ที่ชี้โดยคู่รีจิสเตอร์ Z ฉันขอเตือนคุณว่า Z คือรีจิสเตอร์สองตัว R30 (ZL) และ R31 (ZH) ไบต์ต่ำของที่อยู่จะถูกป้อนลงใน R30 และไบต์สูงจะถูกป้อนลงใน R31

ในโค้ดดูเหมือนว่านี้:

LDI ZL,ต่ำ(ข้อมูล*2) ; เราป้อนไบต์ต่ำของที่อยู่ลงในคู่รีจิสเตอร์ Z LDI ZH,high(data*2) ; เราป้อนไบต์สูงของที่อยู่ลงในคู่รีจิสเตอร์ Z การคูณด้วยสองเกิดจากการที่อยู่ที่ระบุไว้ใน; เป็นคำแบบไบต์คู่ แต่เราต้องการเป็นไบต์ ; ดังนั้นเราจึงคูณด้วยสอง หลังจากโหลดที่อยู่แล้วคุณสามารถโหลดหมายเลขจากหน่วยความจำ LPM R16, Z; ใน register R16 หลังจากคำสั่งนี้จะมีหมายเลข 12, ; นำมาจากหน่วยความจำโปรแกรม ; ที่ไหนสักแห่งในตอนท้ายของโปรแกรม แต่ในส่วนข้อมูล .CSEG: .db 12,34,45,23

ตอนนี้เราคุ้นเคยกับความสามารถและฟังก์ชันบางอย่างของไมโครคอนโทรลเลอร์แล้ว คำถามเชิงตรรกะก็เกิดขึ้นตามธรรมชาติ: สิ่งที่จำเป็นในการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ต้องใช้โปรแกรมและอุปกรณ์อะไรบ้าง และจะหาได้จากที่ไหน?


เพื่อให้ไมโครคอนโทรลเลอร์สามารถแก้ไขปัญหาและทำหน้าที่บางอย่างได้นั้นจะต้องได้รับการตั้งโปรแกรมนั่นคือต้องเขียนโปรแกรมหรือโค้ดโปรแกรมลงไป

โครงสร้างและลำดับการเขียนโปรแกรม

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

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


เราจะเขียนโปรแกรมด้วยภาษา C ซึ่งเป็นภาษาระดับสูง โปรแกรมในภาษา C เขียนได้เร็วกว่ามากเมื่อเทียบกับโปรแกรมที่คล้ายกันใน Assembly นอกจากนี้ โปรแกรมที่ซับซ้อนทั้งหมดยังเขียนด้วยภาษาซีเป็นหลัก

ที่นี่เราจะไม่เปรียบเทียบข้อดีและข้อเสียของการเขียนโปรแกรมใน Assembly และ C เมื่อเวลาผ่านไป เมื่อได้รับประสบการณ์ในการเขียนโปรแกรม MK คุณจะได้ข้อสรุปที่เป็นประโยชน์สำหรับตัวคุณเอง

รหัสโปรแกรมสามารถเขียนได้ในโปรแกรมแก้ไขข้อความมาตรฐานเช่น Notepad อย่างไรก็ตาม ในทางปฏิบัติ พวกเขาใช้โปรแกรมแก้ไขที่สะดวกกว่า ซึ่งจะกล่าวถึงด้านล่าง

การรวบรวมโปรแกรม

รหัส C ที่เราเขียนยังไม่สามารถเข้าใจได้สำหรับไมโครคอนโทรลเลอร์ เนื่องจาก MK เข้าใจคำสั่งเฉพาะในระบบไบนารี่ (หรือเลขฐานสิบหก) ซึ่งเป็นชุดของศูนย์และหน่วย ดังนั้นรหัส C จะต้องถูกแปลงเป็นศูนย์และรหัส เพื่อจุดประสงค์นี้จึงมีการใช้โปรแกรมพิเศษที่เรียกว่า คอมไพเลอร์และกระบวนการนั้นเอง การแปลงโค้ดเรียกว่าการคอมไพล์.

หากต้องการแฟลชเฟิร์มแวร์ MK อุปกรณ์ที่เรียกว่า โปรแกรมเมอร์. อินพุตเชื่อมต่อกับพอร์ต COM หรือ USB ขึ้นอยู่กับประเภทของโปรแกรมเมอร์และเอาต์พุตเชื่อมต่อกับพินบางตัวของไมโครคอนโทรลเลอร์


มีโปรแกรมเมอร์และบอร์ดพัฒนาให้เลือกมากมาย แต่เราค่อนข้างพอใจกับสิ่งที่ง่ายที่สุด โปรแกรมเมอร์ซึ่งในประเทศจีนมีราคาไม่เกิน 3 ดอลลาร์


หลังจากที่ไมโครคอนโทรลเลอร์กระพริบ โปรแกรมจะถูกดีบั๊กและทดสอบบนอุปกรณ์จริงหรือตามที่พวกเขาพูดบนฮาร์ดแวร์

ตอนนี้เรามาสรุปขั้นตอนการเขียนโปรแกรมไมโครคอนโทรลเลอร์กัน


เมื่อเขียนโปรแกรมง่าย ๆ คุณสามารถทำได้โดยไม่ต้องมีจุดที่สองนั่นคือโดยไม่ต้องวาดอัลกอริทึมบนกระดาษ แค่เก็บมันไว้ในหัวก็เพียงพอแล้ว

ควรสังเกตว่าการดีบักและการทดสอบโปรแกรมจะดำเนินการก่อนที่จะกระพริบเฟิร์มแวร์ MK

ชุดโปรแกรมที่จำเป็น

มีโปรแกรมที่มีประโยชน์และสะดวกมากมายสำหรับการเขียนโปรแกรม MK พวกเขามีทั้งแบบชำระเงินและฟรี ในหมู่พวกเขามีสามสิ่งหลัก:

1) แอตเมล สตูดิโอ

2) CodeVisionAVR

3) WinAVR

โปรแกรมทั้งหมดนี้เกี่ยวข้องกับ ไอดีฉันแบบบูรณาการ ดีการพัฒนา อีสภาพแวดล้อม – ​​สภาพแวดล้อมการพัฒนาแบบบูรณาการ. คุณสามารถเขียนโค้ด คอมไพล์ และดีบักมันได้

คุณควรใส่ใจกับ Code Vision AVR IDE นี้ทำให้การเขียนโค้ดง่ายขึ้นและเร็วขึ้น อย่างไรก็ตามโปรแกรมได้รับการชำระแล้ว

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

การดีบักเฟิร์มแวร์และโปรแกรม

เราจะแฟลชไมโครคอนโทรลเลอร์โดยใช้โปรแกรมเพิ่มเติม.

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

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

องค์ประกอบสำคัญอีกประการหนึ่งที่จะเป็นประโยชน์สำหรับเราคือเอกสารทางเทคนิคของ MK ที่เรียกว่า แผ่นข้อมูล. โดยทั่วไปคุณจะต้องดาวน์โหลด เอกสารข้อมูลสำหรับไมโครคอนโทรลเลอร์ ATmega8.

คิเซเลฟ โรมัน พฤษภาคม 2550 บทความอัปเดตเมื่อวันที่ 26 พฤษภาคม 2014

แล้วไมโครคอนโทรลเลอร์คืออะไร (ต่อไปนี้จะเรียกว่า MK)? พูดง่ายๆ ก็คือคอมพิวเตอร์ขนาดเล็กที่อยู่ในวงจรรวมตัวเดียว มีโปรเซสเซอร์ (หน่วยลอจิกทางคณิตศาสตร์หรือ ALU), หน่วยความจำแฟลช, หน่วยความจำ EEPROM, รีจิสเตอร์จำนวนมาก, พอร์ต I/O รวมถึงระฆังและนกหวีดเพิ่มเติม เช่น ตัวจับเวลา ตัวนับ ตัวเปรียบเทียบ USART ฯลฯ หลังจากจ่ายไฟแล้ว ไมโครคอนโทรลเลอร์จะบู๊ตและเริ่มรันโปรแกรมที่จัดเก็บไว้ในหน่วยความจำแฟลช ในขณะเดียวกันก็สามารถควบคุมอุปกรณ์ภายนอกได้หลากหลายผ่านพอร์ต I/O

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

AVR คือไมโครคอนโทรลเลอร์ขนาด 8 บิต กล่าวคือ ALU สามารถดำเนินการง่ายๆ ด้วยตัวเลขเพียง 8 บิตในรอบสัญญาณนาฬิกาเดียว ถึงเวลาพูดคุยเกี่ยวกับ MK ที่เราจะใช้ ฉันกำลังทำงานกับ ATMega16 MK เป็นเรื่องปกติมากและสามารถซื้อได้ในร้านขายอะไหล่วิทยุเกือบทุกแห่งในราคาประมาณ 100 รูเบิล หากคุณไม่พบ คุณสามารถซื้อ MK อื่น ๆ ของซีรีส์ MEGA ได้ แต่ในกรณีนี้ คุณจะต้องค้นหาเอกสารประกอบ เนื่องจาก "ขา" เดียวกันของ MK ที่แตกต่างกันสามารถทำหน้าที่ต่างกันได้ และ เมื่อเชื่อมต่อแล้วดูเหมือนว่าหากข้อสรุปทั้งหมดถูกต้องคุณอาจได้อุปกรณ์ที่ใช้งานได้หรืออาจเป็นเพียงควันกลิ่นเหม็น เมื่อซื้อ ATMega16 ตรวจสอบให้แน่ใจว่ามาในแพ็คเกจ DIP ขนาดใหญ่ 40 พิน และซื้อซ็อกเก็ตสำหรับเสียบเข้าไปด้วย หากต้องการใช้งานคุณจะต้องมีอุปกรณ์เพิ่มเติม: ไฟ LED, ปุ่ม, ขั้วต่อ ฯลฯ

ATMega16 มีฟังก์ชันที่หลากหลายมากมาย นี่คือคุณสมบัติบางประการ:

  • ความถี่สัญญาณนาฬิกาสูงสุด – 16 MHz (8 MHz สำหรับ ATMega16L)
  • คำสั่งส่วนใหญ่จะดำเนินการในหนึ่งรอบสัญญาณนาฬิกา
  • 32 การลงทะเบียนการทำงาน 8 บิต
  • พอร์ต I/O 8 บิตเต็มรูปแบบ 4 พอร์ต
  • ตัวจับเวลา/ตัวนับ 8 บิตสองตัว และตัวนับ 16 บิตหนึ่งตัว
  • ตัวแปลงแอนะล็อกเป็นดิจิทัล 10 บิต (ADC)
  • เครื่องกำเนิดสัญญาณนาฬิกาภายในที่ 1 MHz
  • เครื่องเปรียบเทียบแบบอะนาล็อก
  • อินเทอร์เฟซ SPI, I2C, TWI, RS-232, JTAG
  • การเขียนโปรแกรมในวงจรและการเขียนโปรแกรมด้วยตนเอง
  • โมดูลการปรับความกว้างพัลส์ (PWM)

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

ในที่สุดเรามาลงมือทำธุรกิจกันดีกว่า ฉันแนะนำให้สร้างบอร์ดพัฒนาและดีบั๊กพิเศษสำหรับไมโครคอนโทรลเลอร์ซึ่งคุณสามารถประกอบวงจรไฟฟ้าใด ๆ ด้วยไมโครคอนโทรลเลอร์โดยไม่ต้องใช้หัวแร้ง (หรือเกือบจะไม่มีเลย) การใช้บอร์ดดังกล่าวจะช่วยอำนวยความสะดวกในการทำงานกับ MK อย่างมากและเร่งกระบวนการเรียนรู้การเขียนโปรแกรมให้เร็วขึ้น ดูเหมือนว่านี้:

สิ่งที่คุณต้องการสำหรับสิ่งนี้?

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

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

ให้เราอธิบายว่าตอนนี้เราสนใจขาไหน

  • VCC - จ่ายไฟที่นี่ (4.5 - 5.5 V) จากแหล่งที่มีความเสถียร
  • GND – กราวด์
  • RESET – รีเซ็ต (ที่ระดับแรงดันไฟฟ้าต่ำ)
  • XTAL1, XTAL2 – เครื่องสะท้อนเสียงแบบควอตซ์เชื่อมต่ออยู่ที่นี่
  • PA, PB, PC, PD – พอร์ตอินพุต/เอาท์พุต (A, B, C และ D ตามลำดับ)

สิ่งใดก็ตามที่ผลิต 7-11 V DC สามารถใช้เป็นแหล่งพลังงานได้ เพื่อการทำงานที่เสถียรของ MK จำเป็นต้องมีแหล่งจ่ายไฟที่เสถียร ในฐานะโคลงคุณสามารถใช้วงจรไมโครซีรีส์ 7805 ได้ สิ่งเหล่านี้คือตัวปรับเสถียรแบบรวมเชิงเส้นซึ่งอินพุตนั้นมาพร้อมกับกระแสที่ไม่เสถียรโดยตรง 7-11 V และเอาต์พุตคือ 5 V ของกระแสที่เสถียร ก่อนและหลัง 7805 คุณต้องติดตั้งตัวเก็บประจุตัวกรอง (อิเล็กโทรไลต์สำหรับกรองสัญญาณรบกวนความถี่ต่ำและเซรามิกสำหรับความถี่สูง) หากคุณไม่พบโคลงคุณสามารถใช้แบตเตอรี่ 4.5 V เป็นแหล่งพลังงานได้ MK จะต้องได้รับพลังงานโดยตรงจากแบตเตอรี่

ด้านล่างนี้เป็นแผนภาพการเชื่อมต่อ MK:

ทีนี้ลองหาว่านี่คืออะไร

BQ1 คือเครื่องสะท้อนเสียงแบบควอตซ์ที่ตั้งค่าความถี่การทำงานของ MK คุณสามารถตั้งค่าได้สูงสุด 16 MHz แต่เนื่องจากเราวางแผนที่จะทำงานในอนาคตด้วยพอร์ต COM ฉันขอแนะนำให้ใช้ตัวสะท้อนเสียงสำหรับความถี่ต่อไปนี้: 14.7456 MHz, 11.0592 MHz, 7.3725 MHz, 3.6864 MHz หรือ 1 ,8432 MHz (ภายหลัง จะได้ชัดเจนว่าทำไม) ผมใช้ 11.0592 MHz. เห็นได้ชัดว่ายิ่งความถี่สูง ความเร็วของอุปกรณ์ก็จะยิ่งสูงขึ้นตามไปด้วย

R1 เป็นตัวต้านทานแบบดึงขึ้นที่รักษาแรงดันไฟฟ้าไว้ที่ 5 V ที่อินพุต RESET ระดับแรงดันไฟฟ้าต่ำบนอินพุตนี้บ่งชี้ถึงการรีเซ็ต หลังจากการรีเซ็ต MK จะบู๊ต (10 - 15 ms) และเริ่มรันโปรแกรมอีกครั้ง เนื่องจากนี่คืออินพุตอิมพีแดนซ์สูง คุณจึงไม่สามารถปล่อยให้มัน "ห้อยอยู่ในอากาศ" ได้ - ปิ๊กอัพตัวเล็ก ๆ บนมันจะนำไปสู่การรีเซ็ต MK โดยไม่คาดคิด นี่คือสิ่งที่ R1 มีไว้เพื่อ เพื่อความน่าเชื่อถือ ฉันแนะนำให้ติดตั้งตัวเก็บประจุ C6 ด้วย (ไม่เกิน 20 µF)

SB1 – ปุ่มรีเซ็ต

ตัวสะท้อนควอทซ์และตัวเก็บประจุตัวกรอง C3 ควรตั้งอยู่ใกล้กับ MK มากที่สุด (ไม่เกิน 5-7 ซม.) เนื่องจากมิฉะนั้นอาจเกิดการรบกวนในสายไฟส่งผลให้ MK ทำงานผิดปกติ

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

ตอนนี้เราได้จัดการกับฮาร์ดแวร์แล้ว ก็ถึงเวลาที่จะไปยังซอฟต์แวร์

มีสภาพแวดล้อมการพัฒนาหลายอย่างสำหรับการเขียนโปรแกรม AVR ประการแรก นี่คือ AVR Studio - ระบบการเขียนโปรแกรมอย่างเป็นทางการจาก Atmel ช่วยให้คุณสามารถเขียนในโปรแกรมแอสเซมเบลอร์และดีบักที่เขียนด้วยแอสเซมบลี C และ C++ IAR คือระบบการเขียนโปรแกรมเชิงพาณิชย์ในภาษา C, C++ และแอสเซมบลี WinAVR เป็นคอมไพเลอร์โอเพ่นซอร์ส AtmanAVR คือระบบการเขียนโปรแกรมสำหรับ AVR ที่มีอินเทอร์เฟซเกือบจะเหมือนกับ Visual C++ 6 ทุกประการ นอกจากนี้ AtmanAVR ยังช่วยให้คุณสามารถดีบักโปรแกรมและมีฟังก์ชันตัวช่วยมากมายที่ทำให้การเขียนโค้ดง่ายขึ้น ระบบการเขียนโปรแกรมนี้เป็นระบบเชิงพาณิชย์ แต่ตามใบอนุญาต คุณสามารถใช้งานได้ฟรีเป็นเวลาหนึ่งเดือน

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

ก่อนอื่นต้องหา IAR ซะก่อน เป็นเรื่องปกติมากและการค้นหาไม่ควรเป็นปัญหา หลังจากดาวน์โหลด IAR 3.20 จากที่ไหนสักแห่งแล้ว ให้ติดตั้งคอมไพเลอร์/สภาพแวดล้อมการทำงานแล้วเปิดใช้งาน หลังจากนี้คุณสามารถเริ่มทำงานได้

หลังจากเปิดตัว IAR แล้ว ให้เลือก ไฟล์/ใหม่/พื้นที่ทำงานเลือกเส้นทางไปยังโปรเจ็กต์ของเราและสร้างโฟลเดอร์สำหรับโปรเจ็กต์และตั้งชื่อ เช่น “Prog1” ตอนนี้เรามาสร้างโครงการกัน: โครงการ / สร้างโครงการใหม่...เรียกมันว่า "Prog1" ด้วย คลิกขวาที่ชื่อโครงการในแผนผังโครงการและเลือก "ตัวเลือก"

ที่นี่เราจะกำหนดค่าคอมไพเลอร์สำหรับ MK เฉพาะ ขั้นแรก คุณต้องเลือกประเภทโปรเซสเซอร์ ATMega16 บนแท็บ Target ทำเครื่องหมายในช่อง Enable bit Definition in I/O-include files บนแท็บ Library Configuration (เพื่อให้คุณสามารถใช้ชื่อบิตของ MK register ต่างๆ ในโค้ดโปรแกรมได้ ) และเลือกประเภทไลบรารี C ที่นั่น /EU++ ในหมวดหมู่ ICCAVR คุณต้องกาเครื่องหมายที่ช่องเปิดใช้งานการสนับสนุนหลายไบต์บนแท็บภาษา และปิดการเพิ่มประสิทธิภาพบนแท็บการเพิ่มประสิทธิภาพ (ไม่เช่นนั้นจะทำให้โปรแกรมแรกของเราเสียหาย)

จากนั้นเลือกหมวดหมู่ XLINK ที่นี่คุณจะต้องกำหนดรูปแบบของไฟล์ที่คอมไพล์ เนื่องจากขณะนี้เรากำลังตั้งค่าตัวเลือกสำหรับโหมด Debug ดังที่อธิบายไว้ในชื่อเรื่อง เราจึงต้องได้รับไฟล์การดีบักเป็นเอาต์พุต หลังจากนั้นเราจะเปิดใน AVR Studio ในการดำเนินการนี้ คุณจะต้องเลือก extension.cof และประเภทไฟล์คือ ubrof 7

ตอนนี้คลิกตกลง จากนั้นเปลี่ยน Debug เป็น Release

ไปที่ตัวเลือกอีกครั้ง โดยที่พารามิเตอร์ทั้งหมดยกเว้น XLINK จะถูกตั้งค่าให้เหมือนกัน ใน XLINK ให้เปลี่ยนนามสกุลเป็น .hex และรูปแบบไฟล์เป็น intel-standart

นั่นคือทั้งหมดที่ ตอนนี้คุณสามารถเริ่มเขียนโปรแกรมแรกของคุณได้แล้ว สร้างแหล่งที่มา/ข้อความใหม่และป้อนรหัสต่อไปนี้:

#รวม"iom16.h" สั้น ๆ ที่ไม่ได้ลงนาม int i; เป็นโมฆะหลัก( เป็นโมฆะ) (DDRB = 255; พอร์ตบี = 0; ในขณะที่(1) { ถ้า(พอร์ตบี == 255) พอร์ตบี = 0; อื่นพอร์ตบี++; สำหรับ(i=0; ผม

ไฟล์ "iom16.h" อยู่ในโฟลเดอร์ (C:\ไฟล์โปรแกรม)\IAR Systems\Embedded Workbench 3.2\avr\inc. หากคุณใช้ MK อื่น เช่น ATMega64 ให้เลือกไฟล์ “iom64.h” ไฟล์ส่วนหัวเหล่านี้เก็บข้อมูลเกี่ยวกับ MK: ชื่อของรีจิสเตอร์ บิตในรีจิสเตอร์ และชื่อของอินเทอร์รัปต์ แต่ละพินของพอร์ต A, B, C หรือ D สามารถทำหน้าที่เป็นอินพุตหรือเอาต์พุตได้ สิ่งนี้ถูกกำหนดโดย Data Direction Register (DDR) 1 ทำให้ขาเป็นเอาต์พุต 0 เป็นอินพุต ดังนั้นโดยการตั้งค่าเช่น DDRA = 13 เราสร้างเอาต์พุต "ขา" PB0, PB2, PB3 ส่วนที่เหลือ - อินพุตเพราะ 13 ในไบนารี่คือ 00001101

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



ตอนนี้เราบันทึกไฟล์นี้ในโฟลเดอร์โปรเจ็กต์เป็น Prog1.c คัดลอกไฟล์ iom16.h ไปยังโฟลเดอร์โปรเจ็กต์ เลือก Project/Add Files และเพิ่ม “iom16.h” และ “Prog1.c” เลือก Release กด F7 โปรแกรมคอมไพล์แล้วข้อความจะปรากฏขึ้น:


จำนวนข้อผิดพลาดทั้งหมด: 0
จำนวนคำเตือนทั้งหมด: 0

นี่คือรูปถ่ายของโปรแกรมเมอร์ของฉัน:

ดาวน์โหลดโปรแกรมเมอร์ AVReal คัดลอก (AVReal32.exe) ไปยังโฟลเดอร์ Release/exe ซึ่งควรเก็บไฟล์ Prog1.hex เราจ่ายไฟให้กับ MK เชื่อมต่อสายเคเบิลโปรแกรม เปิด Far Manager (สะดวกที่สุดในการแฟลช MK) ไปที่โฟลเดอร์นี้กด Ctrl+O เนื่องจากเรามี MK ใหม่ เราจึงเติมของ

avreal32.exe +MEGA16 -o11.0592MHZ -p1 -fblev=0,jtagen=1,cksel=F,sut=1 –w

อย่าลืมป้อนความถี่ที่ถูกต้องหากคุณไม่ได้ใช้ 11059200 Hz! ขณะเดียวกันก็เรียกว่า. ฟิวส์ - รีจิสเตอร์ที่ควบคุมการทำงานของมัน (การใช้เครื่องกำเนิดไฟฟ้าภายใน, Jtag ฯลฯ ) หลังจากนี้ก็พร้อมรับโปรแกรมแรก โปรแกรมเมอร์จะได้รับพอร์ต LPT ความถี่ชื่อไฟล์และอื่น ๆ ที่ใช้เป็นพารามิเตอร์ (ทั้งหมดแสดงอยู่ในคำอธิบายของ AVReal) เราโทร:

Avreal32.exe + Mega16 -o11.0592MHz -p1 -e -w -az -% Prog1.hex

หากการเชื่อมต่อถูกต้อง โปรแกรมเมอร์จะรายงานการเขียนโปรแกรมสำเร็จ ไม่มีการรับประกันว่าจะใช้งานได้ในครั้งแรก (ครั้งแรกที่คุณเรียกใช้โปรแกรม) บางครั้งฉันเองก็ถูกตั้งโปรแกรมเป็นครั้งที่สอง บางทีพอร์ต LPT อาจผิดปกติหรือมีสิ่งรบกวนในสายเคเบิล หากเกิดปัญหา ให้ตรวจสอบสายเคเบิลของคุณอย่างระมัดระวัง จากประสบการณ์ของฉันเองฉันรู้ว่า 60% ของการทำงานผิดพลาดเกี่ยวข้องกับการขาดการติดต่อในตำแหน่งที่ถูกต้อง 20% กับการมีอยู่ของสิ่งที่ไม่จำเป็นและอีก 15% จากการบัดกรีสิ่งผิดไปในสิ่งที่ผิดอย่างผิดพลาด หากทุกอย่างล้มเหลว โปรดอ่านคำอธิบายของโปรแกรมเมอร์แล้วลองสร้าง Byte Blaster

สมมติว่าทุกอย่างเหมาะกับคุณ หากคุณเชื่อมต่อ LED แปดดวงเข้ากับพอร์ต B ของ MK (ทำสิ่งนี้โดยปิด MK และขอแนะนำให้รวมตัวต้านทาน 300-400 โอห์มเป็นอนุกรมพร้อมกับ LED) และใช้พลังงาน ปาฏิหาริย์เล็ก ๆ จะเกิดขึ้น - a “ คลื่น” จะวิ่งผ่านพวกเขา!

© คิเซเลฟ โรมัน
พฤษภาคม 2550

ธันวาคม 2558

1. ข้อดีของวิธีการที่เสนอ

วงจรอุปกรณ์ที่ใช้ไมโครคอนโทรลเลอร์ (MCU) มักจะโดดเด่นด้วยการผสมผสานระหว่างคุณสมบัติที่ยากต่อการรวมสองประการ: ความเรียบง่ายสูงสุดและฟังก์ชันการทำงานที่สูง นอกจากนี้ฟังก์ชันการทำงานยังสามารถเปลี่ยนแปลงและขยายได้ในอนาคตโดยไม่ต้องทำการเปลี่ยนแปลงใดๆ กับวงจร เพียงแค่เปลี่ยนโปรแกรม (กะพริบ) คุณสมบัติเหล่านี้อธิบายได้จากข้อเท็จจริงที่ว่าผู้สร้างไมโครคอนโทรลเลอร์สมัยใหม่พยายามวางทุกสิ่งที่นักพัฒนาอุปกรณ์อิเล็กทรอนิกส์ต้องการไว้บนชิปตัวเดียว - อย่างน้อยที่สุดเท่าที่จะทำได้ เป็นผลให้มีการเปลี่ยนแปลงในการเน้นจากวงจรและการติดตั้งเป็นซอฟต์แวร์ ด้วยการใช้ MK ตอนนี้ความจำเป็นในการ "โหลด" วงจรกับชิ้นส่วนน้อยลง และมีการเชื่อมต่อระหว่างส่วนประกอบน้อยลง แน่นอนว่าสิ่งนี้ทำให้วงจรน่าสนใจยิ่งขึ้นสำหรับการทำซ้ำโดยวิศวกรอิเล็กทรอนิกส์ทั้งที่มีประสบการณ์และมือใหม่ แต่ตามปกติคุณต้องจ่ายทุกอย่าง สิ่งนี้ก็ไม่ใช่เรื่องยากเช่นกัน หากคุณซื้อ MK ใหม่ ให้ติดตั้งในวงจรที่ประกอบอย่างถูกต้องจากชิ้นส่วนที่ให้บริการและใช้พลังงาน จากนั้นจะไม่มีอะไรทำงาน - อุปกรณ์จะไม่ทำงาน ไมโครคอนโทรลเลอร์จำเป็นต้องมีโปรแกรม

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

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

ในการเขียนโปรแกรมลงใน MK โดยไม่ต้องใช้โปรแกรมเมอร์ เราจำเป็นต้องมีตัวแปลงพอร์ต USB-RS232TTL และเช่นกัน ตัวแปลง USB-RS232TTL ช่วยให้คุณใช้พอร์ต USB เพื่อสร้างพอร์ต COM ที่แตกต่างจากพอร์ต "ของจริง" เฉพาะในกรณีที่อินพุตและเอาต์พุตใช้ระดับลอจิคัล TTL นั่นคือแรงดันไฟฟ้าในช่วงตั้งแต่ 0 ถึง 5 โวลต์ ( คุณสามารถอ่านเพิ่มเติมได้ในบทความ " ") ไม่ว่าในกรณีใด ตัวแปลงดังกล่าวมีประโยชน์ที่ควรมีไว้ใน “ครัวเรือน” ของคุณ ดังนั้นหากคุณยังไม่มี ก็คุ้มค่าที่จะซื้ออย่างแน่นอน สำหรับระดับลอจิคัล ในกรณีของเรา TTL นั้นมีข้อได้เปรียบเหนือพอร์ต COM ทั่วไปด้วยซ้ำ เนื่องจากอินพุตและเอาต์พุตของพอร์ตดังกล่าวสามารถเชื่อมต่อโดยตรงกับไมโครคอนโทรลเลอร์ใด ๆ ที่ใช้พลังงาน 5 V รวมถึง ATtiny และ ATmega แต่อย่าพยายามใช้พอร์ต COM ทั่วไป เพราะใช้แรงดันไฟฟ้าในช่วงตั้งแต่ -12 ถึง +12 V (หรือ -15...+15V) ในกรณีนี้ ไม่สามารถยอมรับการเชื่อมต่อโดยตรงกับไมโครคอนโทรลเลอร์ได้!!!

แนวคิดในการสร้างสคริปต์สำหรับโปรแกรม Perpetuum M ซึ่งใช้งานฟังก์ชั่นของโปรแกรมเมอร์เกิดขึ้นหลังจากอ่านสิ่งพิมพ์จำนวนหนึ่งบนอินเทอร์เน็ตที่นำเสนอโซลูชั่นบางอย่างสำหรับเฟิร์มแวร์ MK ในแต่ละกรณีพบข้อบกพร่องร้ายแรงหรือปัญหาที่มากเกินไป บ่อยครั้งที่ฉันเจอวงจรโปรแกรมเมอร์ที่มีไมโครคอนโทรลเลอร์และในเวลาเดียวกันก็มีการให้คำแนะนำที่ค่อนข้างจริงจังเช่น: "... และในการตั้งโปรแกรมไมโครคอนโทรลเลอร์สำหรับโปรแกรมเมอร์นี้เราจะต้อง... ถูกต้อง - โปรแกรมเมอร์อีกคน!" ต่อไปก็แนะนำให้ไปหาเพื่อน มองหาบริการแบบเสียเงิน ฯลฯ คุณภาพของซอฟต์แวร์ที่เผยแพร่บนเครือข่ายสำหรับวัตถุประสงค์เหล่านี้ก็ไม่น่าประทับใจเช่นกัน - มีปัญหามากมายเกิดขึ้นทั้งในด้านการใช้งานและ "ความขุ่นมัว" ของอินเทอร์เฟซผู้ใช้ มักจะใช้เวลานานในการทำความเข้าใจวิธีใช้โปรแกรม - จะต้องศึกษาแม้กระทั่งการดำเนินการที่ง่ายที่สุด โปรแกรมอื่นสามารถทำบางสิ่งบางอย่างเป็นเวลานานและขยันขันแข็ง แต่ผู้ใช้เรียนรู้ว่าไม่มีการเขียนใด ๆ ไปยัง MK หลังจากที่เฟิร์มแวร์ทั้งหมดเสร็จสมบูรณ์และอ่านการทดสอบในภายหลังเท่านั้น ปัญหาต่อไปนี้เกิดขึ้นเช่นกัน: ผู้ใช้พยายามเลือก MK ของเขาจากรายการคริสตัลที่รองรับ แต่ไม่ได้อยู่ในรายการ ในกรณีนี้ คุณจะไม่สามารถใช้โปรแกรมได้ - ตามกฎแล้วจะไม่รวมอยู่ในรายการ MK ที่หายไป นอกจากนี้การเลือกคอนโทรลเลอร์จากรายการด้วยตนเองยังดูแปลกเมื่อพิจารณาว่าในหลาย ๆ กรณีโปรแกรมเมอร์สามารถกำหนดประเภทของ MK ได้เอง ทั้งหมดนี้ไม่ได้กล่าวไว้เพื่อโยนโคลนใส่ผลิตภัณฑ์ที่มีอยู่ แต่เพื่ออธิบายเหตุผลของการปรากฏตัวของสคริปต์สำหรับโปรแกรม Perpetuum M ตามที่อธิบายไว้ในบทความนี้ ปัญหามีอยู่จริง และเกี่ยวข้องกับผู้เริ่มต้นที่ไม่สามารถเอาชนะ "กำแพง" นี้ได้ตลอดเวลาเพื่อก้าวเข้าสู่โลกของไมโครคอนโทรลเลอร์ สคริปต์ที่นำเสนอคำนึงถึงข้อบกพร่องที่พบในโปรแกรมอื่น “ความโปร่งใส” สูงสุดของการทำงานของอัลกอริธึมได้ถูกนำมาใช้แล้ว ซึ่งเป็นอินเทอร์เฟซผู้ใช้ที่เรียบง่ายอย่างยิ่งซึ่งไม่จำเป็นต้องเรียนรู้ และไม่มีโอกาสสับสนและ “คลิกสิ่งที่ผิด” หาก MK ที่ต้องการไม่อยู่ในกลุ่มที่รองรับ คุณสามารถเพิ่มคำอธิบายได้ด้วยตัวเอง โดยรับข้อมูลที่จำเป็นจากเอกสารที่ดาวน์โหลดจากเว็บไซต์ของผู้พัฒนา MK และที่สำคัญสคริปต์เปิดให้ศึกษาและแก้ไขครับ ทุกคนสามารถเปิดมันในโปรแกรมแก้ไขข้อความ ศึกษาและแก้ไขได้ตามดุลยพินิจของตนเอง เปลี่ยนฟังก์ชั่นที่มีอยู่ให้เข้ากับรสนิยมและเพิ่มฟังก์ชั่นที่ขาดหายไป

สคริปต์เวอร์ชันแรกถูกสร้างขึ้นในเดือนมิถุนายน 2558 เวอร์ชันนี้ให้การสนับสนุนเฉพาะไมโครคอนโทรลเลอร์ซีรีส์ ATtiny และ ATmega ของ Atmel ที่มีฟังก์ชันสำหรับการเขียน/อ่านหน่วยความจำแฟลช การตั้งค่าบิตการกำหนดค่า และการตรวจจับประเภทคอนโทรลเลอร์โดยอัตโนมัติ ไม่มีการใช้การเขียนและการอ่าน EEPROM มีแผนที่จะเสริมฟังก์ชันการทำงานของสคริปต์ : เพิ่มการเขียนและการอ่าน EEPROM การใช้การรองรับคอนโทรลเลอร์ PIC เป็นต้น ด้วยเหตุนี้สคริปต์จึงยังไม่ได้เผยแพร่ แต่เนื่องจากไม่มีเวลา การดำเนินการตามแผนจึงล่าช้า และเพื่อไม่ให้สิ่งที่ดีที่สุดกลายเป็น ศัตรูของความดีก็ตัดสินใจที่จะเผยแพร่เวอร์ชันที่มีอยู่ หากฟังก์ชั่นที่นำไปใช้แล้วยังไม่เพียงพอโปรดอย่าอารมณ์เสีย ในกรณีนี้ คุณสามารถลองเพิ่มฟังก์ชั่นที่ต้องการได้ด้วยตัวเอง ฉันจะไม่ซ่อน: แนวคิดในการสร้างสคริปต์นี้ในตอนแรกยังมีความหมายทางการศึกษาอีกด้วย เมื่อเข้าใจอัลกอริธึมและเพิ่มบางสิ่งของคุณเองลงไปแล้ว คุณจะสามารถเข้าใจการทำงานของ MK ได้ดีขึ้นในโหมดการเขียนโปรแกรมเพื่อที่ อนาคตคุณจะไม่พบว่าตัวเองอยู่ในตำแหน่งหญิงสาวหน้ารถที่พัง มองดูภายในรถอย่างถี่ถ้วน และไม่เข้าใจว่าทำไมมันถึง “ไม่ได้ผล”

2. อินเทอร์เฟซ MK ในโหมดการเขียนโปรแกรม

มีหลายวิธีในการทำให้คอนโทรลเลอร์เข้าสู่โหมดการเขียนโปรแกรมและใช้งานคอนโทรลเลอร์ในโหมดนี้ วิธีที่ง่ายที่สุดในการนำไปใช้กับคอนโทรลเลอร์ของซีรีย์ ATtiny และ ATmega ก็คือ SPI เราจะใช้มัน

แต่ก่อนที่เราจะเริ่มพิจารณาสัญญาณที่จำเป็นในการสร้าง SPI เราจะทำการจองจำนวนหนึ่งก่อน ไมโครคอนโทรลเลอร์มีบิตการกำหนดค่า สิ่งเหล่านี้เหมือนกับสวิตช์สลับสวิตช์ซึ่งช่วยให้คุณเปลี่ยนคุณสมบัติบางอย่างของไมโครวงจรได้ตามความต้องการของโครงการ ทางกายภาพแล้ว เซลล์เหล่านี้เป็นเซลล์หน่วยความจำแบบไม่ลบเลือน เช่นเดียวกับเซลล์ที่ใช้เขียนโปรแกรม ข้อแตกต่างก็คือมีน้อยมาก (มากถึงสามไบต์สำหรับ ATmega) และไม่ได้เป็นส่วนหนึ่งของพื้นที่ที่อยู่ของหน่วยความจำใดๆ การเขียนและการอ่านข้อมูลการกำหนดค่าจะดำเนินการโดยคำสั่งแยกต่างหากในโหมดการเขียนโปรแกรม MK ตอนนี้สิ่งสำคัญคือต้องทราบว่าบิตการกำหนดค่าบางอย่างส่งผลต่อความสามารถในการใช้ SPI ด้วยค่าบางค่า อาจกลายเป็นว่าไม่สามารถใช้ SPI ได้ หากคุณเจอไมโครคอนโทรลเลอร์วิธีที่เสนอในบทความนี้จะไม่ช่วยอะไร ในกรณีนี้ คุณจะต้องเปลี่ยนการตั้งค่าบิตการกำหนดค่าในโปรแกรมเมอร์ซึ่งรองรับโหมดการเขียนโปรแกรมอื่น หรือใช้ไมโครคอนโทรลเลอร์อื่น แต่ปัญหานี้ใช้ได้กับ MK ที่ใช้แล้วหรือที่มีคน "เล่น" ไม่สำเร็จเท่านั้น ความจริงก็คือ MCU ใหม่มาพร้อมกับการตั้งค่าบิตการกำหนดค่าที่ไม่ป้องกันการใช้ SPI สิ่งนี้ได้รับการยืนยันโดยผลการทดสอบของสคริปต์โปรแกรมเมอร์สำหรับโปรแกรม Perpetuum M ในระหว่างที่มีการแฟลช MK ที่แตกต่างกันสี่ตัว (ATmega8, ATmega128, ATtiny13, ATtiny44) ได้สำเร็จ พวกเขาทั้งหมดเป็นของใหม่ การตั้งค่าเริ่มต้นของบิตการกำหนดค่าสอดคล้องกับเอกสารประกอบ และไม่รบกวนการใช้ SPI

จากข้อมูลข้างต้น คุณควรใส่ใจกับบิตต่อไปนี้ บิต SPIEN อนุญาตหรือปิดใช้งานการใช้ SPI อย่างชัดเจน ดังนั้นในกรณีของเรา จะต้องเปิดใช้งานค่าของมัน บิต RSTDISBL สามารถเปลี่ยนหนึ่งในเอาต์พุตของวงจรไมโคร (กำหนดไว้ล่วงหน้า) ให้เป็นอินพุตของสัญญาณ "รีเซ็ต" หรือไม่หมุนก็ได้ (ขึ้นอยู่กับค่าที่เขียนลงในบิตนี้) ในกรณีของเราจำเป็นต้องมีอินพุต "รีเซ็ต" (หากไม่มีอยู่จะไม่สามารถเปลี่ยน MK เป็นโหมดการเขียนโปรแกรมผ่าน SPI ได้) นอกจากนี้ยังมีบิตของกลุ่ม CKSEL ที่ระบุแหล่งที่มาของสัญญาณนาฬิกา พวกเขาไม่ได้ป้องกันการใช้ SPI แต่ต้องจำไว้ด้วยเพราะหากไม่มีพัลส์นาฬิกาเลยหรือหากความถี่ต่ำกว่าที่ยอมรับได้สำหรับความเร็ว SPI ที่กำหนด จะไม่มีอะไรดีเกิดขึ้นเช่นกัน โดยทั่วไป MCU ใหม่ที่มี RC oscillator ภายในจะมีบิตกลุ่ม CKSEL ที่กำหนดค่าให้ใช้งาน สิ่งนี้เหมาะกับเราค่อนข้างดี - มีการตอกบัตรโดยไม่ต้องใช้ความพยายามเพิ่มเติมในส่วนของเรา ไม่จำเป็นต้องบัดกรีเครื่องสะท้อนเสียงควอตซ์หรือเชื่อมต่อเครื่องกำเนิดไฟฟ้าภายนอก หากบิตที่ระบุมีการตั้งค่าที่แตกต่างกัน คุณจะต้องดูแลการตอกบัตรให้สอดคล้องกับการตั้งค่า ในกรณีนี้ อาจจำเป็นต้องเชื่อมต่อเครื่องสะท้อนเสียงแบบควอตซ์หรือเครื่องกำเนิดสัญญาณนาฬิกาภายนอกเข้ากับ MCU แต่ในบทความนี้เราจะไม่พิจารณาว่าจะทำเช่นนี้ได้อย่างไร ตัวอย่างการเชื่อมต่อ MK สำหรับการเขียนโปรแกรมที่มีอยู่ในบทความนี้ได้รับการออกแบบมาเพื่อกรณีที่ง่ายที่สุด

ข้าว. 1. การแลกเปลี่ยนข้อมูลผ่าน SPI ในโหมดการเขียนโปรแกรม

ตอนนี้เรามาดูรูปที่ 1 ซึ่งนำมาจากเอกสารประกอบของ ATmega128A MK มันแสดงกระบวนการส่งหนึ่งไบต์ไปยัง MK และรับหนึ่งไบต์จาก MK พร้อมกัน ตามที่เราเห็นทั้งสองกระบวนการนี้ใช้พัลส์นาฬิกาเดียวกันที่จ่ายจากโปรแกรมเมอร์ไปยังไมโครคอนโทรลเลอร์ที่อินพุต SCK ซึ่งเป็นหนึ่งในพินของไมโครวงจรซึ่งกำหนดบทบาทดังกล่าวในโหมดการเขียนโปรแกรม SPI สายสัญญาณอีกสองเส้นให้การรับและส่งข้อมูลหนึ่งบิตต่อรอบสัญญาณนาฬิกา ข้อมูลจะเข้าสู่ไมโครคอนโทรลเลอร์ผ่านอินพุต MOSI และข้อมูลที่อ่านจะถูกนำมาจากเอาต์พุต MISO สังเกตเห็นเส้นประสองเส้นที่ลากจาก SCK ถึง MISO และ MOSI พวกมันจะแสดงช่วงเวลาที่ไมโครคอนโทรลเลอร์ “กลืน” บิตข้อมูลที่ตั้งค่าไว้ที่อินพุต MOSI และ ณ เวลาใดที่ไมโครคอนโทรลเลอร์จะตั้งค่าบิตข้อมูลของตัวเองไปที่เอาต์พุต MISO ทุกอย่างค่อนข้างง่าย แต่ในการเข้าสู่โหมดการเขียนโปรแกรม MK เรายังต้องมีสัญญาณ RESET อย่าลืมเกี่ยวกับสาย GND ทั่วไปและแหล่งจ่ายไฟ VCC โดยรวมแล้วปรากฎว่าต้องเชื่อมต่อสายไฟเพียง 6 เส้นกับไมโครคอนโทรลเลอร์เพื่อแฟลชเฟิร์มแวร์ผ่าน SPI ด้านล่างนี้เราจะวิเคราะห์รายละเอียดเพิ่มเติม แต่ตอนนี้เราจะเพิ่มการแลกเปลี่ยนข้อมูลกับ MK ในโหมดการเขียนโปรแกรมผ่าน SPI จะดำเนินการในแพ็กเก็ตขนาด 4 ไบต์ ไบต์แรกของแต่ละแพ็กเก็ตนั้นมีไว้เพื่อการเข้ารหัสคำสั่งโดยเฉพาะ ไบต์ที่สอง ขึ้นอยู่กับไบต์แรก อาจเป็นความต่อเนื่องของโค้ดคำสั่ง หรือส่วนหนึ่งของที่อยู่ หรือสามารถมีค่าที่กำหนดเองได้ ไบต์ที่สามใช้สำหรับการส่งที่อยู่เป็นหลัก แต่สามารถมีค่าที่กำหนดเองได้ในหลายคำสั่ง ไบต์ที่สี่มักจะส่งข้อมูลหรือมีค่าที่กำหนดเอง พร้อมกับการส่งไบต์ที่สี่ คำสั่งบางคำสั่งจะได้รับข้อมูลที่มาจากไมโครคอนโทรลเลอร์ รายละเอียดสำหรับแต่ละคำสั่งสามารถพบได้ในเอกสารประกอบของคอนโทรลเลอร์ในตารางชื่อ "ชุดคำสั่งการเขียนโปรแกรมอนุกรม SPI" ในตอนนี้ เราทราบเพียงว่าการแลกเปลี่ยนทั้งหมดกับคอนโทรลเลอร์นั้นสร้างขึ้นจากลำดับของแพ็กเก็ต 32 บิต โดยในแต่ละแพ็กเก็ตจะมีการส่งข้อมูลที่เป็นประโยชน์ไม่เกินหนึ่งไบต์ สิ่งนี้ไม่เหมาะสมที่สุด แต่โดยรวมแล้วใช้งานได้ดี

3. การเชื่อมต่อ MK เพื่อการเขียนโปรแกรม

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

บนอินเทอร์เน็ต คุณมักจะพบข้อมูลว่าตัวแปลงดังกล่าวด้อยกว่าและไม่สามารถทำอะไรร้ายแรงกับพวกเขาได้ แต่สำหรับรุ่นคอนเวอร์เตอร์ส่วนใหญ่ ความคิดเห็นนี้ผิด ใช่ มีตัวแปลงลดราคาที่ไม่มีอินพุตและเอาต์พุตทั้งหมดเมื่อเปรียบเทียบกับพอร์ต COM มาตรฐาน (เช่นเฉพาะ TXD และ RXD) ในขณะที่มีการออกแบบที่แยกกันไม่ได้ (ไมโครวงจรเต็มไปด้วยพลาสติก - มันคือ ไม่อาจเข้าถึงหมุดได้) แต่สิ่งเหล่านี้ไม่คุ้มที่จะซื้อ ในบางกรณี คุณสามารถรับอินพุตและเอาต์พุตพอร์ตที่หายไปได้โดยการบัดกรีสายไฟเข้ากับชิปโดยตรง ตัวอย่างของตัวแปลง "ที่ได้รับการปรับปรุง" ดังกล่าวแสดงในรูปที่ 2 (ชิป PL-2303 - รายละเอียดเพิ่มเติมเกี่ยวกับวัตถุประสงค์ของพินในบทความ "") นี่เป็นหนึ่งในรุ่นที่ถูกที่สุด แต่มีข้อดีในตัวเองเมื่อใช้ในการออกแบบโฮมเมด สายอะแดปเตอร์ที่มีคุณสมบัติครบถ้วนซึ่งมีขั้วต่อเก้าพินมาตรฐานที่ปลาย เช่น พอร์ต COM ก็มีแพร่หลายเช่นกัน แตกต่างจากพอร์ต COM ทั่วไปในระดับ TTL เท่านั้น และเข้ากันไม่ได้กับซอฟต์แวร์รุ่นเก่าและฮาร์ดแวร์รุ่นเก่าบางรุ่น นอกจากนี้ ยังสามารถสังเกตได้ว่าสายไฟบนชิป CH34x แสดงให้เห็นว่ามีความน่าเชื่อถือและมีเสถียรภาพมากขึ้นในการทดสอบที่รุนแรงต่างๆ เมื่อเปรียบเทียบกับตัวแปลงบน PL-2303 อย่างไรก็ตามในระหว่างการใช้งานปกติจะไม่เห็นความแตกต่างที่เห็นได้ชัดเจน

เมื่อเลือกตัวแปลง USB-RS232TTL คุณควรคำนึงถึงความเข้ากันได้ของไดรเวอร์กับเวอร์ชันของระบบปฏิบัติการที่คุณใช้ด้วย

มาดูหลักการเชื่อมต่อไมโครคอนโทรลเลอร์และตัวแปลง USB-RS232TTL โดยละเอียดยิ่งขึ้นโดยใช้ตัวอย่างของ MK รุ่นที่แตกต่างกันสี่รุ่น: ATtiny13, ATtiny44, ATmega8 และ ATmega128 รูปที่ 3 แสดงแผนภาพทั่วไปของการเชื่อมต่อดังกล่าว อาจทำให้คุณประหลาดใจที่ทราบว่าสัญญาณ RS232 (RTS, TXD, DTR และ CTS) ถูกใช้อย่างไม่เหมาะสม แต่ไม่ต้องกังวล: โปรแกรม Perpetuum M สามารถทำงานร่วมกับพวกเขาได้โดยตรง - ตั้งค่าเอาต์พุตและอ่านสถานะอินพุต ไม่ว่าในกรณีใด ตัวแปลง USB-RS232TTL ที่ใช้กันอย่างแพร่หลายบนชิป CH34x และ PL-2303 ให้ความสามารถนี้ - สิ่งนี้ได้รับการยืนยันแล้ว ตัวแปลงยอดนิยมอื่น ๆ ไม่ควรมีปัญหาเนื่องจากใช้ฟังก์ชัน Windows มาตรฐานในการเข้าถึงพอร์ต

โดยหลักการแล้วตัวต้านทานที่แสดงในแผนภาพทั่วไปไม่สามารถติดตั้งได้ แต่ก็ยังดีกว่าถ้าติดตั้ง จุดประสงค์ของพวกเขาคืออะไร? การใช้อินพุตและเอาต์พุต TTL ของตัวแปลงและแหล่งจ่ายไฟห้าโวลต์ของไมโครคอนโทรลเลอร์ทำให้เราไม่จำเป็นต้องประสานระดับลอจิคัล - ทุกอย่างถูกต้องแล้วซึ่งหมายความว่าการเชื่อมต่อสามารถทำได้โดยตรง แต่ในระหว่างการทดลอง อะไรก็เกิดขึ้นได้ เช่น ตามกฎแห่งความใจร้าย ไขควงอาจตกในที่ที่ไม่อาจตกได้ และลัดวงจรสิ่งที่ไม่ควรลัดวงจร แน่นอน อะไรก็เกิดขึ้นได้ กลายเป็น "ไขควง" ตัวต้านทานในกรณีนี้บางครั้งจะลดผลที่ตามมาวัตถุประสงค์ประการหนึ่งคือกำจัดข้อขัดแย้งด้านเอาต์พุตที่อาจเกิดขึ้นความจริงก็คือหลังจากการเขียนโปรแกรมเสร็จสิ้นไมโครคอนโทรลเลอร์จะเข้าสู่โหมดการทำงานปกติและอาจ เกิดขึ้นที่พินที่เชื่อมต่อกับเอาต์พุตของตัวแปลง (RTS, TXD หรือ DTR) ก็กลายเป็นเอาต์พุตตามโปรแกรมที่เพิ่งบันทึกใน MK ในกรณีนี้จะแย่มากหากเอาต์พุตที่เชื่อมต่อโดยตรงสองตัว "ต่อสู้" - พยายามตั้งค่าระดับตรรกะต่างๆ ในการ “ดิ้นรน” เช่นนี้ บางคนอาจ “พ่ายแพ้” แต่เราไม่ต้องการสิ่งนั้น

ค่าของตัวต้านทานทั้งสามตัวถูกเลือกที่ระดับ 4.3 KOhm สิ่งนี้ใช้กับการเชื่อมต่อระหว่างเอาต์พุตคอนเวอร์เตอร์และอินพุตไมโครคอนโทรลเลอร์ ความแม่นยำของตัวต้านทานไม่สำคัญ: คุณสามารถลดความต้านทานลงเป็น 1 KOhm หรือเพิ่มเป็น 10 KOhm (แต่ในกรณีที่สอง ความเสี่ยงของการรบกวนจะเพิ่มขึ้นเมื่อใช้สายไฟยาวระหว่างทางไป MK) สำหรับการเชื่อมต่อระหว่างอินพุตตัวแปลง (CTS) และเอาต์พุตไมโครคอนโทรลเลอร์ (MISO) จะใช้ตัวต้านทาน 100 โอห์มที่นี่ สิ่งนี้อธิบายได้จากลักษณะเฉพาะของอินพุตของตัวแปลงที่ใช้ ในระหว่างการทดสอบมีการใช้ตัวแปลงกับวงจรไมโคร PL-2303 ซึ่งเห็นได้ชัดว่าอินพุตเชื่อมต่อกับแหล่งจ่ายไฟเป็นบวกโดยมีความต้านทานค่อนข้างต่ำ (ประมาณหลายร้อยโอห์ม) ในการ "แยกแรงดึงขึ้น" ฉันต้องติดตั้งตัวต้านทานที่มีความต้านทานเพียงเล็กน้อย อย่างไรก็ตาม คุณไม่จำเป็นต้องติดตั้งเลย บนตัวแปลงนี่คืออินพุตเสมอ ไม่สามารถกลายเป็นทางออกได้ ซึ่งหมายความว่าจะไม่มีความขัดแย้งในการออกในการพัฒนากิจกรรมใดๆ

หากชิปมีพิน AVCC แยกต่างหากสำหรับจ่ายไฟให้กับตัวแปลงแอนะล็อกเป็นดิจิทัล (เช่น ATmega8 หรือ ATmega128) ก็ควรเชื่อมต่อกับพินไฟ VCC ทั่วไป ไอซีบางตัวมีพินไฟ VCC มากกว่าหนึ่งพินหรือ GND มากกว่าหนึ่งอัน ตัวอย่างเช่น ATmega128 มี 3 GND พิน และ 2 พิน VCC ในการออกแบบถาวร ควรเชื่อมต่อหมุดที่มีชื่อเดียวกันเข้าด้วยกันจะดีกว่า ในกรณีของเรา ในระหว่างการเขียนโปรแกรม คุณสามารถใช้พิน VCC และ GND ได้หนึ่งพินต่ออัน

และนี่คือลักษณะของการเชื่อมต่อ ATtiny13 รูปนี้แสดงการกำหนดพินที่ใช้เมื่อเขียนโปรแกรมผ่าน SPI ถัดจากรูปภาพคือการเชื่อมต่อชั่วคราวในความเป็นจริง


บางคนอาจบอกว่านี่ไม่ร้ายแรง - การต่อสายไฟ แต่คุณและฉันเป็นคนมีเหตุผล เป้าหมายของเราคือการเขียนโปรแกรมไมโครคอนโทรลเลอร์ ใช้เวลาและทรัพยากรอื่นๆ ขั้นต่ำกับไมโครคอนโทรลเลอร์ และไม่อวดตัวต่อหน้าผู้อื่น คุณภาพไม่ประสบ วิธีการ "ต่อสาย" ในกรณีนี้ค่อนข้างมีประสิทธิภาพและสมเหตุสมผล การกระพริบเฟิร์มแวร์ของคอนโทรลเลอร์เป็นขั้นตอนที่ทำเพียงครั้งเดียว ดังนั้นจึงไม่มีประโยชน์ที่จะปกปิดด้วยหินแกรนิต หากตั้งใจจะเปลี่ยนเฟิร์มแวร์ในอนาคตโดยไม่ต้องถอดคอนโทรลเลอร์ออกจากวงจร (ในผลิตภัณฑ์สำเร็จรูป) สิ่งนี้จะถูกนำมาพิจารณาระหว่างการติดตั้งระหว่างการผลิตอุปกรณ์ โดยปกติแล้วจะมีการติดตั้งตัวเชื่อมต่อ (RESET, SCK, MOSI, MISO, GND) เพื่อจุดประสงค์นี้และสามารถแฟลช MK ได้แม้หลังจากติดตั้งบนบอร์ดแล้ว แต่สิ่งเหล่านี้เป็นความสุขที่สร้างสรรค์ เรากำลังพิจารณากรณีที่ง่ายที่สุด

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


อีกตัวอย่างหนึ่งของการเชื่อมต่อคอนโทรลเลอร์ชั่วคราวเพื่อตั้งโปรแกรมคือ ATmega8 มีพินมากกว่านี้ แต่หลักการก็เหมือนกัน - มีสายไฟสองสามเส้นและตอนนี้คอนโทรลเลอร์ก็พร้อมที่จะ "เติม" ข้อมูลลงไปแล้ว สายสีดำพิเศษในภาพที่มาจากพิน 13 ไม่ได้มีส่วนร่วมในการเขียนโปรแกรม ได้รับการออกแบบมาเพื่อลบสัญญาณเสียงออกหลังจากที่ MK ออกจากโหมดการเขียนโปรแกรม นี่เป็นเพราะความจริงที่ว่าในระหว่างการดีบักสคริปต์สำหรับ "Perpetuum M" โปรแกรมกล่องดนตรีถูกดาวน์โหลดไปยัง MK


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

เพื่อให้ภาพสมบูรณ์เรามาดูการเชื่อมต่อไมโครวงจร MK กับ "ขา" จำนวนมาก จุดประสงค์ของสายสีดำพิเศษในภาพที่มาจากพิน 15 นั้นเหมือนกับในกรณีของ ATmega8 ทุกประการ


คุณคงมั่นใจแล้วว่าทุกอย่างค่อนข้างง่าย ใครก็ตามที่รู้วิธีนับพินของไมโครวงจร (จากเครื่องหมายในวงกลมทวนเข็มนาฬิกา) จะเข้าใจได้ และอย่าลืมเกี่ยวกับความแม่นยำ วงจรไมโครชอบคนที่เรียบร้อยและไม่ให้อภัยกับการปฏิบัติที่ไม่ระมัดระวัง

ก่อนที่จะไปยังส่วนของซอฟต์แวร์ ตรวจสอบให้แน่ใจว่าได้ติดตั้งไดรเวอร์ตัวแปลง USB-RS232TTL อย่างถูกต้อง (ตรวจสอบ Windows Device Manager) จำหรือจดหมายเลขพอร์ต COM เสมือนที่ปรากฏขึ้นเมื่อคุณเชื่อมต่อตัวแปลง จะต้องป้อนหมายเลขนี้ลงในข้อความของสคริปต์ซึ่งคุณสามารถอ่านได้ด้านล่าง

4. สคริปต์ - โปรแกรมเมอร์สำหรับ "Perpetuum M"

เราพบส่วนฮาร์ดแวร์ของ "โปรแกรมเมอร์" แล้ว นี่มีชัยไปกว่าครึ่งแล้ว ตอนนี้ยังคงต้องจัดการกับส่วนซอฟต์แวร์ บทบาทของมันจะดำเนินการโดยโปรแกรม Perpetuum M ภายใต้การควบคุมของสคริปต์ซึ่งใช้ฟังก์ชันที่จำเป็นทั้งหมดสำหรับการโต้ตอบกับไมโครคอนโทรลเลอร์

ไฟล์เก็บถาวรที่มีสคริปต์ควรแตกไฟล์ลงในโฟลเดอร์เดียวกับที่มีโปรแกรม perpetuum.exe ในกรณีนี้เมื่อคุณเรียกใช้ไฟล์ perpetuum.exe เมนูจะปรากฏขึ้นบนหน้าจอพร้อมรายการสคริปต์ที่ติดตั้งซึ่งจะมีบรรทัด "AVR MK Programmer" (อาจเป็นเพียงอันเดียว) นี่คือเส้นที่เราต้องการ

สคริปต์อยู่ในโฟลเดอร์ PMS ในไฟล์ "MK Programmer AVR.pms" ไฟล์นี้สามารถดู ศึกษา และแก้ไขได้หากจำเป็นในโปรแกรมแก้ไขข้อความทั่วไป เช่น Windows Notepad ก่อนที่จะใช้สคริปต์ คุณมักจะต้องทำการเปลี่ยนแปลงข้อความที่เกี่ยวข้องกับการตั้งค่าพอร์ต ในการดำเนินการนี้ ให้ตรวจสอบชื่อของพอร์ตที่ใช้ใน Windows Device Manager และหากจำเป็น ให้แก้ไขบรรทัด "PortName="COM4";" อย่างเหมาะสม - แทนที่จะเป็นเลข 4 อาจมีเลขอื่นก็ได้ นอกจากนี้ เมื่อใช้ตัวแปลง USB-RS232TTL รุ่นอื่น คุณอาจต้องเปลี่ยนการตั้งค่าการกลับสัญญาณ (บรรทัดสคริปต์ที่ขึ้นต้นด้วยคำว่า "สูง") คุณสามารถตรวจสอบการผกผันของสัญญาณด้วยตัวแปลง USB-RS232TTL โดยใช้หนึ่งในตัวอย่างที่มีอยู่ในคำแนะนำสำหรับโปรแกรม Perpetuum M (ส่วนของฟังก์ชั่นสำหรับการทำงานกับพอร์ต)

โฟลเดอร์ย่อย MK_AVR มีไฟล์พร้อมคำอธิบายของคอนโทรลเลอร์ที่รองรับ หากตัวควบคุมที่คุณต้องการไม่ได้อยู่ในนั้น คุณสามารถเพิ่มตัวควบคุมที่คุณต้องการเองได้ โดยทำการเปรียบเทียบ นำไฟล์หนึ่งไฟล์มาเป็นตัวอย่าง และใช้โปรแกรมแก้ไขข้อความ ป้อนข้อมูลที่จำเป็น โดยนำมาจากเอกสารประกอบสำหรับไมโครคอนโทรลเลอร์ของคุณ สิ่งสำคัญคือต้องระวังป้อนข้อมูลโดยไม่มีข้อผิดพลาดมิฉะนั้น MK จะไม่ถูกตั้งโปรแกรมหรือจะตั้งโปรแกรมไม่ถูกต้อง เวอร์ชันดั้งเดิมรองรับไมโครคอนโทรลเลอร์ 6 ตัว: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 และ ATmega128 สคริปต์ใช้การจดจำคอนโทรลเลอร์ที่เชื่อมต่อโดยอัตโนมัติ - ไม่จำเป็นต้องระบุด้วยตนเอง หากตัวระบุที่อ่านจาก MK ไม่ได้อยู่ในคำอธิบายที่มีอยู่ ข้อความจะปรากฏขึ้นว่าไม่รู้จักคอนโทรลเลอร์

ไฟล์เก็บถาวรที่มีสคริปต์ยังมีข้อมูลเพิ่มเติมอีกด้วย โฟลเดอร์ไฟล์ AVR controller inc มีคอลเลกชันไฟล์คำจำกัดความของคอนโทรลเลอร์ที่มีประโยชน์และกว้างขวาง ไฟล์เหล่านี้ใช้เมื่อเขียนโปรแกรม MK ของคุณเอง อีกสี่โฟลเดอร์ "MusicBox_..." ประกอบด้วยไฟล์ที่มีโปรแกรมในภาษา Assembly และเฟิร์มแวร์ที่พร้อมสำหรับการดาวน์โหลดไปยัง MK แยกต่างหากสำหรับ ATtiny13, ATtiny44, ATmega8 และ ATmega128 หากคุณได้เชื่อมต่อ MK ตัวใดตัวหนึ่งสำหรับการเขียนโปรแกรมตามที่แนะนำในบทความนี้แล้วคุณสามารถแฟลชได้ทันที - คุณจะได้รับกล่องดนตรี เพิ่มเติมเกี่ยวกับเรื่องนี้ด้านล่าง

เมื่อคุณเลือกบรรทัด “MK AVR Programmer” ในเมนูสคริปต์ สคริปต์จะเริ่มดำเนินการ ในเวลาเดียวกันจะเปิดพอร์ตส่งคำสั่งไปยัง MK เพื่อสลับไปที่โหมดการเขียนโปรแกรมได้รับการยืนยันจาก MK เกี่ยวกับการเปลี่ยนแปลงที่ประสบความสำเร็จขอตัวระบุ MK และค้นหาคำอธิบายของ MK นี้ด้วยตัวระบุในบรรดาที่มีอยู่ ไฟล์พร้อมคำอธิบาย หากไม่พบคำอธิบายที่ต้องการ ก็จะแสดงข้อความที่เกี่ยวข้อง หากพบคำอธิบาย เมนูหลักของโปรแกรมเมอร์จะเปิดขึ้น คุณสามารถดูภาพหน้าจอได้ในรูปที่ 8 การทำความเข้าใจเพิ่มเติมนั้นไม่ยาก - เมนูนั้นง่ายมาก

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

ข้อจำกัดด้านฟังก์ชันการทำงานบางอย่างอธิบายไว้โดยตรงในข้อความสคริปต์:
// ดำเนินการบันทึกจากที่อยู่ศูนย์เท่านั้น (บันทึกที่อยู่ส่วนขยายจะถูกละเว้น โหลดออฟเซ็ต - เช่นกัน)
//ไม่ได้ตรวจสอบลำดับและความต่อเนื่องของบันทึกในไฟล์ HEX
//เช็คซัมไม่ได้ถูกตรวจสอบ
สิ่งนี้ใช้กับการทำงานกับไฟล์ HEX ซึ่งใช้รหัสเฟิร์มแวร์สำหรับ MK หากไฟล์นี้ไม่เสียหาย การตรวจสอบเช็คซัมจะไม่มีผลใดๆ หากมีการบิดเบี้ยว จะไม่สามารถตรวจพบได้โดยใช้สคริปต์ ในกรณีส่วนใหญ่ ข้อจำกัดที่เหลือจะไม่ส่งผลเสียหาย แต่คุณยังต้องคำนึงถึงข้อจำกัดเหล่านั้นด้วย

5. กล่องดนตรี - งานฝีมือง่ายๆ สำหรับผู้เริ่มต้น

หากคุณมีไมโครคอนโทรลเลอร์ตัวใดตัวหนึ่ง: ATtiny13, ATtiny44, ATmega8 หรือ ATmega128 คุณสามารถเปลี่ยนให้เป็นกล่องดนตรีหรือการ์ดเพลงได้อย่างง่ายดาย ในการทำเช่นนี้ก็เพียงพอที่จะเขียนเฟิร์มแวร์ที่เกี่ยวข้องลงใน MK ซึ่งเป็นหนึ่งในสี่เฟิร์มแวร์ที่อยู่ในโฟลเดอร์ "MusicBox_..." ในไฟล์เก็บถาวรเดียวกันกับสคริปต์ รหัสเฟิร์มแวร์จะถูกจัดเก็บไว้ในไฟล์ที่มีนามสกุล ".hex" แน่นอนว่าการใช้ ATmega128 สำหรับยานดังกล่าวนั้น "อ้วน" เช่นเดียวกับ ATmega8 แต่สิ่งนี้อาจเป็นประโยชน์สำหรับการทดสอบหรือการทดลอง กล่าวคือ เพื่อวัตถุประสงค์ทางการศึกษา ข้อความของโปรแกรมใน Assembler ก็แนบมาด้วย โปรแกรมไม่ได้ถูกสร้างขึ้นตั้งแต่ต้น - โปรแกรมกล่องดนตรีจากหนังสือ A.V. Belov เรื่อง "AVR Microcontrollers in Amateur Radio Practice" ถูกนำมาใช้เป็นพื้นฐาน โปรแกรมดั้งเดิมมีการเปลี่ยนแปลงที่สำคัญหลายประการ:
1. ปรับให้เหมาะกับ MK สี่ตัว: ATtiny13, ATtiny44, ATmega8 และ ATmega128
2. ปุ่มต่างๆ ได้ถูกกำจัดออกไปแล้ว - ไม่จำเป็นต้องเชื่อมต่อกับคอนโทรลเลอร์ใดๆ เลย ยกเว้นพลังงานและตัวส่งเสียง (เมโลดี้จะเล่นต่อกันในวงวนไม่มีที่สิ้นสุด)
3. ระยะเวลาของโน้ตแต่ละตัวจะลดลงตามระยะเวลาการหยุดระหว่างโน้ตเพื่อขจัดสิ่งรบกวนในจังหวะดนตรี
4. ทำนองที่ 8 เชื่อมต่อกัน ไม่ได้ใช้ในฉบับหนังสือ
5. จากอัตนัย: “การปรับปรุง” บางอย่างเพื่อเพิ่มประสิทธิภาพและทำให้อัลกอริทึมเข้าใจง่ายขึ้น

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

ใน ATtiny13 เนื่องจากไม่มีตัวนับ 16 บิต จึงต้องใช้ตัวนับ 8 บิตเพื่อสร้างบันทึก ซึ่งทำให้ความแม่นยำของบันทึกลดลงเล็กน้อย แต่สิ่งนี้แทบจะมองไม่เห็นด้วยหู

เกี่ยวกับบิตการกำหนดค่า การตั้งค่าจะต้องสอดคล้องกับสถานะของไมโครคอนโทรลเลอร์ใหม่ หากเคยใช้ MK ของคุณที่ไหนสักแห่งมาก่อน คุณจะต้องตรวจสอบสถานะของบิตการกำหนดค่า และหากจำเป็น ให้ปรับให้สอดคล้องกับการตั้งค่าของไมโครคอนโทรลเลอร์ใหม่ คุณสามารถค้นหาสถานะของบิตการกำหนดค่าของไมโครคอนโทรลเลอร์ใหม่ได้จากเอกสารประกอบสำหรับ MK นี้ (ส่วน "Fuse Bits") ข้อยกเว้นคือ ATmega128 MCU นี้มีบิต M103C ซึ่งเปิดใช้งานโหมดความเข้ากันได้กับ ATmega103 รุ่นเก่า การเปิดใช้งานบิต M103C จะลดความสามารถของ ATmega128 ลงอย่างมาก และบิตนี้ใช้งานได้กับ MK ใหม่ คุณต้องรีเซ็ต M103C ให้เป็นสถานะไม่ทำงาน หากต้องการจัดการบิตการกำหนดค่า ให้ใช้ส่วนที่เกี่ยวข้องของเมนูสคริปต์โปรแกรมเมอร์

การให้แผนผังของกล่องดนตรีไม่มีประโยชน์ มีเพียงไมโครคอนโทรลเลอร์ แหล่งจ่ายไฟ และตัวส่งสัญญาณเสียงเพียโซเท่านั้น กำลังจ่ายในลักษณะเดียวกับที่เราทำเมื่อตั้งโปรแกรม MK ตัวส่งสัญญาณเสียงเชื่อมต่อระหว่างสายทั่วไป (พิน GND ของคอนโทรลเลอร์) และหนึ่งในพิน MK ซึ่งหมายเลขดังกล่าวสามารถพบได้ในไฟล์พร้อมรหัสแอสเซมบลีของโปรแกรม (*.asm) ที่จุดเริ่มต้นของข้อความโปรแกรมสำหรับ MK แต่ละตัวในความคิดเห็นจะมีบรรทัด: "สัญญาณเสียงถูกสร้างขึ้นที่พิน XX" เมื่อสคริปต์โปรแกรมเมอร์เสร็จสิ้น ไมโครคอนโทรลเลอร์จะออกจากโหมดการเขียนโปรแกรมและเข้าสู่การทำงานตามปกติ การเล่นท่วงทำนองจะเริ่มขึ้นทันที เมื่อเชื่อมต่อตัวส่งสัญญาณเสียง คุณสามารถตรวจสอบสิ่งนี้ได้ คุณสามารถปล่อยให้ตัวส่งสัญญาณเสียงเชื่อมต่ออยู่ในขณะที่ตั้งโปรแกรมคริสตัลได้ก็ต่อเมื่อเสียงนั้นนำมาจากพินที่ไม่ได้ใช้ใน SPI มิฉะนั้นความจุเพิ่มเติมบนพินอาจรบกวนการตั้งโปรแกรม