Tải bản đầy đủ (.pdf) (11 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (283.92 KB, 11 trang )

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 chính xác ñược khoảng delay là bao nhiêu
ðược sử dụng khi cần tạo ra các thời gian delay
không ñòi hỏi sự chính xác lớn.

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM

2

1


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 sẽ bị treo trong quá
trình chạy (run-time)

Y
Process



3

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

4

2



8051 Timer

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM

5

8051 Timer

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM

6

3


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


7

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

8

4


delay.c
#include <reg51.h>
#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

9

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ỗ nào

}


BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM

10

5


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 những ứng
dụng ñòi hỏi chính xác về mặt
timing.
Không có khả năng dừng 1 task
ñang thực thi ñể thực hiện task
còn 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

6



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 này chỉ chạy ñúng trong trường hợp các task rất 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 các 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

7


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 1 need service
cycle time

Y

Nếu 1 thiết bị cần thời
gian ñáp ứng nhanh hơn
I/O service #1 1 “cycle time”, hệ thống
có thể chạy sai.

Y

Nếu có 1 trình phục vụ
I/O chạy trong thời gian
dài, ñáp ứng của hệ
I/O service #2 thống sẽ bị chậm.

N

I/O 2 need service
N

ðộ ổn ñịnh của 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

8


Round-Robin scheduler with
interrupt
Interrupt Level

Task level

I/O 1 Flag?

Y

Clear Flag 1
I/O service #1

ISR1

Set Flag 1

ISR2

Set Flag 2

N
Y
I/O 2 Flag?


Clear Flag 2
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 cả các tác vụ có cùng mức ưu tiên
Solution:
ðưa các code có ñộ ưu tiên cao vào ISR

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM

18

9


8051 interrupt vector table

Ban ñầu, họ 8051 chỉ có 5 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 này 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 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



×