Lập trình hệ thống nhúng delay sử dụng vòng lặp lệnh

11 448 0
Lập trình hệ thống nhúng  delay sử dụng vòng lặp lệnh

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan