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

Thảo luận trong 'STM8'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. croket_2512

    croket_2512 Kỹ sư

    Tham gia ngày:
    21/3/13
    Bài viết:
    230
    Đã được thích:
    101
    Điểm thành tích:
    43
    Giới tính:
    Nam
    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!
     
  2. NgoHungCuong

    NgoHungCuong http://ngohungcuong.com

    Tham gia ngày:
    19/8/12
    Bài viết:
    4,061
    Đã được thích:
    9,152
    Điểm thành tích:
    69
    Giới tính:
    Nam
    Nghề nghiệp:
    Thất nghiệp
    Nơi ở:
    Lâm Thao - Phú Thọ
    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?
     
    croket_2512tdm thích bài này.
  3. croket_2512

    croket_2512 Kỹ sư

    Tham gia ngày:
    21/3/13
    Bài viết:
    230
    Đã được thích:
    101
    Điểm thành tích:
    43
    Giới tính:
    Nam
    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?
     
  4. NgoHungCuong

    NgoHungCuong http://ngohungcuong.com

    Tham gia ngày:
    19/8/12
    Bài viết:
    4,061
    Đã được thích:
    9,152
    Điểm thành tích:
    69
    Giới tính:
    Nam
    Nghề nghiệp:
    Thất nghiệp
    Nơi ở:
    Lâm Thao - Phú Thọ
    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.
     
    croket_2512 thích bài này.
  5. croket_2512

    croket_2512 Kỹ sư

    Tham gia ngày:
    21/3/13
    Bài viết:
    230
    Đã được thích:
    101
    Điểm thành tích:
    43
    Giới tính:
    Nam
    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.
     
  6. lam_nguyen56

    lam_nguyen56 Sinh viên đại học

    Tham gia ngày:
    26/9/14
    Bài viết:
    43
    Đã được thích:
    39
    Điểm thành tích:
    18
    Giới tính:
    Nam
    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
     
  7. croket_2512

    croket_2512 Kỹ sư

    Tham gia ngày:
    21/3/13
    Bài viết:
    230
    Đã được thích:
    101
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Ý mình ví dụ đơn giản, chứ không ai lại làm thế! :)
     
  8. croket_2512

    croket_2512 Kỹ sư

    Tham gia ngày:
    21/3/13
    Bài viết:
    230
    Đã được thích:
    101
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Tiện thể, bạn cho hỏi đa nhiệm và RTOS là 2 hay 1?
     
  9. lam_nguyen56

    lam_nguyen56 Sinh viên đại học

    Tham gia ngày:
    26/9/14
    Bài viết:
    43
    Đã được thích:
    39
    Điểm thành tích:
    18
    Giới tính:
    Nam
    Tất nhiên là khác nhau rồi, vì windows mình đang dùng cũng là đa nhiệm. Bài toán của bạn cụ thể thế nào, cứ đưa lên anh em góp ý
     
  10. croket_2512

    croket_2512 Kỹ sư

    Tham gia ngày:
    21/3/13
    Bài viết:
    230
    Đã được thích:
    101
    Điểm thành tích:
    43
    Giới tính:
    Nam
    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?
     

Chia sẻ trang này