สารบัญ:

ไมโครคอนโทรลเลอร์ AVR ไฟ LED กะพริบโดยใช้ตัวจับเวลา ตัวจับเวลาขัดจังหวะ โหมดจับเวลา CTC: 6 ขั้นตอน
ไมโครคอนโทรลเลอร์ AVR ไฟ LED กะพริบโดยใช้ตัวจับเวลา ตัวจับเวลาขัดจังหวะ โหมดจับเวลา CTC: 6 ขั้นตอน

วีดีโอ: ไมโครคอนโทรลเลอร์ AVR ไฟ LED กะพริบโดยใช้ตัวจับเวลา ตัวจับเวลาขัดจังหวะ โหมดจับเวลา CTC: 6 ขั้นตอน

วีดีโอ: ไมโครคอนโทรลเลอร์ AVR ไฟ LED กะพริบโดยใช้ตัวจับเวลา ตัวจับเวลาขัดจังหวะ โหมดจับเวลา CTC: 6 ขั้นตอน
วีดีโอ: AVR Microcontroller. LED flasher using timers. Timers interrupts. Timer CTC Mode. 2024, กรกฎาคม
Anonim
Image
Image

สวัสดีทุกคน!

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

ขั้นตอนที่ 1: คำอธิบาย

คำชี้แจงปัญหา 1: มาแฟลช LED แรก (สีเขียว) ทุก ๆ 50 Ms
คำชี้แจงปัญหา 1: มาแฟลช LED แรก (สีเขียว) ทุก ๆ 50 Ms

ใน ATMega328 มีตัวจับเวลาสามประเภท:

Timer/Counter0 (TC0) - เป็นโมดูลตัวจับเวลา/ตัวนับแบบ 8 บิตสำหรับใช้งานทั่วไป พร้อมด้วย OutputCompare Units แยกอิสระ 2 ชุด และรองรับ PWM

ตัวจับเวลา/ตัวนับ1 (TC1) - หน่วยตัวจับเวลา/ตัวนับ 16 บิตช่วยให้สามารถจับเวลาการทำงานของโปรแกรมได้อย่างแม่นยำ (การจัดการเหตุการณ์) การสร้างคลื่น และการวัดเวลาของสัญญาณ

Timer/Counter2 (TC2) - เป็นวัตถุประสงค์ทั่วไป, ช่อง, โมดูลตัวจับเวลา / ตัวนับ 8 บิตพร้อม PWM และการทำงานแบบอะซิงโครนัส

ขั้นตอนที่ 2: คำชี้แจงปัญหา 1: ให้แฟลช LED ดวงแรก (สีเขียว) ทุกๆ 50 Ms

คำชี้แจงปัญหา 1: มาแฟลช LED แรก (สีเขียว) ทุก ๆ 50 Ms
คำชี้แจงปัญหา 1: มาแฟลช LED แรก (สีเขียว) ทุก ๆ 50 Ms
คำชี้แจงปัญหา 1: มาแฟลช LED แรก (สีเขียว) ทุก ๆ 50 Ms
คำชี้แจงปัญหา 1: มาแฟลช LED แรก (สีเขียว) ทุก ๆ 50 Ms

วิธีการ:

- ใช้ตัวจับเวลาล่วงหน้า Timer0 เพื่อลดสัญญาณไฟฟ้าความถี่สูงเป็นความถี่ที่ต่ำกว่าโดยการหารจำนวนเต็ม

- ใช้การขัดจังหวะทุกครั้งที่ Timer0 ล้น

Timer0 (8 บิต) นับตั้งแต่ 0 ถึง 255 หลังจากนั้น โอเวอร์โฟลว์ ค่านี้เปลี่ยนแปลงทุกพัลส์ของนาฬิกา

F_CPU=16MHz: ช่วงเวลานาฬิกา = 1000ms / 16000000Hz = 0.0000625ms

จำนวนตัวจับเวลา = (ต้องหน่วงเวลา / ช่วงเวลานาฬิกา) -1 = (50ms / 0.0000625ms) = 799999

นาฬิกาได้ทำเครื่องหมายไปแล้ว 799999 ครั้งเพื่อให้เกิดความล่าช้าเพียง 50 ms!

ใช้เทคนิคการแบ่งความถี่ที่เรียกว่า prescaling เพื่อลดจำนวนตัวจับเวลาได้ AVR เสนอค่าพรีสเกลเลอร์ต่อไปนี้ให้เราเลือก: 8, 64, 256 และ 1024 ดูตารางสรุปผลลัพธ์ของการใช้พรีสเกลเลอร์ต่างๆ

ค่าตัวนับควรเป็นจำนวนเต็มเสมอ มาเลือกพรีสเกลเลอร์ 256 กันเถอะ!

ในไมโครคอนโทรลเลอร์ส่วนใหญ่ มีบางอย่างที่เรียกว่าอินเตอร์รัปต์ อินเตอร์รัปต์นี้สามารถเริ่มทำงานเมื่อใดก็ตามที่ตรงตามเงื่อนไขบางประการ ตอนนี้เมื่อใดก็ตามที่การขัดจังหวะถูกไล่ออก AVR จะหยุดและบันทึกการดำเนินการของรูทีนหลัก เข้าร่วมการโทรขัดจังหวะ (โดยดำเนินการรูทีนพิเศษที่เรียกว่า Interrupt Service Routine, ISR) และเมื่อเสร็จสิ้นแล้ว ให้กลับไปที่ รูทีนหลักและดำเนินการต่อไป

เนื่องจากความล่าช้าที่ต้องการ (50ms) มากกว่าการหน่วงเวลาสูงสุดที่เป็นไปได้: 4, 096ms = 1000ms / 62500Hz * 256 เห็นได้ชัดว่าตัวจับเวลาจะล้น และเมื่อใดก็ตามที่ตัวจับเวลาล้น การขัดจังหวะจะเริ่มทำงาน

การขัดจังหวะควรถูกไล่ออกกี่ครั้ง?

50ms / 4.096ms = 3125 / 256 = 12.207 หากตัวจับเวลาล้น 12 ครั้ง 12 * 4.096ms = 49.152ms จะผ่านไป ในการทำซ้ำครั้งที่ 13 เราต้องการการหน่วงเวลา 50ms – 49.152ms = 0.848ms

ที่ความถี่ 62500Hz (prescaler = 256) แต่ละขีดจะใช้เวลา 0.016ms ดังนั้นเพื่อให้เกิดความล่าช้า 0.848ms จะต้องใช้ 0.848ms / 0.016ms = 53 ticks ดังนั้น ในการทำซ้ำครั้งที่ 13 เราอนุญาตให้ตัวจับเวลานับได้ถึง 53 เท่านั้น แล้วจึงรีเซ็ต

เริ่มต้น Timer0/Counter (ดูรูป):

TCCR0B |= (1 << CS02) // ตั้งค่าตัวจับเวลาด้วย prescaler = 256 TCNT0 = 0 // เริ่มต้นตัวนับ TIMSK0 |= (1 << TOIE0) // เปิดใช้งานโอเวอร์โฟลว์อินเตอร์รัปต์ sei () // เปิดใช้งานการขัดจังหวะทั่วโลก tot_overflow = 0 // เริ่มต้นตัวแปรตัวนับล้น

ขั้นตอนที่ 3: คำชี้แจงปัญหา 2: มาแฟลช LED ที่สอง (สีน้ำเงิน) ทุก ๆ 1 วินาที

คำชี้แจงปัญหา 2: มาแฟลช LED ที่สอง (สีน้ำเงิน) ทุก ๆ 1 วินาที
คำชี้แจงปัญหา 2: มาแฟลช LED ที่สอง (สีน้ำเงิน) ทุก ๆ 1 วินาที
คำชี้แจงปัญหา 2: ให้แฟลช LED ดวงที่สอง (สีน้ำเงิน) ทุกๆ 1 วินาที
คำชี้แจงปัญหา 2: ให้แฟลช LED ดวงที่สอง (สีน้ำเงิน) ทุกๆ 1 วินาที
คำชี้แจงปัญหา 2: มาแฟลช LED ที่สอง (สีน้ำเงิน) ทุก ๆ 1 วินาที
คำชี้แจงปัญหา 2: มาแฟลช LED ที่สอง (สีน้ำเงิน) ทุก ๆ 1 วินาที

วิธีการ:

- ใช้ตัวจับเวลาพรีสเกล Timer1 เพื่อลดสัญญาณไฟฟ้าความถี่สูงเป็นความถี่ที่ต่ำกว่าโดยการหารจำนวนเต็ม

- ใช้ Clear Timer ในโหมดเปรียบเทียบ (CTC)

- ใช้การขัดจังหวะด้วยโหมด CTC

Timer1 (16 บิต) นับจาก 0 ถึง 65534 หลังจากนั้นจะล้น ค่านี้เปลี่ยนแปลงทุกพัลส์ของนาฬิกา

F_CPU=16MHz: ช่วงเวลานาฬิกา = 1000ms / 16000000Hz = 0.0000625msTimer count = (Required Delay / Clock Time Period)-1 = (1000ms / 0.0000625ms) = 15999999

นาฬิกาได้ทำเครื่องหมายแล้ว 15999999 ครั้งเพื่อให้เกิดความล่าช้า 1 วินาที!

ใช้เทคนิคการแบ่งความถี่ที่เรียกว่า prescaling เพื่อลดการนับเวลาได้ AVR เสนอค่าพรีสเกลเลอร์ต่อไปนี้ให้เราเลือก: 8, 64, 256 และ 1024 ดูตารางสรุปผลลัพธ์ของการใช้พรีสเกลเลอร์ต่างๆ ค่าตัวนับควรเป็นจำนวนเต็มเสมอ มาเลือกพรีสเกลเลอร์ 256 กันเถอะ!

ในโหมด Clear timer on Compare (CTC) การลงทะเบียน OCR1A หรือ ICR1 จะถูกใช้เพื่อจัดการกับความละเอียดของตัวนับ ในโหมด CTC ตัวนับจะถูกล้างเป็นศูนย์เมื่อค่าตัวนับ (TCNT1) ตรงกับ OCR1A หรือ ICR1 OCR1A หรือ ICR1 กำหนดค่าสูงสุดสำหรับตัวนับ ดังนั้นจึงต้องมีความละเอียดด้วย โหมดนี้ช่วยให้ควบคุมความถี่เอาท์พุตการเปรียบเทียบที่ตรงกันได้ดียิ่งขึ้น และยังช่วยลดความยุ่งยากในการนับเหตุการณ์ภายนอกอีกด้วย เราต้องบอก AVR ให้รีเซ็ต Timer1/Counter ทันทีที่ค่าถึงค่า 62500 เพื่อให้ได้ค่าดีเลย์ 1 วินาที

เริ่มต้น Timer1/Counter (ดูรูป):

TCCR1B |= (1 << WGM12)| (1 << CS12) // ตั้งค่าตัวจับเวลาด้วย prescaler = 256 และโหมด CTC TCNT1 = 0 // เริ่มต้นตัวนับ TIMSK1 |= (1 << OCIE1A) // เปิดใช้งานการเปรียบเทียบการขัดจังหวะ OCR1A = 62500 // เริ่มต้นเปรียบเทียบค่า

ขั้นตอนที่ 4: คำชี้แจงปัญหา 3: มาแฟลช LED ดวงที่สาม (สีแดง) ทุก ๆ 16ms

คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที
คำชี้แจงปัญหา 3: ให้แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที

วิธีการ:

- การใช้ตัวจับเวลาล่วงหน้า Prescaler เพื่อลดสัญญาณไฟฟ้าความถี่สูงเป็นความถี่ที่ต่ำกว่าโดยการหารจำนวนเต็ม

- ใช้ Clear Timer ในโหมดเปรียบเทียบ (CTC)

- ใช้โหมดฮาร์ดแวร์ CTC โดยไม่หยุดชะงัก

Timer2 (8 บิต) นับจาก 0 ถึง 255 หลังจากนั้นจะล้น ค่านี้เปลี่ยนแปลงทุกพัลส์ของนาฬิกา

F_CPU=16MHz: ช่วงเวลานาฬิกา = 1000ms / 16000000Hz = 0.0000625ms

จำนวนตัวจับเวลา = (ต้องหน่วงเวลา / ช่วงเวลาของนาฬิกา) -1 = (16ms / 0.0000625ms) = 255999

เข็มนาฬิกาเดินแล้ว 255999 ทำให้ดีเลย์ 16ms!

ดูตารางสรุปผลลัพธ์ของการใช้พรีสเกลเลอร์ต่างๆ ค่าตัวนับควรเป็นจำนวนเต็มเสมอ มาเลือกพรีสเกลเลอร์ 1024 กันเถอะ!

ในโหมด CTC ตัวนับจะถูกล้างเป็นศูนย์เมื่อค่าตัวนับ (TCNT2) ตรงกับ OCR2A หรือ ICR2 พิน PB3 ยังเป็นขาออกเปรียบเทียบพินของ TIMER2 - OC2A (ดูแผนภาพ)

Timer/Counter2 Control Register A – TCCR2A Bit 7:6 – COM2A1:0 – Compare Output Mode for Compare Unit A. เนื่องจากเราจำเป็นต้องสลับ LED เราจึงเลือกตัวเลือก: Toggle OC2A on Compare Match เมื่อใดก็ตามที่มีการเปรียบเทียบเกิดขึ้น หมุด OC2A ถูกสลับโดยอัตโนมัติ ไม่จำเป็นต้องตรวจสอบแฟล็กบิตใด ๆ ไม่จำเป็นต้องสนใจการขัดจังหวะใด ๆ

เริ่มต้น Timer2/Counter

TCCR2A |= (1 << COM2A0)|(1 << WGM21) // ตั้งค่าตัวจับเวลา OC2A pin ในโหมดสลับและโหมด CTC TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20) // ตั้งค่าตัวจับเวลาด้วย prescaler = 1024 TCNT2 = 0 // เริ่มต้นตัวนับ OCR2A = 250 // เริ่มต้นเปรียบเทียบค่า

ขั้นตอนที่ 5: การเขียนโค้ดสำหรับโปรแกรมใน C. การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์

การเขียนโค้ดสำหรับโปรแกรมใน C. การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์
การเขียนโค้ดสำหรับโปรแกรมใน C. การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์
การเขียนโค้ดสำหรับโปรแกรมใน C. การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์
การเขียนโค้ดสำหรับโปรแกรมใน C. การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์

การเขียนและสร้างแอปพลิเคชันไมโครคอนโทรลเลอร์ AVR ในรหัส C โดยใช้แพลตฟอร์มการพัฒนาแบบบูรณาการ - Atmel Studio

F_CPU กำหนดความถี่สัญญาณนาฬิกาในเฮิรตซ์และเป็นเรื่องปกติในโปรแกรมที่ใช้ไลบรารี avr-libc ในกรณีนี้ รูทีนการหน่วงเวลาจะใช้เพื่อกำหนดวิธีการคำนวณการหน่วงเวลา

#ifndef F_CPU

#define F_CPU 16000000UL // บอกความถี่คริสตัลคอนโทรลเลอร์ (16 MHz AVR ATMega328P) #endif

#include // ส่วนหัวเพื่อเปิดใช้งานการควบคุมการไหลของข้อมูลบนพิน กำหนดพิน พอร์ต ฯลฯ

ไฟล์รวมแรกเป็นส่วนหนึ่งของ avr-libc และจะถูกใช้ในโครงการ AVR ที่คุณทำงานอยู่เกือบทั้งหมด io.h จะกำหนด CPU ที่คุณใช้ (ซึ่งเป็นสาเหตุที่คุณระบุส่วนเมื่อคอมไพล์) และรวมส่วนหัวคำจำกัดความ IO ที่เหมาะสมสำหรับชิปที่เราใช้อยู่ มันเพียงกำหนดค่าคงที่สำหรับพิน พอร์ต รีจิสเตอร์พิเศษ ฯลฯ ทั้งหมดของคุณ

#include // ส่วนหัวเพื่อเปิดใช้งานการขัดจังหวะ

ระเหย uint8_t tot_overflow; // ตัวแปรโกลบอลเพื่อนับจำนวนโอเวอร์โฟลว์

ระเบียบวิธีของคำชี้แจงปัญหา: LED แฟลชก่อน (สีเขียว) ทุก ๆ 50 ms

- ใช้ตัวจับเวลาล่วงหน้า Timer0 เพื่อลดสัญญาณไฟฟ้าความถี่สูงเป็นความถี่ที่ต่ำกว่าโดยการหารจำนวนเต็ม

- ใช้การขัดจังหวะทุกครั้งที่ Timer0 ล้น

โมฆะ timer0_init () // เริ่มต้นตัวจับเวลา, ขัดจังหวะและตัวแปร

{ TCCR0B |= (1 << CS02); // ตั้งเวลาด้วย prescaler = 256 TCNT0 = 0; // เริ่มต้นตัวนับ TIMSK0 |= (1 << TOIE0); // เปิดใช้งานโอเวอร์โฟลว์ nterrupt sei(); // เปิดใช้งานการขัดจังหวะทั่วโลก tot_overflow = 0; // เริ่มต้นตัวแปรตัวนับล้น }

ระเบียบวิธีของคำชี้แจงปัญหา: แฟลช LED ดวงที่สอง (สีน้ำเงิน) ทุกๆ 1 วินาที

- ใช้ตัวจับเวลาพรีสเกล Timer1 เพื่อลดสัญญาณไฟฟ้าความถี่สูงเป็นความถี่ที่ต่ำกว่าโดยการหารจำนวนเต็ม

- ใช้ Clear Timer ในโหมดเปรียบเทียบ (CTC)

- ใช้การขัดจังหวะด้วยโหมด CTC

โมฆะ timer1_init () // เริ่มต้น timer1 ขัดจังหวะและตัวแปร { TCCR1B |= (1 << WGM12) | (1 << CS12); // ตั้งเวลาด้วย prescaler = 256 และโหมด CTC TCNT1 = 0; // เริ่มต้นตัวนับ OCR1A = 62500; // เริ่มต้นเปรียบเทียบค่า TIMSK1 |= (1 << OCIE1A); // เปิดใช้งานการเปรียบเทียบการขัดจังหวะ}

ระเบียบวิธีของคำชี้แจงปัญหา: แฟลช LED ดวงที่สาม (สีแดง) ทุกๆ 16 มิลลิวินาที

- ใช้ตัวจับเวลาล่วงหน้าของ Timer2 เพื่อลดสัญญาณไฟฟ้าความถี่สูงเป็นความถี่ที่ต่ำกว่าโดยการหารจำนวนเต็ม

- ใช้ Clear Timer ในโหมดเปรียบเทียบ (CTC)

- ใช้โหมดฮาร์ดแวร์ CTC โดยไม่หยุดชะงัก

โมฆะ timer2_init () // เริ่มต้น timer2 { TCCR2A |= (1 << COM2A0) | (1 << WGM21); // ตั้งค่าตัวจับเวลา OC2A pin ในโหมดสลับและโหมด CTC TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // ตั้งเวลาด้วย prescaler = 1024 TCNT2 = 0; // เริ่มต้นตัวนับ OCR2A = 250; // เริ่มต้นเปรียบเทียบค่า }

รูทีนบริการขัดจังหวะการโอเวอร์โฟลว์ TIMER0 ถูกเรียกเมื่อใดก็ตามที่ TCNT0 โอเวอร์โฟลว์:

ISR(TIMER0_OVF_vect)

{ tot_overflow++; // ติดตามจำนวนล้น }

ISR นี้จะถูกไล่ออกเมื่อใดก็ตามที่มีการจับคู่เกิดขึ้น ดังนั้นให้สลับที่นี่:

ISR (TIMER1_COMPA_vect) { PORTC ^= (1 << 1); // สลับนำที่นี่}

int หลัก (เป็นโมฆะ)

{ DDRB |= (1 << 0); // เชื่อมต่อ 1 (สีเขียว) นำไปสู่พิน PB0 DDRC |= (1 << 1); // เชื่อมต่อ 2 (สีน้ำเงิน) นำไปสู่พิน PC1 DDRB |= (1 << 3); // เชื่อมต่อ 3 (สีแดง) นำไปสู่พิน PB3 (OC2A) timer0_init(); // เริ่มต้น timer0 timer1_init (); // เริ่มต้น timer1 timer2_init (); // เริ่มต้นตัวจับเวลา 2 ในขณะที่ (1) // วนซ้ำตลอดไป {

หาก Timer0 ล้น 12 ครั้ง 12 * 4.096ms = 49.152ms จะผ่านไป ในการทำซ้ำครั้งที่ 13 เราต้องการการหน่วงเวลา 50ms – 49.152ms = 0.848ms ดังนั้น ในการทำซ้ำครั้งที่ 13 เราอนุญาตให้ตัวจับเวลานับได้ถึง 53 เท่านั้น แล้วจึงรีเซ็ต

if (tot_overflow >= 12) // ตรวจสอบว่าไม่มี ของล้น = 12 หมายเหตุ: ใช้ '>='

{ if (TCNT0 >= 53) // ตรวจสอบว่าตัวจับเวลานับถึง 53 หรือไม่ { PORTB ^= (1 << 0); // สลับ TCNT0 นำ = 0; // รีเซ็ตตัวนับ tot_overflow = 0; // รีเซ็ตตัวนับล้น } } } }

การอัปโหลดไฟล์ HEX ลงในหน่วยความจำแฟลชไมโครคอนโทรลเลอร์:

พิมพ์ในหน้าต่างพรอมต์ DOS คำสั่ง:

avrdude –c [ชื่อโปรแกรมเมอร์] –p m328p –u –U flash:w:[ชื่อไฟล์ hex ของคุณ] ในกรณีของฉันคือ: avrdude –c ISPProgv1 –p m328p –u –U flash:w:Timers.hex

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

การเบิร์นหน่วยความจำแฟลชไมโครคอนโทรลเลอร์…

ตกลง! ตอนนี้ไมโครคอนโทรลเลอร์ทำงานตามคำแนะนำของโปรแกรมของเรา มาลองดูกัน!

ขั้นตอนที่ 6: การสร้างวงจรไฟฟ้า

การทำวงจรไฟฟ้า
การทำวงจรไฟฟ้า
การทำวงจรไฟฟ้า
การทำวงจรไฟฟ้า
การทำวงจรไฟฟ้า
การทำวงจรไฟฟ้า

เชื่อมต่อส่วนประกอบตามแผนผังไดอะแกรม

แนะนำ: