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 05-01-2013, 11:34 AM   #1
CarrotMonster
Nhập môn đệ tử
 
Tham gia ngày: Dec 2012
Bài gửi: 7
:
Cần giúp lỗi delay với ccs!

Mình đang lập trình chạy 6 led nối với RC0 - RC5! Dùng thạch anh 20mhz, chương trình như sau:
#INCLUDE <16F887.H>
#INCLUDE <STDIO.H>
#FUSES NOWDT,HS,PUT,NOLVP
#USE DELAY(CLOCK=20000000)
INT T;
VOID MAIN()
{
SET_TRIS_C(0X00);
T=1000;
WHILE(1)
{
OUTPUT_C(0B00000011);
DELAY_MS(T);
OUTPUT_C(0B00000110);
DELAY_MS(T);
OUTPUT_C(0B00001100);
DELAY_MS(T);
OUTPUT_C(0B00011000);
DELAY_MS(T);
OUTPUT_C(0B00110000);
DELAY_MS(T);
OUTPUT_C(0B00100001);
DELAY_MS(T);
}
}


Nhưng đến khi chạy thì nó ko delay 1 giây mà nhanh hơn, giống như là 300ms!

Đến khi thay DELAY_MS(T); bằng DELAY_MS(1000); thì lại chạy đúng?! Pro nào xin chỉ giáo! Thanks!
CarrotMonster vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-01-2013, 12:31 PM   #2
pstin
Đệ tử 7 túi
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: TP HCM
Bài gửi: 190
:
Trích:
Nguyên văn bởi CarrotMonster View Post
Mình đang lập trình chạy 6 led nối với RC0 - RC5! Dùng thạch anh 20mhz, chương trình như sau:
#INCLUDE <16F887.H>
#INCLUDE <STDIO.H>
#FUSES NOWDT,HS,PUT,NOLVP
#USE DELAY(CLOCK=20000000)
INT T;
VOID MAIN()
{
SET_TRIS_C(0X00);
T=1000;
WHILE(1)
{
OUTPUT_C(0B00000011);
DELAY_MS(T);
OUTPUT_C(0B00000110);
DELAY_MS(T);
OUTPUT_C(0B00001100);
DELAY_MS(T);
OUTPUT_C(0B00011000);
DELAY_MS(T);
OUTPUT_C(0B00110000);
DELAY_MS(T);
OUTPUT_C(0B00100001);
DELAY_MS(T);
}
}


Nhưng đến khi chạy thì nó ko delay 1 giây mà nhanh hơn, giống như là 300ms!

Đến khi thay DELAY_MS(T); bằng DELAY_MS(1000); thì lại chạy đúng?! Pro nào xin chỉ giáo! Thanks!
Hàm delay_ms (time )
Time = 0-255 nếu là biến số hay = 0-65535 nếu là hằng số.
==> Phải trui luyện lại CCS cơ bản!!.

Bạn muốn lên 1000, thì đổi thành T=100 và lặp 10 lần!!!.
for(i=1;i<=10;i++)
{delay_ms(T);}
pstin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-01-2013, 11:01 PM   #3
CarrotMonster
Nhập môn đệ tử
 
Tham gia ngày: Dec 2012
Bài gửi: 7
:
Trích:
Nguyên văn bởi pstin View Post
Hàm delay_ms (time )
Time = 0-255 nếu là biến số hay = 0-65535 nếu là hằng số.
==> Phải trui luyện lại CCS cơ bản!!.

Bạn muốn lên 1000, thì đổi thành T=100 và lặp 10 lần!!!.
for(i=1;i<=10;i++)
{delay_ms(T);}
Mình tìm ra vấn đề rồi! không cần lặp 10 lần, Mình thay khai báo INT T; thành INT16 T; chạy ngon ơ!
CarrotMonster vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-01-2013, 12:07 PM   #4
pthien0288
Nhập môn đệ tử
 
Tham gia ngày: Jan 2013
Bài gửi: 6
:
nếu muốn delay 1s sao không viết thẳng là delay_ms(1000).Nếu không ra đúng 1s thì bạn nên xem lại thạch anh của bạn vì mình đã bị vấn đề này rồi , còn không thích thì ta có thể dùng timer 0 cũng được.
pthien0288 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-01-2013, 05:19 PM   #5
pstin
Đệ tử 7 túi
 
Tham gia ngày: Jul 2010
Nơi Cư Ngụ: TP HCM
Bài gửi: 190
:
Trích:
Nguyên văn bởi pthien0288 View Post
nếu muốn delay 1s sao không viết thẳng là delay_ms(1000).Nếu không ra đúng 1s thì bạn nên xem lại thạch anh của bạn vì mình đã bị vấn đề này rồi , còn không thích thì ta có thể dùng timer 0 cũng được.
Đúng là cái vụ delay 16 bit này cũng chạy được!...

Viết delay_ms() theo biến số nó cũng có ý nghĩa riêng của nó!,...một ví dụ đơn giản như bạn chỉnh "thời gian báo động" bằng cách chỉnh biến trở bên ngoài!,...đọc giá trị ADC của biến trở và delay theo đó!...
Chỉnh thời gian delay theo nút nhấn thì nhiều khi rắc rối và không cần thiết vì nó cần phải có màn hình hiển thị mới được!!!..
pstin vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-01-2013, 02:07 PM   #6
CarrotMonster
Nhập môn đệ tử
 
Tham gia ngày: Dec 2012
Bài gửi: 7
:
Trích:
Nguyên văn bởi pstin View Post
Đúng là cái vụ delay 16 bit này cũng chạy được!...

Viết delay_ms() theo biến số nó cũng có ý nghĩa riêng của nó!,...một ví dụ đơn giản như bạn chỉnh "thời gian báo động" bằng cách chỉnh biến trở bên ngoài!,...đọc giá trị ADC của biến trở và delay theo đó!...
Chỉnh thời gian delay theo nút nhấn thì nhiều khi rắc rối và không cần thiết vì nó cần phải có màn hình hiển thị mới được!!!..
Chính xác nè! Hàm delay mình làm delay theo biến số, ví dụ như xuất xung điều chỉnh tốc độ cho động cơ bước dùng delay nè (lười dùng timer), mình dùng int nó cho có 255, gán 1000 nên bị tràn nên chạy có 255 ms thôi! Chuyển qua int16 cho ko bị tràn!
CarrotMonster 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à 04:18 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