PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 31-03-2009, 12:03 AM   #1
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
TÍnh toán thời gian trong CCS C

Mình đang chuyển sang lập trình PIC bằng PIC C nhưng cái tính toán thời gian lệnh ,chu kỳ lệnh chưa biết tính toán thế nào cho đúng.Thứ nhất là vể chu kỳ lệnh của các lệnh trong PIC C:delay_ms();output_D()...Cái này tham khảo ở đâu vậy vì trong datasheet của PIC chỉ nói đến chu kỳ lệnh của mã asembly thôi.Lấy ví dụ chương trình này :
Code:
/*   CONTINUE.C
*/

#include "16F877A.H"
#use delay(clock=4000000)

main()
{
   int outbyte;

    restart: outbyte=0;

    while(1)
    {
        output_D(outbyte);
        delay_ms(2);
        outbyte++;
                 
        if (!input(PIN_D0)) continue;
        if (!input(PIN_D1)) break;
        delay_ms(2);
        if (outbyte==100) goto restart;
    }
}
Ở trên ta khai báo clock=4000000 tức là 1 chu kỳ lệnh là =4*t0=4*(1/4000000)=1us
Các câu hỏi chưa có câu trả lời là:
1> Lệnh delay(clock=4000000) ảnh hưởng như thế nào tới lệnh delay_ms(2).Bởi vì delay_ms(2) tức là tạm dừng 2s,vậy clock kia ảnh hưởng thế nào?????
2> Khi chạy debug thi khi den lệnh delay_ms(2) thì nó sẽ trở về dòng #use delay(clock=4000000),và dừng ở đó 8 lần .Phải chăng 2 trong dòng lệnh delay_ms(2) kia là...?
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2009, 12:18 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi thaithien View Post
Mình đang chuyển sang lập trình PIC bằng PIC C nhưng cái tính toán thời gian lệnh ,chu kỳ lệnh chưa biết tính toán thế nào cho đúng.Thứ nhất là vể chu kỳ lệnh của các lệnh trong PIC C:delay_ms();output_D()...Cái này tham khảo ở đâu vậy vì trong datasheet của PIC chỉ nói đến chu kỳ lệnh của mã asembly thôi.Lấy ví dụ chương trình này :
...

Ở trên ta khai báo clock=4000000 tức là 1 chu kỳ lệnh là =4*t0=4*(1/4000000)=1us
Các câu hỏi chưa có câu trả lời là:
1> Lệnh delay(clock=4000000) ảnh hưởng như thế nào tới lệnh delay_ms(2).Bởi vì delay_ms(2) tức là tạm dừng 2s,vậy clock kia ảnh hưởng thế nào?????
2> Khi chạy debug thi khi den lệnh delay_ms(2) thì nó sẽ trở về dòng #use delay(clock=4000000),và dừng ở đó 8 lần .Phải chăng 2 trong dòng lệnh delay_ms(2) kia là...?
1. #use delay(clock=xxx) không phải là lệnh mà là chỉ dẫn, để báo cho trình biên dịch biết rằng clock của bạn là xxx, từ đó trình biên dịch mới tính ra số chu kỳ máy cần làm trễ để đạt được thao tác làm trễ trong các hàm delay_us(), và delay_ms(). Ví dụ, nếu bạn dùng chỉ dẫn #use để cho biết clock = 4000000 (Hz), như vậy trình biên dịch sẽ tính ra được (như bạn đã tính ra ở trên) là mỗi chu kỳ máy sẽ tiêu tốn 1 us. Như vậy, khi bạn gọi hàm delay_ms(2) thì trình biên dịch sẽ biết cần phải làm trễ 2 ms, và mỗi ms sẽ tương ứng với 1000 chu kỳ máy.

Bạn thử khai báo #use delay(clock=8000000) và dùng tần số clock 4 MHz xem có phải delay_ms(1000) sẽ làm trễ 2 giây hay không.

2. Bạn debug bằng IDE nào? Bạn có thể dùng chế độ Step Over để chạy lệnh gọi hàm delay_ms() như một lệnh hay không?

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2009, 12:39 AM   #3
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
Trích:
Nguyên văn bởi namqn View Post
1. #use delay(clock=xxx) không phải là lệnh mà là chỉ dẫn, để báo cho trình biên dịch biết rằng clock của bạn là xxx, từ đó trình biên dịch mới tính ra số chu kỳ máy cần làm trễ để đạt được thao tác làm trễ trong các hàm delay_us(), và delay_ms(). Ví dụ, nếu bạn dùng chỉ dẫn #use để cho biết clock = 4000000 (Hz), như vậy trình biên dịch sẽ tính ra được (như bạn đã tính ra ở trên) là mỗi chu kỳ máy sẽ tiêu tốn 1 us. Như vậy, khi bạn gọi hàm delay_ms(2) thì trình biên dịch sẽ biết cần phải làm trễ 2 ms, và mỗi ms sẽ tương ứng với 1000 chu kỳ máy.

Bạn thử khai báo #use delay(clock=8000000) và dùng tần số clock 4 MHz xem có phải delay_ms(1000) sẽ làm trễ 2 giây hay không.

2. Bạn debug bằng IDE nào? Bạn có thể dùng chế độ Step Over để chạy lệnh gọi hàm delay_ms() như một lệnh hay không?

Thân,

Em dùng MPLAB,và đã debug bằng các công cụ step over,step into rồi ghi các mốc thời gian dưới thanh trạng thái nhưng thấy chưa khớp.Để em kiểm tra lại.Còn các chu kỳ lệnh của các lệnh trong PIC C thì sao hả anh ?
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2009, 12:56 AM   #4
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
em đã tính chu kỳ lệnh của lệnh delay_ms() bằng cách sau đây không biết có đúng khôg nữa.(tính như hình)
Dùng chế độ debug và xem code assembly thì thấy lệnh delay_ms() tương đương với nhóm 3 lệnh liên tiếp:
movlw //1 cycle
movwf //1 cycle
goto //2 cycle

Như vậy chu ký lệnh của delay_ms() sẽ là 1+1+2=4.
Hình Kèm Theo
File Type: gif untitled.GIF (94.3 KB, 18 lần tải)
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2009, 02:03 AM   #5
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi thaithien View Post
Em dùng MPLAB,và đã debug bằng các công cụ step over,step into rồi ghi các mốc thời gian dưới thanh trạng thái nhưng thấy chưa khớp.Để em kiểm tra lại.Còn các chu kỳ lệnh của các lệnh trong PIC C thì sao hả anh ?
Bạn nên dùng StopWatch (trong mênu Debugger của MPLAB IDE) để đo thời gian giữa những lần step, có thể dùng nút Zero để xóa thời gian khi cần thiết, và cũng chú ý thiết lập tần số clock cho đúng bằng lệnh Settings (trong mênu Debugger của MPLAB IDE).

Câu hỏi về các chu kỳ lệnh của bạn thì tôi không hiểu lắm, có phải bạn định hỏi một lệnh cụ thể như +, -, hay gọi hàm thư viện nào đó thì mất bao nhiêu chu kỳ không?

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-03-2009, 02:06 AM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi thaithien View Post
em đã tính chu kỳ lệnh của lệnh delay_ms() bằng cách sau đây không biết có đúng khôg nữa.(tính như hình)
Dùng chế độ debug và xem code assembly thì thấy lệnh delay_ms() tương đương với nhóm 3 lệnh liên tiếp:
movlw //1 cycle
movwf //1 cycle
goto //2 cycle

Như vậy chu ký lệnh của delay_ms() sẽ là 1+1+2=4.
Tôi không tin rằng hàm delay_ms() của CCS C chỉ gồm 3 lệnh đó. 2 lệnh đầu tiên chỉ ghi giá trị 2 vào một ô nhớ có địa chỉ 0x22, lệnh thứ ba nhảy đến địa chỉ 0x0004. Đoạn chương trình ở địa chỉ 0x0004 mới thực sự liên quan đến động tác delay.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-04-2009, 02:20 AM   #7
thaithien
Đệ tử 7 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 213
:
Em nghĩ vấn đề "thiết lập tần số clock cho đúng bằng lệnh Settings (trong mênu Debugger của MPLAB IDE)" là cực kỳ quan trọng trong mô phỏng nếu không thì tính toán sẽ sai hết.Cảm ơn anh namnq rất nhiều.
thaithien vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:44 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam