ระบบฝังตัว - คู่มือฉบับย่อ
ระบบ
ระบบคือการจัดเรียงที่หน่วยทั้งหมดของมันประกอบทำงานร่วมกันตามชุดของกฎ นอกจากนี้ยังสามารถกำหนดเป็นวิธีการทำงานจัดระเบียบหรือทำงานอย่างใดอย่างหนึ่งหรือหลายอย่างตามแผนตายตัว ตัวอย่างเช่นนาฬิกาคือระบบแสดงเวลา ส่วนประกอบเป็นไปตามชุดของกฎเพื่อแสดงเวลา หากชิ้นส่วนใดชิ้นส่วนหนึ่งล้มเหลวนาฬิกาจะหยุดทำงาน ดังนั้นเราสามารถพูดได้ว่าในระบบส่วนประกอบย่อยทั้งหมดพึ่งพาซึ่งกันและกัน
ระบบฝังตัว
ตามชื่อของมัน Embedded หมายถึงสิ่งที่ยึดติดกับอีกสิ่งหนึ่ง ระบบฝังตัวสามารถคิดได้ว่าเป็นระบบฮาร์ดแวร์คอมพิวเตอร์ที่มีซอฟต์แวร์ฝังอยู่ ระบบฝังตัวอาจเป็นระบบอิสระหรืออาจเป็นส่วนหนึ่งของระบบขนาดใหญ่ ระบบฝังตัวคือไมโครคอนโทรลเลอร์หรือระบบที่ใช้ไมโครโปรเซสเซอร์ซึ่งออกแบบมาเพื่อทำงานเฉพาะ ตัวอย่างเช่นสัญญาณเตือนไฟไหม้เป็นระบบฝังตัว มันจะรู้สึกได้แค่ควัน
ระบบฝังตัวมีส่วนประกอบสามส่วน -
มีฮาร์ดแวร์
มีซอฟต์แวร์ประยุกต์
มีระบบปฏิบัติการแบบเรียลไทม์ (RTOS) ที่ดูแลซอฟต์แวร์แอพพลิเคชั่นและจัดเตรียมกลไกเพื่อให้โปรเซสเซอร์รันกระบวนการตามกำหนดเวลาโดยทำตามแผนการควบคุมเวลาแฝง RTOS กำหนดวิธีการทำงานของระบบ ตั้งกฎระหว่างการดำเนินการของโปรแกรมแอปพลิเคชัน ระบบฝังตัวขนาดเล็กอาจไม่มี RTOS
ดังนั้นเราสามารถกำหนดระบบฝังตัวเป็นไมโครคอนโทรลเลอร์ที่ใช้ซอฟต์แวร์ขับเคลื่อนเชื่อถือได้ระบบควบคุมแบบเรียลไทม์
ลักษณะของระบบฝังตัว
Single-functioned- ระบบฝังตัวมักจะดำเนินการเฉพาะและทำแบบเดิมซ้ำ ๆ ตัวอย่างเช่นเพจเจอร์จะทำหน้าที่เป็นเพจเจอร์เสมอ
Tightly constrained- ระบบคอมพิวเตอร์ทั้งหมดมีข้อ จำกัด เกี่ยวกับเมตริกการออกแบบ แต่ระบบที่อยู่ในระบบฝังตัวอาจมีข้อ จำกัด เป็นพิเศษ เมตริกการออกแบบคือการวัดคุณสมบัติของการนำไปใช้งานเช่นต้นทุนขนาดกำลังและประสิทธิภาพ ต้องมีขนาดที่พอดีกับชิปตัวเดียวต้องทำงานได้เร็วพอที่จะประมวลผลข้อมูลแบบเรียลไทม์และใช้พลังงานขั้นต่ำเพื่อยืดอายุแบตเตอรี่
Reactive and Real time- ระบบฝังตัวจำนวนมากต้องตอบสนองต่อการเปลี่ยนแปลงในสภาพแวดล้อมของระบบอย่างต่อเนื่องและต้องคำนวณผลลัพธ์บางอย่างตามเวลาจริงโดยไม่ชักช้า ลองพิจารณาตัวอย่างของตัวควบคุมการล่องเรือในรถยนต์ ตรวจสอบและตอบสนองต่อเซ็นเซอร์ความเร็วและเบรกอย่างต่อเนื่อง ต้องคำนวณการเร่งความเร็วหรือการลดความเร่งซ้ำ ๆ ภายในเวลาที่ จำกัด การคำนวณล่าช้าอาจส่งผลให้ไม่สามารถควบคุมรถได้
Microprocessors based - ต้องเป็นไมโครโปรเซสเซอร์หรือไมโครคอนโทรลเลอร์
Memory- ต้องมีหน่วยความจำเนื่องจากซอฟต์แวร์มักจะฝังไว้ใน ROM ไม่จำเป็นต้องมีความทรงจำรองในคอมพิวเตอร์
Connected - ต้องมีการเชื่อมต่ออุปกรณ์ต่อพ่วงเพื่อเชื่อมต่ออุปกรณ์อินพุตและเอาต์พุต
HW-SW systems- ซอฟต์แวร์ใช้เพื่อเพิ่มคุณสมบัติและความยืดหยุ่น ฮาร์ดแวร์ถูกใช้เพื่อประสิทธิภาพและความปลอดภัย
ข้อดี
- ปรับแต่งได้อย่างง่ายดาย
- การใช้พลังงานต่ำ
- ราคาถูก
- ประสิทธิภาพที่เพิ่มขึ้น
ข้อเสีย
- ความพยายามในการพัฒนาสูง
- เวลาในการทำตลาดมากขึ้น
โครงสร้างพื้นฐานของระบบฝังตัว
ภาพประกอบต่อไปนี้แสดงโครงสร้างพื้นฐานของระบบฝังตัว -
Sensor- วัดปริมาณทางกายภาพและแปลงเป็นสัญญาณไฟฟ้าซึ่งผู้สังเกตการณ์หรือเครื่องมืออิเล็กทรอนิกส์ใด ๆ สามารถอ่านได้เช่นตัวแปลง A2D เซ็นเซอร์เก็บปริมาณที่วัดได้ไปยังหน่วยความจำ
A-D Converter - ตัวแปลงอนาล็อกเป็นดิจิตอลจะแปลงสัญญาณแอนะล็อกที่เซ็นเซอร์ส่งให้เป็นสัญญาณดิจิทัล
Processor & ASICs - โปรเซสเซอร์ประมวลผลข้อมูลเพื่อวัดผลลัพธ์และจัดเก็บไว้ในหน่วยความจำ
D-A Converter - ตัวแปลงดิจิตอลเป็นอนาล็อกแปลงข้อมูลดิจิทัลที่ป้อนโดยโปรเซสเซอร์เป็นข้อมูลอนาล็อก
Actuator - แอคชูเอเตอร์เปรียบเทียบเอาต์พุตที่ได้รับจาก DA Converter กับเอาต์พุตจริง (คาดว่า) ที่เก็บไว้ในนั้นและจัดเก็บเอาต์พุตที่ได้รับอนุมัติ
โปรเซสเซอร์เป็นหัวใจของระบบฝังตัว เป็นหน่วยพื้นฐานที่รับอินพุตและสร้างเอาต์พุตหลังจากประมวลผลข้อมูล สำหรับผู้ออกแบบระบบฝังตัวจำเป็นต้องมีความรู้ทั้งไมโครโปรเซสเซอร์และไมโครคอนโทรลเลอร์
โปรเซสเซอร์ในระบบ
โปรเซสเซอร์มีสองหน่วยที่จำเป็น -
- ชุดควบคุมการไหลของโปรแกรม (CU)
- หน่วยปฏิบัติการ (EU)
CU มีหน่วยดึงข้อมูลสำหรับดึงคำแนะนำจากหน่วยความจำ สหภาพยุโรปมีวงจรที่ใช้คำแนะนำเกี่ยวกับการดำเนินการถ่ายโอนข้อมูลและการแปลงข้อมูลจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง
สหภาพยุโรปมีหน่วยเลขคณิตและตรรกะ (ALU) และวงจรที่ดำเนินการคำสั่งสำหรับงานควบคุมโปรแกรมเช่นขัดจังหวะหรือข้ามไปยังชุดคำสั่งอื่น
โปรเซสเซอร์จะเรียกใช้วงจรของการดึงข้อมูลและดำเนินการตามคำสั่งในลำดับเดียวกับที่ดึงข้อมูลจากหน่วยความจำ
ประเภทของโปรเซสเซอร์
โปรเซสเซอร์สามารถอยู่ในประเภทต่อไปนี้ -
General Purpose Processor (GPP)
- Microprocessor
- Microcontroller
- โปรเซสเซอร์ในตัว
- โปรเซสเซอร์สัญญาณดิจิตอล
- ตัวประมวลผลสื่อ
ตัวประมวลผลระบบเฉพาะแอปพลิเคชัน (ASSP)
โปรเซสเซอร์คำสั่งเฉพาะแอปพลิเคชัน (ASIP)
GPP core (s) หรือ ASIP core (s) บน Application Specific Integrated Circuit (ASIC) หรือ Very Large Scale Integration (VLSI)
ไมโครโปรเซสเซอร์
ไมโครโปรเซสเซอร์คือชิป VLSI ตัวเดียวที่มี CPU นอกจากนี้ยังอาจมีหน่วยอื่น ๆ เช่นโค้ชหน่วยคำนวณเลขคณิตสำหรับการประมวลผลจุดลอยตัวและหน่วยท่อส่งที่ช่วยในการประมวลผลคำสั่งได้เร็วขึ้น
วงจรการดึงข้อมูลและดำเนินการของไมโครโปรเซสเซอร์รุ่นก่อนหน้านี้ได้รับคำแนะนำจากความถี่สัญญาณนาฬิกาที่ ~ 1 MHz ตอนนี้โปรเซสเซอร์ทำงานที่ความถี่สัญญาณนาฬิกา 2GHz
ไมโครคอนโทรลเลอร์
ไมโครคอนโทรลเลอร์เป็นหน่วย VLSI ชิปเดียว (เรียกอีกอย่างว่า microcomputer) ซึ่งแม้ว่าจะมีความสามารถในการคำนวณที่ จำกัด แต่ก็มีความสามารถในการป้อนข้อมูล / เอาต์พุตที่ได้รับการปรับปรุงและหน่วยการทำงานบนชิปจำนวนหนึ่ง
ซีพียู | แกะ | รอม |
พอร์ต I / O | จับเวลา | พอร์ต Serial COM |
ไมโครคอนโทรลเลอร์ใช้โดยเฉพาะอย่างยิ่งในระบบฝังตัวสำหรับแอพพลิเคชั่นการควบคุมแบบเรียลไทม์ที่มีหน่วยความจำโปรแกรมบนชิปและอุปกรณ์
ไมโครโปรเซสเซอร์เทียบกับไมโครคอนโทรลเลอร์
ตอนนี้เรามาดูความแตกต่างที่โดดเด่นที่สุดระหว่างไมโครโปรเซสเซอร์และไมโครคอนโทรลเลอร์
ไมโครโปรเซสเซอร์ | ไมโครคอนโทรลเลอร์ |
---|---|
ไมโครโปรเซสเซอร์เป็นงานมัลติทาสก์ในธรรมชาติ สามารถทำงานได้หลายงานพร้อมกัน ตัวอย่างเช่นบนคอมพิวเตอร์เราสามารถเล่นเพลงในขณะที่เขียนข้อความในโปรแกรมแก้ไขข้อความ | มุ่งเน้นงานเดียว ตัวอย่างเช่นเครื่องซักผ้าออกแบบมาสำหรับซักผ้าเท่านั้น |
สามารถเพิ่ม RAM, ROM, พอร์ต I / O และตัวจับเวลาภายนอกได้และสามารถเปลี่ยนตัวเลขได้ | ไม่สามารถเพิ่ม RAM, ROM, I / O Ports และ Timers จากภายนอกได้ ส่วนประกอบเหล่านี้จะถูกฝังเข้าด้วยกันบนชิปและได้รับการแก้ไขเป็นตัวเลข |
นักออกแบบสามารถกำหนดจำนวนหน่วยความจำหรือพอร์ต I / O ที่ต้องการได้ | ตัวเลขคงที่สำหรับหน่วยความจำหรือ I / O ทำให้ไมโครคอนโทรลเลอร์เหมาะสำหรับงานที่ จำกัด แต่เฉพาะเจาะจง |
การสนับสนุนภายนอกของหน่วยความจำภายนอกและพอร์ต I / O ทำให้ระบบที่ใช้ไมโครโปรเซสเซอร์หนักกว่าและเสียค่าใช้จ่ายมากขึ้น | ไมโครคอนโทรลเลอร์มีน้ำหนักเบาและราคาถูกกว่าไมโครโปรเซสเซอร์ |
อุปกรณ์ภายนอกต้องการพื้นที่มากขึ้นและการใช้พลังงานก็สูงขึ้น | ระบบที่ใช้ไมโครคอนโทรลเลอร์ใช้พลังงานน้อยและใช้พื้นที่น้อยลง |
ไมโครคอนโทรลเลอร์ 8051 ทำงานร่วมกับบัสข้อมูล 8 บิต ดังนั้นจึงสามารถรองรับหน่วยความจำข้อมูลภายนอกได้สูงสุด 64K และหน่วยความจำโปรแกรมภายนอกที่ 64k ได้ดีที่สุด โดยรวมแล้วไมโครคอนโทรลเลอร์ 8051 สามารถจัดการหน่วยความจำภายนอกได้ 128k
เมื่อข้อมูลและรหัสอยู่ในบล็อกหน่วยความจำที่แตกต่างกันสถาปัตยกรรมจะเรียกว่า Harvard architecture. ในกรณีที่ข้อมูลและรหัสอยู่ในบล็อกหน่วยความจำเดียวกันสถาปัตยกรรมจะเรียกว่าVon Neumann architecture.
สถาปัตยกรรมฟอนนอยมันน์
สถาปัตยกรรมฟอนนอยมันน์ถูกเสนอครั้งแรกโดยนักวิทยาศาสตร์คอมพิวเตอร์จอห์นฟอนนอยมันน์ ในสถาปัตยกรรมนี้มีเส้นทางข้อมูลหรือบัสหนึ่งเส้นทางสำหรับทั้งคำสั่งและข้อมูล ด้วยเหตุนี้ซีพียูจึงทำการทำงานทีละครั้ง เรียกคำสั่งจากหน่วยความจำหรือดำเนินการอ่าน / เขียนข้อมูล ดังนั้นการดึงข้อมูลคำสั่งและการดำเนินการข้อมูลจึงไม่สามารถเกิดขึ้นพร้อมกันโดยใช้บัสร่วมกัน
สถาปัตยกรรม Von-Neumann รองรับฮาร์ดแวร์ที่เรียบง่าย อนุญาตให้ใช้หน่วยความจำแบบลำดับเดียว ความเร็วในการประมวลผลในวันนี้แซงหน้าเวลาในการเข้าถึงหน่วยความจำอย่างมากและเราใช้หน่วยความจำ (แคช) ในเครื่องที่เร็วมาก แต่มีจำนวนน้อยในโปรเซสเซอร์
สถาปัตยกรรมฮาร์วาร์ด
สถาปัตยกรรม Harvard มีพื้นที่จัดเก็บข้อมูลและบัสสัญญาณแยกต่างหากสำหรับคำแนะนำและข้อมูล สถาปัตยกรรมนี้มีการจัดเก็บข้อมูลทั้งหมดที่อยู่ภายใน CPU และไม่มีการเข้าถึงที่จัดเก็บคำสั่งเป็นข้อมูล คอมพิวเตอร์มีพื้นที่หน่วยความจำแยกต่างหากสำหรับคำสั่งโปรแกรมและข้อมูลโดยใช้บัสข้อมูลภายในทำให้สามารถเข้าถึงทั้งคำสั่งและข้อมูลได้พร้อมกัน
โปรแกรมที่จำเป็นในการโหลดโดยตัวดำเนินการ โปรเซสเซอร์ไม่สามารถบู๊ตเองได้ ในสถาปัตยกรรมฮาร์วาร์ดไม่จำเป็นต้องทำให้ความทรงจำทั้งสองแบ่งปันกัน
สถาปัตยกรรมฟอน - นอยมันน์เทียบกับสถาปัตยกรรมฮาร์วาร์ด
ประเด็นต่อไปนี้ทำให้สถาปัตยกรรมฟอนนอยมันน์แตกต่างจากสถาปัตยกรรมฮาร์วาร์ด
สถาปัตยกรรมฟอน - นอยมันน์ | สถาปัตยกรรมฮาร์วาร์ด |
---|---|
หน่วยความจำเดียวที่จะแชร์ทั้งรหัสและข้อมูล | แยกความทรงจำสำหรับรหัสและข้อมูล |
โปรเซสเซอร์จำเป็นต้องดึงรหัสในรอบสัญญาณนาฬิกาที่แยกจากกันและข้อมูลในรอบนาฬิกาอื่น ดังนั้นจึงต้องใช้สองรอบนาฬิกา | รอบนาฬิกาเดียวก็เพียงพอแล้วเนื่องจากมีการใช้บัสแยกต่างหากเพื่อเข้าถึงรหัสและข้อมูล |
ความเร็วสูงขึ้นจึงใช้เวลาน้อยลง | ความเร็วช้าลงจึงใช้เวลานานกว่า |
เรียบง่ายในการออกแบบ | ซับซ้อนในการออกแบบ |
CISC และ RISC
CISC เป็นคอมพิวเตอร์ชุดคำสั่งที่ซับซ้อน เป็นคอมพิวเตอร์ที่สามารถจัดการกับคำสั่งได้เป็นจำนวนมาก
ในช่วงต้นทศวรรษ 1980 นักออกแบบคอมพิวเตอร์แนะนำว่าคอมพิวเตอร์ควรใช้คำสั่งน้อยลงด้วยโครงสร้างที่เรียบง่ายเพื่อให้สามารถทำงานได้เร็วขึ้นมากภายใน CPU โดยไม่ต้องใช้หน่วยความจำ คอมพิวเตอร์ดังกล่าวจัดเป็น Reduced Instruction Set Computer หรือ RISC
CISC กับ RISC
ประเด็นต่อไปนี้ทำให้ CISC แตกต่างจาก RISC -
CISC | ความเสี่ยง |
---|---|
ชุดคำสั่งที่ใหญ่ขึ้น ง่ายต่อการตั้งโปรแกรม | ชุดคำแนะนำที่เล็กลง ยากต่อการเขียนโปรแกรม |
การออกแบบคอมไพเลอร์ที่เรียบง่ายขึ้นโดยพิจารณาจากชุดคำสั่งที่ใหญ่ขึ้น | การออกแบบคอมไพเลอร์ที่ซับซ้อน |
โหมดการกำหนดแอดเดรสจำนวนมากทำให้เกิดรูปแบบคำสั่งที่ซับซ้อน | โหมดการกำหนดแอดเดรสไม่กี่แก้ไขรูปแบบคำสั่ง |
ความยาวของคำสั่งเป็นตัวแปร | ความยาวของคำสั่งแตกต่างกันไป |
รอบนาฬิกาต่อวินาทีสูงขึ้น | รอบนาฬิกาต่ำต่อวินาที |
เน้นฮาร์ดแวร์ | เน้นซอฟต์แวร์ |
ชุดควบคุมใช้ชุดคำสั่งขนาดใหญ่โดยใช้หน่วยไมโครโปรแกรม | แต่ละคำสั่งจะต้องดำเนินการโดยฮาร์ดแวร์ |
การดำเนินการช้าลงเนื่องจากคำแนะนำจะต้องอ่านจากหน่วยความจำและถอดรหัสโดยหน่วยถอดรหัส | ดำเนินการได้เร็วขึ้นเนื่องจากแต่ละคำสั่งจะต้องดำเนินการโดยฮาร์ดแวร์ |
ไม่สามารถวางท่อได้ | การวางท่อเป็นไปได้โดยพิจารณาจากรอบนาฬิกาเดียว |
คอมไพเลอร์และแอสเซมเบลอร์
คอมไพเลอร์
คอมไพเลอร์คือโปรแกรมคอมพิวเตอร์ (หรือชุดโปรแกรม) ที่แปลงซอร์สโค้ดที่เขียนด้วยภาษาโปรแกรม (ภาษาต้นทาง) เป็นภาษาคอมพิวเตอร์อื่น (โดยปกติจะเป็นรูปแบบไบนารี) สาเหตุส่วนใหญ่ของการแปลงคือการสร้างโปรแกรมปฏิบัติการ ชื่อ "คอมไพเลอร์" ส่วนใหญ่ใช้สำหรับโปรแกรมที่แปลซอร์สโค้ดจากภาษาโปรแกรมระดับสูงไปเป็นภาษาระดับต่ำ (เช่นภาษาแอสเซมบลีหรือรหัสเครื่อง)
ข้ามคอมไพเลอร์
หากโปรแกรมที่คอมไพล์สามารถทำงานบนคอมพิวเตอร์ที่มี CPU หรือระบบปฏิบัติการแตกต่างจากคอมพิวเตอร์ที่คอมไพเลอร์รวบรวมโปรแกรมคอมไพเลอร์นั้นจะเรียกว่าคอมไพเลอร์ข้าม
ตัวถอดรหัส
โปรแกรมที่สามารถแปลโปรแกรมจากภาษาระดับต่ำเป็นภาษาระดับสูงเรียกว่าตัวถอดรหัส
แปลงภาษา
โปรแกรมที่แปลโปรแกรมที่เขียนด้วยภาษาระดับสูงต่างๆโดยปกติเรียกว่าตัวแปลภาษาตัวแปลต้นทางไปยังตัวแปลต้นทางหรือตัวแปลงภาษา
คอมไพเลอร์มีแนวโน้มที่จะดำเนินการดังต่อไปนี้ -
- Preprocessing
- Parsing
- การวิเคราะห์ความหมาย (การแปลที่มุ่งเน้นไวยากรณ์)
- การสร้างรหัส
- การเพิ่มประสิทธิภาพรหัส
ผู้ประกอบ
แอสเซมเบลอร์คือโปรแกรมที่ใช้คำสั่งพื้นฐานของคอมพิวเตอร์ (เรียกว่าภาษาแอสเซมบลี) และแปลงเป็นรูปแบบของบิตที่โปรเซสเซอร์ของคอมพิวเตอร์สามารถใช้เพื่อดำเนินการขั้นพื้นฐานได้ แอสเซมเบลอร์สร้างโค้ดอ็อบเจ็กต์โดยการแปลคำสั่งการจำแอสเซมบลีเป็น opcodes แก้ไขชื่อสัญลักษณ์เป็นตำแหน่งหน่วยความจำ ภาษาแอสเซมบลีใช้ตัวช่วยในการจำเพื่อแสดงการทำงานของเครื่องระดับต่ำ (opcode)
เครื่องมือดีบักในระบบฝังตัว
การดีบักเป็นกระบวนการที่เป็นระบบในการค้นหาและลดจำนวนข้อบกพร่องในโปรแกรมคอมพิวเตอร์หรือฮาร์ดแวร์อิเล็กทรอนิกส์เพื่อให้ทำงานได้ตามที่คาดไว้ การดีบักเป็นเรื่องยากเมื่อระบบย่อยเชื่อมโยงกันอย่างแน่นหนาเนื่องจากการเปลี่ยนแปลงเล็กน้อยในระบบย่อยหนึ่งสามารถสร้างจุดบกพร่องในอีกระบบหนึ่งได้ เครื่องมือดีบักที่ใช้ในระบบฝังตัวแตกต่างกันอย่างมากในแง่ของเวลาในการพัฒนาและคุณสมบัติการดีบัก เราจะพูดถึงเครื่องมือการดีบักต่อไปนี้ -
- Simulators
- ชุดสตาร์ทไมโครคอนโทรลเลอร์
- Emulator
เครื่องจำลอง
โค้ดได้รับการทดสอบสำหรับ MCU / ระบบโดยจำลองบนโฮสต์คอมพิวเตอร์ที่ใช้สำหรับการพัฒนาโค้ด เครื่องจำลองพยายามจำลองพฤติกรรมของไมโครคอนโทรลเลอร์ที่สมบูรณ์ในซอฟต์แวร์
หน้าที่ของเครื่องจำลอง
เครื่องจำลองทำหน้าที่ดังต่อไปนี้ -
กำหนดตระกูลโปรเซสเซอร์หรืออุปกรณ์ประมวลผลตลอดจนเวอร์ชันต่างๆสำหรับระบบเป้าหมาย
ตรวจสอบข้อมูลโดยละเอียดของส่วนซอร์สโค้ดที่มีเลเบลและอาร์กิวเมนต์เชิงสัญลักษณ์เมื่อการดำเนินการดำเนินไปในแต่ละขั้นตอน
แสดงสถานะของ RAM และพอร์ตจำลองของระบบเป้าหมายสำหรับการดำเนินการในแต่ละขั้นตอนเดียว
ตรวจสอบการตอบสนองของระบบและกำหนดปริมาณงาน
จัดเตรียมการติดตามผลลัพธ์ของเนื้อหาของตัวนับโปรแกรมเทียบกับการลงทะเบียนโปรเซสเซอร์
ให้ความหมายโดยละเอียดของคำสั่งปัจจุบัน
ตรวจสอบข้อมูลโดยละเอียดของคำสั่งจำลองเนื่องจากป้อนจากแป้นพิมพ์หรือเลือกจากเมนู
รองรับเงื่อนไข (สูงสุด 8 หรือ 16 หรือ 32 เงื่อนไข) และเบรกพอยต์ที่ไม่มีเงื่อนไข
จัดเตรียมจุดพักและการติดตามซึ่งเป็นเครื่องมือทดสอบและดีบักที่สำคัญร่วมกัน
อำนวยความสะดวกในการซิงโครไนซ์อุปกรณ์ต่อพ่วงภายในและความล่าช้า
ชุดเริ่มต้นไมโครคอนโทรลเลอร์
ชุดสตาร์ทไมโครคอนโทรลเลอร์ประกอบด้วย -
- บอร์ดฮาร์ดแวร์ (บอร์ดประเมินผล)
- โปรแกรมเมอร์ในระบบ
- เครื่องมือซอฟต์แวร์บางอย่างเช่นคอมไพเลอร์แอสเซมเบลอร์ลิงค์เกอร์ ฯลฯ
- ในบางครั้ง IDE และโค้ดขนาด จำกัด เวอร์ชันการประเมินของคอมไพลเลอร์
ข้อได้เปรียบที่สำคัญของชุดอุปกรณ์เหล่านี้เหนือเครื่องจำลองคือการทำงานแบบเรียลไทม์จึงช่วยให้สามารถตรวจสอบฟังก์ชันอินพุต / เอาต์พุตได้ง่าย อย่างไรก็ตามชุดเริ่มต้นนั้นเพียงพออย่างสมบูรณ์และเป็นตัวเลือกที่ถูกที่สุดในการพัฒนาโครงการไมโครคอนโทรลเลอร์อย่างง่าย
อีมูเลเตอร์
อีมูเลเตอร์คือชุดฮาร์ดแวร์หรือโปรแกรมซอฟต์แวร์หรืออาจเป็นได้ทั้งสองอย่างที่เลียนแบบการทำงานของระบบคอมพิวเตอร์หนึ่ง (แขก) ในระบบคอมพิวเตอร์อื่น (โฮสต์) ซึ่งแตกต่างจากระบบแรกเพื่อให้พฤติกรรมที่จำลองมีความคล้ายคลึงกันอย่างใกล้ชิด ของระบบจริง (แขก)
การเลียนแบบหมายถึงความสามารถของโปรแกรมคอมพิวเตอร์ในอุปกรณ์อิเล็กทรอนิกส์ในการเลียนแบบ (เลียนแบบ) โปรแกรมหรืออุปกรณ์อื่น การจำลองเน้นไปที่การสร้างสภาพแวดล้อมคอมพิวเตอร์ดั้งเดิมขึ้นมาใหม่ อีมูเลเตอร์มีความสามารถในการรักษาการเชื่อมต่อที่ใกล้ชิดกับความถูกต้องของวัตถุดิจิทัล โปรแกรมจำลองช่วยให้ผู้ใช้ทำงานกับแอปพลิเคชันหรือระบบปฏิบัติการประเภทใดก็ได้บนแพลตฟอร์มในลักษณะเดียวกับที่ซอฟต์แวร์ทำงานในสภาพแวดล้อมดั้งเดิม
อุปกรณ์ต่อพ่วงในระบบฝังตัว
ระบบฝังตัวสื่อสารกับโลกภายนอกผ่านอุปกรณ์ต่อพ่วงเช่นการติดตาม & mins;
- Serial Communication Interfaces (SCI) เช่น RS-232, RS-422, RS-485 เป็นต้น
- Synchronous Serial Communication Interface เช่น I2C, SPI, SSC และ ESSI
- บัสอนุกรมสากล (USB)
- การ์ดมัลติมีเดีย (การ์ด SD, แฟลชขนาดกะทัดรัด ฯลฯ )
- เครือข่ายเช่นอีเธอร์เน็ต LonWorks ฯลฯ
- Fieldbuses เช่น CAN-Bus, LIN-Bus, PROFIBUS เป็นต้น
- imers เช่น PLL (s), Capture / Compare และ Time Processing Units
- IO แบบแยกหรือที่เรียกว่า General Purpose Input / Output (GPIO)
- อนาล็อกเป็นดิจิตอล / ดิจิตอลเป็นอนาล็อก (ADC / DAC)
- การดีบักเช่นพอร์ต JTAG, ISP, ICSP, BDM Port, BITP และ DP9
หลักเกณฑ์ในการเลือกไมโครคอนโทรลเลอร์
ในขณะที่เลือกไมโครคอนโทรลเลอร์ตรวจสอบให้แน่ใจว่าตรงกับงานที่ทำอยู่และคุ้มค่า เราต้องดูว่าไมโครคอนโทรลเลอร์ 8 บิต 16 บิตหรือ 32 บิตสามารถรองรับความต้องการด้านคอมพิวเตอร์ของงานได้ดีที่สุด นอกจากนี้ควรคำนึงถึงประเด็นต่อไปนี้ในขณะที่เลือกไมโครคอนโทรลเลอร์ -
Speed - ไมโครคอนโทรลเลอร์รองรับความเร็วสูงสุดเท่าไหร่?
Packaging- เป็น DIP 40 พิน (แพ็คเกจคู่อินไลน์) หรือ QFP (แพ็คเกจ Quad แบน) สิ่งนี้มีความสำคัญในแง่ของพื้นที่การประกอบและการสร้างต้นแบบผลิตภัณฑ์ขั้นสุดท้าย
Power Consumption - นี่เป็นเกณฑ์สำคัญสำหรับผลิตภัณฑ์ที่ใช้แบตเตอรี่
Amount of RAM and ROM บนชิป
Count of I/O pins and Timers บนชิป
Cost per Unit - นี่เป็นสิ่งสำคัญในแง่ของต้นทุนขั้นสุดท้ายของผลิตภัณฑ์ที่จะใช้ไมโครคอนโทรลเลอร์
นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณมีเครื่องมือเช่นคอมไพเลอร์ตัวดีบั๊กและแอสเซมเบลอร์ที่พร้อมใช้งานกับไมโครคอนโทรลเลอร์ ที่สำคัญที่สุดคุณควรซื้อไมโครคอนโทรลเลอร์จากแหล่งที่เชื่อถือได้
ประวัติย่อของ 8051
ไมโครโปรเซสเซอร์ตัวแรก 4004 ถูกคิดค้นโดย Intel Corporation 8085 และ 8086ไมโครโปรเซสเซอร์ถูกคิดค้นโดย Intel ในปี 1981 Intel ได้เปิดตัวไมโครคอนโทรลเลอร์ 8 บิตที่เรียกว่า8051. มันถูกเรียกว่าsystem on a chipเนื่องจากมี RAM 128 ไบต์, ROM บนชิป 4K ไบต์ตัวจับเวลาสองตัวพอร์ตอนุกรมหนึ่งพอร์ตและพอร์ต 4 พอร์ต (กว้าง 8 บิต) ทั้งหมดนี้อยู่ในชิปตัวเดียว เมื่อเป็นที่นิยมอย่างแพร่หลาย Intel อนุญาตให้ผู้ผลิตรายอื่นทำและวางตลาดรสชาติที่แตกต่างกันของ 8051 โดยมีรหัสที่เข้ากันได้กับ 8051 หมายความว่าถ้าคุณเขียนโปรแกรมของคุณสำหรับรสชาติ 8051 หนึ่งรสชาติมันจะทำงานในรสชาติอื่น ๆ ด้วยไม่ว่าจะเป็น ผู้ผลิต. สิ่งนี้นำไปสู่หลายเวอร์ชันที่มีความเร็วและจำนวน RAM บนชิปที่แตกต่างกัน
8051 รส. / สมาชิก
8052 microcontroller- 8052 มีคุณสมบัติมาตรฐานทั้งหมดของไมโครคอนโทรลเลอร์ 8051 เช่นเดียวกับแรมพิเศษ 128 ไบต์และตัวจับเวลาเพิ่มเติม นอกจากนี้ยังมี ROM โปรแกรมบนชิป 8K ไบต์แทนที่จะเป็น 4K ไบต์
8031 microcontroller- เป็นสมาชิกอีกคนในตระกูล 8051 ชิปนี้มักเรียกกันว่า ROM-less 8051 เนื่องจากมี ROM บนชิป 0K ไบต์ คุณต้องเพิ่ม ROM ภายนอกเพื่อใช้งานซึ่งมีโปรแกรมที่จะเรียกและเรียกใช้งาน โปรแกรมนี้มีขนาดใหญ่ถึง 64K ไบต์ แต่ในกระบวนการเพิ่ม ROM ภายนอกไปยัง 8031 มันสูญเสีย 2 พอร์ตจาก 4 พอร์ต ในการแก้ปัญหานี้เราสามารถเพิ่ม I / O ภายนอกลงใน 8031
เปรียบเทียบระหว่างสมาชิกครอบครัว 8051
ตารางต่อไปนี้เปรียบเทียบคุณสมบัติที่มีใน 8051, 8052 และ 8031
ลักษณะเฉพาะ | 8051 | 8052 | 8031 |
---|---|---|---|
ROM (ไบต์) | 4K | 8K | 0K |
RAM (ไบต์) | 128 | 256 | 128 |
ตัวจับเวลา | 2 | 3 | 2 |
หมุด I / O | 32 | 32 | 32 |
พอร์ตอนุกรม | 1 | 1 | 1 |
ขัดจังหวะแหล่งที่มา | 6 | 8 | 6 |
คุณสมบัติของไมโครคอนโทรลเลอร์ 8051
ไมโครคอนโทรลเลอร์ 8051 มาพร้อมกับคุณสมบัติดังต่อไปนี้ -
- หน่วยความจำโปรแกรมบนชิป 4KB ไบต์ (ROM)
- หน่วยความจำข้อมูลบนชิป 128 ไบต์ (RAM)
- ธนาคารลงทะเบียนสี่แห่ง
- ผู้ใช้กำหนดค่าสถานะซอฟต์แวร์ 128 รายการ
- บัสข้อมูลแบบสองทิศทาง 8 บิต
- บัสแอดเดรสทิศทางเดียว 16 บิต
- วัตถุประสงค์ทั่วไป 32 รายการลงทะเบียนแต่ละ 8 บิต
- ตัวจับเวลา 16 บิต (โดยปกติจะเป็น 2 แต่อาจมีมากกว่าหรือน้อยกว่า)
- อินเทอร์รัปต์ภายในและภายนอกสองตัว
- พอร์ต 8 บิตสี่พอร์ต (รุ่นสั้นมีพอร์ต 8 บิตสองพอร์ต)
- ตัวนับโปรแกรม 16 บิตและตัวชี้ข้อมูล
- 8051 อาจมีคุณสมบัติพิเศษอีกมากมายเช่น UARTs, ADC, Op-amp เป็นต้น
Block Diagram ของไมโครคอนโทรลเลอร์ 8051
ภาพประกอบต่อไปนี้แสดงแผนภาพบล็อกของไมโครคอนโทรลเลอร์ 8051 -
ใน 8051 การดำเนินการ I / O ทำได้โดยใช้พอร์ตสี่พอร์ตและ 40 พิน แผนภาพพินต่อไปนี้แสดงรายละเอียดของหมุด 40 พิน พอร์ตการทำงาน I / O สงวน 32 พินโดยที่แต่ละพอร์ตมี 8 พิน อีก 8 พินกำหนดให้เป็น V cc , GND, XTAL1, XTAL2, RST, EA (bar), ALE / PROG (bar) และ PSEN (bar)
เป็น PDIP 40 พิน (Plastic Dual Inline Package)
Note- ในแพ็คเกจ DIP คุณสามารถจดจำพินแรกและพินสุดท้ายได้โดยการตัดที่ตรงกลางของ IC ขาแรกที่อยู่ทางด้านซ้ายของเครื่องหมายนี้และตัดขาสุดท้าย (เช่น 40 THขาในกรณีนี้) อยู่ทางด้านขวาของเครื่องหมายตัด
พอร์ต I / O และหน้าที่
พอร์ตสี่พอร์ต P0, P1, P2 และ P3 แต่ละพอร์ตใช้ 8 พินทำให้เป็นพอร์ต 8 บิต เมื่อ RESET พอร์ตทั้งหมดจะถูกกำหนดค่าเป็นอินพุตพร้อมที่จะใช้เป็นพอร์ตอินพุต เมื่อ 0 แรกถูกเขียนลงในพอร์ตมันจะกลายเป็นเอาต์พุต ในการกำหนดค่าใหม่เป็นอินพุตต้องส่ง 1 ไปยังพอร์ต
พอร์ต 0 (Pin No 32 - Pin No 39)
มี 8 พิน (32 ถึง 39) สามารถใช้สำหรับอินพุตหรือเอาต์พุต ซึ่งแตกต่างจากพอร์ต P1, P2 และ P3 โดยปกติเราจะเชื่อมต่อตัวต้านทานแบบดึงขึ้น P0 ถึง 10K-ohm เพื่อใช้เป็นพอร์ตอินพุตหรือเอาต์พุตซึ่งเป็นช่องระบายน้ำแบบเปิด
นอกจากนี้ยังกำหนดให้เป็น AD0-AD7 ทำให้สามารถใช้เป็นทั้งที่อยู่และข้อมูลได้ ในกรณีของ 8031 (เช่น ROMless Chip) เมื่อเราต้องการเข้าถึง ROM ภายนอก P0 จะถูกใช้สำหรับทั้ง Address และ Data Bus ALE (Pin no 31) ระบุว่า P0 มีที่อยู่หรือข้อมูลหรือไม่ เมื่อ ALE = 0 จะให้ข้อมูล D0-D7 แต่เมื่อ ALE = 1 จะมีที่อยู่ A0-A7 ในกรณีที่ไม่มีการเชื่อมต่อหน่วยความจำภายนอก P0 จะต้องเชื่อมต่อภายนอกกับตัวต้านทานแบบดึงขึ้น 10K-ohm
MOV A,#0FFH ;(comments: A=FFH(Hexadecimal i.e. A=1111 1111)
MOV P0,A ;(Port0 have 1's on every pin so that it works as Input)
พอร์ต 1 (พิน 1 ถึง 8)
เป็นพอร์ต 8 บิต (พิน 1 ถึง 8) และสามารถใช้เป็นอินพุตหรือเอาต์พุตได้ ไม่ต้องใช้ตัวต้านทานแบบดึงขึ้นเนื่องจากมีการเชื่อมต่อภายในอยู่แล้ว เมื่อรีเซ็ตพอร์ต 1 จะถูกกำหนดค่าเป็นพอร์ตอินพุต สามารถใช้รหัสต่อไปนี้เพื่อส่งค่า 55H และ AAH สลับกันไปยังพอร์ต 1
;Toggle all bits of continuously
MOV A,#55
BACK:
MOV P2,A
ACALL DELAY
CPL A ;complement(invert) reg. A
SJMP BACK
หากพอร์ต 1 ถูกกำหนดค่าให้ใช้เป็นพอร์ตเอาต์พุตดังนั้นหากต้องการใช้เป็นพอร์ตอินพุตอีกครั้งให้ตั้งโปรแกรมโดยเขียน 1 ลงในบิตทั้งหมดตามรหัสต่อไปนี้
;Toggle all bits of continuously
MOV A ,#0FFH ;A = FF hex
MOV P1,A ;Make P1 an input port
MOV A,P1 ;get data from P1
MOV R7,A ;save it in Reg R7
ACALL DELAY ;wait
MOV A,P1 ;get another data from P1
MOV R6,A ;save it in R6
ACALL DELAY ;wait
MOV A,P1 ;get another data from P1
MOV R5,A ;save it in R5
พอร์ต 2 (พิน 21 ถึง 28)
พอร์ต 2 ใช้พินทั้งหมด 8 พิน (พิน 21 ถึง 28) และสามารถใช้ได้ทั้งอินพุตและเอาต์พุต เช่นเดียวกับ P1 (พอร์ต 1) P2 ยังไม่ต้องการตัวต้านทานแบบดึงขึ้นภายนอกเนื่องจากมีการเชื่อมต่อภายในอยู่แล้ว ต้องใช้ร่วมกับ P0 เพื่อระบุแอดเดรส 16 บิตสำหรับหน่วยความจำภายนอก ดังนั้นจึงกำหนดเป็น (A0 – A7) ด้วยดังที่แสดงในแผนภาพพิน เมื่อ 8051 เชื่อมต่อกับหน่วยความจำภายนอกจะมีพา ธ สำหรับแอดเดรส 8 บิต 16 บิตบนและไม่สามารถใช้เป็น I / O ได้ เมื่อรีเซ็ตพอร์ต 2 จะถูกกำหนดค่าเป็นพอร์ตอินพุต สามารถใช้โค้ดต่อไปนี้เพื่อส่งค่า 55H และ AAH แบบสลับกันไปยังพอร์ต 2
;Toggle all bits of continuously
MOV A,#55
BACK:
MOV P2,A
ACALL DELAY
CPL A ; complement(invert) reg. A
SJMP BACK
หากพอร์ต 2 ถูกกำหนดค่าให้ใช้เป็นพอร์ตเอาต์พุตดังนั้นหากต้องการใช้เป็นพอร์ตอินพุตอีกครั้งให้ตั้งโปรแกรมโดยเขียน 1 ลงในบิตทั้งหมดตามรหัสต่อไปนี้
;Get a byte from P2 and send it to P1
MOV A,#0FFH ;A = FF hex
MOV P2,A ;make P2 an input port
BACK:
MOV A,P2 ;get data from P2
MOV P1,A ;send it to Port 1
SJMP BACK ;keep doing that
พอร์ต 3 (หมุด 10 ถึง 17)
นอกจากนี้ยังมีขนาด 8 บิตและสามารถใช้เป็นอินพุต / เอาต์พุตได้ พอร์ตนี้ให้สัญญาณที่สำคัญอย่างยิ่ง P3.0 และ P3.1 คือ RxD (ตัวรับ) และ TxD (เครื่องส่งสัญญาณ) ตามลำดับและใช้ร่วมกันสำหรับการสื่อสารแบบอนุกรม พิน P3.2 และ P3.3 ใช้สำหรับอินเทอร์รัปต์ภายนอก P3.4 และ P3.5 ใช้สำหรับตัวจับเวลา T0 และ T1 ตามลำดับ P3.6 และ P3.7 คือพินเขียน (WR) และอ่าน (RD) เหล่านี้เป็นพินต่ำที่ใช้งานอยู่หมายความว่าจะใช้งานได้เมื่อมีการให้ 0 และใช้เพื่อให้การดำเนินการอ่านและเขียนไปยัง ROM ภายนอกในระบบที่ใช้ 8031
P3 บิต | ฟังก์ชัน | พิน |
---|---|---|
P3.0 | RxD | 10 |
P3.1 < | TxD | 11 |
P3.2 < | เสริม INT0 | 12 |
P3.3 < | INT1 | 13 |
P3.4 < | T0 | 14 |
P3.5 < | T1 | 15 |
P3.6 < | WR | 16 |
P3.7 < | เสริม RD | 17 |
บทบาทคู่ของพอร์ต 0 และพอร์ต 2
Dual role of Port 0- พอร์ต 0 ถูกกำหนดให้เป็น AD0 – AD7 เช่นกันเนื่องจากสามารถใช้ได้ทั้งข้อมูลและการจัดการที่อยู่ ในขณะที่เชื่อมต่อ 8051 กับหน่วยความจำภายนอกพอร์ต 0 สามารถให้ทั้งที่อยู่และข้อมูล ไมโครคอนโทรลเลอร์ 8051 จะมัลติเพล็กซ์อินพุตเป็นแอดเดรสหรือข้อมูลเพื่อบันทึกพิน
Dual role of Port 2- นอกจากทำงานเป็น I / O แล้วพอร์ต P2 ยังใช้เพื่อจัดเตรียมแอดเดรสบัส 16 บิตสำหรับหน่วยความจำภายนอกพร้อมกับพอร์ต 0 อีกด้วยพอร์ต P2 ถูกกำหนดให้เป็น (A8– A15) ในขณะที่พอร์ต 0 ให้ 8 บิตที่ต่ำกว่าผ่าน A0 – A7 กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่าเมื่อ 8051 เชื่อมต่อกับหน่วยความจำภายนอก (ROM) ซึ่งสามารถสูงสุดได้ถึง 64KB และเป็นไปได้ด้วยบัสแอดเดรส 16 บิตเพราะเรารู้ว่า 216 = 64KB Port2 ใช้สำหรับ 8 บิตบนของแอดเดรส 16 บิตและไม่สามารถใช้กับ I / O ได้และนี่คือวิธีที่ระบุรหัสโปรแกรมของ ROM ภายนอก
การเชื่อมต่อฮาร์ดแวร์ของพิน
Vcc - Pin 40 จ่ายให้กับชิปและคือ +5 V.
Gnd - Pin 20 เป็นพื้นสำหรับการอ้างอิง
XTAL1, XTAL2 (Pin no 18 & Pin no 19)- 8051 มีออสซิลเลเตอร์บนชิป แต่ต้องใช้นาฬิกาภายนอกเพื่อเรียกใช้ คริสตัลควอตซ์เชื่อมต่อระหว่างพิน XTAL1 และ XTAL2 ของชิป คริสตัลนี้ยังต้องการตัวเก็บประจุ 30pF สองตัวเพื่อสร้างสัญญาณความถี่ที่ต้องการ ด้านหนึ่งของตัวเก็บประจุแต่ละตัวเชื่อมต่อกับกราวด์ 8051 IC มีให้ใช้งานในความเร็วต่างๆและทั้งหมดขึ้นอยู่กับผลึกควอตซ์นี้เช่นไมโครคอนโทรลเลอร์ 20 MHz ต้องการคริสตัลที่มีความถี่ไม่เกิน 20 MHz
RST (Pin No. 9)- เป็นพินอินพุตและพินสูงที่ใช้งานอยู่ เมื่อใช้พัลส์สูงที่พินนี้นั่นคือ 1 ไมโครคอนโทรลเลอร์จะรีเซ็ตและยุติกิจกรรมทั้งหมด กระบวนการนี้เรียกว่าPower-On Reset. การเปิดใช้งานการรีเซ็ตการเปิดเครื่องจะทำให้ค่าทั้งหมดในรีจิสเตอร์สูญหาย มันจะตั้งค่าตัวนับโปรแกรมเป็น 0 ทั้งหมด เพื่อให้แน่ใจว่าอินพุตรีเซ็ตถูกต้องพัลส์สูงจะต้องสูงเป็นเวลาอย่างน้อยสองรอบเครื่องก่อนที่จะได้รับอนุญาตให้ไปต่ำซึ่งขึ้นอยู่กับค่าตัวเก็บประจุและอัตราที่มันชาร์จ (Machine Cycle คือจำนวนความถี่ต่ำสุดที่คำสั่งเดียวต้องการในการดำเนินการ)
EA or External Access (Pin No. 31)- เป็นพินอินพุต พินนี้เป็นพินต่ำที่ใช้งานได้ เมื่อใช้ชีพจรต่ำจะได้รับการเปิดใช้งาน ในกรณีของไมโครคอนโทรลเลอร์ (8051/52) มีรอมบนชิปอีเอ (บาร์) ขาเชื่อมต่อกับวีซีซี แต่ในไมโครคอนโทรลเลอร์ 8031 ซึ่งไม่มี ROM บนชิปรหัสจะถูกเก็บไว้ใน ROM ภายนอกแล้วดึงข้อมูลโดยไมโครคอนโทรลเลอร์ ในกรณีนี้เราต้องเชื่อมต่อ EA (พินหมายเลข 31) เข้ากับ Gnd เพื่อระบุว่าโค้ดโปรแกรมถูกเก็บไว้ภายนอก
PSEN or Program store Enable (Pin No 29)- นี่เป็นพินต่ำที่ใช้งานได้เช่นกันเช่นจะเปิดใช้งานหลังจากใช้ชีพจรต่ำ เป็นพินเอาต์พุตและใช้ร่วมกับขา EA ในระบบที่ใช้ 8031 (เช่น ROMLESS) เพื่ออนุญาตให้จัดเก็บรหัสโปรแกรมใน ROM ภายนอก
ALE or (Address Latch Enable)- นี่คือขาออกและมีการใช้งานสูง โดยเฉพาะใช้สำหรับ 8031 IC เพื่อเชื่อมต่อกับหน่วยความจำภายนอก สามารถใช้ในขณะที่ตัดสินใจว่าจะใช้พิน P0 เป็นแอดเดรสบัสหรือบัสข้อมูล เมื่อ ALE = 1 พิน P0 จะทำงานเป็นบัสข้อมูลและเมื่อ ALE = 0 พิน P0 จะทำหน้าที่เป็นแอดเดรสบัส
พอร์ต I / O และความสามารถในการระบุตำแหน่งบิต
เป็นคุณสมบัติที่ใช้กันอย่างแพร่หลายของ 8051 ในขณะที่เขียนโค้ดสำหรับ 8051 บางครั้งเราจำเป็นต้องเข้าถึงพอร์ตเพียง 1 หรือ 2 บิตแทนที่จะเป็น 8 บิตทั้งหมด 8051 ให้ความสามารถในการเข้าถึงแต่ละบิตของพอร์ต
ในขณะที่เข้าถึงพอร์ตในลักษณะบิตเดียวเราใช้ไวยากรณ์ "SETB X. Y" โดยที่ X คือหมายเลขพอร์ต (0 ถึง 3) และ Y คือหมายเลขบิต (0 ถึง 7) สำหรับบิตข้อมูล D0-D7 โดยที่ D0 คือ LSB และ D7 คือ MSB ตัวอย่างเช่น "SETB P1.5" ตั้งค่า high bit 5 ของพอร์ต 1
โค้ดต่อไปนี้แสดงวิธีที่เราสามารถสลับบิต P1.2 อย่างต่อเนื่อง
AGAIN:
SETB P1.2
ACALL DELAY
CLR P1.2
ACALL DELAY
SJMP AGAIN
คำแนะนำบิตเดียว
คำแนะนำ | ฟังก์ชัน |
---|---|
บิต SETB | ตั้งค่าบิต (bit = 1) |
CLR บิต | ล้างบิต (บิต = 0) |
บิต CPL | เติมเต็มบิต (bit = NOT bit) |
เจบีหน่อยนะเป้าหมาย | ข้ามไปที่เป้าหมายถ้า bit = 1 (กระโดดถ้าบิต) |
JNB บิตเป้าหมาย | ข้ามไปที่เป้าหมายถ้าบิต = 0 (กระโดดถ้าไม่มีบิต) |
JBC บิตเป้าหมาย | ข้ามไปที่เป้าหมายถ้า bit = 1 ล้างบิต (กระโดดถ้าบิตแล้วล้าง) |
โปรแกรมเคาน์เตอร์
ตัวนับโปรแกรมเป็นรีจิสเตอร์ 16 หรือ 32 บิตซึ่งมีที่อยู่ของคำสั่งถัดไปที่จะดำเนินการ พีซีจะเพิ่มขึ้นโดยอัตโนมัติไปยังตำแหน่งหน่วยความจำลำดับถัดไปทุกครั้งที่มีการดึงคำสั่ง การดำเนินการสาขาการกระโดดและการขัดจังหวะโหลดตัวนับโปรแกรมด้วยที่อยู่อื่นที่ไม่ใช่ตำแหน่งลำดับถัดไป
การเปิดใช้งานการรีเซ็ตการเปิดเครื่องจะทำให้ค่าทั้งหมดในรีจิสเตอร์สูญหาย หมายความว่าค่าของพีซี (ตัวนับโปรแกรม) เป็น 0 เมื่อรีเซ็ตบังคับให้ CPU ดึง opcode แรกจากตำแหน่งหน่วยความจำ ROM 0000 หมายความว่าเราต้องวาง upcode ไบต์แรกในตำแหน่ง ROM 0000 เนื่องจากเป็นที่ที่ CPU คาดว่าจะพบคำสั่งแรก
รีเซ็ตเวกเตอร์
ความสำคัญของเวกเตอร์รีเซ็ตคือชี้โปรเซสเซอร์ไปยังที่อยู่หน่วยความจำซึ่งมีคำสั่งแรกของเฟิร์มแวร์ หากไม่มีการรีเซ็ตเวกเตอร์โปรเซสเซอร์จะไม่รู้ว่าจะเริ่มดำเนินการที่ใด เมื่อรีเซ็ตโปรเซสเซอร์จะโหลดตัวนับโปรแกรม (PC) ด้วยค่าเวกเตอร์รีเซ็ตจากตำแหน่งหน่วยความจำที่กำหนดไว้ล่วงหน้า บนสถาปัตยกรรม CPU08 นี่คือตำแหน่ง$FFFE:$FFFF.
เมื่อไม่จำเป็นต้องรีเซ็ตเวกเตอร์นักพัฒนามักจะยอมรับและไม่ตั้งโปรแกรมลงในภาพสุดท้าย เป็นผลให้โปรเซสเซอร์ไม่เริ่มทำงานในผลิตภัณฑ์ขั้นสุดท้าย ถือเป็นข้อผิดพลาดทั่วไปที่เกิดขึ้นระหว่างขั้นตอนการดีบัก
ตัวชี้สแต็ก
Stack ถูกนำไปใช้ใน RAM และใช้ทะเบียน CPU เพื่อเข้าถึงเรียกว่า SP (Stack Pointer) register SP register คือรีจิสเตอร์ 8 บิตและสามารถระบุแอดเดรสหน่วยความจำช่วง 00h ถึง FFh ในขั้นต้นการลงทะเบียน SP มีค่า 07 เพื่อชี้ไปที่ตำแหน่ง 08 เป็นตำแหน่งแรกที่ใช้สำหรับสแต็กโดย 8051
เมื่อเนื้อหาของการลงทะเบียน CPU ถูกเก็บไว้ในสแต็กจะเรียกว่าการดำเนินการ PUSH เมื่อเนื้อหาของสแต็กถูกเก็บไว้ในทะเบียน CPU เรียกว่าการดำเนินการ POP กล่าวอีกนัยหนึ่งรีจิสเตอร์จะถูกผลักลงบนสแต็กเพื่อบันทึกและดึงออกจากสแต็กเพื่อดึงข้อมูล
วนไม่มีสิ้นสุด
การวนซ้ำแบบไม่มีที่สิ้นสุดหรือการวนซ้ำแบบไม่มีที่สิ้นสุดสามารถระบุได้ว่าเป็นลำดับของคำสั่งในโปรแกรมคอมพิวเตอร์ที่ดำเนินการวนซ้ำอย่างไม่มีที่สิ้นสุดเนื่องจากเหตุผลดังต่อไปนี้ -
- วนซ้ำโดยไม่มีเงื่อนไขสิ้นสุด
- วนซ้ำกับเงื่อนไขการยุติที่ไม่สามารถพบได้
- วนซ้ำด้วยเงื่อนไขการยุติที่ทำให้ลูปเริ่มต้นใหม่
การวนซ้ำแบบไม่สิ้นสุดดังกล่าวมักทำให้ระบบปฏิบัติการรุ่นเก่าไม่ตอบสนองเนื่องจากลูปที่ไม่มีที่สิ้นสุดจะใช้เวลาทั้งหมดของโปรเซสเซอร์ที่มีอยู่ การดำเนินการ I / O ที่รออินพุตของผู้ใช้เรียกอีกอย่างว่า "ลูปไม่มีที่สิ้นสุด" สาเหตุหนึ่งที่เป็นไปได้ของคอมพิวเตอร์ "ค้าง" คือการวนซ้ำที่ไม่สิ้นสุด สาเหตุอื่น ๆ ได้แก่deadlock และ access violations.
ระบบฝังตัวไม่เหมือนพีซีไม่เคย "ออกจาก" แอปพลิเคชัน พวกเขาไม่ได้ใช้งานผ่าน Infinite Loop เพื่อรอให้เหตุการณ์เกิดขึ้นในรูปแบบของการขัดจังหวะหรือpre-scheduled task. เพื่อประหยัดพลังงานโปรเซสเซอร์บางตัวจะเข้าสู่โหมดพิเศษsleep หรือ wait modes แทนที่จะไม่ทำงานผ่าน Infinite Loop แต่จะออกมาจากโหมดนี้เมื่อจับเวลาหรือ External Interrupt
ขัดจังหวะ
การขัดจังหวะส่วนใหญ่เป็นกลไกฮาร์ดแวร์ที่สั่งให้โปรแกรมทราบว่ามีเหตุการณ์เกิดขึ้น ซึ่งอาจเกิดขึ้นได้ตลอดเวลาดังนั้นจึงไม่ตรงกันกับโฟลว์โปรแกรม โปรเซสเซอร์เหล่านี้ต้องการการจัดการพิเศษโดยโปรเซสเซอร์และในที่สุดจะจัดการโดย Interrupt Service Routine (ISR) ที่เกี่ยวข้อง การขัดจังหวะต้องได้รับการจัดการอย่างรวดเร็ว หากคุณใช้เวลาในการให้บริการขัดจังหวะมากเกินไปคุณอาจพลาดการขัดจังหวะอีกครั้ง
Endian น้อย Vs Big Endian
แม้ว่าตัวเลขจะแสดงในลักษณะเดียวกันเสมอ แต่ก็ไม่ได้จัดเก็บไว้ในหน่วยความจำแบบเดียวกัน เครื่อง Big-Endian เก็บข้อมูลไบต์ที่สำคัญที่สุดไว้ในที่อยู่หน่วยความจำต่ำสุด เครื่อง Big-Endian เก็บ 0x12345678 เป็น -
ADD+0: 0x12
ADD+1: 0x34
ADD+2: 0x56
ADD+3: 0x78
ในทางกลับกันเครื่อง Little-Endian จะเก็บข้อมูลไบต์ที่มีนัยสำคัญน้อยที่สุดไว้ในที่อยู่หน่วยความจำต่ำสุด เครื่อง Little-Endian เก็บ 0x12345678 เป็น -
ADD+0: 0x78
ADD+1: 0x56
ADD+2: 0x34
ADD+3: 0x12
ภาษาแอสเซมบลีได้รับการพัฒนาเพื่อให้ mnemonicsหรือสัญลักษณ์สำหรับคำแนะนำรหัสระดับเครื่อง โปรแกรมภาษาแอสเซมบลีประกอบด้วยตัวช่วยจำดังนั้นจึงควรแปลเป็นรหัสเครื่อง โปรแกรมที่รับผิดชอบการแปลงนี้เรียกว่าassembler. ภาษาแอสเซมบลีมักถูกเรียกว่าเป็นภาษาระดับต่ำเนื่องจากทำงานโดยตรงกับโครงสร้างภายในของซีพียู ในการเขียนโปรแกรมด้วยภาษาแอสเซมบลีโปรแกรมเมอร์ต้องทราบรีจิสเตอร์ทั้งหมดของ CPU
ภาษาโปรแกรมต่างๆเช่น C, C ++, Java และภาษาอื่น ๆ เรียกว่าภาษาระดับสูงเนื่องจากไม่เกี่ยวข้องกับรายละเอียดภายในของ CPU ในทางตรงกันข้ามแอสเซมเบลอร์ใช้ในการแปลโปรแกรมภาษาแอสเซมบลีเป็นรหัสเครื่อง (บางครั้งเรียกอีกอย่างว่าobject code หรือ opcode). ในทำนองเดียวกันคอมไพเลอร์แปลภาษาระดับสูงเป็นรหัสเครื่อง ตัวอย่างเช่นในการเขียนโปรแกรมด้วยภาษาซีจะต้องใช้คอมไพเลอร์ C เพื่อแปลโปรแกรมเป็นภาษาเครื่อง
โครงสร้างของภาษาแอสเซมบลี
โปรแกรมภาษาแอสเซมบลีคือชุดของคำสั่งซึ่งเป็นคำสั่งภาษาแอสเซมบลีเช่น ADD และ MOV หรือคำสั่งที่เรียกว่า directives.
อัน instruction บอก CPU ว่าต้องทำอะไรในขณะที่ directive (เรียกอีกอย่างว่า pseudo-instructions) ให้คำแนะนำแก่ผู้ประกอบ ตัวอย่างเช่นคำสั่ง ADD และ MOV เป็นคำสั่งที่ CPU ทำงานในขณะที่ ORG และ END เป็นคำสั่งแอสเซมเบลอร์ แอสเซมเบลอร์วาง opcode ไปยังตำแหน่งหน่วยความจำ 0 เมื่อใช้คำสั่ง ORG ในขณะที่ END ระบุไปยังจุดสิ้นสุดของซอร์สโค้ด คำสั่งภาษาโปรแกรมประกอบด้วยสี่ฟิลด์ต่อไปนี้ -
[ label: ] mnemonics [ operands ] [;comment ]
วงเล็บเหลี่ยม ([]) ระบุว่าฟิลด์เป็นทางเลือก
label fieldอนุญาตให้โปรแกรมอ้างถึงบรรทัดของรหัสตามชื่อ ฟิลด์ป้ายกำกับต้องมีอักขระไม่เกินจำนวนที่กำหนด
mnemonics และ operands fieldsร่วมกันปฏิบัติงานจริงของโปรแกรมและทำงานให้สำเร็จ ข้อความเช่น ADD A, C & MOV C, # 68 โดยที่ ADD และ MOV เป็นตัวช่วยจำซึ่งสร้าง opcodes "A, C" และ "C, # 68" เป็นตัวถูกดำเนินการ สองช่องนี้อาจมีคำสั่ง คำสั่งไม่สร้างรหัสเครื่องและใช้โดยแอสเซมเบลอร์เท่านั้นในขณะที่คำสั่งจะถูกแปลเป็นรหัสเครื่องเพื่อให้ CPU ดำเนินการ
1.0000 ORG 0H ;start (origin) at location 0
2 0000 7D25 MOV R5,#25H ;load 25H into R5
3.0002 7F34 MOV R7,#34H ;load 34H into R7
4.0004 7400 MOV A,#0 ;load 0 into A
5.0006 2D ADD A,R5 ;add contents of R5 to A
6.0007 2F ADD A,R7 ;add contents of R7 to A
7.0008 2412 ADD A,#12H ;add to A value 12 H
8.000A 80FE HERE: SJMP HERE ;stay in this loop
9.000C END ;end of asm source file
comment field เริ่มต้นด้วยอัฒภาคซึ่งเป็นตัวบ่งชี้ความคิดเห็น
สังเกตป้าย "HERE" ในโปรแกรม ป้ายกำกับใด ๆ ที่อ้างถึงคำสั่งควรตามด้วยเครื่องหมายจุดคู่
การประกอบและใช้งานโปรแกรม 8051
ในที่นี้จะกล่าวถึงรูปแบบพื้นฐานของภาษาแอสเซมบลี ขั้นตอนในการสร้างประกอบและรันโปรแกรมภาษาแอสเซมบลีมีดังนี้ -
ขั้นแรกเราใช้ตัวแก้ไขเพื่อพิมพ์โปรแกรมที่คล้ายกับโปรแกรมด้านบน บรรณาธิการเช่นโปรแกรม MS-DOS EDIT ที่มาพร้อมกับระบบปฏิบัติการ Microsoft ทั้งหมดสามารถใช้เพื่อสร้างหรือแก้ไขโปรแกรมได้ บรรณาธิการต้องสามารถสร้างไฟล์ ASCII ได้ ส่วนขยาย "asm" สำหรับไฟล์ต้นฉบับจะถูกใช้โดยแอสเซมเบลอร์ในขั้นตอนถัดไป
ซอร์สไฟล์ "asm" มีโค้ดโปรแกรมที่สร้างในขั้นตอนที่ 1 ซึ่งถูกป้อนเข้ากับแอสเซมเบลอร์ 8051 จากนั้นแอสเซมเบลอร์จะแปลงคำแนะนำภาษาแอสเซมบลีเป็นคำแนะนำรหัสเครื่องและสร้างไฟล์.obj file (ไฟล์ออบเจ็กต์) และไฟล์ .lst file(ไฟล์รายการ). เรียกอีกอย่างว่าเป็นsource fileนั่นเป็นเหตุผลที่แอสเซมเบลอร์บางรายต้องการให้ไฟล์นี้มีนามสกุล "src" ไฟล์ "lst" เป็นทางเลือก มีประโยชน์มากสำหรับโปรแกรมเพราะแสดงรายการ opcodes และ address ทั้งหมดรวมทั้งข้อผิดพลาดที่แอสเซมเบลอร์ตรวจพบ
ผู้ประกอบต้องการขั้นตอนที่สามที่เรียกว่า linking. โปรแกรมลิงก์รับไฟล์อ็อบเจ็กต์อย่างน้อยหนึ่งไฟล์และสร้างไฟล์อ็อบเจ็กต์สัมบูรณ์ที่มีนามสกุล "abs"
จากนั้นไฟล์ "abs" จะถูกป้อนเข้ากับโปรแกรมที่เรียกว่า "OH" (object to hex converter) ซึ่งจะสร้างไฟล์ที่มีนามสกุล "hex" ซึ่งพร้อมที่จะเบิร์นลงใน ROM
ประเภทข้อมูล
ไมโครคอนโทรลเลอร์ 8051 ประกอบด้วยข้อมูล 8 บิตประเภทเดียวและแต่ละรีจิสเตอร์มีขนาด 8 บิตด้วย โปรแกรมเมอร์ต้องแยกย่อยข้อมูลที่มีขนาดใหญ่กว่า 8 บิต (00 ถึง FFH หรือ 255 เป็นทศนิยม) เพื่อให้ CPU สามารถประมวลผลได้
DB (กำหนดไบต์)
คำสั่ง DB เป็นคำสั่งข้อมูลที่ใช้กันอย่างแพร่หลายในแอสเซมเบลอร์ ใช้เพื่อกำหนดข้อมูล 8 บิต นอกจากนี้ยังสามารถใช้เพื่อกำหนดข้อมูลรูปแบบทศนิยมไบนารีฐานสิบหกหรือ ASCII สำหรับทศนิยม "D" หลังเลขฐานสิบเป็นทางเลือก แต่จำเป็นสำหรับ "B" (ไบนารี) และ "Hl" (เลขฐานสิบหก)
ในการระบุ ASCII เพียงวางอักขระในเครื่องหมายคำพูด ('เช่นนี้') แอสเซมเบลอร์สร้างรหัส ASCII สำหรับตัวเลข / อักขระโดยอัตโนมัติ คำสั่ง DB เป็นคำสั่งเดียวที่สามารถใช้เพื่อกำหนดสตริง ASCII ที่มีขนาดใหญ่กว่าสองอักขระ ดังนั้นควรใช้สำหรับข้อกำหนดข้อมูล ASCII ทั้งหมด ตัวอย่างบางส่วนของ DB แสดงไว้ด้านล่าง -
ORG 500H
DATA1: DB 28 ;DECIMAL (1C in hex)
DATA2: DB 00110101B ;BINARY (35 in hex)
DATA3: DB 39H ;HEX
ORG 510H
DATA4: DB "2591" ;ASCII NUMBERS
ORG 520H
DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
สามารถใช้อัญประกาศเดี่ยวหรือคู่รอบสตริง ASCII DB ยังใช้เพื่อจัดสรรหน่วยความจำเป็นชิ้นขนาดไบต์
คำสั่ง Assembler
คำสั่งบางส่วนของ 8051 มีดังนี้ -
ORG (origin)- คำสั่งต้นทางใช้เพื่อระบุจุดเริ่มต้นของที่อยู่ ใช้ตัวเลขในรูปแบบ hexa หรือทศนิยม หากระบุ H ไว้หลังตัวเลขตัวเลขจะถือว่าเป็น hexa หรือทศนิยม แอสเซมเบลอร์แปลงเลขฐานสิบเป็นเฮกซ่า
EQU (equate)- ใช้เพื่อกำหนดค่าคงที่โดยไม่ต้องใช้ตำแหน่งหน่วยความจำ EQU เชื่อมโยงค่าคงที่กับป้ายกำกับข้อมูลเพื่อให้เลเบลปรากฏในโปรแกรมค่าคงที่จะถูกแทนที่ด้วยเลเบล ขณะดำเนินการคำสั่ง "MOV R3, #COUNT" รีจิสเตอร์ R3 จะโหลดด้วยค่า 25 (สังเกตเครื่องหมาย #) ข้อดีของการใช้ EQU คือโปรแกรมเมอร์สามารถเปลี่ยนได้เพียงครั้งเดียวและแอสเซมเบลอร์จะเปลี่ยนสิ่งที่เกิดขึ้นทั้งหมด โปรแกรมเมอร์ไม่ต้องค้นหาทั้งโปรแกรม
END directive- ระบุจุดสิ้นสุดของไฟล์ต้นทาง (asm) คำสั่ง END คือบรรทัดสุดท้ายของโปรแกรม อะไรก็ตามหลังจากคำสั่ง END จะถูกละเว้นโดยแอสเซมเบลอร์
ป้ายกำกับในภาษาแอสเซมบลี
ป้ายกำกับทั้งหมดในภาษาแอสเซมบลีต้องเป็นไปตามกฎที่ระบุด้านล่าง -
ชื่อป้ายกำกับแต่ละรายการต้องไม่ซ้ำกัน ชื่อที่ใช้สำหรับเลเบลในการเขียนโปรแกรมภาษาแอสเซมบลีประกอบด้วยตัวอักษรทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็กหมายเลข 0 ถึง 9 และอักขระพิเศษเช่นเครื่องหมายคำถาม (?), จุด (.) ในอัตรา @, ขีดล่าง (_), และดอลลาร์ ($)
อักขระตัวแรกควรเป็นอักขระตามตัวอักษร มันไม่สามารถเป็นตัวเลขได้
ไม่สามารถใช้คำสงวนเป็นป้ายกำกับในโปรแกรมได้ ตัวอย่างเช่นคำ ADD และ MOV เป็นคำสงวนเนื่องจากเป็นคำสั่งช่วยจำ
รีจิสเตอร์ใช้ใน CPU เพื่อจัดเก็บข้อมูลชั่วคราวซึ่งอาจเป็นข้อมูลที่ต้องประมวลผลหรือแอดเดรสที่ชี้ไปยังข้อมูลที่จะดึงข้อมูล ใน 8051 มีประเภทข้อมูลหนึ่งคือ 8 บิตตั้งแต่ MSB (บิตที่สำคัญที่สุด) D7 ไปจนถึง LSB (บิตที่มีนัยสำคัญน้อยที่สุด) D0 ด้วยประเภทข้อมูล 8 บิตประเภทข้อมูลใด ๆ ที่มีขนาดใหญ่กว่า 8 บิตจะต้องถูกแบ่งออกเป็นกลุ่มข้อมูล 8 บิตก่อนที่จะประมวลผล
รีจิสเตอร์ที่ใช้กันอย่างแพร่หลายของ 8051 คือ A (ตัวสะสม), B, R0-R7, DPTR (ตัวชี้ข้อมูล) และพีซี (ตัวนับโปรแกรม) การลงทะเบียนทั้งหมดนี้มีขนาด 8 บิตยกเว้น DPTR และ PC
การจัดเก็บรีจิสเตอร์ใน 8051
เราจะพูดถึงการลงทะเบียนพื้นที่เก็บข้อมูลประเภทต่อไปนี้ที่นี่ -
- Accumulator
- R ลงทะเบียน
- B ลงทะเบียน
- ตัวชี้ข้อมูล (DPTR)
- ตัวนับโปรแกรม (PC)
- ตัวชี้สแต็ก (SP)
ตัวสะสม
ตัวสะสมรีจิสเตอร์ A ใช้สำหรับการคำนวณทางคณิตศาสตร์และตรรกะทั้งหมด หากไม่มีตัวสะสมผลลัพธ์ของการคำนวณแต่ละรายการ (การบวกการคูณการกะ ฯลฯ ) จะถูกเก็บไว้ในหน่วยความจำหลัก การเข้าถึงหน่วยความจำหลักช้ากว่าการเข้าถึงรีจิสเตอร์เช่นแอคคูมูเลเตอร์เนื่องจากเทคโนโลยีที่ใช้สำหรับหน่วยความจำหลักขนาดใหญ่นั้นช้ากว่า (แต่ถูกกว่า) มากกว่าที่ใช้สำหรับรีจิสเตอร์
รีจิสเตอร์ "R"
รีจิสเตอร์ "R" คือชุดของรีจิสเตอร์แปดตัว ได้แก่ R0, R1 ถึง R7 รีจิสเตอร์เหล่านี้ทำหน้าที่เป็นรีจิสเตอร์หน่วยเก็บข้อมูลสำรองหรือชั่วคราวในการดำเนินการหลายอย่าง พิจารณาตัวอย่างของผลรวม 10 และ 20 เก็บตัวแปร 10 ไว้ในตัวสะสมและอีกตัวแปร 20 นิ้วเช่นลงทะเบียน R4 ในการประมวลผลการดำเนินการเพิ่มเติมให้ดำเนินการคำสั่งต่อไปนี้ -
ADD A,R4
หลังจากดำเนินการตามคำสั่งนี้ตัวสะสมจะมีค่า 30 ดังนั้นรีจิสเตอร์ "R" จึงเป็นตัวช่วยที่สำคัญมากหรือ helper registers. Accumulator เพียงอย่างเดียวจะไม่มีประโยชน์มากนักหากไม่ใช่สำหรับการลงทะเบียน "R" เหล่านี้ การลงทะเบียน "R" มีไว้สำหรับการจัดเก็บค่าชั่วคราว
ให้เราใช้ตัวอย่างอื่น เราจะเพิ่มค่าใน R1 และ R2 เข้าด้วยกันแล้วลบค่าของ R3 และ R4 ออกจากผลลัพธ์
MOV A,R3 ;Move the value of R3 into the accumulator
ADD A,R4 ;Add the value of R4
MOV R5,A ;Store the resulting value temporarily in R5
MOV A,R1 ;Move the value of R1 into the accumulator
ADD A,R2 ;Add the value of R2
SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
อย่างที่คุณเห็นเราใช้ R5 เพื่อเก็บผลรวมของ R3 และ R4 ไว้ชั่วคราว แน่นอนว่านี่ไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการคำนวณ (R1 + R2) - (R3 + R4) แต่จะแสดงให้เห็นถึงการใช้รีจิสเตอร์ "R" เป็นวิธีในการจัดเก็บค่าชั่วคราว
การลงทะเบียน "B"
รีจิสเตอร์ "B" นั้นคล้ายกับ Accumulator มากในแง่ที่ว่ามันอาจมีค่า 8 บิต (1 ไบต์) การลงทะเบียน "B" ใช้โดยคำสั่ง 8051 สองคำสั่งเท่านั้น:MUL AB และ DIV AB. ในการคูณหรือหาร A ด้วยหมายเลขอื่นอย่างรวดเร็วและง่ายดายคุณสามารถจัดเก็บหมายเลขอื่นไว้ใน "B" และใช้สองคำสั่งนี้ นอกเหนือจากการใช้คำสั่ง MUL และ DIV แล้วรีจิสเตอร์ "B" ยังใช้เป็นรีจิสเตอร์ที่เก็บชั่วคราวอีกตัวหนึ่งเช่นเดียวกับรีจิสเตอร์ตัวที่เก้า
ตัวชี้ข้อมูล
ตัวชี้ข้อมูล (DPTR) เป็นรีจิสเตอร์ 16 บิต (2 ไบต์) ที่ผู้ใช้สามารถเข้าถึงได้ของ 8051 เท่านั้น Accumulator, R0 – R7 register และ B register คือรีจิสเตอร์มูลค่า 1 ไบต์ DPTR มีไว้สำหรับชี้ไปที่ข้อมูล 8051 ใช้เพื่อเข้าถึงหน่วยความจำภายนอกโดยใช้ที่อยู่ที่ระบุโดย DPTR DPTR เป็นรีจิสเตอร์ 16 บิตเท่านั้นและมักใช้เพื่อเก็บค่า 2 ไบต์
ตัวนับโปรแกรม
Program Counter (PC) เป็นแอดเดรส 2 ไบต์ซึ่งบอก 8051 ซึ่งคำสั่งถัดไปในการดำเนินการสามารถพบได้ในหน่วยความจำ พีซีเริ่มต้นที่ 0000h เมื่อ 8051 เริ่มต้นและเพิ่มขึ้นทุกครั้งหลังจากดำเนินการตามคำสั่ง พีซีไม่ได้เพิ่มขึ้นด้วย 1 เสมอไปคำแนะนำบางอย่างอาจต้องใช้ 2 หรือ 3 ไบต์; ในกรณีเช่นนี้พีซีจะเพิ่มขึ้นทีละ 2 หรือ 3
Branch, jumpและ interruptการดำเนินการโหลดตัวนับโปรแกรมด้วยที่อยู่อื่นที่ไม่ใช่ตำแหน่งตามลำดับถัดไป การเปิดใช้งานการรีเซ็ตการเปิดเครื่องจะทำให้ค่าทั้งหมดในรีจิสเตอร์สูญหาย หมายความว่าค่าของพีซีเป็น 0 เมื่อรีเซ็ตโดยบังคับให้ CPU ดึง opcode แรกจากตำแหน่ง ROM 0000 หมายความว่าเราต้องวาง upcode ไบต์แรกในตำแหน่ง ROM 0000 เนื่องจากเป็นที่ที่ CPU คาดว่าจะพบ คำแนะนำแรก
ตัวชี้สแต็ก (SP)
Stack Pointer เช่นเดียวกับการลงทะเบียนทั้งหมดยกเว้น DPTR และ PC อาจมีค่า 8 บิต (1 ไบต์) Stack Pointer บอกตำแหน่งที่จะนำค่าถัดไปออกจากสแตก เมื่อใส่ค่าลงในสแต็กค่าของ SP จะเพิ่มขึ้นจากนั้นค่าจะถูกเก็บไว้ที่ตำแหน่งหน่วยความจำผลลัพธ์ เมื่อค่าถูกดึงออกจากสแต็กค่าจะถูกส่งกลับจากตำแหน่งหน่วยความจำที่ระบุโดย SP จากนั้นค่าของ SP จะลดลง
ลำดับการดำเนินการนี้มีความสำคัญ SP จะเริ่มต้นเป็น 07h เมื่อเริ่มต้น 8051 หากมีการพุชค่าลงในสแต็กพร้อมกันค่าจะถูกเก็บไว้ในที่อยู่ RAM ภายใน 08h เนื่องจาก 8051 จะเพิ่มค่าของ SP (จาก 07h ถึง 08h) ก่อนจากนั้นจะเก็บค่าที่ผลักไว้ที่หน่วยความจำนั้น ที่อยู่ (08h) SP ถูกแก้ไขโดยตรงโดย 8051 โดยหกคำสั่ง: PUSH, POP, ACALL, LCALL, RET และ RETI
ROM Space ใน 8051
สมาชิกในครอบครัว 8051 บางคนมี ROM บนชิปเพียง 4K ไบต์ (เช่น 8751, AT8951); บางคนมี ROM 8K เช่น AT89C52 และมีสมาชิกในครอบครัวบางคนที่มี ROM บนชิป 32K ไบต์และ 64K ไบต์เช่น Dallas Semiconductor ประเด็นที่ต้องจำคือไม่มีสมาชิกในตระกูล 8051 สามารถเข้าถึง opcode ได้มากกว่า 64K ไบต์เนื่องจากตัวนับโปรแกรมใน 8051 เป็นรีจิสเตอร์ 16 บิต (ที่อยู่ 0000 ถึง FFFF)
ตำแหน่งแรกของ ROM โปรแกรมภายใน 8051 มีที่อยู่ 0000H ในขณะที่ตำแหน่งสุดท้ายอาจแตกต่างกันขึ้นอยู่กับขนาดของ ROM บนชิป ในบรรดาสมาชิกในครอบครัว 8051 AT8951 มี ROM บนชิป $ k โดยมีที่อยู่หน่วยความจำ 0000 (ตำแหน่งแรก) ถึง 0FFFH (ตำแหน่งสุดท้าย)
8051 Flag Bits และ PSW Register
คำสถานะโปรแกรม (PSW) register คือ 8-bit register หรือที่เรียกว่า flag register. มีความกว้าง 8 บิต แต่ใช้เพียง 6 บิตเท่านั้น สองบิตที่ไม่ได้ใช้คือuser-defined flags. เรียกว่าสี่ธงconditional flagsซึ่งหมายความว่าพวกเขาระบุเงื่อนไขที่เป็นผลหลังจากดำเนินการตามคำสั่ง ทั้งสี่นี้คือCY (พกพา), AC (พกพาเสริม), P (parity) และ OV(ล้น). บิต RS0 และ RS1 ใช้เพื่อเปลี่ยนทะเบียนธนาคาร รูปต่อไปนี้แสดงการลงทะเบียนคำสถานะโปรแกรม
PSW Register มีบิตสถานะที่แสดงสถานะปัจจุบันของ CPU
CY | CA | F0 | RS1 | RS0 | OV | - | ป |
---|
CY | PSW.7 | ถือธง |
AC | PSW 6 | ธงพกพาเสริม |
F0 | PSW 5 | แฟล็ก 0 พร้อมใช้งานสำหรับผู้ใช้สำหรับวัตถุประสงค์ทั่วไป |
RS1 | PSW.4 | ลงทะเบียนตัวเลือกธนาคารบิต 1 |
RS0 | PSW.3 | ลงทะเบียนตัวเลือกธนาคารบิต 0 |
OV | PSW 2 | ค่าสถานะล้น |
- | PSW.1 | ผู้ใช้สามารถกำหนดธงได้ |
ป | PSW.0 | ธงปาริตี ตั้งค่า / ล้างโดยฮาร์ดแวร์ระหว่างรอบคำสั่งเพื่อระบุจำนวนคู่ / คี่ของ 1 บิตในตัวสะสม |
เราสามารถเลือกบิต Register Bank ที่เกี่ยวข้องโดยใช้บิต RS0 และ RS1
RS1 | RS2 | ลงทะเบียนธนาคาร | ที่อยู่ |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag- แฟล็กพกพานี้ถูกตั้งค่า (1) เมื่อใดก็ตามที่มีการดำเนินการจากบิต D7 ได้รับผลกระทบหลังจากการดำเนินการเพิ่มหรือลบ 8 บิต นอกจากนี้ยังสามารถรีเซ็ตเป็น 1 หรือ 0 ได้โดยตรงโดยคำสั่งเช่น "SETB C" และ "CLR C" โดยที่ "SETB" ย่อมาจาก set bit carry และ "CLR" หมายถึง clear carry
AC, auxiliary carry flag- หากมีการพกพาจาก D3 และ D4 ระหว่างการดำเนินการ ADD หรือ SUB บิต AC จะถูกตั้งค่าไว้ มิฉะนั้นจะถูกล้าง ใช้สำหรับคำสั่งในการคำนวณเลขคณิตทศนิยมที่เข้ารหัสไบนารี
P, the parity flag- แฟล็กพาริตีแสดงถึงจำนวน 1 ในรีจิสเตอร์ตัวสะสมเท่านั้น หากรีจิสเตอร์ A มีเลขคี่ของ 1 ดังนั้น P = 1; และสำหรับเลขคู่ของ 1 P = 0
OV, the overflow flag- แฟล็กนี้ถูกตั้งค่าเมื่อใดก็ตามที่ผลลัพธ์ของการดำเนินการกับหมายเลขเซ็นมีขนาดใหญ่เกินไปทำให้บิตลำดับสูงล้นลงในบิตเซ็น ใช้เพื่อตรวจหาข้อผิดพลาดในการดำเนินการทางคณิตศาสตร์ที่ลงนามเท่านั้น
ตัวอย่าง
แสดงสถานะของแฟล็ก CY, AC และ P หลังจากการเพิ่ม 9CH และ 64H ในคำสั่งต่อไปนี้
MOV A, # 9CH
เพิ่ม A, # 64H
Solution: 9C 10011100
+64 01100100
100 00000000
CY = 1 since there is a carry beyond D7 bit
AC = 0 since there is a carry from D3 to D4
P = 0 because the accumulator has even number of 1's
ไมโครคอนโทรลเลอร์ 8051 มีแรม 128 ไบต์ เราจะพูดถึงการจัดสรร RAM ขนาด 128 ไบต์เหล่านี้และตรวจสอบการใช้งานเป็นสแต็กและรีจิสเตอร์
การจัดสรรพื้นที่หน่วยความจำ RAM ใน 8051
RAM ขนาด 128 ไบต์ภายใน 8051 ถูกกำหนดที่อยู่ 00 ถึง 7FH สามารถเข้าถึงได้โดยตรงเป็นตำแหน่งหน่วยความจำและแบ่งออกเป็นสามกลุ่มดังนี้ -
32 ไบต์จาก 00H ถึง 1FH สถานที่ตั้งกันไว้สำหรับการลงทะเบียนธนาคารและกอง
16 ไบต์จากตำแหน่ง 20H ถึง 2FH ถูกตั้งไว้สำหรับหน่วยความจำอ่าน / เขียนบิตแอดเดรส
80 ไบต์จากตำแหน่ง 30H ถึง 7FH ใช้สำหรับการจัดเก็บแบบอ่านและเขียน เรียกว่าเป็นscratch pad. แรม 80 ตำแหน่งเหล่านี้ใช้กันอย่างแพร่หลายเพื่อวัตถุประสงค์ในการจัดเก็บข้อมูลและพารามิเตอร์โดยโปรแกรมเมอร์ 8051
ลงทะเบียนธนาคารใน 8051
RAM ทั้งหมด 32 ไบต์ถูกตั้งไว้สำหรับรีจิสเตอร์แบงค์และสแต็ก 32 ไบต์เหล่านี้แบ่งออกเป็นธนาคารลงทะเบียนสี่แห่งซึ่งแต่ละธนาคารมีการลงทะเบียน 8 รายการคือ R0 – R7 ตำแหน่ง RAM ตั้งแต่ 0 ถึง 7 จะถูกตั้งค่าไว้สำหรับ bank 0 ของ R0 – R7 โดยที่ R0 คือตำแหน่ง RAM 0, R1 คือตำแหน่ง RAM 1, R2 คือตำแหน่งที่ 2 เป็นต้นไปจนถึงตำแหน่งหน่วยความจำ 7 ซึ่งเป็นของ R7 ของธนาคาร 0.
ธนาคารแห่งที่สองของการลงทะเบียน R0 – R7 เริ่มต้นที่ตำแหน่ง RAM 08 และไปที่ตำแหน่ง OFH ธนาคารที่สามของ R0 – R7 เริ่มต้นที่ตำแหน่งหน่วยความจำ 10H และไปที่ตำแหน่ง 17H สุดท้ายตำแหน่ง RAM 18H ถึง 1FH จะถูกตั้งไว้สำหรับธนาคารที่สี่ของ R0 – R7
เริ่มต้นลงทะเบียนธนาคาร
หากตำแหน่ง RAM 00–1F ถูกตั้งไว้สำหรับธนาคารที่ลงทะเบียนทั้งสี่แห่งเราจะเข้าถึงธนาคารใดที่ลงทะเบียนของ R0 – R7 ได้เมื่อเปิดเครื่อง 8051 คำตอบคือลงทะเบียนธนาคาร 0; นั่นคือตำแหน่ง RAM ตั้งแต่ 0 ถึง 7 จะถูกเข้าถึงด้วยชื่อ R0 ถึง R7 เมื่อตั้งโปรแกรม 8051 เนื่องจากการอ้างอิงตำแหน่ง RAM เหล่านี้ด้วยชื่อเช่น R0 ถึง R7 นั้นง่ายกว่ามากแทนที่จะใช้ตำแหน่งหน่วยความจำ
วิธีการเปลี่ยนลงทะเบียนธนาคาร
ลงทะเบียนธนาคาร 0 เป็นค่าเริ่มต้นเมื่อเปิดเครื่อง 8051 เราสามารถเปลี่ยนไปใช้ธนาคารอื่นโดยใช้ PSW register D4 และ D3 บิตของ PSW ใช้เพื่อเลือกธนาคารที่ต้องการลงทะเบียนเนื่องจากสามารถเข้าถึงได้โดยคำสั่งที่กำหนดที่อยู่ได้ของบิต SETB และ CLR ตัวอย่างเช่น "SETB PSW.3" จะตั้งค่า PSW.3 = 1 และเลือกทะเบียนธนาคาร 1
RS1 | RS2 | เลือกธนาคารแล้ว |
---|---|---|
0 | 0 | ธนาคาร 0 |
0 | 1 | ธนาคาร 1 |
1 | 0 | ธนาคาร 2 |
1 | 1 | ธนาคาร 3 |
กองซ้อนและการดำเนินการ
กองใน 8051
สแต็กคือส่วนของ RAM ที่ CPU ใช้เพื่อจัดเก็บข้อมูลเช่นข้อมูลหรือที่อยู่หน่วยความจำชั่วคราว CPU ต้องการพื้นที่จัดเก็บนี้โดยพิจารณาจากจำนวนรีจิสเตอร์ที่ จำกัด
วิธีการเข้าถึง Stacks
เนื่องจากสแต็กเป็นส่วนหนึ่งของแรมจึงมีรีจิสเตอร์อยู่ภายในซีพียูเพื่อชี้ไปที่มัน รีจิสเตอร์ที่ใช้ในการเข้าถึงสแตกเรียกว่าสแต็กพอยน์เตอร์รีจิสเตอร์ ตัวชี้สแต็กใน 8051 มีความกว้าง 8 บิตและสามารถใช้ค่า 00 ถึง FFH เมื่อเริ่มต้น 8051 ทะเบียน SP จะมีค่า 07H ซึ่งหมายความว่าตำแหน่ง RAM 08 เป็นตำแหน่งแรกที่ใช้สำหรับสแต็ก การดำเนินการจัดเก็บของทะเบียน CPU ในสแต็กเรียกว่าไฟล์PUSHและการรับเนื้อหาจากสแต็กกลับเข้าสู่ทะเบียน CPU เรียกว่าไฟล์ POP.
ผลักดันเข้าไปในกอง
ใน 8051 ตัวชี้สแต็ก (SP) จะชี้ไปยังตำแหน่งที่ใช้ล่าสุดของสแต็ก เมื่อข้อมูลถูกผลักลงบนสแต็กตัวชี้สแต็ก (SP) จะเพิ่มขึ้นทีละ 1 เมื่อดำเนินการ PUSH เนื้อหาของรีจิสเตอร์จะถูกบันทึกลงในสแตกและ SP จะเพิ่มขึ้นทีละ 1 ในการดันรีจิสเตอร์ลงบนสแต็กเรา ต้องใช้ที่อยู่ RAM ตัวอย่างเช่นคำสั่ง "PUSH 1" จะพุช register R1 บนสแต็ก
โผล่จากกอง
การดึงเนื้อหาของสแต็กกลับเข้าไปในรีจิสเตอร์ที่กำหนดนั้นตรงกันข้ามกับกระบวนการพุช ด้วยการดำเนินการป๊อปทุกครั้งไบต์บนสุดของสแต็กจะถูกคัดลอกไปยังรีจิสเตอร์ที่ระบุโดยคำสั่งและตัวชี้สแต็กจะลดลงหนึ่งครั้ง
โฟลว์ของโปรแกรมดำเนินไปในลักษณะตามลำดับจากคำสั่งหนึ่งไปยังคำสั่งถัดไปเว้นแต่จะมีการเรียกใช้คำสั่งการถ่ายโอนการควบคุม คำสั่งการถ่ายโอนการควบคุมประเภทต่างๆในภาษาแอสเซมบลี ได้แก่ การกระโดดแบบมีเงื่อนไขหรือไม่มีเงื่อนไขและคำแนะนำในการโทร
คำแนะนำในการวนซ้ำและกระโดด
วนลูปใน 8051
การทำซ้ำตามลำดับคำสั่งหลาย ๆ ครั้งเรียกว่า a loop. คำแนะนำDJNZ reg, labelใช้เพื่อดำเนินการวนซ้ำ ในคำสั่งนี้รีจิสเตอร์จะลดลง 1; ถ้าไม่ใช่ศูนย์ 8051 จะข้ามไปยังที่อยู่เป้าหมายที่อ้างถึงโดยป้ายกำกับ
รีจิสเตอร์ถูกโหลดด้วยตัวนับสำหรับจำนวนการทำซ้ำก่อนเริ่มลูป ในคำสั่งนี้ทั้งการลดลงของการลงทะเบียนและการตัดสินใจที่จะกระโดดจะรวมกันเป็นคำสั่งเดียว รีจิสเตอร์อาจเป็น R0 – R7 ก็ได้ เคาน์เตอร์ยังสามารถเป็นที่ตั้งแรม
ตัวอย่าง
Multiply 25 by 10 using the technique of repeated addition.
Solution- การคูณสามารถทำได้โดยการเพิ่มตัวคูณซ้ำ ๆ หลาย ๆ ครั้งของตัวคูณ ตัวอย่างเช่น,
25 * 10 = 250 (ฟ้า)
25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250
MOV A,#0 ;A = 0,clean ACC
MOV R2,#10 ; the multiplier is replaced in R2
Add A,#25 ;add the multiplicand to the ACC
AGAIN:DJNZ R2,
AGAIN:repeat until R2 = 0 (10 times)
MOV R5 , A ;save A in R5 ;R5 (FAH)
Drawback in 8051 - การดำเนินการวนซ้ำด้วยคำแนะนำ DJNZ Reg labelจำกัด การทำซ้ำ 256 ครั้งเท่านั้น หากไม่ได้ใช้การกระโดดแบบมีเงื่อนไขคำสั่งหลังจากกระโดดจะถูกดำเนินการ
วนในลูป
เมื่อเราใช้วงในอีกวงหนึ่งจะเรียกว่า nested loop. การลงทะเบียนสองรายการใช้เพื่อเก็บการนับเมื่อจำนวนสูงสุดถูก จำกัด ไว้ที่ 256 ดังนั้นเราจึงใช้วิธีนี้เพื่อทำซ้ำการกระทำมากกว่า 256 ครั้ง
Example
เขียนโปรแกรมเพื่อ -
- โหลดตัวสะสมด้วยค่า 55H
- เติม ACC 700 ครั้ง
Solution- เนื่องจาก 700 มีค่ามากกว่า 255 (ความจุสูงสุดของรีจิสเตอร์ใด ๆ ) จึงมีการใช้รีจิสเตอร์สองตัวเพื่อนับจำนวน รหัสต่อไปนี้แสดงวิธีใช้สองรีจิสเตอร์ R2 และ R3 สำหรับการนับ
MOV A,#55H ;A = 55H
NEXT: MOV R3,#10 ;R3 the outer loop counter
AGAIN:MOV R2,#70 ;R2 the inner loop counter
CPL A ;complement
การกระโดดตามเงื่อนไขอื่น ๆ
ตารางต่อไปนี้แสดงการกระโดดตามเงื่อนไขที่ใช้ใน 8051 -
คำแนะนำ | หนังบู๊ |
---|---|
JZ | กระโดดถ้า A = 0 |
JNZ | กระโดดถ้า A ≠ 0 |
DJNZ | ลดและกระโดดถ้าลงทะเบียน≠ 0 |
CJNE A ข้อมูล | กระโดดถ้าข้อมูล A ≠ |
CJNE reg, #data | กระโดดถ้าไบต์≠ข้อมูล |
JC | กระโดดถ้า CY = 1 |
JNC | กระโดดถ้า CY ≠ 1 |
จขกท | กระโดดถ้า bit = 1 |
JNB | กระโดดถ้าบิต = 0 |
JBC | กระโดดถ้า bit = 1 และล้างบิต |
JZ (jump if A = 0)- ในคำแนะนำนี้เนื้อหาของตัวสะสมจะถูกตรวจสอบ ถ้าเป็นศูนย์ 8051 จะข้ามไปยังที่อยู่เป้าหมาย คำสั่ง JZ สามารถใช้ได้กับตัวสะสมเท่านั้นไม่สามารถใช้กับการลงทะเบียนอื่น ๆ
JNZ (jump if A is not equal to 0)- ในคำแนะนำนี้เนื้อหาของตัวสะสมจะถูกตรวจสอบว่าไม่เป็นศูนย์ ถ้าไม่ใช่ศูนย์ 8051 จะข้ามไปยังที่อยู่เป้าหมาย
JNC (Jump if no carry, jumps if CY = 0)- บิตแฟล็ก Carry ในแฟล็ก (หรือ PSW) ใช้ในการตัดสินใจว่าจะกระโดดหรือไม่ "ป้ายกำกับ JNC" CPU ดูที่แฟล็กพกพาเพื่อดูว่ามีการยกขึ้นหรือไม่ (CY = 1) หากไม่ถูกยกขึ้นแสดงว่า CPU เริ่มดึงข้อมูลและดำเนินการตามคำแนะนำจากที่อยู่ของป้ายกำกับ ถ้า CY = 1 มันจะไม่กระโดด แต่จะดำเนินการคำสั่งถัดไปด้านล่าง JNC
JC (Jump if carry, jumps if CY = 1) - ถ้า CY = 1 มันจะข้ามไปยังที่อยู่เป้าหมาย
JB (jump if bit is high)
JNB (jump if bit is low)
Note - ต้องสังเกตว่าการกระโดดแบบมีเงื่อนไขทั้งหมดเป็นการกระโดดระยะสั้นกล่าวคือแอดเดรสของเป้าหมายจะต้องอยู่ภายใน –128 ถึง +127 ไบต์ของเนื้อหาของตัวนับโปรแกรม
คำแนะนำในการกระโดดโดยไม่มีเงื่อนไข
มีการกระโดดแบบไม่มีเงื่อนไขสองครั้งในปี 8051 -
LJMP (long jump)- LJMP คือคำสั่ง 3 ไบต์ซึ่งไบต์แรกแสดงถึง opcode และไบต์ที่สองและสามแทนแอดเดรส 16 บิตของตำแหน่งเป้าหมาย ที่อยู่เป้าหมาย 2 ไบต์คืออนุญาตให้ข้ามไปยังตำแหน่งหน่วยความจำใดก็ได้จาก 0000 ถึง FFFFH
SJMP (short jump)- เป็นคำสั่ง 2 ไบต์โดยที่ไบต์แรกคือ opcode และไบต์ที่สองคือที่อยู่สัมพัทธ์ของตำแหน่งเป้าหมาย ที่อยู่สัมพัทธ์มีตั้งแต่ 00H ถึง FFH ซึ่งแบ่งออกเป็นการกระโดดไปข้างหน้าและถอยหลัง นั่นคืออยู่ภายใน –128 ถึง +127 ไบต์ของหน่วยความจำที่สัมพันธ์กับที่อยู่ของพีซีปัจจุบัน (ตัวนับโปรแกรม) ในกรณีของการกระโดดไปข้างหน้าแอดเดรสเป้าหมายสามารถอยู่ภายในพื้นที่ 127 ไบต์จากพีซีปัจจุบัน ในกรณีของการย้อนกลับที่อยู่เป้าหมายสามารถอยู่ภายใน –128 ไบต์จากพีซีปัจจุบัน
การคำนวณ Short Jump Address
การกระโดดแบบมีเงื่อนไขทั้งหมด (JNC, JZ และ DJNZ) เป็นการกระโดดระยะสั้นเนื่องจากเป็นคำสั่ง 2 ไบต์ ในคำแนะนำเหล่านี้ไบต์แรกแสดงถึง opcode และไบต์ที่สองแสดงถึงที่อยู่สัมพัทธ์ ที่อยู่เป้าหมายจะสัมพันธ์กับค่าของตัวนับโปรแกรมเสมอ ในการคำนวณที่อยู่เป้าหมายไบต์ที่สองจะถูกเพิ่มลงในพีซีของคำสั่งด้านล่างการกระโดด ดูโปรแกรมด้านล่าง -
Line PC Op-code Mnemonic Operand
1 0000 ORG 0000
2 0000 7800 MOV R0,#003
3 0002 7455 MOV A,#55H0
4 0004 6003 JZ NEXT
5 0006 08 INC R0
6 0007 04 AGAIN: INC A
7 0008 04 INC A
8 0009 2477 NEXT: ADD A, #77h
9 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0, A
12 000F F9 MOV R1, A
13 0010 FA MOV R2, A
14 0011 FB MOV R3, A
15 0012 2B OVER: ADD A, R3
16 0013 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 0017 END
การคำนวณที่อยู่เป้าหมายกระโดดถอยหลัง
ในกรณีของการกระโดดไปข้างหน้าค่าการเคลื่อนที่คือจำนวนบวกระหว่าง 0 ถึง 127 (00 ถึง 7F ในฐานสิบหก) อย่างไรก็ตามสำหรับการกระโดดถอยหลังการเคลื่อนที่จะมีค่าเป็นลบ 0 ถึง –128
คำแนะนำในการโทร
CALL ใช้เพื่อเรียกรูทีนย่อยหรือเมธอด รูทีนย่อยใช้เพื่อดำเนินการหรืองานที่ต้องดำเนินการบ่อยๆ ทำให้โปรแกรมมีโครงสร้างมากขึ้นและประหยัดพื้นที่หน่วยความจำ มีสองคำแนะนำ - LCALL และ ACALL
LCALL (โทรทางไกล)
LCALL เป็นคำสั่ง 3 ไบต์โดยที่ไบต์แรกแสดงถึง opcode และไบต์ที่สองและสามใช้เพื่อระบุแอดเดรสของรูทีนย่อยเป้าหมาย LCALL สามารถใช้เพื่อเรียกรูทีนย่อยซึ่งมีอยู่ภายในพื้นที่แอดเดรส 64K ไบต์ของ 8051
เพื่อให้กลับไปยังจุดที่ประสบความสำเร็จหลังจากเรียกใช้รูทีนย่อยที่เรียกว่า CPU จะบันทึกที่อยู่ของคำสั่งด้านล่าง LCALL บนสแต็ก ดังนั้นเมื่อมีการเรียกรูทีนย่อยการควบคุมจะถูกโอนไปยังรูทีนย่อยนั้นและโปรเซสเซอร์จะบันทึกพีซี (ตัวนับโปรแกรม) บนสแตกและเริ่มดึงคำแนะนำจากตำแหน่งใหม่ คำสั่ง RET (return) ถ่ายโอนการควบคุมกลับไปยังผู้เรียกหลังจากเสร็จสิ้นการดำเนินการของรูทีนย่อย ทุกรูทีนย่อยใช้ RET เป็นคำสั่งสุดท้าย
ACALL (การโทรแบบสัมบูรณ์)
ACALL เป็นคำสั่ง 2 ไบต์ตรงกันข้ามกับ LCALL ซึ่งมีขนาด 3 ไบต์ แอดเดรสเป้าหมายของรูทีนย่อยต้องอยู่ภายใน 2K ไบต์เนื่องจากใช้เพียง 11 บิตของ 2 ไบต์สำหรับแอดเดรส ความแตกต่างระหว่าง ACALL และ LCALL คือที่อยู่เป้าหมายสำหรับ LCALL สามารถอยู่ที่ใดก็ได้ภายในพื้นที่แอดเดรส 64K ไบต์ของ 8051 ในขณะที่แอดเดรสเป้าหมายของ CALL อยู่ในช่วง 2K ไบต์
อัน addressing modeหมายถึงวิธีการระบุตำแหน่งหน่วยความจำที่ระบุ มีห้าวิธีที่แตกต่างกันหรือห้าโหมดการกำหนดที่อยู่ในการดำเนินการคำสั่งนี้ซึ่งมีดังต่อไปนี้ -
- โหมดกำหนดแอดเดรสทันที
- โหมดกำหนดแอดเดรสโดยตรง
- ลงทะเบียนโหมดกำหนดแอดเดรสโดยตรง
- ลงทะเบียนโหมดการกำหนดแอดเดรสทางอ้อม
- โหมดกำหนดแอดเดรสที่จัดทำดัชนี
โหมดกำหนดแอดเดรสทันที
เริ่มต้นด้วยตัวอย่าง
MOV A, #6AH
โดยทั่วไปเราสามารถเขียน
MOV A, #data
เรียกว่า immediate เนื่องจากข้อมูล 8 บิตจะถูกโอนไปยังตัวสะสมทันที (ตัวถูกดำเนินการปลายทาง)
ภาพประกอบต่อไปนี้อธิบายถึงคำสั่งข้างต้นและการดำเนินการ opcode 74H ถูกบันทึกไว้ที่ที่อยู่ 0202 ข้อมูล 6AH จะถูกบันทึกไว้ที่ที่อยู่ 0203 ในหน่วยความจำของโปรแกรม หลังจากอ่าน opcode 74H ข้อมูลที่อยู่หน่วยความจำโปรแกรมถัดไปจะถูกโอนไปยังตัวสะสม A (E0H คือที่อยู่ของตัวสะสม) เนื่องจากคำสั่งมีขนาด 2 ไบต์และดำเนินการในรอบเดียวตัวนับโปรแกรมจะเพิ่มขึ้นทีละ 2 และจะชี้ไปที่ 0204 ของหน่วยความจำโปรแกรม
Note- สัญลักษณ์ '#' ก่อน 6AH แสดงว่าตัวถูกดำเนินการเป็นข้อมูล (8 บิต) ในกรณีที่ไม่มี "#" เลขฐานสิบหกจะถูกนำมาเป็นที่อยู่
โหมดที่อยู่โดยตรง
นี่เป็นอีกวิธีหนึ่งในการจัดการกับตัวถูกดำเนินการ ที่อยู่ของข้อมูล (แหล่งข้อมูล) จะได้รับเป็นตัวถูกดำเนินการ ลองมาเป็นตัวอย่าง
MOV A, 04H
ธนาคารที่ลงทะเบียน # 0 (ทะเบียนที่ 4) มีที่อยู่ 04H เมื่อดำเนินการคำสั่ง MOV ข้อมูลที่จัดเก็บในรีจิสเตอร์ 04H จะถูกย้ายไปยังแอคคูมูเลเตอร์ เนื่องจากรีจิสเตอร์ 04H เก็บข้อมูล 1FH 1FH จะถูกย้ายไปที่ตัวสะสม
Note- เราไม่ได้ใช้ '#' ในโหมดกำหนดแอดเดรสโดยตรงซึ่งแตกต่างจากโหมดทันที หากเราใช้ '#' ค่าข้อมูล 04H จะถูกโอนไปยังตัวสะสมแทน 1FH
ลองดูภาพประกอบต่อไปนี้ มันแสดงให้เห็นว่าคำสั่งถูกดำเนินการอย่างไร
ดังที่แสดงในภาพประกอบด้านบนนี่คือคำสั่ง 2 ไบต์ซึ่งต้องใช้ 1 รอบจึงจะเสร็จสมบูรณ์ พีซีจะเพิ่มขึ้นทีละ 2 และจะชี้ไปที่ 0204 ตัวเลือกสำหรับคำสั่ง MOV A ที่อยู่คือ E5H เมื่อคำสั่งที่ 0202 ถูกดำเนินการ (E5H) ตัวสะสมจะทำงานและพร้อมที่จะรับข้อมูล จากนั้นพีซีจะไปยังที่อยู่ถัดไปเป็น 0203 และค้นหาที่อยู่ของตำแหน่ง 04H ซึ่งเป็นที่ตั้งของแหล่งข้อมูล (ที่จะถ่ายโอนไปยังตัวสะสม) ที่ 04H ส่วนควบคุมจะค้นหาข้อมูล 1F และถ่ายโอนไปยังตัวสะสมและด้วยเหตุนี้การดำเนินการจะเสร็จสิ้น
ลงทะเบียน Direct Addressing Mode
ในโหมดการกำหนดแอดเดรสนี้เราใช้ชื่อรีจิสเตอร์โดยตรง (เป็นตัวดำเนินการต้นทาง) ให้เราพยายามทำความเข้าใจด้วยความช่วยเหลือของตัวอย่าง
MOV A, R4
ในแต่ละครั้งรีจิสเตอร์สามารถรับค่าจาก R0 ถึง R7 มี 32 ทะเบียนดังกล่าว ในการใช้การลงทะเบียน 32 รายการที่มีตัวแปรเพียง 8 ตัวในการลงทะเบียนจะใช้การลงทะเบียนธนาคาร มีธนาคารที่ลงทะเบียน 4 แห่งที่มีชื่อตั้งแต่ 0 ถึง 3 แต่ละธนาคารประกอบด้วย 8 การลงทะเบียนที่ตั้งชื่อจาก R0 ถึง R7
ในแต่ละครั้งสามารถเลือกธนาคารที่ลงทะเบียนเดียวได้ การเลือกธนาคารที่ลงทะเบียนสามารถทำได้ผ่านไฟล์Special Function Register (SFR) ชื่อว่า Processor Status Word(PSW). PSW เป็น SFR 8 บิตซึ่งแต่ละบิตสามารถตั้งโปรแกรมได้ตามต้องการ บิตถูกกำหนดจาก PSW.0 ถึง PSW.7 PSW.3 และ PSW.4 ใช้เพื่อเลือกลงทะเบียนธนาคาร
ตอนนี้ให้ดูภาพประกอบต่อไปนี้เพื่อให้เข้าใจชัดเจนว่ามันทำงานอย่างไร
Opcode EC ใช้สำหรับ MOV A, R4 opcode ถูกเก็บไว้ที่ที่อยู่ 0202 และเมื่อดำเนินการแล้วการควบคุมจะตรงไปที่ R4 ของธนาคารทะเบียนที่เคารพ (ซึ่งถูกเลือกใน PSW) ถ้าเลือก register bank # 0 ข้อมูลจาก R4 ของ register bank # 0 จะถูกย้ายไปที่ตัวสะสม ที่นี่ 2F เก็บไว้ที่ 04H. 04H แสดงที่อยู่ของ R4 ของธนาคารที่ลงทะเบียน # 0
การเคลื่อนไหวของข้อมูล (2F) ถูกเน้นด้วยตัวหนา 2F กำลังถ่ายโอนไปยังตัวสะสมจากตำแหน่งหน่วยความจำข้อมูล 0C H และแสดงเป็นเส้นประ 0CH คือตำแหน่งที่อยู่ของ Register 4 (R4) ของ register bank # 1 คำสั่งข้างต้นคือ 1 ไบต์และต้องการ 1 รอบเพื่อให้การทำงานสมบูรณ์ ความหมายคือคุณสามารถบันทึกหน่วยความจำของโปรแกรมได้โดยใช้โหมดการลงทะเบียนโดยตรง
ลงทะเบียนโหมดที่อยู่ทางอ้อม
ในโหมดการกำหนดแอดเดรสนี้แอดเดรสของข้อมูลจะถูกเก็บไว้ในรีจิสเตอร์เป็นตัวถูกดำเนินการ
MOV A, @R0
ที่นี่ค่าภายใน R0 ถือเป็นที่อยู่ซึ่งเก็บข้อมูลที่จะถ่ายโอนไปยังตัวสะสม Example: หาก R0 มีค่า 20H และข้อมูล 2FH ถูกเก็บไว้ที่ที่อยู่ 20H ค่า 2FH จะถูกโอนไปยังตัวสะสมหลังจากดำเนินการตามคำสั่งนี้ ดูภาพประกอบต่อไปนี้
ดังนั้น opcode สำหรับ MOV A, @R0คือ E6H สมมติว่าเลือกธนาคารทะเบียน # 0 แล้ว R0 ของ register bank # 0 จะเก็บข้อมูล 20H การควบคุมโปรแกรมจะย้ายไปที่ 20H ซึ่งจะค้นหาข้อมูล 2FH และจะถ่ายโอน 2FH ไปยังตัวสะสม นี่คือคำสั่ง 1 ไบต์และตัวนับโปรแกรมจะเพิ่มขึ้นทีละ 1 และย้ายไปที่ 0203 ของหน่วยความจำโปรแกรม
Note- เฉพาะ R0 และ R1 เท่านั้นที่ได้รับอนุญาตให้สร้างคำแนะนำในการระบุแอดเดรสทางอ้อม กล่าวอีกนัยหนึ่งโปรแกรมเมอร์สามารถสร้างคำสั่งโดยใช้ @ R0 หรือ @ R1 อนุญาตให้ลงทะเบียนทุกธนาคาร
โหมดการกำหนดแอดเดรสที่จัดทำดัชนี
เราจะใช้สองตัวอย่างเพื่อทำความเข้าใจแนวคิดของโหมดการกำหนดแอดเดรสที่จัดทำดัชนี ดูคำแนะนำต่อไปนี้ -
MOVC A, @A+DPTR
และ
MOVC A, @A+PC
โดยที่ DPTR เป็นตัวชี้ข้อมูลและพีซีเป็นตัวนับโปรแกรม (ทั้งคู่เป็นรีจิสเตอร์ 16 บิต) ลองพิจารณาตัวอย่างแรก
MOVC A, @A+DPTR
ตัวถูกดำเนินการต้นทางคือ @ A + DPTR มีแหล่งข้อมูลจากตำแหน่งนี้ ที่นี่เรากำลังเพิ่มเนื้อหาของ DPTR ด้วยเนื้อหาปัจจุบันของตัวสะสม การเพิ่มนี้จะให้ที่อยู่ใหม่ซึ่งเป็นที่อยู่ของแหล่งข้อมูล จากนั้นข้อมูลที่ชี้โดยที่อยู่นี้จะถูกโอนไปยังตัวสะสม
opcode คือ 93H DPTR มีค่า 01FE โดยที่ 01 อยู่ใน DPH (สูงกว่า 8 บิต) และ FE อยู่ใน DPL (8 บิตต่ำกว่า) Accumulator มีค่า 02H จากนั้นทำการเพิ่มแบบ 16 บิตและ 01FE H + 02H จะได้ผลลัพธ์ 0200 H ข้อมูลที่ตำแหน่ง 0200H จะถูกถ่ายโอนไปยังตัวสะสม ค่าก่อนหน้าภายในตัวสะสม (02H) จะถูกแทนที่ด้วยข้อมูลใหม่จาก 0200H ข้อมูลใหม่ในตัวสะสมจะถูกเน้นในภาพประกอบ
นี่คือคำสั่ง 1 ไบต์ที่มี 2 รอบที่จำเป็นสำหรับการดำเนินการและเวลาในการดำเนินการที่จำเป็นสำหรับคำสั่งนี้สูงเมื่อเทียบกับคำสั่งก่อนหน้า (ซึ่งมีทั้งหมด 1 รอบต่อหนึ่งรอบ)
ตัวอย่างอื่น ๆ MOVC A, @A+PCทำงานในลักษณะเดียวกับตัวอย่างข้างต้น แทนที่จะเพิ่ม DPTR ด้วยแอคคูมูเลเตอร์ข้อมูลภายในตัวนับโปรแกรม (PC) จะถูกเพิ่มด้วยตัวสะสมเพื่อรับที่อยู่เป้าหมาย
การลงทะเบียนฟังก์ชันพิเศษ (หรือการลงทะเบียนเพื่อวัตถุประสงค์พิเศษหรือเพียงแค่ลงทะเบียนพิเศษ) คือการลงทะเบียนภายในไมโครโปรเซสเซอร์ที่ควบคุมหรือตรวจสอบการทำงานต่างๆของไมโครโปรเซสเซอร์ เนื่องจากรีจิสเตอร์พิเศษเชื่อมโยงอย่างใกล้ชิดกับฟังก์ชันหรือสถานะพิเศษบางอย่างของโปรเซสเซอร์จึงอาจไม่สามารถเขียนได้โดยตรงตามคำสั่งปกติ (เช่นเพิ่มย้าย ฯลฯ ) แต่การลงทะเบียนพิเศษบางอย่างในสถาปัตยกรรมโปรเซสเซอร์บางตัวต้องการคำสั่งพิเศษในการแก้ไข
ใน 8051 การลงทะเบียน A, B, DPTR และ PSW เป็นส่วนหนึ่งของกลุ่มการลงทะเบียนที่เรียกกันทั่วไปว่า SFR (การลงทะเบียนฟังก์ชันพิเศษ) SFR สามารถเข้าถึงได้ด้วยชื่อหรือตามที่อยู่
ตารางต่อไปนี้แสดงรายการ SFR และที่อยู่
ที่อยู่ไบต์ | ที่อยู่บิต | ||||||||
---|---|---|---|---|---|---|---|---|---|
FF | |||||||||
F0 | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | ข |
E0 | E7 | E6 | E5 | E4 | E3 | E2 | E1 | E0 | ACC |
D0 | D7 | D6 | D5 | D4 | D3 | D2 | - | D0 | PSW |
B8 | - | - | - | พ.ศ. | BB | ศ ธ | B9 | B8 | IP |
B0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | P3 |
A2 | AF | - | - | AC | AB | AA | A9 | A8 | IE |
A0 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | P2 |
99 | บิตแอดเดรสไม่ได้ | SBUF | |||||||
98 | ชั้น 9 | 9E | 9 ด | 9 ค | 9B | 9A | 99 | 98 | SCON |
90 | 97 | 96 | 95 | 94 | 93 | 92 | 91 | 90 | P1 |
8D | บิตแอดเดรสไม่ได้ | TH1 | |||||||
8C | บิตแอดเดรสไม่ได้ | TH0 | |||||||
8B | บิตแอดเดรสไม่ได้ | TL1 | |||||||
8A | บิตแอดเดรสไม่ได้ | TL0 | |||||||
89 | บิตแอดเดรสไม่ได้ | TMOD | |||||||
88 | ชั้น 8 | 8E | 8D | 8C | 8B | 8A | 89 | 88 | TCON |
87 | บิตแอดเดรสไม่ได้ | PCON | |||||||
83 | บิตแอดเดรสไม่ได้ | ปส | |||||||
82 | บิตแอดเดรสไม่ได้ | DPL | |||||||
81 | บิตแอดเดรสไม่ได้ | SP | |||||||
80 | 87 | 87 | 85 | 84 | 83 | 82 | 81 | 80 | P0 |
พิจารณาสองประเด็นต่อไปนี้เกี่ยวกับที่อยู่ SFR
การลงทะเบียนฟังก์ชันพิเศษสามารถมีที่อยู่ระหว่าง 80H ถึง FFH ที่อยู่เหล่านี้สูงกว่า 80H เนื่องจากที่อยู่ตั้งแต่ 00 ถึง 7FH เป็นที่อยู่ของหน่วยความจำ RAM ภายใน 8051
SFR ไม่ได้ใช้พื้นที่แอดเดรส 80 ถึง FF ทั้งหมด สถานที่ที่ไม่ได้ใช้ตั้งแต่ 80H ถึง FFH สงวนไว้และโปรแกรมเมอร์ 8051 จะต้องไม่ใช้
CY | PSW.7 | ถือธง |
AC | PSW 6 | ธงพกพาเสริม |
F0 | PSW 5 | แฟล็ก 0 พร้อมใช้งานสำหรับผู้ใช้สำหรับวัตถุประสงค์ทั่วไป |
RS1 | PSW.4 | ลงทะเบียนตัวเลือกธนาคารบิต 1 |
RS0 | PSW.3 | ลงทะเบียนตัวเลือกธนาคารบิต 0 |
OV | PSW 2 | ค่าสถานะล้น |
- | PSW.1 | ผู้ใช้สามารถกำหนดธงได้ |
ป | PSW.0 | ธงปาริตี ตั้งค่า / ล้างโดยฮาร์ดแวร์ระหว่างรอบคำสั่งเพื่อระบุจำนวนคู่ / คี่ของ 1 บิตในตัวสะสม |
ในตัวอย่างต่อไปนี้ชื่อของผู้ลงทะเบียน SFR จะถูกแทนที่ด้วยที่อยู่
CY | AC | F0 | RS1 | RS0 | OV | - | ป |
---|
เราสามารถเลือกบิต Register Bank ที่เกี่ยวข้องโดยใช้บิต RS0 และ RS1
RS1 | RS2 | ลงทะเบียนธนาคาร | ที่อยู่ |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
Program Status Word (PSW) มีบิตสถานะเพื่อแสดงสถานะปัจจุบันของ CPU ตัวแปร 8051 มีการลงทะเบียนฟังก์ชันพิเศษหนึ่งรายการคือ PSW พร้อมข้อมูลสถานะนี้ 8251 มีแฟล็กสถานะเพิ่มเติมสองสถานะคือ Z และ N ซึ่งมีอยู่ในการลงทะเบียนฟังก์ชันพิเศษที่สองที่เรียกว่า PSW1
ก timerเป็นนาฬิกาชนิดพิเศษที่ใช้วัดช่วงเวลา ตัวจับเวลาที่นับตั้งแต่ศูนย์ขึ้นไปสำหรับการวัดเวลาที่ผ่านไปมักเรียกว่า astopwatch. เป็นอุปกรณ์ที่นับถอยหลังจากช่วงเวลาที่กำหนดและใช้ในการสร้างการหน่วงเวลาเช่นนาฬิกาทรายคือตัวจับเวลา
ก counterเป็นอุปกรณ์ที่จัดเก็บ (และบางครั้งจะแสดง) จำนวนครั้งที่เกิดเหตุการณ์หรือกระบวนการใด ๆ ขึ้นตามสัญญาณนาฬิกา ใช้เพื่อนับเหตุการณ์ที่เกิดขึ้นภายนอกไมโครคอนโทรลเลอร์ ในอุปกรณ์อิเล็กทรอนิกส์ตัวนับสามารถใช้งานได้อย่างง่ายดายโดยใช้วงจรประเภทรีจิสเตอร์เช่นฟลิปฟล็อป
ความแตกต่างระหว่าง Timer และ Counter
จุดที่ทำให้ตัวจับเวลาแตกต่างจากตัวนับมีดังนี้ -
จับเวลา | เคาน์เตอร์ |
---|---|
การลงทะเบียนเพิ่มขึ้นสำหรับทุกรอบเครื่อง | การลงทะเบียนจะเพิ่มขึ้นโดยพิจารณาจากการเปลี่ยน 1 ถึง 0 ที่ตรงกับขาอินพุตภายนอก (T0, T1) |
อัตราการนับสูงสุดคือ 1/12 ของความถี่ออสซิลเลเตอร์ | อัตราการนับสูงสุดคือ 1/24 ของความถี่ออสซิลเลเตอร์ |
ตัวจับเวลาใช้ความถี่ของนาฬิกาภายในและสร้างความล่าช้า | ตัวนับใช้สัญญาณภายนอกเพื่อนับพัลส์ |
ตัวจับเวลาของ 8051 และทะเบียนที่เกี่ยวข้อง
8051 มีตัวจับเวลา 2 แบบคือ Timer 0 และ Timer 1 สามารถใช้เป็นตัวจับเวลาหรือเป็นตัวนับเหตุการณ์ ทั้ง Timer 0 และ Timer 1 มีความกว้าง 16 บิต เนื่องจาก 8051 เป็นไปตามสถาปัตยกรรม 8 บิตแต่ละ 16 บิตจึงถูกเข้าถึงเป็นสองรีจิสเตอร์ที่แยกจากกันของไบต์ต่ำและไบต์สูง
จับเวลา 0 ลงทะเบียน
การลงทะเบียน 16 บิตของ Timer 0 ถูกเข้าถึงเป็นไบต์ต่ำและสูง รีจิสเตอร์ไบต์ต่ำเรียกว่า TL0 (Timer 0 low byte) และ high-byte register เรียกว่า TH0 (Timer 0 high byte) การลงทะเบียนเหล่านี้สามารถเข้าถึงได้เหมือนกับการลงทะเบียนอื่น ๆ ตัวอย่างเช่นคำแนะนำMOV TL0, #4H ย้ายค่าไปที่ไบต์ต่ำของ Timer # 0
ตัวจับเวลา 1 ลงทะเบียน
การลงทะเบียน 16 บิตของ Timer 1 ถูกเข้าถึงเป็นไบต์ต่ำและสูง รีจิสเตอร์ไบต์ต่ำเรียกว่า TL1 (Timer 1 low byte) และ high-byte register เรียกว่า TH1 (Timer 1 high byte) การลงทะเบียนเหล่านี้สามารถเข้าถึงได้เหมือนกับการลงทะเบียนอื่น ๆ ตัวอย่างเช่นคำแนะนำMOV TL1, #4H ย้ายค่าไปยังไบต์ต่ำของ Timer 1
TMOD (โหมดตั้งเวลา) ลงทะเบียน
ทั้ง Timer 0 และ Timer 1 ใช้รีจิสเตอร์เดียวกันเพื่อตั้งค่าโหมดการทำงานของตัวจับเวลาต่างๆ เป็นการลงทะเบียนแบบ 8 บิตซึ่ง 4 บิตล่างจะถูกตั้งไว้สำหรับ Timer 0 และสี่บิตบนสำหรับ Timers ในแต่ละกรณีจะใช้ 2 บิตล่างเพื่อตั้งค่าโหมดจับเวลาล่วงหน้าและ 2 บิตบนจะใช้เพื่อระบุตำแหน่ง
Gate - เมื่อตั้งค่าตัวจับเวลาจะทำงานในขณะที่ INT (0,1) สูงเท่านั้น
C/T - บิตเลือกตัวนับ / ตัวจับเวลา
M1 - บิตโหมด 1
M0 - โหมดบิต 0
ประตู
ตัวจับเวลาทุกตัวมีวิธีการเริ่มต้นและการหยุด ตัวจับเวลาบางตัวทำสิ่งนี้โดยซอฟต์แวร์บางตัวใช้ฮาร์ดแวร์และบางตัวมีการควบคุมทั้งซอฟต์แวร์และฮาร์ดแวร์ ตัวจับเวลา 8051 มีการควบคุมทั้งซอฟต์แวร์และฮาร์ดแวร์ การเริ่มและหยุดของตัวจับเวลาจะถูกควบคุมโดยซอฟต์แวร์โดยใช้คำสั่งSETB TR1 และ CLR TR1 สำหรับตัวจับเวลา 1 และ SETB TR0 และ CLR TR0 สำหรับตัวจับเวลา 0.
คำสั่ง SETB ใช้เพื่อเริ่มต้นและหยุดโดยคำสั่ง CLR คำแนะนำเหล่านี้เริ่มต้นและหยุดตัวจับเวลาตราบเท่าที่ GATE = 0 ในทะเบียน TMOD ตัวจับเวลาสามารถเริ่มต้นและหยุดโดยแหล่งภายนอกได้โดยสร้าง GATE = 1 ในทะเบียน TMOD
C / T (นาฬิกา / จับเวลา)
บิตนี้ในทะเบียน TMOD ใช้เพื่อตัดสินใจว่าจะใช้ตัวจับเวลาเป็นไฟล์ delay generator หรือ event manager. ถ้า C / T = 0 จะใช้เป็นตัวจับเวลาสำหรับการสร้างการหน่วงเวลา แหล่งสัญญาณนาฬิกาที่ใช้สร้างการหน่วงเวลาคือความถี่คริสตัลของ 8051 ถ้า C / T = 0 ความถี่คริสตัลที่ติดกับ 8051 จะกำหนดความเร็วที่ตัวจับเวลา 8051 ทำเครื่องหมายในช่วงเวลาปกติ
ความถี่ของตัวจับเวลาจะอยู่ที่ 1/12 ของความถี่ของคริสตัลที่ติดกับ 8051 เสมอแม้ว่าระบบที่ใช้ 8051 ต่างๆจะมีความถี่ XTAL ตั้งแต่ 10 MHz ถึง 40 MHz แต่โดยปกติเราจะทำงานกับความถี่ XTAL ที่ 11.0592 MHz เป็นเพราะอัตราการรับส่งข้อมูลสำหรับการสื่อสารแบบอนุกรมของ 8051.XTAL = 11.0592 ทำให้ระบบ 8051 สามารถสื่อสารกับพีซีได้โดยไม่มีข้อผิดพลาด
M1 / M2
M1 | M2 | โหมด |
---|---|---|
0 | 0 | โหมดจับเวลา 13 บิต |
0 | 1 | โหมดจับเวลา 16 บิต |
1 | 0 | โหมดรีโหลดอัตโนมัติ 8 บิต |
1 | 1 | โหมดหก |
โหมดต่างๆของตัวจับเวลา
โหมด 0 (โหมดจับเวลา 13 บิต)
ทั้งตัวจับเวลา 1 และตัวจับเวลา 0 ในโหมด 0 ทำงานเป็นตัวนับ 8 บิต (โดยมีตัวตั้งค่าเริ่มต้นแบบหารด้วย 32) ไทม์เมอร์รีจิสเตอร์ถูกกำหนดค่าเป็นรีจิสเตอร์ 13 บิตซึ่งประกอบด้วย 8 บิตทั้งหมดของ TH1 และ 5 บิตล่างของ TL1 3 บิตบนของ TL1 ไม่แน่นอนและควรละเว้น การตั้งค่าแฟล็กรัน (TR1) ไม่ล้างรีจิสเตอร์ ค่าสถานะขัดจังหวะตัวจับเวลา TF1 ถูกตั้งค่าเมื่อการนับย้อนจาก 1 ทั้งหมดไปเป็น 0 ทั้งหมด การทำงานของโหมด 0 จะเหมือนกันสำหรับ Timer 0 เหมือนกับการทำงานของ Timer 1
โหมด 1 (โหมดตั้งเวลา 16 บิต)
โหมดจับเวลา "1" คือตัวจับเวลาแบบ 16 บิตและเป็นโหมดที่ใช้กันทั่วไป มันทำงานในลักษณะเดียวกับโหมด 13 บิตยกเว้นว่าจะใช้ทั้งหมด 16 บิต TLx จะเพิ่มขึ้นโดยเริ่มจาก 0 ถึงสูงสุด 255 เมื่อถึงค่า 255 TLx จะรีเซ็ตเป็น 0 จากนั้น THx จะเพิ่มขึ้นทีละ 1 เนื่องจากเป็นตัวจับเวลาแบบ 16 บิตเต็มตัวจับเวลาอาจมีค่าที่แตกต่างกันได้ถึง 65536 ค่า จะล้นกลับไปที่ 0 หลังจาก 65,536 รอบเครื่อง
โหมด 2 (โหลดอัตโนมัติ 8 บิต)
ตัวจับเวลาทั้งสองได้รับการกำหนดค่าเป็นตัวนับ 8 บิต (TL1 และ TL0) พร้อมการรีโหลดอัตโนมัติ โอเวอร์โฟลว์จาก TL1 (TL0) จะตั้งค่า TF1 (TF0) และโหลด TL1 (TL0) ด้วยเนื้อหาของ Th1 (TH0) ซึ่งตั้งค่าล่วงหน้าโดยซอฟต์แวร์ การโหลดซ้ำทำให้ TH1 (TH0) ไม่เปลี่ยนแปลง
ข้อดีของโหมดโหลดอัตโนมัติคือคุณสามารถตั้งเวลาให้มีค่าตั้งแต่ 200 ถึง 255 ได้เสมอหากคุณใช้โหมด 0 หรือ 1 คุณจะต้องตรวจสอบโค้ดเพื่อดูโอเวอร์โฟลว์และในกรณีนั้น รีเซ็ตตัวจับเวลาเป็น 200 ในกรณีนี้คำแนะนำที่มีค่าจะตรวจสอบค่าและ / หรือโหลดซ้ำ ในโหมด 2 ไมโครคอนโทรลเลอร์จะดูแลสิ่งนี้ เมื่อคุณกำหนดค่าตัวจับเวลาในโหมด 2 แล้วคุณไม่ต้องกังวลเกี่ยวกับการตรวจสอบว่าตัวจับเวลาล้นหรือไม่และคุณไม่ต้องกังวลกับการรีเซ็ตค่าเนื่องจากฮาร์ดแวร์ไมโครคอนโทรลเลอร์จะทำทั้งหมดให้คุณ โหมดโหลดซ้ำอัตโนมัติใช้สำหรับกำหนดอัตรารับส่งข้อมูลทั่วไป
โหมด 3 (โหมดจับเวลาแยก)
โหมดตั้งเวลา "3" เรียกว่า split-timer mode. เมื่อ Timer 0 ถูกวางไว้ในโหมด 3 มันจะกลายเป็นตัวจับเวลา 8 บิตสองตัวที่แยกจากกัน Timer 0 คือ TL0 และ Timer 1 คือ TH0 ทั้งไทม์เมอร์นับตั้งแต่ 0 ถึง 255 และในกรณีที่โอเวอร์โฟลว์ให้รีเซ็ตกลับเป็น 0 บิตทั้งหมดที่เป็นของไทเมอร์ 1 จะเชื่อมโยงกับ TH0
เมื่อ Timer 0 อยู่ในโหมดแยกตัวจับเวลาจริง 1 (เช่น TH1 และ TL1) สามารถตั้งค่าได้ในโหมด 0, 1 หรือ 2 แต่ไม่สามารถเริ่ม / หยุดได้เนื่องจากบิตที่เชื่อมโยงกับ TH0 ในขณะนี้ ตัวจับเวลาจริง 1 จะเพิ่มขึ้นทุกรอบเครื่อง
การเริ่มต้นตัวจับเวลา
เลือกโหมดจับเวลา พิจารณาตัวจับเวลา 16 บิตที่ทำงานอย่างต่อเนื่องและไม่ขึ้นกับพินภายนอกใด ๆ
เริ่มต้น TMOD SFR ใช้ TMOD 4 บิตต่ำสุดและพิจารณา Timer 0 เก็บสองบิตคือ GATE 0 และ C / T 0 เป็น 0 เนื่องจากเราต้องการให้ตัวจับเวลาเป็นอิสระจากพินภายนอก เนื่องจากโหมด 16 บิตคือโหมดจับเวลา 1 ให้ล้าง T0M1 และตั้งค่า T0M0 อย่างมีประสิทธิภาพบิตเดียวที่จะเปิดคือบิต 0 ของ TMOD ตอนนี้ดำเนินการตามคำสั่งต่อไปนี้ -
MOV TMOD,#01h
ตอนนี้ Timer 0 อยู่ในโหมดจับเวลา 16 บิต แต่ตัวจับเวลาไม่ทำงาน ในการเริ่มจับเวลาในโหมดการทำงานให้ตั้งค่า TR0 บิตโดยดำเนินการตามคำสั่งต่อไปนี้ -
SETB TR0
ตอนนี้ตัวจับเวลา 0 จะเริ่มนับทันทีโดยจะเพิ่มขึ้นทุก ๆ รอบเครื่อง
การอ่านตัวจับเวลา
ตัวจับเวลา 16 บิตสามารถอ่านได้สองวิธี อ่านค่าจริงของตัวจับเวลาเป็นตัวเลข 16 บิตหรือคุณตรวจพบเมื่อตัวจับเวลาล้น
การตรวจจับ Timer Overflow
เมื่อตัวจับเวลาล้นจากค่าสูงสุดเป็น 0 ไมโครคอนโทรลเลอร์จะตั้งค่าบิต TFx ในทะเบียน TCON โดยอัตโนมัติ ดังนั้นแทนที่จะตรวจสอบค่าที่แน่นอนของตัวจับเวลาคุณสามารถตรวจสอบบิต TFx ได้ หากตั้งค่า TF0 แสดงว่าตัวจับเวลา 0 ล้น ถ้า TF1 ถูกตั้งค่าตัวจับเวลา 1 จะล้น
การขัดจังหวะเป็นสัญญาณไปยังโปรเซสเซอร์ที่ปล่อยออกมาจากฮาร์ดแวร์หรือซอฟต์แวร์ซึ่งบ่งบอกถึงเหตุการณ์ที่ต้องดำเนินการทันที เมื่อใดก็ตามที่มีการขัดจังหวะเกิดขึ้นคอนโทรลเลอร์จะดำเนินการตามคำสั่งปัจจุบันให้เสร็จสิ้นและเริ่มการทำงานของไฟล์Interrupt Service Routine (ISR) หรือ Interrupt Handler. ISR จะบอกโปรเซสเซอร์หรือคอนโทรลเลอร์ว่าต้องทำอย่างไรเมื่อเกิดการขัดจังหวะ การขัดจังหวะอาจเป็นได้ทั้งการขัดจังหวะฮาร์ดแวร์หรือการขัดจังหวะซอฟต์แวร์
ฮาร์ดแวร์ขัดจังหวะ
การขัดจังหวะฮาร์ดแวร์คือสัญญาณแจ้งเตือนทางอิเล็กทรอนิกส์ที่ส่งไปยังโปรเซสเซอร์จากอุปกรณ์ภายนอกเช่นตัวควบคุมดิสก์หรืออุปกรณ์ต่อพ่วงภายนอก ตัวอย่างเช่นเมื่อเรากดแป้นบนแป้นพิมพ์หรือเลื่อนเมาส์จะทำให้เกิดการขัดจังหวะของฮาร์ดแวร์ซึ่งทำให้โปรเซสเซอร์อ่านการกดแป้นพิมพ์หรือตำแหน่งเมาส์
ซอฟต์แวร์ขัดจังหวะ
การขัดจังหวะของซอฟต์แวร์เกิดจากเงื่อนไขพิเศษหรือคำสั่งพิเศษในชุดคำสั่งซึ่งทำให้เกิดการขัดจังหวะเมื่อดำเนินการโดยโปรเซสเซอร์ ตัวอย่างเช่นหากหน่วยตรรกะทางคณิตศาสตร์ของโปรเซสเซอร์รันคำสั่งเพื่อหารตัวเลขด้วยศูนย์เพื่อทำให้เกิดข้อยกเว้นแบบหารด้วยศูนย์ซึ่งทำให้คอมพิวเตอร์ละทิ้งการคำนวณหรือแสดงข้อความแสดงข้อผิดพลาด คำแนะนำการขัดจังหวะซอฟต์แวร์ทำงานคล้ายกับการเรียกรูทีนย่อย
Polling คืออะไร?
สถานะของการตรวจสอบอย่างต่อเนื่องเรียกว่า polling. ไมโครคอนโทรลเลอร์คอยตรวจสอบสถานะของอุปกรณ์อื่น ๆ และในขณะที่ดำเนินการดังกล่าวไม่มีการดำเนินการอื่นใดและใช้เวลาในการประมวลผลทั้งหมดในการตรวจสอบ ปัญหานี้สามารถแก้ไขได้โดยใช้การขัดจังหวะ
ในวิธีการขัดจังหวะตัวควบคุมจะตอบสนองเมื่อเกิดการขัดจังหวะเท่านั้น ดังนั้นคอนโทรลเลอร์จึงไม่จำเป็นต้องตรวจสอบสถานะ (แฟล็กสัญญาณ ฯลฯ ) ของอุปกรณ์ที่เชื่อมต่อและในตัว
ขัดจังหวะ v / s การสำรวจ
นี่คือการเปรียบเทียบที่แยกความแตกต่างของการขัดจังหวะจากการสำรวจ -
ขัดจังหวะ | การสำรวจความคิดเห็น |
---|---|
การขัดจังหวะก็เหมือนกับไฟล์ shopkeeper. หากมีใครต้องการบริการหรือผลิตภัณฑ์เขาก็ไปหาเขาและแสดงความเห็นถึงความต้องการของเขา ในกรณีที่มีการขัดจังหวะเมื่อได้รับแฟล็กหรือสัญญาณจะแจ้งให้คอนโทรลเลอร์ทราบว่าจำเป็นต้องได้รับการซ่อมบำรุง | วิธีการสำรวจความคิดเห็นก็เหมือนกับไฟล์ salesperson. พนักงานขายเดินจากประตูหนึ่งไปอีกประตูหนึ่งขณะขอซื้อผลิตภัณฑ์หรือบริการ ในทำนองเดียวกันคอนโทรลเลอร์จะคอยตรวจสอบแฟล็กหรือสัญญาณทีละรายการสำหรับอุปกรณ์ทั้งหมดและให้บริการกับส่วนประกอบใดก็ตามที่ต้องการบริการ |
ขัดจังหวะบริการประจำ
สำหรับการขัดจังหวะทุกครั้งจะต้องมีรูทีนบริการขัดจังหวะ (ISR) หรือ interrupt handler. เมื่อเกิดการขัดจังหวะไมโครคอนโทรลเลอร์จะรันรูทีนบริการขัดจังหวะ สำหรับการขัดจังหวะทุกครั้งจะมีตำแหน่งคงที่ในหน่วยความจำที่เก็บแอดเดรสของรูทีนบริการขัดจังหวะ ISR ตารางตำแหน่งหน่วยความจำที่ตั้งไว้เพื่อเก็บแอดเดรสของ ISR เรียกว่าเป็น Interrupt Vector Table
ตารางเวกเตอร์ขัดจังหวะ
มีการขัดจังหวะหกรายการรวมถึง RESET ใน 8051
ขัดจังหวะ | ตำแหน่ง ROM (Hex) | พิน |
---|---|---|
ขัดจังหวะ | ตำแหน่ง ROM (HEX) | |
Serial COM (RI และ TI) | 0023 | |
ตัวจับเวลา 1 ขัดจังหวะ (TF1) | 001B | |
HW ภายนอกขัดจังหวะ 1 (INT1) | 0013 | P3.3 (13) |
HW ภายนอกขัดจังหวะ 0 (INT0) | 0003 | P3.2 (12) |
จับเวลา 0 (TF0) | 000B | |
รีเซ็ต | 0000 | 9 |
เมื่อเปิดใช้งานพินรีเซ็ต 8051 จะข้ามไปยังตำแหน่งแอดเดรส 0000 นี่คือการรีเซ็ตการเปิดเครื่อง
การขัดจังหวะสองตัวถูกตั้งค่าไว้สำหรับตัวจับเวลา: หนึ่งตัวสำหรับตัวจับเวลา 0 และอีกตัวสำหรับตัวจับเวลา 1 ตำแหน่งหน่วยความจำคือ 000BH และ 001BH ตามลำดับในตารางเวกเตอร์อินเทอร์รัปต์
การขัดจังหวะสองรายการถูกตั้งค่าไว้สำหรับการขัดจังหวะภายนอกของฮาร์ดแวร์ หมายเลขพิน 12 และหมายเลขพิน 13 ในพอร์ต 3 ใช้สำหรับการขัดจังหวะฮาร์ดแวร์ภายนอก INT0 และ INT1 ตามลำดับ ตำแหน่งหน่วยความจำคือ 0003H และ 0013H ตามลำดับในตารางเวกเตอร์ขัดจังหวะ
การสื่อสารแบบอนุกรมมีการขัดจังหวะเดียวที่เป็นของทั้งรับและส่ง ตำแหน่งหน่วยความจำ 0023H เป็นของการขัดจังหวะนี้
ขั้นตอนในการดำเนินการขัดจังหวะ
เมื่อการขัดจังหวะทำงานไมโครคอนโทรลเลอร์จะดำเนินการตามขั้นตอนต่อไปนี้ -
ไมโครคอนโทรลเลอร์จะปิดคำสั่งที่กำลังดำเนินการอยู่และบันทึกที่อยู่ของคำสั่งถัดไป (PC) บนสแต็ก
นอกจากนี้ยังบันทึกสถานะปัจจุบันของอินเทอร์รัปต์ทั้งหมดภายใน (กล่าวคือไม่ใช่บนสแต็ก)
มันข้ามไปยังตำแหน่งหน่วยความจำของตารางเวกเตอร์ขัดจังหวะที่เก็บแอดเดรสของรูทีนบริการขัดจังหวะ
ไมโครคอนโทรลเลอร์รับที่อยู่ของ ISR จากตารางเวกเตอร์ขัดจังหวะและกระโดดไปที่มัน เริ่มดำเนินการรูทีนย่อย interrupt service ซึ่งก็คือ RETI (return from interrupt)
เมื่อดำเนินการตามคำสั่ง RETI ไมโครคอนโทรลเลอร์จะกลับไปยังตำแหน่งที่ถูกขัดจังหวะ ขั้นแรกจะได้รับที่อยู่ตัวนับโปรแกรม (PC) จากสแต็กโดยการเปิดไบต์บนสุดของสแต็กลงในพีซี จากนั้นจะเริ่มดำเนินการจากที่อยู่นั้น
Edge Triggering เทียบกับ Level Triggering
โมดูลอินเทอร์รัปต์มีสองประเภทคือระดับทริกเกอร์หรือขอบทริกเกอร์
ระดับที่เรียกใช้ | Edge Triggered |
---|---|
โมดูลอินเทอร์รัปต์ระดับทริกเกอร์จะสร้างอินเทอร์รัปต์เสมอเมื่อใดก็ตามที่ยืนยันระดับของอินเทอร์รัปต์ซอร์ส | โมดูลอินเทอร์รัปต์ที่ถูกทริกเกอร์ด้วยขอบจะสร้างการขัดจังหวะเฉพาะเมื่อตรวจพบขอบที่ยืนยันของแหล่งสัญญาณขัดจังหวะ ขอบจะถูกตรวจพบเมื่อระดับแหล่งสัญญาณขัดจังหวะเปลี่ยนไปจริงๆ นอกจากนี้ยังสามารถตรวจจับได้โดยการสุ่มตัวอย่างเป็นระยะและตรวจจับระดับที่ยืนยันได้เมื่อตัวอย่างก่อนหน้านี้ไม่ได้รับการยืนยัน |
หากยังคงยืนยันแหล่งที่มาของการขัดจังหวะเมื่อตัวจัดการการขัดจังหวะของเฟิร์มแวร์จัดการการขัดจังหวะโมดูลขัดจังหวะจะสร้างอินเทอร์รัปต์อีกครั้ง | โมดูลอินเทอร์รัปต์ที่ถูกกระตุ้นด้วยขอบสามารถทำงานได้ทันทีไม่ว่าแหล่งที่มาของการขัดจังหวะจะทำงานอย่างไร |
การขัดจังหวะระดับทริกเกอร์เป็นเรื่องยุ่งยากสำหรับเฟิร์มแวร์ | การขัดจังหวะแบบ Edge-trigger ทำให้ความซับซ้อนของโค้ดของเฟิร์มแวร์ต่ำลดจำนวนเงื่อนไขสำหรับเฟิร์มแวร์และให้ความยืดหยุ่นมากขึ้นเมื่อมีการจัดการการขัดจังหวะ |
การเปิดใช้งานและปิดใช้งานการขัดจังหวะ
เมื่อรีเซ็ตการขัดจังหวะทั้งหมดจะถูกปิดใช้งานแม้ว่าจะเปิดใช้งานอยู่ก็ตาม ต้องเปิดใช้งานอินเทอร์รัปต์โดยใช้ซอฟต์แวร์เพื่อให้ไมโครคอนโทรลเลอร์ตอบสนองต่อการขัดจังหวะเหล่านั้น
การลงทะเบียน IE (interrupt enable) มีหน้าที่ในการเปิดใช้งานและปิดใช้งานการขัดจังหวะ IE คือการลงทะเบียน bitaddressable
ขัดจังหวะเปิดใช้งานการลงทะเบียน
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA - เปิด / ปิดการใช้งานทั่วโลก
- - ไม่ได้กำหนด
ET2 - เปิดใช้งานตัวจับเวลา 2 ขัดจังหวะ
ES - เปิดใช้งานการขัดจังหวะพอร์ตอนุกรม
ET1 - เปิดใช้งานตัวจับเวลา 1 ขัดจังหวะ
EX1 - เปิดใช้งานการขัดจังหวะภายนอก 1
ET0 - เปิดใช้งานตัวจับเวลา 0 ขัดจังหวะ
EX0 - เปิดใช้งานอินเตอร์รัปต์ภายนอก 0
ในการเปิดใช้งานการขัดจังหวะเราทำตามขั้นตอนต่อไปนี้ -
บิต D7 ของทะเบียน IE (EA) ต้องสูงเพื่อให้การลงทะเบียนส่วนที่เหลือมีผล
หาก EA = 1 อินเทอร์รัปต์จะเปิดใช้งานและจะได้รับการตอบสนองหากบิตที่เกี่ยวข้องใน IE มีค่าสูง หาก EA = 0 จะไม่มีการขัดจังหวะใด ๆ ตอบสนองแม้ว่าพินที่เกี่ยวข้องในทะเบียน IE จะสูงก็ตาม
Interrupt Priority ใน 8051
เราสามารถปรับเปลี่ยนลำดับความสำคัญของการขัดจังหวะได้โดยกำหนดลำดับความสำคัญที่สูงกว่าให้กับการขัดจังหวะใด ๆ สิ่งนี้ทำได้โดยการเขียนโปรแกรมลงทะเบียนที่เรียกว่าIP (ขัดจังหวะลำดับความสำคัญ)
รูปต่อไปนี้แสดงบิตของการลงทะเบียน IP เมื่อรีเซ็ตการลงทะเบียน IP จะมี 0 ทั้งหมด เพื่อให้ลำดับความสำคัญสูงกว่าการขัดจังหวะใด ๆ เราทำให้บิตที่เกี่ยวข้องในการลงทะเบียน IP สูง
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | ไม่ได้ดำเนินการ. |
- | IP.6 | ไม่ได้ดำเนินการ. |
- | IP 5 | ไม่ได้ดำเนินการ. |
- | IP.4 | ไม่ได้ดำเนินการ. |
PT1 | IP.3 | กำหนดระดับความสำคัญของการขัดจังหวะตัวจับเวลา 1 |
PX1 | IP.2 | กำหนดระดับความสำคัญภายนอก Interrupt 1 |
PT0 | IP.1 | กำหนดระดับลำดับความสำคัญของการขัดจังหวะตัวจับเวลา 0 |
PX0 | IP.0 | กำหนดระดับความสำคัญภายนอก Interrupt 0 |
ขัดจังหวะภายใน Interrupt
จะเกิดอะไรขึ้นถ้า 8051 เรียกใช้ ISR ที่เป็นของอินเทอร์รัปต์และอีกอันหนึ่งใช้งานได้ ในกรณีเช่นนี้การขัดจังหวะที่มีลำดับความสำคัญสูงสามารถขัดจังหวะการขัดจังหวะที่มีลำดับความสำคัญต่ำได้ นี้เรียกว่าinterrupt inside interrupt. ใน 8051 การขัดจังหวะที่มีลำดับความสำคัญต่ำอาจถูกขัดจังหวะด้วยการขัดจังหวะที่มีลำดับความสำคัญสูง แต่จะไม่ถูกขัดจังหวะโดยการขัดจังหวะลำดับความสำคัญต่ำ
การทริกเกอร์การขัดจังหวะโดยซอฟต์แวร์
มีหลายครั้งที่เราจำเป็นต้องทดสอบ ISR ด้วยวิธีการจำลอง สามารถทำได้ด้วยคำแนะนำง่ายๆในการตั้งค่าอินเตอร์รัปต์ให้สูงและทำให้ 8051 ข้ามไปที่ตารางเวกเตอร์ขัดจังหวะ ตัวอย่างเช่นตั้งค่าบิต IE เป็น 1 สำหรับตัวจับเวลา 1 คำสั่งSETB TF1 จะขัดจังหวะ 8051 ไม่ว่าจะทำอะไรก็ตามและบังคับให้ข้ามไปที่ตารางเวกเตอร์ขัดจังหวะ