Thông tin tài liệu
LẬP TRÌNH HỆ THỐNG NHÚNG BÙI QUỐC BẢO Delay sử dụng vòng lặp lệnh For(i=1000;i>0;i ); ðơn giản Không ñòi hỏi timer Không biết xác ñược khoảng delay ðược sử dụng cần tạo thời gian delay không ñòi hỏi xác lớn BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM Cấu trúc Timeout N Key pressed? Nếu phím bị hỏng hay tiếp xúc không tốt, chương trình bị treo trình chạy (run-time) Y Process BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM Cấu trúc Timeout ellapseTime = initValue N N Key pressed? ellapseTime ellapseTime=0? Y Process sbit Key = P1^0; ellapseTime = 1000; While (Key != 0) && ( ellapseTime != 0); BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 8051 Timer BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 8051 Timer BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM Delay using timer void delay50ms(void) { TMOD &= 0xF0; TMOD |= 0x01; ET = 0; TH0 = 0x3C; TL0 = 0xB0; TR0 = 1; While (!TF0); TR0 = 0; TF0 = 0; } BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM Delay.h #ifndef _DELAY_H #define …………… #define #define #define #define OSC_FREQ OSC_PER_INST TIME_1ms PRELOAD_1ms 12 12 1000 65536 – (TIME_1ms)/(OSC_FREQ/OSC_PER_INST) #define PRELOAD_1ms_H #define PRELOAD_1ms_L (PRELOAD_1ms / 256) (PRELOAD_1ms % 256) #define TIME_50ms ………………………………………………………… #define PRELOAD_50ms …………………………………………………… void delay1ms(void); void delay50ms(void); void delayMs(unsigned int n); #endif BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM delay.c #include #include “delay.h” void { } void { } void { } delay1ms(void) delay50ms(void) delayMs(unsigned int n) BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM Access lowbyte and highbyte #define LOWBYTE(v) #define HIGHBYTE(v) ((unsigned char) (v)) ((unsigned char) (((unsigned int) (v)) >> 8)) #define BYTELOW(v) #define BYTEHIGH(v) (*(((unsigned char *) (&v) + 1))) (*((unsigned char *) (&v))) Void main(void) { volatile unsigned char i; i = LOWBYTE(0x1234); i = BYTEHIGH(0x1234); Sai chỗ } BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 10 Multi tasking Cấu trúc superloop: int main(void) { while (1) { Task_1(); Task_2(); } } Nhược ñiểm: Không dùng cho ứng dụng ñòi hỏi xác mặt timing Không có khả dừng task ñang thực thi ñể thực task lại (pre-emption) BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 11 Cấu trúc superloop với delay 30s 5s 35s void Delay(uint32_t seconds) { // Setup a hardware timer for the given time // Loop until the delay has been reached } int main(void) { while (1) { Set_Green(); Delay(30); Set_Yellow(); Delay(5); Set_Red(); Delay(35); } } BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 12 Cấu trúc superloop với delay Expected timing void Delay(uint32_t milliseconds) { // Setup a hardware timer for // the given time // Loop until the delay has //been reached } int main(void) { while (1) { Task_1(); Delay(5); Task_2(); Delay(5); Real timing } } Nhược ñiểm: Cấu trúc chạy ñúng trường hợp task ngắn BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 13 Sandwich delay int main(void) { while (1) { Start_Timer(5); Task_1(); Wait_For_Timer(); Nhược ñiểm: Không cung cấp ñược mức ñộ ưu tiên cho tác vụ Start_Timer(5); Task_2(); Wait_For_Timer(); } } BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 14 Foreground/Background scheduling // Run by hardware //every millisecond BackGround Level void Timer_ISR(void) { updateData(); } updateDisplay(); void main(void) { Init_ISR(); updateDisplay(); ForeGround Level updateData(); processInput(); while (1) { updateDisplay(); processInput(); } } BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 15 Round-Robin scheduler: Poll and serve Nhược ñiểm: I/O need service cycle time Y Nếu thiết bị cần thời gian ñáp ứng nhanh I/O service #1 “cycle time”, hệ thống chạy sai Y Nếu có trình phục vụ I/O chạy thời gian dài, ñáp ứng hệ I/O service #2 thống bị chậm N I/O need service N ðộ ổn ñịnh hệ thống phụ thuộc nhiều yếu tố Khó sửa ñổi chương trình BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 16 Round-Robin scheduler with interrupt Interrupt Level Task level I/O Flag? Y Clear Flag I/O service #1 ISR1 Set Flag ISR2 Set Flag N Y I/O Flag? Clear Flag I/O service #2 N BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 17 Nhược ñiểm: Tất tác vụ có mức ưu tiên Solution: ðưa code có ñộ ưu tiên cao vào ISR BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 18 8051 interrupt vector table Ban ñầu, họ 8051 có nguồn ngắt BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 19 Interrupt function Các nhà sản xuất sau thêm vào nhiều ngắt cho 8051 Keil C hỗ trợ 32 vector ngắt ðịnh nghĩa ngắt: void ISR_name(void) interrupt interrupt_number using bank_number BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 20 10 Case study 30s 5s 35s Viết chương trình ñiều khiển ñèn giao thông: a) Dùng phương pháp sandwich delay b) Dùng ngắt Các ñèn xanh-vàng-ñỏ ñược ñiều khiển P1.0, P1.1, P1.2 ðưa chân port lên làm ñèn sáng BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 21 11 [...]...Case study 30s 5s 35s Viết chương trình ñiều khiển ñèn giao thông: a) Dùng phương pháp sandwich delay b) Dùng ngắt Các ñèn xanh-vàng-ñỏ ñược ñiều khiển bởi P1.0, P1.1, P1.2 ðưa chân port lên 1 làm ñèn sáng BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 21 11 ... time”, hệ thống chạy sai Y Nếu có trình phục vụ I/O chạy thời gian dài, ñáp ứng hệ I/O service #2 thống bị chậm N I/O need service N ðộ ổn ñịnh hệ thống phụ thuộc nhiều yếu tố Khó sửa ñổi chương trình. .. delay1 ms(void); void delay5 0ms(void); void delayMs(unsigned int n); #endif BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM delay. c #include #include delay. h” void { } void { } void { } delay1 ms(void)... delay Expected timing void Delay( uint32_t milliseconds) { // Setup a hardware timer for // the given time // Loop until the delay has //been reached } int main(void) { while (1) { Task_1(); Delay( 5);
Ngày đăng: 04/12/2015, 14:15
Xem thêm: Lập trình hệ thống nhúng delay sử dụng vòng lặp lệnh, Lập trình hệ thống nhúng delay sử dụng vòng lặp lệnh