PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Cần giúp lỗi delay với ccs! (http://www.picvietnam.com/forum/showthread.php?t=31593)

CarrotMonster 05-01-2013 11:34 AM

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!

pstin 05-01-2013 12:31 PM

Trích:

Nguyên văn bởi CarrotMonster (Post 80408)
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);}

CarrotMonster 05-01-2013 11:01 PM

Trích:

Nguyên văn bởi pstin (Post 80411)
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 ơ! :)

pthien0288 08-01-2013 12:07 PM

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.

pstin 08-01-2013 05:19 PM

Trích:

Nguyên văn bởi pthien0288 (Post 80440)
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!!!..

CarrotMonster 09-01-2013 02:07 PM

Trích:

Nguyên văn bởi pstin (Post 80448)
Đú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!


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam