Chào các bạn. Mình mới tập tành lập trình cho vi điều khiển được mấy hôm nay, nói chung là mới học được chút chút, thấy trên mạng cũng khá nhiều bài nói về hàm delay, nhưng mỗi người một kiểu và quan trọng là không có 1 thư viện nhất quán và đáng tin cậy. đây là hàm delay mà mình kết hợp từ những tài liệu trên mạng và mình viết theo văn phong của mình, tuy có thể rườm rà hơn cách của mọi người nhưng mình dám chắc là CPU sẽ đỡ hiện tượng bị treo hơn.
Mình đính kèm lên đây tệp delay.h trong này gồm có 3 hàm:
delay(x) -> đơn vị thời gian tính bằng 1/10 ms ->delay(10.000)=1s
sleep(x) -> đơn vị thời gian tính bằng mini giây ->sleep(1000)=1s
sleepi(x) -> đơn vị thời gian cũng tính bằng mini giây nhưng viết theo lối ngắt kết hợp với idle mode để tiết kiệm điện và chống hiện tượng treo cpu vì quá tải. -> sleepi(1000)=1s
Nếu có gì chưa ổn thì mọi người góp ý giúp mình nhé.
Dưới đây mình trích hàm sleepi để mọi người tham khảo luôn.
khi gọi hàm này cpu sẽ ngủ trong 1ms sau đó ngắt sẽ đánh thức cpu dậy, quá trình ngủ và đánh thức sẽ thực hiện cho đến khi đạt được thời gian làm trễ mong muốn thì cpu mới thực sự tỉnh dậy và quay về với caller
Mình đính kèm lên đây tệp delay.h trong này gồm có 3 hàm:
delay(x) -> đơn vị thời gian tính bằng 1/10 ms ->delay(10.000)=1s
sleep(x) -> đơn vị thời gian tính bằng mini giây ->sleep(1000)=1s
sleepi(x) -> đơn vị thời gian cũng tính bằng mini giây nhưng viết theo lối ngắt kết hợp với idle mode để tiết kiệm điện và chống hiện tượng treo cpu vì quá tải. -> sleepi(1000)=1s
Nếu có gì chưa ổn thì mọi người góp ý giúp mình nhé.
Dưới đây mình trích hàm sleepi để mọi người tham khảo luôn.
khi gọi hàm này cpu sẽ ngủ trong 1ms sau đó ngắt sẽ đánh thức cpu dậy, quá trình ngủ và đánh thức sẽ thực hiện cho đến khi đạt được thời gian làm trễ mong muốn thì cpu mới thực sự tỉnh dậy và quay về với caller
Code:
void sleepi(unsigned n) { unsigned c=0,z=~0-1000;//1ms TR1 = 0; /* Stop Timer 1 */ TMOD &= ~0x0F; /* 16-bit, no prescale mode */ TMOD |= 0x10; PT1 = 1; /* High Priority Interrupt */ ET1 = 1; /* Enable Timer1 Interrupt */ TR1 = 1; /* Start Timer 1 */ EA = 1; /* Enable Global Interrupts */ while(1) { TH1=((z>>8)&0xff);//High TL1=(z&0xff);//Low if(c>=n) { TR1=0; TF1=0; return; // Return caller } c+=1; PCON=0x1;// Go idle mode for power saver } } void timer_ISR (void) interrupt 3 { //Do nothing - use for weakup cpu from idle mode }