30/09/2018, 20:24

2 timer chạy song song với mikroc

Mình dùng mikroc để lập trình cho pic. giờ mình muốn cho 2 timer chạy song song thì làm như thế nào?

Bé tập Code viết 22:41 ngày 30/09/2018

Cụ thể hơn chút đi bạn

nguyen quang viết 22:39 ngày 30/09/2018

mình dùng 2cảm biến siêu âm hoạt động độc lập nhau. 1 timer đếm cho 1 cảm biến, mà 2 cảm biến chạy độc lập với nhau nên mình muốn cho 2 timer chạy song song với nhau thì dùng cách nào. dùng ngắt được không, mình biết dùng cấu trúc thread thì cũng được nhưng k biết cú pháp câu lệnh @@

Bé tập Code viết 22:38 ngày 30/09/2018

Mình hiểu câu hỏi của bạn là: làm sao để xử lý xong xong đồng bộ 2 timer ?

Câu trả lời là:
Nếu vi xử lý của vi điều khiển bạn đang dùng không đa nhân (mà mình nghĩ là trường hợp bạn đang dùng là không ) thì điều đó là không thể được.

Bạn chỉ có thể xử lý tuần tự từng cảm biến, nếu bạn không làm ứng dụng realtime thì mình nghĩ thời gian hồi đáp của vi điều khiển là đủ để chấp nhận mà

Tung Dao viết 22:40 ngày 30/09/2018

Bạn phải xác định được PIC bạn đang sử dụng có bao nhiêu hardware Timer, nếu có nhiều hơn 1 bạn hoàn toàn có thể đến song song 2 timer cho 2 cảm biến tại cùng 1 thời điểm.

Mà cụ thể bạn đang dùng PIC dòng nào? nói củ thể thì mọi người sẽ dễ góp ý hơn

Nếu vi xử lý của vi điều khiển bạn đang dùng không đa nhân (mà mình nghĩ là trường hợp bạn đang dùng là không ) thì điều đó là không thể được.

MÌnh nghĩ cái này không đúng, xung quanh VDK còn nhiều ngoại vi có thể chạy độc lập vs CPU, nên dù có đơn nhân hay đa nhân thì vẫn có thể thực hiện được nhiều chức năng (trong trường hợp này là timer counter) tại 1 thời điểm

Bé tập Code viết 22:36 ngày 30/09/2018

Ý bạn là VĐK (trong trường hợp này là chạy không có OS) với VXL đơn nhân có thể chạy multi task đồng bộ được ???

Dùng HW Timer như bạn nói là chính xác. Trường hợp bạn @quangmn2293 muốn dùng SW Timer thì có thể dùng chung với Interrupt để đồng bộ.

Văn Dương viết 22:26 ngày 30/09/2018

Thì bạn bật 2 cái timer lên thôi chứ có gì đâu.
Thư viện mickroC rất dễ dùng và nhiều rồi còn gì. Chỉ trừ pic của bạn không có 2 timer.

Văn Dương viết 22:40 ngày 30/09/2018

Timer “cứng” chạy độc lập với CPU. CPU có thể cấu hình và xử lý ngắt của timer.

Tung Dao viết 22:31 ngày 30/09/2018

Ý mình trong trường hợp này có thể cân nhắc về số lượng timer để xử lý song song 2 cảm biến, không nhất thiết phải cân nhắc đến đa nhiệm hay ko đa nhiệm, OS hay non-OS.

nguyen quang viết 22:29 ngày 30/09/2018

mình dùng pic16f877, có 3 timer nhưng không biết làm sao để 2 timer chạy song song, có người nói dùng interrupt mà mình k áp dụng được, với thư viện mikroc mình tìm không có interrupt hay thread

nguyen quang viết 22:34 ngày 30/09/2018

không dùng real-time nhưng thời gian xử lý của 1 cảm biết phải mấy đến 0.25s nên cảm giác bị delay quá nhiều :((

nguyen quang viết 22:32 ngày 30/09/2018

mình muốn sử dụng interrupt thì chỉ cần dùng 2 lệnh
PORT.B0 = 0;
PORT.B0 = 1;
là nó tự nhảy đến interrupt đúng không, cách kích hoạt interrupt như vậy đúng k?

Văn Dương viết 22:37 ngày 30/09/2018

Mỗi timer đều có các thanh ghi để cấu hình làm việc, bạn chỉ cần set giá trị thanh ghi cấu hình phù hợp là timer sẽ chạy.

nguyen quang viết 22:39 ngày 30/09/2018

mà cho mình hỏi interrupt của pic16f877a và pic16f887 có khác nhau gì k?? làm mà nó k chạy -_-

Tung Dao viết 22:29 ngày 30/09/2018

mà cho mình hỏi interrupt của pic16f877a và pic16f887 có khác nhau gì k

C ơ chế interrupt là như nhau ở dòng VDK này, muốn chạy được bạn phải đọc kĩ datasheet tập trung vào phần Timer, thường thì quá trình các bước để enable interrupt cho một ngoại vi gồm các bước sau (nhắc lại là bạn nên xem kĩ lại datasheet để biết có thêm yêu cầu đặc biệt nào không) (lấy VD là Timer0 torng PIC16F87X family):

  • Enable ngoại vi ngắt, mội ngoại vi (có 1 vài ngoại lệ) sẽ có thanh ghi điều khiển ngắt riêng biệt, trong trường hợp này bit T0IE trong thanh ghi INTCON sẽ quyết định chuyện này
    INTCON |= T0IE; // enable Timer0 interrupt
  • Enable ngắt toàn cục, ngoài bit điều khiển ngắt của mội ngoại vi ra, toàn bộ MCU sẽ được cho phép ngắt hay không phụ thuộc vào 1 bit global, trong trường hợp này là bit GIE trong thanh ghi INTCON
    INTCON |= GIE; // enable global interrupt
  • Cài đặt hàm phục vụ ngắt (ISR - Interrupt Service Routine), cái này bạn phải tham khảo sample code của nhà sản xuất cung cấp, thường thì mỗi nhà sản xuất sẽ offer dùng 1 loại IDE/Compiler riêng, nên các thực hiện ISR là khác nhau, bạn tham khảo đoạn code bên dưới và tìm hiệu thêm để tìm ra cách viết đúng cho IDE/Compiler bạn dang xài
void interrupt Timer0_ISR(void)
{
    // ISR implementation 
}
  • Đảm bảo điều kiện ngắt xảy ra, mỗi ngoại vi đều có các điều kiện ngắt nhất định, lấy VD Timer sẽ ngắt khi bộ đếm của nó tràn, tràn còn tùy thuộc vào loại đếm (up/down/,… tham khảo trong datasheet), bạn phải config đúng những điều kiện này thì Timer mới ngắt đúng theo ý mình được
  • Xóa cờ ngắt sau khi thự hiện ISR, thường thì 1 số ngoại vi sẽ không tự động xóa cờ ngắt (1 loại tín hiệu để interrupt CPU khi CPU đang chạy main flow), nên bạn phải thực hiện việc xóa nay ngay khi thoát khỏi ISR, nếu không ISR sẽ liên tục được gọi mặt dù điều kiện ngắt chưa xảy ra, đối vs Timer0 cờ ngắt là bit T0IF trong thanh ghi INT0CON
    INT0CON &= ~T0IF; // clear interrupt flag
Văn Dương viết 22:41 ngày 30/09/2018

Bạn lập trình PIC nên tải datasheet dòng PIC đang sử dụng. Thông thường trong datasheet sẽ nói rất rõ những thứ mình cần, mình phải làm như thế nào, và có cả code mẫu bằng ASM.

Bài liên quan
0