ส่วนของเว็บไซต์
ตัวเลือกของบรรณาธิการ:
- การเปลี่ยนอินเทอร์เฟซ Steam - จากรูปภาพธรรมดาไปจนถึงการนำเสนอทั้งหมดบนหน้าจอ การออกแบบไอน้ำใหม่
- วิธียกเลิกการสมัครสมาชิก Megogo บนทีวี: คำแนะนำโดยละเอียด วิธียกเลิกการสมัครสมาชิก Megogo
- วิธีแบ่งพาร์ติชันดิสก์โดยติดตั้ง Windows โดยไม่สูญเสียข้อมูล แบ่งพาร์ติชันดิสก์ 7
- เหตุใดผู้จัดพิมพ์จึงไม่สามารถแก้ไขทุกหน้าได้
- ไม่มีการบู๊ตจากแฟลชไดรฟ์ใน BIOS - จะกำหนดค่าได้อย่างไร?
- รหัสโปรโมชั่น Pandao สำหรับคะแนน
- ไวรัสแรนซัมแวร์ที่เป็นอันตรายกำลังแพร่กระจายอย่างหนาแน่นบนอินเทอร์เน็ต
- การติดตั้ง RAM เพิ่มเติม
- จะทำอย่างไรถ้าหูฟังไม่สร้างเสียงบนแล็ปท็อป
- ไดเรกทอรีไดโอด ไดโอดเรียงกระแสกำลังสูง 220V
การโฆษณา
ขัดจังหวะใน atmega8 หลักสูตรการฝึกอบรม |
ข้อดีอย่างหนึ่งของไมโครคอนโทรลเลอร์ ATmega8 คือการขัดจังหวะที่หลากหลาย ขัดจังหวะเป็นเหตุการณ์ที่เกิดขึ้นเมื่อมีการหยุดการทำงานของโปรแกรมหลักและมีการเรียกใช้ฟังก์ชันที่จัดการการขัดจังหวะบางประเภท การขัดจังหวะแบ่งออกเป็นภายในและภายนอก แหล่งที่มาของการขัดจังหวะภายในรวมถึงโมดูลไมโครคอนโทรลเลอร์ในตัว (ตัวจับเวลา, ตัวรับส่งสัญญาณ USART ฯลฯ ) การขัดจังหวะภายนอกเกิดขึ้นเมื่อสัญญาณภายนอกมาถึงที่พินไมโครคอนโทรลเลอร์ (เช่น สัญญาณที่พิน RESET และ INT) ลักษณะของสัญญาณที่นำไปสู่การขัดจังหวะถูกตั้งค่าไว้ในรีจิสเตอร์ควบคุม มจรโดยเฉพาะอย่างยิ่งในบิต - ISC00 (บิต 0) และ ISC01 (บิต 1) สำหรับอินพุต INT 0; ISC10 (bit2) และ ISC11 (bit3) สำหรับอินพุต INT1 ในไมโครคอนโทรลเลอร์ ATmega8 แต่ละอินเทอร์รัปต์จะมีของตัวเอง เวกเตอร์ขัดจังหวะ(ที่อยู่ที่จุดเริ่มต้นของพื้นที่หน่วยความจำโปรแกรมซึ่งเก็บคำสั่งสำหรับการข้ามไปยังรูทีนขัดจังหวะที่ระบุ) ใน mega8 การขัดจังหวะทั้งหมดจะมีลำดับความสำคัญเท่ากัน หากมีการขัดจังหวะหลายครั้งเกิดขึ้นพร้อมกัน การขัดจังหวะที่มีจำนวนเวกเตอร์ต่ำกว่าจะถูกประมวลผลก่อน เวกเตอร์ขัดจังหวะใน Atmega8
การจัดการขัดจังหวะ4 รีจิสเตอร์มีหน้าที่จัดการการขัดจังหวะใน ATmega8: กิมสค์(หรือที่เรียกว่า GICR) - ห้าม/เปิดใช้งานการขัดจังหวะตามสัญญาณที่อินพุต INT0, INT1 GIFR- การจัดการการขัดจังหวะภายนอกทั้งหมด ทิมสค์, ทีไอเอฟอาร์- การจัดการการหยุดชะงักจากตัวจับเวลา/ตัวนับ ลงทะเบียน กิมสค์(GICR) INTFx=1: เกิดการขัดจังหวะที่อินพุต INTx เมื่อเข้าสู่รูทีนการจัดการการขัดจังหวะ INTFx จะถูกรีเซ็ตเป็นสถานะบันทึกโดยอัตโนมัติ 0 ลงทะเบียน ทิมสค์
TOIE1=1: เปิดใช้งานการขัดจังหวะโอเวอร์โฟลว์ T/C1 โอซีอี1เอ=1: ขัดจังหวะเมื่อรีจิสเตอร์การเปรียบเทียบ A ตรงกับเนื้อหาของตัวนับ T/C1 ที่เปิดใช้งาน โอซีอี1B=1: ขัดจังหวะเมื่อรีจิสเตอร์การเปรียบเทียบ B ตรงกับเนื้อหาของตัวนับ T/C1 ที่เปิดใช้งาน TICIE=1: เปิดใช้งานการขัดจังหวะเมื่อตรงตามเงื่อนไขการจับ TOIE0=1: เปิดใช้งานการขัดจังหวะโอเวอร์โฟลว์ T/C0 ลงทะเบียน ทีไอเอฟอาร์
ทีโอวี1=1: เกิดการโอเวอร์โฟลว์ของ T/C1 โอซีเอฟ1เอ=1: การลงทะเบียนการเปรียบเทียบ A ตรงกับเนื้อหาของเคาน์เตอร์ T/C1 ที่อนุญาต โอซีเอฟ1B=1: การลงทะเบียนการเปรียบเทียบ B ตรงกับเนื้อหาของตัวนับ T/C1 ที่อนุญาต ไอซีเอฟ=1: ตรงตามเงื่อนไขการจับ TOV0=1: เกิดการโอเวอร์โฟลว์ของ T/C0 เมื่อเข้าสู่รูทีนย่อยการจัดการการขัดจังหวะ แฟล็กการลงทะเบียน TIFR ที่สอดคล้องกับการขัดจังหวะจะถูกรีเซ็ตเป็นสถานะบันทึกโดยอัตโนมัติ 0 การขัดจังหวะจะทำงานเฉพาะเมื่อมีการเปิดใช้งานการขัดจังหวะทั่วไปในการลงทะเบียนสถานะ SREG (บิต 7 = 1) เมื่อเกิดการขัดจังหวะ บิตนี้จะถูกรีเซ็ตเป็น 0 โดยอัตโนมัติ และปิดใช้งานการขัดจังหวะที่ตามมา ในตัวอย่างนี้ พิน INT0 ถูกเปิดใช้งานในโหมดอินพุตแบบดึงขึ้น เมื่อพินลัดวงจรลงกราวด์โดยใช้ปุ่ม ลอจิก 0 จะถูกตั้งค่าไว้ (ขอบของสัญญาณจะลดลงจากแรงดันไฟฟ้าไปที่ 0) และตัวจัดการอินเทอร์รัปต์จะถูกทริกเกอร์ โดยเปิดหลอดไฟที่เชื่อมต่อกับพินศูนย์ของพอร์ต บี โมฆะ lampON() ขัดจังหวะเป็นโมฆะ ext_int0_isr (เป็นโมฆะ) DDRD.2=0; SREG|= (1 ในขณะที่(1) ( ตัวอย่างข้างต้นยังแสดงวิธีการตั้งค่าเวกเตอร์อินเทอร์รัปต์ใน Code Vision AVR (interrupt void ext_int0_isr(void)) เวกเตอร์อินเทอร์รัปต์มีการตั้งค่าคล้ายกันสำหรับกรณีอื่นๆ: EXT_INT0 2 ก่อนอื่นการหยุดชะงักคืออะไร? ด้วยเหตุนี้ เรามาจบทฤษฎีและฝึกฝนกันต่อ (แม้ว่าด้านล่างจะมีทฤษฎีเพิ่มเติมก็ตาม) ตามที่คุณอาจเดาได้แล้วเราจะเขียนการขัดจังหวะ (ซึ่งสร้างโดยปุ่ม) ซึ่งจะสว่างขึ้นและปิดไดโอด #รวม ยอมรับว่าการขัดจังหวะ (ทางกายภาพ) จะไม่เปิดหรือปิดเครื่องบนขาคอนโทรลเลอร์ (ตามที่ฉันได้พิจารณาไปแล้ว) แต่จะเปลี่ยนเฉพาะการตั้งค่าสถานะเท่านั้น ในบางค่าที่ไดโอดจะเปิดและปิด จำนวน Int = 1; ตอนนี้ขอประกาศการขัดจังหวะ: ISR(SIG_INTERRUPT1)( ถ้า (num == 1) num = 0; อื่น ๆ num = 1; ) อย่างที่คุณเห็น เวกเตอร์ขัดจังหวะที่เรียกว่าถูกระบุไว้ในวงเล็บมาโคร เวกเตอร์นี้จะบอกคอมไพเลอร์ว่าอินพุตใดที่อินเทอร์รัปต์จะถูกสร้างขึ้น สำหรับ INT1 มันคือ SIG_INTERRUPT1 ตัวอย่างเช่น สำหรับ ADC นี่คือ SIG_ADC (รายการทั้งหมดอธิบายไว้อย่างสมบูรณ์ในหนังสือ “Shpak Yu.A. การเขียนโปรแกรมด้วยภาษา C สำหรับไมโครคอนโทรลเลอร์ AVR และ PIC”) เซย์(); // โดยทั่วไป GIMSK |= (1< เมื่อเสร็จแล้ว คุณจะต้องกำหนดค่าลักษณะการทำงานขัดจังหวะ สามารถสร้างได้หลายวิธี ฉันคิดว่าคุณจะเข้าใจวิธีการแปลสิ่งนี้ MCUCR = (0< ตอนนี้เรามาตั้งค่าพอร์ต C ทั้งหมดเป็นเอาต์พุต: DDRC = 0xff; // พอร์ต C - เอาต์พุต นี่ควรจะชัดเจนแล้ว: ในขณะที่ (1)( ถ้า (num == 1) PORTC |= 1; // เปิดเอาต์พุตแรก C อื่น PORTC &= ~1; // ปิดเอาต์พุตแรก C _delay_ms(100); // รอ 100ms ) ไม่จำเป็นต้องรอ นอกจากนี้ยังลดประสิทธิภาพอีกด้วย แต่ฉันอยากให้มันเป็นแบบนั้น #กำหนด F_CPU 8000000UL // 8MHz #include เรารวบรวมเลขฐานสิบหกและประกอบวงจรใน Proteus เราเพลิดเพลินกับฟังก์ชั่นขัดจังหวะเมื่อเปลี่ยนตำแหน่งของปุ่ม มันมักจะเกิดขึ้นที่ไมโครวงจรควรทำงานและทำงานอย่างเงียบ ๆ แต่สำหรับเหตุการณ์บางอย่าง ให้ทิ้งทุกอย่างและทำอย่างอื่น แล้ว - กลับไปสู่งานเดิมอีกครั้ง... เปรียบเสมือนนาฬิกา - มันแสดงเวลาจนกระทั่งถึงเวลานาฬิกาปลุก และดูเหมือนว่าไม่มีอิทธิพลจากภายนอก เช่น การกดปุ่ม รีเซ็ต และวงจรไมโครจะสวิตช์เอง สิ่งนี้สามารถนำไปใช้ได้โดยใช้อินเทอร์รัปต์ - สัญญาณที่แจ้งให้โปรเซสเซอร์ทราบเกี่ยวกับเหตุการณ์ที่เกิดขึ้น นี่คือตัวอย่างจากชีวิตประจำวัน - คุณกำลังนั่งอยู่ในห้องครัว ดื่มชาพร้อมแยมราสเบอร์รี่และขนมอร่อยๆ และกำลังรอแขก รู้ได้อย่างไรว่ามีคนมา? มีสองทางเลือก: เราจะเสียสมาธิจากรถติด ฉันหมายถึงดื่มชา ทุก ๆ ห้านาทีแล้ววิ่งไปตรวจสอบว่ามีใครยืนอยู่ที่ประตูหรือไม่ หรือซื้อกริ่งประตูและรออย่างใจเย็นในที่ที่มีอุณหภูมิสูงจนกว่าจะมีคนกดกริ่ง ดังนั้นเมื่อมีแขกโทรมา นี่คือกิจกรรม ดังนั้นเราจึงแยกตัวและรีบไปที่ประตู ดังนั้นไมโครเซอร์กิตจึงมีการขัดจังหวะ และไม่ใช่แค่หนึ่งเดียว การขัดจังหวะแบ่งออกเป็นภายนอก - สิ่งเหล่านี้ถูกกระตุ้นที่แรงดันไฟฟ้าที่แน่นอนบนพินบางตัวของไมโครวงจร (INT0, INT1 และบางครั้งก็เป็นพอร์ต PCINT ทั้งหมด) - และภายใน - เมื่อตัวนับล้นตัวจับเวลา Watchdog จะถูกทริกเกอร์เมื่อใช้ USART เมื่อตัวเปรียบเทียบอนาล็อก, ADC และอุปกรณ์ต่อพ่วงอื่นๆ ถูกขัดจังหวะ ดังนั้นปัญหาสำคัญจึงเกิดขึ้น มันเหมือนกับว่าเรายังคงนั่งดื่มชาอยู่ แต่พวกเขาไม่ได้ดังแค่กริ่งประตูเท่านั้น แต่ยังรวมถึงโทรศัพท์ของเราด้วย... และคุณไม่สามารถแยกออกจากกันได้ ต้องทำอะไรสักอย่างก่อน ดังนั้นแผ่นข้อมูลจึงมีตารางเวกเตอร์ขัดจังหวะ ยิ่งหมายเลขขัดจังหวะยิ่งต่ำ ลำดับความสำคัญก็จะยิ่งสูงขึ้น มีรายละเอียดปลีกย่อยหลายประการที่นี่... มีเหตุการณ์เกิดขึ้น - มีการส่งคำขอขัดจังหวะซึ่งเรียกว่า "การตั้งค่าสถานะคำขอขัดจังหวะ" หากทุกอย่างเรียบร้อยดี การขัดจังหวะจะได้รับการแก้ไข ชีวิตก็จะสวยงามและได้รับการประมวลผล แต่หากปิดใช้งานการขัดจังหวะ - ตัวอย่างเช่น กำลังประมวลผลการขัดจังหวะที่มีลำดับความสำคัญสูงกว่าอยู่แล้ว - แฟล็กคำขอนี้จะยังคงหยุดทำงานจนกว่าจะเปิดใช้งานการขัดจังหวะ หลังจากนี้ ชิปจะตรวจสอบการลงทะเบียนคำขอตามลำดับความสำคัญ และหากมีแฟล็ก ชิปก็จะประมวลผล แต่! ปรากฎว่าถึงแม้จะประมวลผลการหยุดชะงัก แต่ก็ไม่ใช่ความจริงที่ว่าเหตุการณ์ที่ทำให้เกิดเหตุการณ์นั้นยังมีชีวิตอยู่... มันเหมือนกับว่ากริ่งประตูและโทรศัพท์ดังพร้อมกัน คุณรับโทรศัพท์ และแขกก็ได้ยินเสียง ตัดสินใจแล้วว่าไม่มีใครอยู่บ้านและออกไป และดูเหมือนว่าจะมีเหตุการณ์เกิดขึ้น - กริ่งประตูดังขึ้น แต่ไม่มีใครอยู่หลังประตู ปัญหาอีกประการหนึ่งคือในขณะที่กำลังประมวลผลการขัดจังหวะอื่นและค่าสถานะคำขอถูกยกขึ้นแล้ว เหตุการณ์อาจเกิดขึ้นได้อีกหลายครั้ง เรารับสายเปิดประตู - และมีแขกมากมายอยู่ที่นั่นแล้ว! น่ากลัว? น่ากลัว... คุณสมบัติอื่นของการใช้การขัดจังหวะ - และไม่เพียงแต่การขัดจังหวะเท่านั้น: การกลับเข้ามาใหม่ (หรือการกลับเข้ามาใหม่) โปรแกรม Reentrant คือโปรแกรมที่สามารถเรียกใช้โดยผู้ใช้หลายคน (หรือกระบวนการ) โดยไม่ทำให้เกิดข้อผิดพลาด และไม่ทำให้การคำนวณสิ้นเปลืองเป็นอย่างน้อย ตัวอย่างเช่น ผู้ใช้รายอื่นไม่ต้องรันโค้ดอีกครั้ง กล่าวอีกนัยหนึ่งถ้าอยู่ในครัวในขณะที่คุณทักทายแขกไม่มีใครขโมยของบางอย่างทุกอย่างก็กลับคืนมา) โดยทั่วไปนี่ถือเป็นเรื่องร้ายแรง - หากคุณไม่คำนึงถึงคุณอาจทนทุกข์ทรมานเป็นเวลานานโดยพูดว่า "ทำไมไม่ทำงาน!" จะต้องนำมาพิจารณาด้วย เช่น หากมีการประมวลผลการขัดจังหวะหลายครั้ง และแต่ละรายการเปลี่ยนตัวแปรโกลบอลบางตัว... การขัดจังหวะมักจะไม่กลับเข้ามาใหม่ นั่นคือในขณะที่อินเทอร์รัปต์กำลังทำงาน คุณจะไม่สามารถเรียกอินเทอร์รัปต์เดิมได้อีก เพื่อป้องกันการเข้าซ้ำในตัวจัดการ ซึ่งอินเทอร์รัปต์จะถูกห้ามโดยอัตโนมัติในขณะที่ประมวลผล (ถ้าคุณต้องการเปิดใช้งานอินเทอร์รัปต์ในการขัดจังหวะ) ขั้นตอนการจัดการคุณต้องคิดสิบหรือยี่สิบครั้งก่อนจะทำตามขั้นตอนผื่นดังกล่าว) ลองพิจารณาการทำงานกับการขัดจังหวะภายนอก: ประการแรก เราต้องกำหนดค่าว่าเหตุการณ์ใดที่จะทำให้เกิดการขัดจังหวะ และประการที่สอง ปล่อยให้ไมโครเซอร์กิตประมวลผลการขัดจังหวะนี้เลย การลงทะเบียน MCUCR รับผิดชอบตัวแรกในชิป ATmega8 - บิต ISC11-ISC10 รับผิดชอบ INT1 และ ISC01-ISC00 รับผิดชอบ INT0 ตารางที่ 1. คำจำกัดความของเหตุการณ์สำหรับการสร้างการขัดจังหวะผ่าน INT1 เช่นเดียวกับ INT0 ตอนนี้สิ่งที่เหลืออยู่คือการเปิดใช้งานการขัดจังหวะบนพินที่เราต้องการ - การลงทะเบียน GIGR มีบิต INT0 และ INT1; ตั้งค่าเป็น "1" ที่ต้องการ - และเปิดใช้งานการหยุดชะงักจากภายนอก! แต่ยังเร็วเกินไปที่จะชื่นชมยินดี - นอกเหนือจากการขัดจังหวะภายนอกแล้ว โดยทั่วไปแล้ว จะต้องเปิดใช้งานการขัดจังหวะด้วย - ตั้งค่าบิตซ้ายสุดของการลงทะเบียน SREG เป็น "1" เช่นเดียวกันสามารถทำได้ด้วยคำสั่งแอสเซมเบลอร์: asm sei; ลองดูตัวอย่างง่ายๆ: มีปุ่มติดอยู่ที่พิน INT0 (D.2) ของชิป ATmega8 (ที่พินและเป็นศูนย์) กด - เกิดการขัดจังหวะและ LED บนพิน B.0 จะเปิดขึ้น LED ตามลำดับเชื่อมต่อกับขาและตัวเครื่อง: // โปรแกรมสำหรับ ATmega8 เมื่อคุณกดปุ่มบนพิน INT0 (D.2) - เชื่อมต่อกับ 0 - // เปิด LED บนพิน B.0 โดยการขัดจังหวะภายนอก - เชื่อมต่อกับ 1 // กำหนดประเภทใหม่ typedef ถ่านไบต์ที่ไม่ได้ลงนาม; sbit ddrButton ที่ ddD2_bit; // ปุ่มสร้าง sbit pinButton ที่ pinD2_bit; sbit พอร์ตปุ่มที่ portD2_bit; สบิต ddrLight ที่ ddB0_bit; // เอาต์พุตสำหรับ LED ไปที่เอาต์พุตแบบดึงขึ้นให้เปิด 0 บนปุ่ม sbit portLight ที่ portB0_bit; ไบต์ flagButton = 0; //คลิกปุ่ม ตั้งค่าสถานะ; กด - 1 void INT0_interrupt() org IVT_ADDR_INT0 // อย่างน้อยคุณต้องเขียนฟังก์ชันว่าง - // เพราะคอมไพเลอร์ไม่ได้สร้างมันขึ้นมาเอง มิฉะนั้นมันจะไม่ทำงาน ( flagButton = 1; ) // การประมวลผลการกดปุ่ม - โดยคำนึงถึงการตีกลับเป็นโมฆะ buttonLight() ( if(flagButton) // หากกดปุ่ม ( portLight = 0; // เปิด LED Delay_ms(500); portLight = 1; // ปิดปุ่มธง LED = 0; ) ) เป็นโมฆะ main () ( // กำลังเริ่มต้นพอร์ตที่ใช้ทั้งหมด ddrB = 0; portB = 0; ddrD = 0; portD = 0; // การเริ่มต้นปุ่ม - ไปยังอินพุตด้วย pull-up portButton = 1; // เริ่มต้น LED ซึ่งเปิดอยู่ด้วย 0 และโดยการกดปุ่ม - เพื่อส่งออกและไปที่ 1 portLight = 1; การขัดจังหวะภายนอก MCUCR.ISC00 = 0; // การขัดจังหวะถูกสร้างขึ้นโดยตรรกะ 0 บน INT0 MCUCR.INT0 = 1; // เปิดใช้งานการขัดจังหวะภายนอก INT0 asm sei; // SREG.B7 = 1; หลักการขัดจังหวะ (bit I); คำสั่งเหมือนกับ while(1) ( buttonLight() ; ) ) เล็กน้อยเกี่ยวกับไวยากรณ์ ฟังก์ชันขัดจังหวะเขียนดังนี้: void function_name() org IVT_ADDR_INT0 คำหลักขององค์กรระบุว่าที่อยู่ขัดจังหวะจากแผ่นข้อมูลจะมาถัดไป เรามีชื่อของการขัดจังหวะจากไลบรารี: เราพิมพ์ IVT แล้วกด Ctrl + Space (ฉันชอบสิ่งเหล่านี้ ˆˆ) คุณยังสามารถใช้ iv แทนคำว่า org ได้ โดยพิจารณาจากวิธีใช้คอมไพเลอร์ หมายเหตุเล็กๆ น้อยๆ อีกประการหนึ่ง: ประการแรก การหยุดชะงักไม่ควรยุ่งยาก - เพียงไม่กี่บรรทัดเท่านั้นเอง นี่เป็นเพราะความจริงที่ว่าในขณะที่ประมวลผลการขัดจังหวะนั้น Microcircuit ไม่สามารถถูกรบกวนจากสิ่งอื่นใดได้ ซึ่งหมายความว่าหากเรามีการขัดจังหวะหลายครั้ง เราก็อาจพลาดเหตุการณ์บางอย่างได้ อาจกลายเป็นว่าเราไม่จำเป็นต้องขัดจังหวะการประมวลผลเลย - ตัวอย่างเช่นวงจรก็เพียงพอแล้วที่วงจรจะตื่นจากโหมดสลีป แต่ในกรณีนี้คุณยังคงต้องเขียนฟังก์ชันขัดจังหวะแม้ว่าจะเป็นฟังก์ชันว่างก็ตาม - ที่เรียกว่า "stub" ตามหลักการแล้ว คอมไพเลอร์บางตัวจะเขียนฟังก์ชันว่างโดยอัตโนมัติสำหรับการขัดจังหวะแต่ละครั้ง แต่นี่ไม่ใช่กรณีของเรา - เราต้องทำด้วยตนเอง วันนี้เราจะมาดูแนวคิดเรื่องการหยุดชะงักและวิธีใช้งานกัน โดยปกติแล้ว เราจะไม่ทำหากไม่มีโปรแกรมการฝึกอบรม แต่ครั้งนี้ เราจะไม่กระพริบไฟ LED ดีอยู่แล้ว. มาทำอะไรเหมือนกริ่งประตูกันเถอะ งาน:ทำให้ไมโครคอนโทรลเลอร์ส่งเสียงบี๊บเมื่อกดปุ่ม เราสร้างโปรเจ็กต์วงแหวนในพื้นที่ทำงานเก่า เลือกประเภทของไมโครคอนโทรลเลอร์ อนุญาตให้ใช้ชื่อบิตที่กำหนดไว้ในไฟล์ส่วนหัว เปลี่ยนประเภทไฟล์เอาต์พุต บันทึกโปรเจ็กต์และพื้นที่ทำงาน ลองจินตนาการถึงสถานการณ์ คุณกำลังนั่งอยู่ที่ทำงานและทบทวนโปรแกรมไมโครคอนโทรลเลอร์ตัวอื่น เจ้านายมาหาคุณแล้วพูดว่า: "ฟังนะ Pash เราซื้อออสซิลโลสโคปสำหรับแผนกของเรา - Tektronix สี่ช่องสัญญาณ ช่วยวาสยาลากพวกเขา” คุณคิดว่า: "เอาละ ความคิดมันเข้ามาขวางทาง... และอยู่กับคุณ" และเจ้านายก็มองคุณแบบนั้น และดวงตาของเขาก็ใจดีและใจดีมาก คุณจะปฏิเสธเขาได้อย่างไร? คุณทิ้งทุกอย่างแล้วไปกับเพื่อนเพื่อซื้อออสซิลโลสโคป พวกเขานำมันเข้ามา เราได้รายงานแล้ว และพวกเขาก็นั่งลงดูรายการอีกครั้ง นี่คือลักษณะของกลไกการขัดจังหวะโดยประมาณ ค่อนข้างง่าย แต่มีประเด็นพื้นฐานหลายประการ ประการที่สอง: ทั้งหมดนี้คล้ายกันมากกับสิ่งที่เกิดขึ้นในไมโครคอนโทรลเลอร์ ไมโครคอนโทรลเลอร์ AVR ประกอบด้วยอุปกรณ์ต่อพ่วงมากมาย (ตัวจับเวลา/ตัวนับ ตัวแปลงแอนะล็อกเป็นดิจิทัล ตัวเปรียบเทียบแอนะล็อก ตัวรับส่งสัญญาณอะซิงโครนัส...ฯลฯ) พลังของไมโครคอนโทรลเลอร์คืออุปกรณ์ทั้งหมดเหล่านี้สามารถทำงานแบบขนานและแยกจากกัน รวมถึงทำงานแบบขนานกับโปรแกรมที่กำลังดำเนินการอยู่ อุปกรณ์ต่อพ่วงแต่ละชิ้นสามารถทำให้เกิดการขัดจังหวะเมื่อมีเหตุการณ์เฉพาะเกิดขึ้น การขัดจังหวะจะเกิดขึ้นก็ต่อเมื่อมีการเปิดใช้งานเท่านั้น การเปิดใช้งานการขัดจังหวะถูกตั้งค่าไว้สำหรับแต่ละอุปกรณ์แยกกัน นอกจากนี้ ยังมีการตั้งค่าสถานะเปิด/ปิดใช้งานทั่วโลกสำหรับการขัดจังหวะทั้งหมด - นี่คือการตั้งค่าสถานะ I ในการลงทะเบียน SREG เมื่อเกิดการขัดจังหวะ ไมโครคอนโทรลเลอร์จะจัดเก็บเนื้อหาของตัวนับโปรแกรมพีซีไว้บนสแต็ก นั่นคือจะจดจำตำแหน่งที่ถูกขัดจังหวะ โหลดที่อยู่ของเวกเตอร์ขัดจังหวะที่สอดคล้องกันลงในตัวนับโปรแกรมและข้ามไปยังที่อยู่นั้น เข้าสู่คำสั่ง Jump แบบไม่มีเงื่อนไข ซึ่งจะไปที่รูทีนย่อยการประมวลผลการขัดจังหวะ ปิดใช้งานการขัดจังหวะโดยการรีเซ็ตแฟล็ก I ดำเนินการรูทีนย่อย หลังจากดำเนินการตามรูทีนการจัดการการขัดจังหวะแล้ว ไมโครคอนโทรลเลอร์จะเปิดใช้งานการขัดจังหวะโดยตั้งค่าสถานะ I และกู้คืนเนื้อหาของตัวนับโปรแกรม กล่าวคือ มันจะกลับไปยังตำแหน่งเดิมในโปรแกรมที่ถูกขัดจังหวะ ตามทฤษฎีแล้ว ตัวจัดการการขัดจังหวะไม่ควรสร้างความเสียหายให้กับเนื้อหาของรีจิสเตอร์ของไมโครคอนโทรลเลอร์ เนื่องจากอาจมีข้อมูลจากโปรแกรมที่กำลังดำเนินการในขณะนั้น เมื่อต้องการทำเช่นนี้ ที่จุดเริ่มต้นของรูทีนย่อยการจัดการการขัดจังหวะ เนื้อหาของการลงทะเบียนไมโครคอนโทรลเลอร์จะถูกเก็บไว้ในสแต็ก และในตอนท้ายของรูทีนย่อยเนื้อหาเหล่านั้นจะถูกกู้คืน ดังนั้น หลังจากออกจากการขัดจังหวะ ไมโครคอนโทรลเลอร์จะสามารถดำเนินการโปรแกรมต่อไปได้ราวกับว่าไม่มีอะไรเกิดขึ้น เมื่อเขียนโปรแกรมในแอสเซมเบลอร์โปรแกรมเมอร์เองก็กำหนดให้บันทึกการลงทะเบียนใน C ซึ่งคอมไพเลอร์จะทำได้ ทีนี้มาพูดถึงตัวจับเวลากัน ATmega8535 มีตัวจับเวลา/ตัวนับสามตัวบนบอร์ด - แปดบิตสองตัว (T0, T2) และหนึ่งตัวสิบหกบิต (T1) เราจะใช้ตัวจับเวลา/ตัวนับ T0 แปดบิต ตัวจับเวลานี้ประกอบด้วยรีจิสเตอร์สามรีจิสเตอร์ - รีจิสเตอร์ควบคุม TCCR0 รีจิสเตอร์การนับ TCNT0 และรีจิสเตอร์การเปรียบเทียบ OCR0 เมื่อเริ่มจับเวลา ตัวนับรีจิสเตอร์ TCNT0 จะเพิ่มค่าของมันทีละหนึ่งสำหรับแต่ละขอบนาฬิกา ความถี่สัญญาณนาฬิกาถูกเลือกจากค่าที่เป็นไปได้หลายค่าในรีจิสเตอร์ควบคุม TCCR0 นอกจากนี้ เมื่อใช้รีจิสเตอร์นี้ โหมดการทำงานของตัวจับเวลาจะถูกตั้งค่าด้วย ตัวจับเวลา T0 สามารถทำให้เกิดการขัดจังหวะเมื่อเกิดเหตุการณ์ "ล้น" - นี่คือเมื่อการลงทะเบียนการนับ TCNT0 ล้น และเมื่อเกิดเหตุการณ์ "บังเอิญ" - นี่คือเมื่อค่าของการลงทะเบียนการนับ TCNT0 เท่ากับค่า ของรีจิสเตอร์เปรียบเทียบ OCR0 ค่าสถานะที่เปิดใช้งานการขัดจังหวะเหล่านี้จะอยู่ในการลงทะเบียน TIMSK ตอนนี้เกี่ยวกับโปรแกรม ไม่สามารถเขียนโปรแกรมทีละบรรทัดได้อีกต่อไป ดังนั้นฉันจะเขียนข้อความให้ทันที ด้านล่างนี้เราจะวิเคราะห์บรรทัดทั้งหมดทีละบรรทัดและทุกอย่างจะชัดเจน ฉันไม่ได้ตั้งใจใช้มาโคร โปรแกรมมีขนาดเล็ก และฉันไม่ต้องการที่จะเกะกะ ภายในหลัก( เป็นโมฆะ
) //ตั้งเวลา T0 //เปิดใช้งานการขัดจังหวะ // โปรแกรมหลักวนซ้ำ - สำรวจปุ่ม //ขัดจังหวะตัวจัดการสำหรับตัวจับเวลา T0 การตั้งค่าพอร์ต ในวงจรของเรา ปุ่มและลำโพงเพียโซเชื่อมต่อกับพอร์ต D ต้องกำหนดค่าพินที่เชื่อมต่อปุ่มเป็นอินพุตและต้องเปิดตัวต้านทานแบบดึงขึ้น ต้องตั้งค่าพินที่เชื่อมต่อลำโพงเพียโซเป็นเอาต์พุต DDRD = (0< การตั้งเวลา โหมดการทำงานของตัวจับเวลา T0 คือ CTC (รีเซ็ตด้วยความบังเอิญ) สัญญาณนาฬิกาคือ clk/8 เราสะท้อนสิ่งนี้ในการลงทะเบียน TCCR0 TCCR0 = (1< ในกรณีที่เรารีเซ็ตการลงทะเบียนการนับ TCNT0 เขียน 0xc8 ไปยังรีจิสเตอร์การเปรียบเทียบ OCR0 ทำไม เพราะผมนับมันแล้ว เครื่องคิดเลข- บนกระดาษการคำนวณนี้มีลักษณะเช่นนี้ สำหรับคำอธิบายโดยละเอียดของตัวจับเวลา T0 โปรดดูเอกสารประกอบสำหรับ ATMega8535 เราได้กำหนดค่าตัวจับเวลาและเปิดใช้งานการขัดจังหวะทั่วไปโดยใช้ฟังก์ชันในตัว __enable_ขัดจังหวะ();
ปุ่มสำรวจความคิดเห็น เมื่อไม่ได้กดปุ่มเอาต์พุตของไมโครคอนโทรลเลอร์จะเชื่อมต่อกับพลังงานผ่านตัวต้านทานแบบดึงขึ้นภายในนั่นคือมีตัวหนึ่งอยู่ที่เอาต์พุต เมื่อกดปุ่มเอาต์พุตจะลัดวงจรลงกราวด์นั่นคือที่นั่น เป็นศูนย์ที่เอาต์พุต ในการตรวจสอบว่ามีการกดปุ่มหรือไม่ คุณต้องอ่านเนื้อหาของการลงทะเบียน PIND และตรวจสอบค่าของศูนย์บิต (ปุ่มเชื่อมต่อกับ PD0) เราจะสำรวจปุ่มแบบวนซ้ำไม่รู้จบ ในขณะที่
(1) อย่าลืม == ไม่ใช่ผู้ดำเนินการมอบหมาย = การจัดการการกดปุ่ม/ปล่อย โดยการกดปุ่มเราจะเปิดใช้งานการหยุดชะงักของตัวจับเวลา T0 และเมื่อปล่อยเราจะปิดการใช้งาน เมื่อต้องการทำเช่นนี้ เราจะจัดการบิต OCIE0 ของการลงทะเบียน TIMSK ทิมสค์ = (1< ทิมสค์ = 0; // ปิดการใช้งานการหยุดชะงัก เนื่องจากเราใช้ตัวจับเวลาเพียงตัวเดียว จึงไม่จำเป็นต้องตั้งค่าหรือรีเซ็ตแต่ละบิต ฟังก์ชันขัดจังหวะถูกกำหนดโดยใช้คำสั่ง #pragma vector= และคำฟังก์ชัน __ขัดจังหวะ.ฟังก์ชันต้องเป็นประเภท void และต้องไม่มีพารามิเตอร์ใดๆ #pragma vector = ที่อยู่ ชื่อ– ชื่อฟังก์ชั่น เลือกตามดุลยพินิจของเรา สำหรับงานของเรา ฟังก์ชันตัวจัดการการขัดจังหวะจะมีลักษณะเช่นนี้ #pragma เวกเตอร์ = TIMER0_COMP_vect นั่นคือทั้งหมดที่ ฉันหวังว่าทุกอย่างชัดเจน ขัดจังหวะ - เหตุการณ์ที่ต้องการการตอบสนองทันทีจากโปรเซสเซอร์ การตอบสนองคือโปรเซสเซอร์ขัดจังหวะการประมวลผลของโปรแกรมปัจจุบัน ( โปรแกรมถูกขัดจังหวะ) และดำเนินการรันโปรแกรมอื่นต่อไป ( โปรแกรมขัดจังหวะ) ออกแบบมาเพื่องานนี้โดยเฉพาะ เมื่อโปรแกรมนี้เสร็จสิ้น โปรเซสเซอร์จะกลับไปดำเนินการโปรแกรมที่ถูกขัดจังหวะ แต่ละเหตุการณ์ที่ต้องหยุดชะงักจะตามมาด้วย สัญญาณขัดจังหวะแจ้งให้คอมพิวเตอร์ทราบเรื่องนี้แล้วโทรไป ขัดจังหวะคำขอ. สถานะของโปรแกรมแสดงถึงชุดสถานะขององค์ประกอบหน่วยเก็บข้อมูลทั้งหมด ณ จุดเวลาที่สอดคล้องกัน (เช่น หลังจากดำเนินการคำสั่งสุดท้าย) เมื่อเกิดการขัดจังหวะ ไมโครคอนโทรลเลอร์จะจัดเก็บเนื้อหาของตัวนับโปรแกรมไว้บนสแต็กและโหลดที่อยู่ของเวกเตอร์ขัดจังหวะที่เกี่ยวข้องลงไป คำสั่งสุดท้ายของรูทีนบริการขัดจังหวะจะต้องเป็นคำสั่งที่กลับไปยังโปรแกรมหลักและกู้คืนตัวนับโปรแกรมที่เก็บไว้ก่อนหน้านี้ ขณะที่ตัวจัดการขัดจังหวะกำลังดำเนินการ ข้อมูลบางอย่างอาจมีการเปลี่ยนแปลง ดังนั้นเมื่อย้ายไปยังตัวจัดการการขัดจังหวะ จำเป็นต้องบันทึกองค์ประกอบที่กำลังเปลี่ยนแปลง ชุดขององค์ประกอบดังกล่าวคือ เวกเตอร์สถานะของโปรแกรม- ในกรณีนี้ ข้อมูลอื่นๆ เกี่ยวกับสถานะของเซลล์หน่วยความจำไม่มีนัยสำคัญหรือสามารถกู้คืนได้โดยทางโปรแกรม เวกเตอร์สถานะเริ่มต้นมีข้อมูลที่จำเป็นทั้งหมดสำหรับการเปิดตัวโปรแกรมครั้งแรก ในหลายกรณี เวกเตอร์สถานะเริ่มต้นมีเพียงองค์ประกอบเดียวเท่านั้น นั่นคือที่อยู่เริ่มต้นของโปรแกรมที่กำลังเปิดใช้งาน เวกเตอร์ขัดจังหวะเป็นเวกเตอร์ของสถานะเริ่มต้นของโปรแกรมขัดจังหวะ (ตัวจัดการ) และมีข้อมูลที่จำเป็นทั้งหมดสำหรับการย้ายไปยังตัวจัดการ รวมถึงที่อยู่เริ่มต้นด้วย การขัดจังหวะแต่ละประเภทจะมีเวกเตอร์ขัดจังหวะของตัวเอง ซึ่งเริ่มต้นการดำเนินการของตัวจัดการที่เกี่ยวข้อง โดยทั่วไปแล้ว เวกเตอร์ขัดจังหวะจะถูกจัดเก็บไว้ในตำแหน่งหน่วยความจำคงที่ที่จัดสรรเป็นพิเศษพร้อมที่อยู่แบบสั้นซึ่งเป็นตัวแทน ขัดจังหวะตารางเวกเตอร์- ในการข้ามไปยังโปรแกรมขัดจังหวะที่เหมาะสม โปรเซสเซอร์จะต้องมีเวกเตอร์ขัดจังหวะและที่อยู่ของเวกเตอร์นี้ ตามที่อยู่นี้ ตามกฎแล้ว จะมีคำสั่งกระโดดแบบไม่มีเงื่อนไขไปยังรูทีนย่อยการจัดการการขัดจังหวะ ตามกฎแล้ว การควบคุมการจัดเก็บและการส่งคืนถูกกำหนดให้กับตัวจัดการการขัดจังหวะ ในกรณีนี้ ตัวจัดการประกอบด้วยสามส่วน - การเตรียมการ (อารัมภบท) และขั้นสุดท้าย (บทส่งท้าย) ซึ่งรับประกันการสลับโปรแกรม และโปรแกรมขัดจังหวะจริงซึ่งดำเนินการตามที่ร้องขอตามคำขอ เวลาตอบสนองถูกกำหนดให้เป็นช่วงเวลาจากช่วงเวลาที่ได้รับคำขอขัดจังหวะจนกระทั่งโปรแกรมขัดจังหวะเริ่มดำเนินการ หากมีแหล่งที่มาของคำขอหลายแหล่ง จะต้องสร้างลำดับการให้บริการคำขอที่เข้ามา เรียกว่า ความสัมพันธ์ที่มีลำดับความสำคัญหรือ วินัยการบริการ- ชุดของประเภทการขัดจังหวะตัวประมวลผลที่เป็นไปได้ทั้งหมดคือ ระบบขัดจังหวะไมโครคอนโทรลเลอร์ วินัยการบริการจะกำหนดว่าคำขอใดที่ได้รับพร้อมกันจะถูกประมวลผลก่อน และตัวจัดการขัดจังหวะนี้หรือนั้นมีสิทธิ์ขัดจังหวะคำขอนี้หรือไม่ หากคำขอขัดจังหวะไม่ได้รับการบริการตามเวลาที่คำขอใหม่มาถึงจากแหล่งเดียวกัน (ลำดับความสำคัญเท่ากัน) ดังนั้น ขัดขวางความอิ่มตัวของระบบ- ในกรณีนี้ คำขอขัดจังหวะบางอย่างจะหายไป ซึ่งไม่สามารถยอมรับได้สำหรับการทำงานปกติของไมโครคอนโทรลเลอร์ ลักษณะของระบบขัดจังหวะเป็น: ขัดจังหวะการมาสก์ใช้เพื่อบอกให้ไมโครคอนโทรลเลอร์ตอบสนองต่อการขัดจังหวะแต่ละประเภทหรือเพิกเฉย มาสก์ขัดจังหวะแสดงถึงรหัสไบนารี่ซึ่งมีบิตถูกแมปเพื่อขัดจังหวะแหล่งคำขอ บิตหนึ่งในรหัสไบนารี่บอกให้ไมโครคอนโทรลเลอร์จัดการกับการขัดจังหวะประเภทนี้ ในทางตรงกันข้าม ศูนย์บิตไม่อนุญาตให้ไมโครคอนโทรลเลอร์ดำเนินการประมวลผลการขัดจังหวะประเภทที่ระบุ |
เป็นที่นิยม:
ใหม่
- วิธียกเลิกการสมัครสมาชิก Megogo บนทีวี: คำแนะนำโดยละเอียด วิธียกเลิกการสมัครสมาชิก Megogo
- วิธีแบ่งพาร์ติชันดิสก์โดยติดตั้ง Windows โดยไม่สูญเสียข้อมูล แบ่งพาร์ติชันดิสก์ 7
- เหตุใดผู้จัดพิมพ์จึงไม่สามารถแก้ไขทุกหน้าได้
- ไม่มีการบู๊ตจากแฟลชไดรฟ์ใน BIOS - จะกำหนดค่าได้อย่างไร?
- รหัสโปรโมชั่น Pandao สำหรับคะแนน
- ไวรัสแรนซัมแวร์ที่เป็นอันตรายกำลังแพร่กระจายอย่างหนาแน่นบนอินเทอร์เน็ต
- การติดตั้ง RAM เพิ่มเติม
- จะทำอย่างไรถ้าหูฟังไม่สร้างเสียงบนแล็ปท็อป
- ไดเรกทอรีไดโอด ไดโอดเรียงกระแสกำลังสูง 220V
- การกู้คืน Microsoft Word สำหรับ Mac ใน OS X Yosemite Word ไม่ได้เริ่มต้นบน mac os sierra