[HELP] Tạo 2 hàm delay_ms và delay_us bằng TIMER4

#1
Chào các bạn,

Mình đang gặp một vấn đề, hi vọng nhận được sự trợ giúp. Mình muốn tạo 2 delay 1ms và us chỉ với một timer 4 mà có ngắt sau mỗi 1ms và 1us. Vậy có làm được không, nếu được thì làm như thế nào?

Thanks and best regards!
 

NgoHungCuong

http://ngohungcuong.com
#2
Sau 1ms thì cũng ko khó nhưng sau 1us thì cũng khó đây. Vì con stm8s003f3p6 hình như tốc độ tối đa là 16mhz. Cứ cho là tạo ngắt sau 1us thì làm được những gì trong 16 chu kỳ máy để tiếp tục tới lần ngắt tiếp theo?
 
#3
1. Tốc độ 16MHz thì khó thế nào khi tạo delay 1us, vì chu kỳ nó là 0.0625us mà anh?
2. Thực ra cái delay_us(1) đó là nằm trong đoạn chương trình LCD 4 bit của em, dùng để nhấp chân EN cho LCD, nó như sau:
Mã:
//High Nibbles
LCD_D7 = cmd_data.B7;
LCD_D6 = cmd_data.B6;
LCD_D5 = cmd_data.B5;
LCD_D4 = cmd_data.B4;
LCD_EN = 1; Delay_us(1); LCD_EN = 0; Delay_us(1);
//Low Nibbles
LCD_D7 = cmd_data.B3;
LCD_D6 = cmd_data.B2;
LCD_D5 = cmd_data.B1;
LCD_D4 = cmd_data.B0;
LCD_EN = 1; Delay_us(1); LCD_EN = 0; Delay_us(1700);
Anh có ý kiến gì để sửa đổi chỗ này không?
 

NgoHungCuong

http://ngohungcuong.com
#4
Thế thì cần gì phải ngắt sau mỗi us.
Để delay 1us kiểu đó thì chỉ cần dùng lệnh nop là được rồi.
 
#5
Vì em nghĩ rằng delay 1 us là lâu khi viết chương trình có nhiều ngắt xảy ra. Ví dụ: em có hai công việc A(hiển thị LCD), B(nháy LED) chẳng hạn, khi em đang thực hiện A, đến ngay chỗ delay_us(1), thì ngắt B xảy ra, chương trình thực hiện ngắt B, em muốn vđk nhảy qua nhảy lại thực hiện A và B, khi B xong thì A cũng xong! Ý em là vậy, như đa nhiệm ấy!

Tiện thể, anh cho em hỏi:
  1. Em chưa biết gì về lập trình đa nhiệm, nhưng hiểu nôm na là lập trình cho vđk thực mỗi tác vụ trong 1 đơn vị thời gian. Vậy đơn vị thời gian đó mình cho bao nhiêu là hợp lý? 1ms được không? Vì em thấy ngay cả bên STM32, người ta cũng dùng systick timer để tạo thời gian 1ms.
  2. Một chu kỳ máy trong arm bằng bao nhiêu chu kỳ thạch anh? Một lệnh asm trong arm (stm32 và stm8) thì được thực hiện trong khoảng thời gian bao nhiêu chu kỳ máy? Ví dụ, như 8051, 1 chu kỳ máy bằng 12 chu kỳ thạch anh, và mỗi lệnh đều có thời gian thực hiện khác nhau.
 

lam_nguyen56

Sinh viên đại học
#6
tạo delay 1us mà dùng timer thì không ổn, vì mấy lệnh set thanh ghi cũng đã mất ngần ấy thời gian
Vì em nghĩ rằng delay 1 us là lâu khi viết chương trình có nhiều ngắt xảy ra. Ví dụ: em có hai công việc A(hiển thị LCD), B(nháy LED) chẳng hạn, khi em đang thực hiện A, đến ngay chỗ delay_us(1), thì ngắt B xảy ra, chương trình thực hiện ngắt B, em muốn vđk nhảy qua nhảy lại thực hiện A và B, khi B xong thì A cũng xong! Ý em là vậy, như đa nhiệm ấy!

Tiện thể, anh cho em hỏi:
  1. Em chưa biết gì về lập trình đa nhiệm, nhưng hiểu nôm na là lập trình cho vđk thực mỗi tác vụ trong 1 đơn vị thời gian. Vậy đơn vị thời gian đó mình cho bao nhiêu là hợp lý? 1ms được không? Vì em thấy ngay cả bên STM32, người ta cũng dùng systick timer để tạo thời gian 1ms.
  2. Một chu kỳ máy trong arm bằng bao nhiêu chu kỳ thạch anh? Một lệnh asm trong arm (stm32 và stm8) thì được thực hiện trong khoảng thời gian bao nhiêu chu kỳ máy? Ví dụ, như 8051, 1 chu kỳ máy bằng 12 chu kỳ thạch anh, và mỗi lệnh đều có thời gian thực hiện khác nhau.
Muốn lập trình đa nhiệm theo kiểu chia task bằng systick thì phải dùng RTOS rồi. Nhưng ứng dụng vừa nháy led vừa hiển thị lcd thì không nên dùng RTOS, cứ lập trình đơn thuần sẽ đơn giản và hiệu quả hơn
 
#7
tạo delay 1us mà dùng timer thì không ổn, vì mấy lệnh set thanh ghi cũng đã mất ngần ấy thời gian

Muốn lập trình đa nhiệm theo kiểu chia task bằng systick thì phải dùng RTOS rồi. Nhưng ứng dụng vừa nháy led vừa hiển thị lcd thì không nên dùng RTOS, cứ lập trình đơn thuần sẽ đơn giản và hiệu quả hơn
Ý mình ví dụ đơn giản, chứ không ai lại làm thế! :)
 
#10
Mình chưa có bài toán cụ thể! Cách tiếp cận của mình là có 1 cái nhìn chung nhất, sau đó chọn lựa và rẽ nhánh đi từng phần, từ tổng thể khái quát rồi mới đi chi tiết! :) Bạn có thể chia sẻ tài liệu gì nói về đa nhiệm và RTOS không?
 

Quảng cáo Google