lecture 3 - naresuan university 03 peripherals.pdf · lecture 3 1 introduction to mcs-51...
TRANSCRIPT
Lecture 3
1
Introduction to MCS-51 Peripherals รปท 1 แสดงแผนผงของ MCS-51 peripherals และการใชงานเพอเปนชองทางตดตอระหวาง CPU กบอปกรณภายนอก สวนperipherals นประกอบดวย 2 Timers/Counters (อาจม 3 ในบางเบอร), Serial port ซงใช UART (Universal Asynchronous Receive Transmit) protocol สามารถท าใหตดตอสอสารกบ computer หรอ microcontroller ตวอนได
นอกจากนนยงม 2 External Interrupt sources (INT0 and INT1) ซงเอาไวรบสญญาณ interrupt จากภายนอก
CPU
Timer/Counter 1Timer/Counter 0
T0 T1
Clock
/12
Serial Port(UART)
External Interrupt 0 External Interrupt 1
INT0 INT1
RXDTXD
รปท 1 MCS-51 Peripherals
Timers/Counters
เนองจากใน MSC-51 ม Timers/Counters ให ส าหรบ 80C51 จะม 16 bit Timer/Counter register ให 2 ชด (คอ Timer 0 และ Timer 1) และส าหรบ 80C52, 83C154 และ 83C154D จะมเพมขนอก 1 ตว (คอ Timer 2) ซงทงหมดนสามารถใชงานเปน Timer หรอ Even counter กได
Lecture 3
2
การใชงานเปน Timer
เมอใชงานเปน Timer คาใน Register จะนบสญญาณภายในเองทกๆ Machine cycle จากท 1 Machine cycle ใชสญญาณ Clock 12 ลก ดงนน คาของ Timer จะนบขนดวยความเรว 1/12 ของความถ Clock ทใช การใชงานเปน Timer สามารถก าหนดรปแบบการใชงานไดจาก Register TMOD ไดจาก Bit M0, M1 ซงเลอกไดทงหมด 4 Mode ดวยกน
การใชงานเปน Counter
ถาบต C/T ใน Register TMOD เปน ‚1‛ ตว Counter จะนบสญญาณจากภายนอกโดยใชขา P3.4 หรอ T0 เปน
ขา Input ใหกบ Timer 0 และใชขา P3.5 หรอ T1 เปน Input ใหกบ Timer 1
เมอใชงานเปน Counter คาใน Register จะมคาเพมขนทกครงทมการเปลยนแปลงสถานะ ‘1’ to ‘0’ ของสญญาณจากภายนอกทขา Input ทสมพนธกน (T0, T1 และ T2) ในการท างานของ Counter น สญญาณจากภายนอก จะถกตรวจสอบในชวงเวลาของ S5P2 ของทกๆ Machine cycle เมอมนตรวจพบสถานะทเปน ‘1’ ใน Cycle ใดๆ แลวตรวจพบสถานะทเปน ‘0’ ใน Cycle ถดมา คาของ Counter กจะเพมขน โดยคาของ Register จะมการเปลยนแปลงในชวงเวลาของ S3P1 ของ Cycle ตอไป หรอพดงายๆวามการนบ 1 ครง จะตองใชเวลา 2 Machine Cycles
จากทการท างานของ Counter ทตรวจสอบสญญาณ ใน 2 Cycle กจะท าใหได ความถสงสดทจะนบไดคอ 1/24 ของสญญาณ Clock ทใช เชน ถา MCS-51 ท างานทความถสญญาณนาฬกา 12 MHz ความถสงสดทจะให Timer ท างานเปน Counter นบได จะมคามากทสด 500 kHz เมอ Timer/Counter นบจนเตมแลวจะเกดการ overflow ซงจะเปนสญญาณ interrupt ไดเชนกน
นอกจากการใชงานทเลอกไดวาใชเปน Timer หรอ Counter แลว Timer 0 และ Timer 1 จะสามารถก าหนดรปแบบการท างานได 4 Mode ดวยกน และส าหรบ Timer 2 จะสามารถก าหนดรปแบบการท างานได 3 แบบคอ Capture, Auto-reload, Baud rate generator
การท างานของ Timer/Counter สามารถควบคมไดโดยการก าหนดคาใน Register IE (Interrupt Enable Register), TMOD (Timer Mode Register) และ TCON (Timer Control Register) ดงตอไปน
IE Register
EA Enable All interrupts
ET1 Enable Timer 1 interrupts
ET0 Enable Timer 0 interrupts
บตเหลานใน IE จะตองถก set เพอใหเกดการ interrupt จาก Timer โดยเขยนในโปรแกรมดงน EA=1;
Lecture 3
3
ET0=1;
TMOD Register
GATE Bit
เปน Bit ทใชควบคมให Timer ท างานหรอไม ถา Bit นของ Timer x ถกตงเปน
1 (Hardware controlled) จะท าให Timer ท างานกตอเมอสญญาณทขา INTx เปน 1 และ Bit TRx ใน Register TCON เปน 1 ดวย
0 (Software controlled) จะท าให Timer ท างานเมอ Bit TRx ใน Register TCON เปน 1
C/~T Bit
ส าหรบเลอกการท างานของ วาจะใชเปน Timer หรอ Counter ถา Bit นเปน
1 (Counter) เลอกการท างานเปน Counter ซงกจะท าการนบสญญาณทเขามาท ขา Tx
0 (Timer) เลอกการท างานเปน Timer ซงกจะท าการนบสญญาณ Clock/12
M1/M0 Bits
00 Mode 0 01 Mode 1 10 Mode 2 11 Mode 3
Lecture 3
4
การท างานของ Timer/Counter ใน Mode 0, 1 และ 2 ของ Timer 0 และ Timer 1 จะคลายกน สวนการท างานใน Mode 3 จะแตกตางกน โดยสรปไดดงน
Mode 0 การท างานใน Mode น จะเปนการใชงานของ Timer register แบบ 13 Bit ซงใช 8 Bit บนมาจาก THx และ 5 Bit ลางจาก TLx
การนบจะเปนการนบขน และเมอถงคามากทสด (THx = FFH, TLx = 1FH) แลวมการนบเพมอก Timer interrupt flag TFx (ใน Register TCON) จะมคาเปน ‘1’
การนบจะท างานเมอสถานะของ Bit TRx = ‘1’ และ (GATE = ‘0’ หรอ Pin ~INTx = ‘1’)
ในการก าหนดให GATE = ‘1’ นน จะท าใหการท างานของ Timer น ถกควบคมโดยสญญาณจากภายนอกซงเขามาทขา ~INTx
Mode 1 การท างานใน Mode 1 น เหมอนกบการท างานใน Mode 0 แตเปนการใชงานของ Timer register ทง 16 Bit คาจากการนบ 8 Bit บนอยใน THx และคาจากการนบ 8 Bit ลางอยใน TLx
Mode 2 การท างานใน Mode น จะเปนการใชงานของ Timer register แบบ 8 Bit ของ TLx เมอ TLx เกด Overflow หรอเกดเปลยนแปลงจาก FFH เปน 00H Timer interrupt flag TFx จะมคาเปน ‘1’ และจะมการท า Automatic reload โหลดคาทเกบไวใน THx ไปเกบไวใน TLx ซงจะเปนคาเรมตนของการนบครงตอไป
Lecture 3
5
Mode 3 ในโหมดน Timer 1 จะไมถกใชงานแตเราสามารถสวตชให Timer 1 ไปท างานในโหมดอนได แตการท างานของ Timer 1 จะไมมการอนเทอรรพทเกดขน
Timer 0 แยกเปน 2 ตวตวละ 8 บต คอ TL0 และ TH0 เมอ Timer เกด Overflow จะมการเซตบต TF0 และ TF1 ตามล าดบ
Lecture 3
6
สวน Counter register TL0 จะใชสญญาณทควบคมการท างาน เหมอนกบการใชใน Mode 0 และส าหรบ Counter register TH0 จะถกก าหนดใหท างานเปน Timer เทานน โดยจะใชการควบคมจาก Bit TR1 และ TF1 ของ Timer 1
และเมอใชงาน Timer 0 ใน Mode 3 แลว ตว Timer 1 จะสามารถควบคมใหหยดนบไดโดยการเปลยนเขาเปน Mode 3 และในการใชงานจะไมสามารถใชการ Interrupt ได
Mode 3 นออกแบบส าหรบการใชงานทตองการ Timer/Counter ทเพมขน
Register TMOD ไมไดเปน bit-addressable register เหมอน IE และ TCON เพราะฉะนนการใสคาเรมตนเขาไปตองท าทเดยวททงหมด 8 บต
TCON Register
TF1 Bit
Timer 1 Overflow Flag จะมสถานะเปน ‘1’ เมอ Timer 1 register นบจนเกด Overflow สถานะของ TF1 นจะถก Clear ไดเองเมอ CPU ท างานตาม Interrupt Service routine (ISR) นนๆ โดยปกตแลว Interrupt จาก Timer จะถก disable เอาไว จงไมมการกระโดดไปท างานยง ISR นนๆ และ TFx จะไมถก clear โดยอตโนมต ถาตองการใหมการกระโดดไปท า ISR ตองมการ set bit EA และ ET ใน Register IE กอน
TR1 Bit
Timer 1 Run Control Bit เปน Bit ทสามารถควบคมไดดวย Software ส าหรบควบคมการนบของ Timer 1 Register ใหนบ หรอหยด
Lecture 3
7
TF0 Bit
Timer 0 Overflow Flag
TR0 Bit
Timer 0 Run Control Bit
IE1 Bit
Bit นจะเปน ‘1’ เมอมสญญาณทเขามาทางขา ~INT1 (โดยมสภาวะลอจกของสญญาณตามก าหนดใน Bit IT1) แลวจะท าใหเกดการกระโดดไปท างานยง Interrupt Service Routine ของ INT1 (Bit น จะกลบเปน ‘0’ ไดเองถา เปนการ Interrupt แบบ Level activated (Bit IT1 = ‘1’))
IT1 Bit
เปน Bit ทใชก าหนดลกษณะของสญญาณทจะเขามาทขา ~INT1
ถา IT1 เปน ‘1’ จะเกดการ Interrupt ถาสญญาณท ขา ~INT1 เปลยนจาก ‘1’ to ‘0’
ถา IT1 เปน ‘0’ จะเกดการ Interrupt ถาสภาวะของสญญาณท ขา ~INT1 เปน ‘0’
IE0 Bit
มการท างานเหมอน IE1
IT0 Bit
มการท างานเหมอน IT1
การท าให Timer เรมท างานสามารถเขยนในโปรแกรมไดดงน
TR0=1;
ตวอยาง 1 การเรม, หยดและการควบคม Timers void main (void) { TMOD = (TMOD & 0xF0) | 0x01; /* Choose Timer 0, Mode 1(16 bits timer)*/ ……………… ……………… while (1)
Lecture 3
8
{ TH0 = 0xFF; /*Initialize the timer with FF9CH (FFFFH-100D) */ TL0 = 0x9C; /* so the timer will overflow after 100 clock cycles*/ TR0 = 1; /* Start Timer 0*/ L1: if(TF0==0) { goto L1; /* Wait until Timer 0 overflows*/ }
TR0=0;/* Stop Timer 0*/ TF0 = 0;/* Clear Timer overflow flag 1*/
…………… ……………
} } ตวอยาง 2 สรางสญญาณ Pulse ใหมคาบเวลา 30000 us ท าไดโดย การท าให Output Bit ทตองการ มสถานะ ON แลวกท าให สถานะของ Output Bit เดยวกนน เปลยนเปน OFF กจะไดสญญาณ Pulse ตามตองการ แตในการสรางสญญาณ Pulse ใหมคาบเวลาไดตามทก าหนดนน สงทตองท าคอ หลงจากทท าให Bit นนๆ ON แลวจะตองหนวงเวลา (Delay ) เปนระยะเวลาตามทก าหนด จงคอยเปลยนสถานะของ Bit นนๆ กลบเปน OFF
การเขยนโปรแกรมสามารถท าได 2 แบบ คอ ใช software Delay หรอ Hardware delay
Pulse Output by Software Delay
การสราง Delay สามารถท าไดโดยการวธการของ Software หรอ Hardware กได
ในการหนวงเวลาโดยใช Software นน สามารถท าไดโดย การให CPU ท างาน ในลกษณะ ของการวน Loop ตามจ านวนครงทก าหนด ซงเวลาท CPU ใชใน การท างานคอเวลาทเราตองการจะหนวงนนเอง void dmsec (unsigned int count) { // mSec Delay unsigned int i; // Keil CA51 (x2)
0?
DECREMENT COUNTER
COUNTER = VALUE
NO
YES
OUT
x
x
x
x
x
x
x
1
Port1
30 msec
Lecture 3
9
while (count) { i = 230; while (i>0) i--; count--; } } ** คาเวลาของการท างานในฟงกชนมาจากการประมาณ **
การสราง Software Delay ทนานขนนน สามารถท าไดโดยการใช Counter ทนบ รอบของการวน Loop ทมขนาดมากขน แตเนองจากจาก Counter ถกก าหนดเปน unsigned int จงมคาไดสงสด 65535 ถาตองการใหเกด Delay นานขนอกอาจตองมการซอน loop หรอใชเทคนคการเขยนโปรแกรมแบบอนๆเขามาชวย
ตวอยางท 2. เปนการสราง Software Delay โดยสามารถเปลยนชวงเลา Delay โดยการใช Counter ทนบรอบของการวน Loop ทมขนาดมากขน แตการใช Software Delay ทม Delay Time มากๆ น จะมขอเสยคอ ขณะ CPU ท าการ Delay ตว CPU จะไมท าอยางอนเลยเปนระยะเวลานาน เพราะฉะนน จงควรใช Hardware Delay แทน เชนในระบบทตองการการตอบสนองทรวดเรวและแนนอน หรอในกรณทระบบ Microcomputer นนมการใชงานของ Interrupt แลว จะท าใหเวลาทไดจากการท า Software Delay นนไมถกตอง ถาการวน Loop ถก Interrupt
Pulse Output by Hardware Delay
การสราง Hardware Delay จะท าโดยใช Programmable Timer หรอ Timer ซงคา Register ภายในของ Timer จะถก Load ดวยคาเรมตน หรอคาเวลาทตองการ สงทแตกตางออกไปกคอ คาของตวนบน จะเพมขนเองโดยอตโนมต ดวยคาบเวลาทแนนอน (บางกรณ เราสามารถทจะก าหนด คาบเวลานได) และเมอคาของตวนบนมคาเพมขนจน Overflow Timer จะสงสญญาณมา Interrupt การท างานของ CPU หรออาจกลาวไดวา มนสงสญญาณมาบอก CPU วา ครบเวลาตามตองการแลว
การเขยนโปรแกรม เพอใหไดการท างานเชนเดยวกน สามารถท าไดโดยหลกการของ Hardware delay โดยใช Timer ซงมอยใน MCS-51 แลว จะไดเปนโปรแกรมดงน
#include<reg51.h> #include <absacc.h> void timer0_ISR (void) interrupt 1 { TR0 = 0; /* Stop Timer 0 */ P1^7 = !P1^7; TH0 = 0x8A; /* Load TH0 */ TL0 = 0xCF; /* Load TL0 */ TF0 = 0;
Lecture 3
10
TR0 = 1; /* Start Timer 0 */ } void main (void) { TMOD = (TMOD & ~0x0F) | 0x01; /* Set T/C0 Mode 1*/ EA = 1; /* Global Interrupt Enable */ ET0 = 1; /* Enable Timer 0 Interrupts */ TH0 = 0x8A; /* Load TH0 */ TL0 = 0xCF; /* Load TL0 */ TR0 = 1; /* Start Timer 0 */ P1^7 = 1; while (1) { ……………/*Other operation*/ …………… } } การท างานของ main โปรแกรมสามารถอธบายไดดงน
TMOD = (TMOD & ~0x0F) | 0x01; เปนการก าหนดการท างานของ Timer/Counter 1 นบหรอหยดนบไดดวยการควบคมจากโปรแกรม (Gate bit=0) และใหท างานในแบบของ Timer (C/~T=0) และการใชงานของ Timer Register ในแบบ 16 Bit (Mode Bit= 0 1)
EA = 1; /* Global Interrupt Enable */ ET0 = 1; /* Enable Timer 0 Interrupts */ เปดการใชงานของ Interrupt เฉพาะทเกดจาก TF1 (EA=1 และ ET1=1)
TH0 = 0x8A; /* Load TH0 */ TL0 = 0xCF; /* Load TL0 */ จากทเปนการใชงานของ Timer register ในแบบ 16 Bit และการ Interrupt จะเกดเมอ Timer register นบจนครบ 65535 ดงนนแลวถาตองการนบ 30000 M.Cycles จะตองตงคาเรมตนของ Timer register = 65535-30000 = 35535 (08ACFH)
TR0 = 1; /* Start Timer 0*/ P1^7 = 1; ก าหนดให Timer เรมการนบและ Turn ON Output
Lecture 3
11
ในสวนของ timer0_ISR (void) interrupt 1 เปน Interrupt Service Routine เมอเกด Interrupt จาก Timer 1 (Timer 1 นบครบเวลาทตงไว) TR0 = 0; /* Stop Timer 0 */ หยดการท างานของ TImer P1^7 = !P1^7; ท าการปลยนคาท P1.7 เปน ตรงกนขาม
TH0 = 0x8A; /* Load TH0 */ TL0 = 0xCF; /* Load TL0 */ ตงคาเรมตนของ Timer register TF0 = 0; TR0 = 1; /* Start Timer 0 */ เรองของการใชงาน interrupt ทงหมดจะกลาวถงในภายหลง
ตวอยาง 3 สรางสญญาณ square wave 10kHz โดยให High 50us และ Low 50 us, Clock 12 MHz
ใช Timer mode 2 โดยให overflow ทก 50 us
#include<reg51.h> #include <absacc.h> void main (void) { TMOD = (TMOD & ~0x0F) | 0x02; /* Set T/C0 Mode 2*/ TH0 = 0xCD; /* Load TH0 by FFH-50D=CDH */ TR0 = 1; /* Start Timer 0 */ while (1) { If (TF0==1)
{ P1^7 = !P1^7; TF0=0; } } }
Lecture 3
12
ตวอยาง 4 สรางสญญาณ square wave 1kHz โดยให High 500us และ Low 500 us, Clock 12 MHz
ชวงเวลามากกวา 256 (FFH) ตองใช Timer mode 1 (16 bits) โดยให overflow ทก 500 us
#include<reg51.h> #include <absacc.h> void main (void) { TMOD = (TMOD & 0xF0) | 0x01; /* Set T/C0 Mode 1*/ TH0 = 0xFE; /* Load TH0 and TL0 by FFFFH-500D=FE0BH */ TL0 = 0x0B; TR0 = 1; /* Start Timer 0 */ while (1) { If (TF0==1)
{ P1^7 = !P1^7; TF0=0; TR0 = 0; /* Stop Timer 0 */
TH0 = 0xFE; /* Load TH0 and TL0 by FFFFH-500D=FE0BH */ TL0 = 0x0B; TR0 = 1; /* Start Timer 0 */
} } }
ตวอยาง 5 Function delay 50 ms, Clock 12 MHz
ใช Timer mode 1 โดยให overflow ทก 50 ms
void delay (void) { TMOD = (TMOD & ~0x0F) | 0x01; /* Set T/C0 Mode 1*/ TH0 = 0x3C; /* Load TH0 and TL0 by FFFFH-50000D=3CAFH */ TL0 = 0xAF;
Lecture 3
13
TR0 = 1; /* Start Timer 0 */ If (TF0==1)
{ P1^7 = !P1^7; TF0=0; TR0 = 0; /* Stop Timer 0 */
TH0 = 0x3C; /* Load TH0 and TL0 by FFFFH-50000D=3CAFH */ TL0 = 0xAF; TR0 = 1; /* Start Timer 0 */
} }
Input / Output Techniques
Input หมายถงการรบคาขอมล จากอปกรณภายนอกเขามา (Input devices: Keyboard, Disk, Sensor, etc.)
Output หมายถงการสงคาขอมลจาก Microprocessor หรอ Memory ออกไปยงอปกรณภายนอก (Output devices: Printer, Monitor, CD Writer, etc.)
การใชงานของ Micro computer ในการรบ Input หรอสง Output นนจะตองมสวนประกอบทส าคญตางๆ คอ
MicrocontrollerSystem
INPUT
PORT
OUTPUTPORT
OutputDevice
OutputDevice
OutputDevice
IntputDevice
IntputDevice
IntputDevice
Input Device ท าหนาทเปลยน ปรมาณ หรอคณสมบตทางกายภาพ (แสง, อณหภม, เสยง, แรง, ระยะทาง . . .) ใหเปนสญญาณ Digital Input Port เปนทางเขาของสญญาณ จาก Input Device เพอทจะสามารถน ามาใชไดใน Microcomputer
Lecture 3
14
Output Port เปนทางออกของขอมลจากระบบ Microcomputer คณสมบตทส าคญของ Output Port คอ มนจะสามารถคงคา ของขอมล ทสงมาจาก CPU ได นนกคอ ตว Output Port จะท าตวเหมอนกบ Register Output Device ท าหนาทแปลงสญญาณ ทเปน Digital น ใหเปนปรมาณทางกายภาพ (แสง, เสยง, ความรอน, การเคลอนท . . .) เพอน าไปใชงานตอไป
Sensing Input
ปญหาของการตรวจจบสญญาณ Input นน จะตรงขามกบการสรางสญญาณ คอในการสรางสญญาณออกมานน ขนอยกบการท างานของ Program แตส าหรบสญญาณ Input ทเขามาจะเกดขนโดยไมมความสมพนธ กบการท างานของโปรแกรมเลย (Asynchronously) การตรวจจบการเกดขนของสญญาณน สามารถท าไดสองวธคอ Polling และ Interrupt
Input /Output Scheduling ในกรณทระบบ Microcomputer ม Input /Output Devices หลายอนทตองไดรบการบรการจาก CPU หรอในกรณทตองมการท างานของโปรแกรมหลายอยางพรอมกน จะเกดปญหาทวา การท างานหลายอยางพรอมกนนนจะท าไดอยางไร หรอตองเขยนเปนโปรแกรมแบบใด
ลกษณะของโปรแกรมเหลานน ตองเปนโปรแกรมทไมยาวมากนก เนองจากจะท าใหระบบมการตอบสนองตองานอนๆ ชา และเปนโปรแกรมทไมตด Loop (เงอนไขของการวน Loop ทขนกบการท างานจากภายนอก หรอเกดการวน Loop ไมสนสด) เพราะจะสงผลใหโปรแกรมอนๆ หยดท างานเปนเวลาทไมแนนอน โปรแกรมเหลานน จะไมท างานพรอมกนอยางแทจรงแตจะตองมการจดล าดบการท างานของ โปรแกรม Input /Output วธการทใชกนหลกๆ นนจะแบงเปน Polling, Interrupt และ DMA
Lecture 3
15
Polling
เปนวธการทงายทสดในการจดล าดบการท างาน ของอปกรณ หรอโปรแกรมหลายๆ อยาง หลกการกคอ CPU (Main program) จะไปตรวจสอบสถานะของอปกรณทตออยในระบบ หรอสถานะของโปรแกรมการท างาน ทละตว/โปรแกรมวามนตองการ การบรการ (Service) หรอไม ถาตองการ CPU กจะกระโดดไปท างานตามโปรแกรมส าหรบอปกรณนนๆ แตถาไมตองการแลว CPU (Main program) กจะไปตรวจสอบอปกรณ/โปรแกรม ทเหลอตอไป
ในหลกการของการท า Polling น อปกรณ/โปรแกรมการท างานทกอน จะตองม Status flag ทจะบอกวา มนตองการ รบการบรการ (ท างาน) หรอไม และเมออปกรณ/โปรแกรมนนๆ ไดรบการบรการแลว จะตอง Clear status flag ซงกคอ การเขยนโปรแกรมให CPU ท าการอานคาสถานะของ Input Port เขามาตลอดเวลา จนกวาจะพบเงอนไขทตองการโดยการวน Loop ตวอยางเชน ถาเราตอ Switch เขาท Input Port P1 ในต าแหนง Bit ท 0 ถาใหสถานะของมนเปน ‘0’ เมอไมมการกด Switch (หรอไมมสญญาณเขามา) และเปน ‘1’ เมอมสญญาณ ดงนนจะไดโปรแกรมส าหรบการตรวจจบสญญาณคอ while(1) { if(sw0 == 1) {
Lecture 3
16
……….. else
} }//end of while(1) ตวอยางของ Main program ซงท าหนาทจดการ Polling เปนดงน
B Requesting
Service ?
Service Routine for
Service B
YES
YES
NO
NO
A Requesting
Service ?
Service Routine for
Service A
NO
C Requesting
Service ?
Service Routine for
Service C
YES
Ready ?
Load Printer Buffer
Transmit Data
NO
YES
ถาก าหนดใหให Bit ตางๆ ใน Port/STATUS Register ทเปนมคาเปน ‘1’ เมอ Device/Program ล าดบนนๆ ตองการ
Service จาก CPU จะเขยนโปรแกรมไดคอ
while(1) { if(P1^0 == 1) /* Polling for device 0*/ { service_0(); /* if bit 0 = ‘1’ call service_0*/
} if(P1^1 == 1) /* Polling for device 1*/ { service_1(); /* if bit 0 = ‘1’ call service_1*/ }
Lecture 3
17
if(P1^2 == 1) /* Polling for device 2*/ { service_2(); /* if bit 0 = ‘1’ call service_2*/ } }//end of while(1)
ขอดของการใชวธ Polling คองาย และไมตองการ Hardware (วงจร) เพมเตม ท าให Input /Output ทงหมดสมพนธกบการท างานของโปรแกรม ส าหรบขอเสยคอ CPU จะใชเวลาเกอบทงหมด ในการตรวจสอบวา Device ใด ตองการการ Service เปนผลให CPU ตอบสนองความตองการชา และไมมเวลาส าหรบการท างานอน
Interrupts
หลกการของการ Interrupt กคอ ใช สายสญญาณ Interrupt (Hardware) เชอมตอระหวาง Devices ตางๆ เขากบ ขาสญญาณพเศษของ Microprocessor ในบางครงสามารถตอสญญาณจาก Devices ตางๆ เขากบ สายสญญาณ Interrupt เสนเดยวกนได เมอ Device หนงในนน ตองการการ Service กจะสงสญญาณลงไปในสายน ซงกเหมอนกบเปนสญญาณ ของ Service Request ทบอกไปยง CPU นนเอง
การท างานทเกดขน เมอ Microprocessor ไดรบสญญาณ Interrupt กคอ CPU จะคอยใหค าสงทก าลงท าอย เสรจสนลง แลว CPU จะกระโดด (Branch) ไปท างานยงโปรแกรมในสวนของ Interrupt Service Routine การทจะกระโดดไปท างานยง Subroutine นน CPU จะตองเกบคาของ Program Counter (PC) ลงใน Stack รวมไปถงคาสถานะของ Flag และ Register อนๆ ทอาจมการเปลยนแปลงไป เนองจากการท างานของโปรแกรมใน Interrupt Service Routine (ISR) กจะตองถกเกบไวดวยเชนกน
เมอเกบคาของ Register ตางๆ ไวแลว กท างานตาม ISR ทตองการ ซงใน ISR น เราอาจท าการ polling เพอตรวจสอบวา เปน Device ตวใดทตองการ การ Service กได หลงจากท ท างานเสรจสนตาม ISR แลว คาของ Register เดมจะถกน ากลบมา และโดยใชค าสง Interrupt Return เพอกลบสการท างานตามปกตตอไป
DMA (Direct Memory Access)
เปนวธการทมใชในระบบ Microcomputer ทตองการเคลอนยายขอมลจ านวนมากกบ Device ซงถาท าการเคลอนยายขอมลโดยผานการท างานของ CPU แลวจะท าไดชา
วธการของ DMA น ตองมวงจรควบคมการท างานภายนอก (DMA Controller) ท าหนาทในการเคลอนยายขอมลกบหนวยความจ าในระบบ ในการนวงจรสวน DMA Controller จะตองสรางสญญาณเพอบอก CPU ใหตดการท างานของ CPU กบหนวย ความจ า
Lecture 3
18
เพอให DMA Controller ควบคมการท างานไดเอง หรออาจกลาวไดวา การท า DMA นนเปน Interrupt แบบหนง ซงใน MCS-51 ไมสามารถกระท าไดโดยตรง MCS-51 Interrupts จากหลกการท างานของ Interrupt ทไดกลาวในบททแลว จะเหนไดวาวธการของ Interrupt นน จะใหประสทธภาพในการท างานทมากกวาการ Polling เนองจากไมจ าเปนตองให Program คอยตรวจสอบสญญาณทเขามา การกระโดดไปท างานยง Interrupt Service Routine (ISR) จะเกดขนโดยอตโนมต ดวยวงจรภายใน CPU เอง
Interrupt Service Routine
การเขยนโปรแกรมเพอใชงานเปน Interrupt service routine นนเหมอนกบการเขยน Sub routine แตมขอแตกตางทส าคญ คอ Sub routine จะถกเรยกใชงานโดยการเรยกใชฟงกชนในโปรแกรม แต ISR จะถกเรยกใชเมอมสญญาณ interrupt ซงเกดขนเมอโปรแกรมท างานอะไรอยกได
ดงนนแลว การเขยนโปรแกรมทเปน ISR จะตองมความรอบคอบถงผลกระทบในการเปลยนแปลงของ Data memory, Register, Acc. และ Flag ตางๆ ซงควรเกบคาเดมเอาไวกอนทจะเรมการท างานของ ISR แลว คนคาเดม เมอจบการท างานของ ISR แลว
ใน MCS-51ไดออกแบบใหมการ Interrupt ไดจาก 5 แหลงคอ 2 External interrupts, 2 Timer interrupts และ Interrupt จาก Serial port และส าหรบ 80C52, 83C154 และ 83C154D จะม Interrupt ทงหมด 6 แหลงดวยกน โดยทเพมขนมา จะเปน Interrupt จาก Timer 2
Lecture 3
19
Interrupt Enables สญญาณ Interrupt ทมาจากแหลงตางๆ สามารถตอบสนอง หรอไมตอบสนองกไดจากการ Set หรอ Clear Bit ทอยใน Register IE และ ใน IE ยงม Bit ทเปนการปดรบ Interrupt ทงหมดอกดวย
เชน เมอตองการมการตอบสนอง Interrupt จาก Timer1 ตองมการ set EA และ ET1 โดย
ET1=1; /*Enable Timer1 interrupt*/
EA =1; /*Set global interrupt bit*/
หรอ
IE=0x88;
Priorities Level Structure
นอกจากการเปดรบ Interrupt แลวสญญาณ Interrupt ทมาจากแหลงตางๆ ยงสามารถทตงระดบความส าคญ (Priority) ไดในสองระดบ โดยการ Set หรอ Clear Bit ใน Register IP (Interrupt Priority) ซงอยใน SFR
เมอ CPU ไดรบ Interrupt ทถกก าหนดใหเปน Low-priority level CPUจะไปท างานตาม ISR นนๆ แตในระหวางน CPU สามารถถก Interrupt ไดอกครงจาก Interrupt ทก าหนด
Lecture 3
20
เปน High-priority level แตจะไมรบ Interrupt ทเปน Low-priority อก
ในระหวางท CPU ก าลงท างานตาม ISR ของ Interrupt ทเปน priority สงสดมนจะไมรบการ Interrupt ใดๆ
ถาเกดสญญาณ Interrupt ขนพรอมกน การ Interrupt ของสญญาณ ทก าหนดใหมความส าคญมากกวาจะไดรบการตอบสนอง สวนถาเปนสญญาณ Interrupt ทก าหนดใหมความส าคญเทากนนน ล าดบการท างานจะขนกบ ขบวนการ Polling ภายในของ MCS-51
การท างานของ CPU เมอเกด Interrupt สถานะของสญญาณ Interrupt ซงอยใน Flag ตางๆ จะถกเกบคาในจงหวะ S5P2 ของทกๆ Machine cycle และถก Polling โดย CPU ใน Machine cycle ตอมา ถาสถานนะของ Flag bit ใดๆ มคาเปน 1 ใน S5P2 ของ Machine cycle กอนหนา ขบวนการ Polling จะตรวจสอบมนพบ และขบวนการ Interrupt กจะสรางค าสง LCALL เพอเรยกใช ISR ส าหรบการ Interrupt นนๆ ISR จะไมถกเรยกใชในกรณตางๆ ตอไปน
1. CPU ก าลงท างานใน ISR ของ Interrupt ทมความส าคญเทากน หรอมากกวา
2. ขบวนการ Polling ของ Interrupt เกดขน ใน Machine cycle ทไมไดเปน Machine cycle สดทายของค าสง ซงก าลงท างานอย
3. CPU ก าลงท าการจบ ISR และกลบสโปรแกรมหลก หรอค าสงทเปนการท างานกบ Register IE หรอ IP
Lecture 3
21
ส าหรบเงอนไขในขอท 2 กเพอใหการท างานของค าสงนนๆ เสรจสมบรณ กอนทจะกระโดดไปท างานยง ISR และส าหรบเงอนไขในขอท 3 เพอเปนการใหแนใจวา CPU จะกลบสโปรแกรมหลกหลงจากจบ ISR หรอค าสงทท างานกบ Register IE หรอ IP กอนทจะเรยกใช ISR
การตอบสนองตอสญญาณ Interrupt ของ CPU นน ในบางกรณ จะท าการ Clear Bit ทท าใหเกด Interrupt ดวย (Bit ของ External interrupt IE0 หรอ IE1 เฉพาะเมอมนถกก าหนดใหท างานแบบ Transition-activated เทานน) และจะไม Clear Bit ของ Serial port หรอ Timer2 ซงสวนน จะตองจดการเองใน Software
การตอบสนองการ interrupt จะท าการเกบคาของ PC ลงใน Stack แลวท าการ Load คาของ PC ใหม คานคอ Interrupt vector ซงจะเปน address ของ ISR ตามแหลงของ Interrupt ทเกด จากตารางจะเหนไดวา เนอทของ ISR แตละตวจะมขนาดเพยง 8 bytes
เมอท างานตาม ISR ไดเสรจสนแลว และจะน าคาของ PC คนมาจาก Stack ซงจะท าให CPU กลบไปท างานยงค าสงทอยตอจาก ค าสงสดทายกอนทเกดการ Interrupt ขน
ในโปรแกรมภาษา C ISR จะเหมอนฟงกชนทวไป แตจะใชค าวา interrupt และหมายเลขของ interrupt ตอทายฟงกชนนน
Source Interrupt Number IE0 0 TF0 1 IE1 2 TF1 3 RI + TI 4 TF2 + EXF2 5
Source Vector address RST 0000H IE0 0003H TF0 000BH IE1 0013H TF1 001BH RI + TI 0023H TF2 + EXF2 002BH
Lecture 3
22
External interrupts ( ~INT0 และ ~INT1)
สามารถจะก าหนดไดวาจะเปนการท างานทขอบขาลงของสญญาณ (Transition-activated) หรอท างานดวยระดบของสญญาณ (Level-activated) โดยก าหนดจาก Bit IT0, IT1 ใน Register TCON
เมอมสญญาณของ External interrupt เขามา กจะท าให Bit IE0 และ IE1 ถก Set สญญาณ Interrupt ทเขามาจะตองเปน ‘0’ อยางนอย 12 Clock เนองจากสญญาณน จะถกเกบคาทกๆ Machine cycle และจากท มนจะไม Clear interrupt request flag (IEx ใน TCON) อปกรณทสรางสญญาณ Interrupt จะตองหยดการ Interrupt (ท าใหเปน ‘1’) กอนทการท างานของ ISR จะสนสด ไมเชนนน แลวการ Interrupt จะเกดขนซ าอกรอบ
ในการใชงานแบบ Transition-activated สญญาณ Interrupt ทเขามาจะตองเปน ‘1’ อยางนอย 12 Clock แลวมการเปลยนเปน ‘0’ อกอยางนอย 12 Clock Interrupt request flag (IEx ใน TCON) จงจะถก Set และเมอมการเรยกใช ISR นน IEx จะถก Clear โดยอตโนมต การ Interrupt ซ าจะไมเกดขน
เมอ CPU ตอบรบการ Interrupt นแลว (กระโดดไปท างานยง ISR) Bit IE0 และ IE1 จะถก Clear โดยอตโนมต ถาเปนการเลอกรบสญญาณ Interrupt ทขอบขาลง แตถาเลอกการท างานของ Interrupt ดวยระดบของสญญาณแลว วงจรภายนอกทสรางสญญาณนจะตองหยดการ Interrupt เอง
กอนการใชงาน external interrupts ตองมการ set bit EA, EX0 หรอ EX1 ใน register IE ใหเปน ‘1’ กอน เพอเลอกใช External Interrupt 0 หรอ External Interrupt 1.
Register IE EA --- ET2 ES ET1 EX1 ET0 EX0
01234567
สามารถเขยนในภาษา C ไดดงน EA = 1; EX0 = 1; EX1 = 1;
Lecture 3
23
นอกจากนน ตองมการเลอกรปแบบของสญญาณ interrupt โดยการก าหนดคา บต IT0 และ IT1 ใน Register TCON
Register TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
01234567
โดยท
IT0/IT1 = 1 External interrupt caused by a falling edge signal on P3.2/P3.3
IT0/IT1 = 0 External interrupt caused by a low level signal on P3.2/P3.3
ตวอยางเชน
IT0 = 1; IT1 = 1;
เปนการเลอกใหเกดการ interrupt เมอสญญาณทขา P3.2/P3.3เปลยนจาก ‘1’ เปน ‘0’
ในสวนของ ISR สามารถเขยนไดดงน
ISR name() interrupt 0
{….}
Timer 0 และ Timer 1 Interrupts
เกดจาก Bit TF0 และ TF1 ใน Register TCON ซงเมอเกดการ Overflow ของ Timer/Counter เมอ Bit นถก Set แลวเมอมการกระโดดไปท างานยง ISR คาสถานะของ Bit กจะถก Clear ดวยวงจรภายใน
Register TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
01234567
Lecture 3
24
กอนการใชงาน Timer 0 และ Timer 1 interrupts ตองมการ set bit EA, ET0 หรอ ET1 ใหเปน ‘1’ กอน เพอเลอกใช Timer 0 Interrupt หรอ Timer 1 Interrupt.
Register IE EA --- ET2 ES ET1 EX1 ET0 EX0
01234567
สามารถเขยนในภาษา C ไดดงน EA = 1; ET0 = 1; ET1 = 1;
Serial port Interrupt
เกดขนเมอเมอ RI หรอ TI ถก set ซงสถานะของการ Interrupt นจะไมถก Clear เมอมการตอบสนองการ Interrupt โดยทวไป ISR ทท าหนาทในการตอบสนองตอ Interrupt ของ Serial port จะตองตรวจสอบเองวา มนเปนการ Interrupt มาจากสถานะของ Bit RI หรอ TI และตองท าหนาทในการ Clear Bit นนๆ เอง
กอนการใชงาน Serial port Interrupt ตองมการ set bit EA และ ES ใหเปน ‘1’ กอน.
Register IE EA --- ET2 ES ET1 EX1 ET0 EX0
01234567
สามารถเขยนในภาษา C ไดดงน EA = 1; ES = 1;
Lecture 3
25
ตวอยาง
โปรแกรมในตวอยางนจะรบสญญาณเขาทาง External Interrupt 0 ทเลอกใหเปน 'Falling Edge' mode และถอวาสญญาณทมความถมากเกนกวาทก าหนดไมใชสญญาณ input ทตองการ ตวอยางเชนการรบขอมลจาก switch และ เกดการ bounce ของหนาสมผส
ถาเกดสญญาณการเปลยนสถานะจาก high เปน low กอนถงเวลาทก าหนดจะสญญาณทมความถมากเกนไป ถาถงเวลาทก าหนดแลวยงไมเกดการเปลยนสถานะจะถอวาเปนสญญาณทใชได และ โปรแกรมจะสรางสญญาณทมลกษณะเดยวกนออกทาง P1.0
// Include standard headers #include <reg51.h> #include <math.h> unsigned int counter; //Variable used for our counter setup_interrupts () // Function to setup the External interrupt 0 in the required mode { EA = 1; EX0 = 1; IT0 = 1; } filter () interrupt 0 //The function the be executed when external interrupt occurs { counter = 0; //Reset the counter to 0 } main() { time_constant = 40000; //Define the response time of our filter setup_interrupts (); //setup the External interrupt while(1) { if (counter < time_constant) // Count until the pre-defined time_constant {
Lecture 3
26
counter++; } if (counter == time_constant) // if the counter was not interrupted by any noise, { P1^0 = P3^2; // output the valid signal on P1^0 } } }
Multiple Devices Connected to a Single Interrupt Line
ในกรณทระบบ ม Devices ทตองการ Interrupt เปนจ านวนมาก การตอขาสญญาณ Interrupt เขากบ CPU สามารถท าไดดงรป
MPUINT 1
I/O Interface 1
I/O Interface 2
I/O Interface 3
P1.0 P1.1 P1.2
เมอเกดการ Interrupt ขน CPU จะกระโดดไปท างานยง ISR ซงกอนทจะท างานตอไปได จะตองตรวจกอนวาเปน Device ตวใดทสรางสญญาณ Interrupt เพอทจะเลอกการท างาน (ISR) ไดเหมาะสม การทจะทราบวาเปน Device ตวใด สามารถท าได 2 วธ คอ Software หรอ Hardware
ส าหรบวธการทาง Hardware นน กคอการให Device นนๆ สงคาของ Address มาพรอมๆ กบการ Interrupt โดยตองมการตอวงจรเพมเตม วธการของ Software นน จะใชขบวนการ Polling ในการตรวจสอบ Device ตางๆ วามนเปนตวทสรางสญญาณหรอไม เรยกขบวนการนวา Polling Interrupt
ตวอยาง ISR ซงท าหนาทในการ Polling Device status ทเปน ‘0’ แลวเลอก ISR ทเหมาะสมตอไป (จากรป)
#include <intrins.h> ……
ISR_1(void) // Interrupt service routine for interface 1 {…..} ISR_2(void) // Interrupt service routine for interface 2 {…..} ISR_3(void) // Interrupt service routine for interface 3
Lecture 3
27
{…..} poll_int () interrupt 2 //The function the be executed when external interrupt 1 occurs { _push_(PSW); /*Save old status …*/ if (P1^0==0) { ISR_1()} if (P1^1==0) { ISR_2()} if (P1^2==0) { ISR_3()} _pop_(PSW); }
Simultaneous Interrupts
ในระหวางการท างานของ ISR นน สามารถทจะใหเกด Interrupt ซอนกนขนได ถาก าหนดให Interrupt ทเกดขนนน มความส าคญสงกวา โดยอาศยการท างานของ Stack เชนเดยวกบการท า Nested-Call จะสามารถแสดงไดดงตวอยางตอไปน
ตวอยาง Intrusion warning system ออกแบบระบบกนผบกรกซงจะสงเสยงความถ 4000 Hz เตอนเปนเวลา 1 วนาท (ใชล าโพงตอกบ P1.7) เมอมสญญาณจาก sensor ทประตท าให INT0 เปน High-to-low transition
Lecture 3
28
ในตวอยางนจ าเปนตองใช 3 interrupts ไดแก external 0 (door sensor), Timer 0 (400 Hz tone), และ Timer 1 (1 second timeout) #include<reg51.h> #include <intrins.h> #include <math.h> unsigned int count void ex0_isr (void) interrupt 0 { TF0=1; // force timer 0 interrupt TF1=1; // force timer 1 interrupt ET0=1; // begin tone for 1 second ET1=1; // enable timer interrupts count=20; } void timer0_ISR (count) interrupt 1 { TR0=0; //Stop timer0
count--; if (count<=0)
{ ET0=0; // Disable tone ET1=0; // Disable itself }
TH0=0x3c; //65535-50000=15535 (3CAF) TL0=0xAF; TR0=1;
} void timer1_ISR (void) interrupt 3 { TR1=1; //65535-1250=64285 (FB1D) TH1=0xFB; TL1=0x1D; P1^7=!P1^7; //Play sound TR1=1; } void main (void) { TMOD=0x11; //16-bit timer mode T0 = 1; // Configure interrupt 0 for falling edge EX0 = 1; // Enable EX0 Interrupt IT1 = 1; // Configure interrupt 1 for falling edge EA = 1; // Enable Global Interrupt Flag }
Lecture 3
29
ตวอยาง ระบบและโปรแกรมเพอควบคมมอเตอรใหหยดท างานเมอมตวมอเตอรความรอนสงเกนไปหรอหมนเรวเกนกวา 10,000 r.p.m. เชนเชอรวดอณหภมซงตออยกบ P3.2 (External interrupt 0) จะให logic 0 เมออณหภมสงเกนไป และ optical encoder ซงตออยกบ P3.5 (Timer/Counter 1) จะสงสญญาณทกครงทมอเตอรหมน 1 รอบ วธหยดการท างานของระบบท าไดโดยใหสญญาณท P1.0 เปน 1 โดยทระบบนใช 24 MHz crystal oscillator // Include standard headers #include <REG51.h> #include <math.h>
#define limit 12 #define stop_signal P1^0
unsigned char sub_counter;
setup_peripherals(){ //setup external interrupt EA = 1; EX0 = 1; IT0 = 1;
TMOD = 0x52; // timer 0 mode 2, counter 1 mode 1
//setup timer 0 TR0 = 1; TH0 = 5; //makes the timer to overflow every 125 uS (divide by 250). ET0 = 1;
//setup timer 1 TR1 = 1 ; }
timer_0 () interrupt 1{ sub_counter++ ; if (sub_counter == 10){ // divide the overflow frequency further more by 10 sub_counter = 0; // this part is executed every 1.25 mS if ((TL1 + (TH1 * 256)) > limit){ // 12/0.00125 = 9600 (~ 10000)s //Stop the motor stop_signal = 1; TL1 = 0; TH1 = 0; } } }
over_heat_alarm () interrupt 0{ stop_signal = 1; }
void main(){ stop_signal = 0; // the motor runs normally setup_peripherals(); while(1){ // Do nothing } }