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)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

hpecom 07-08-2006 09:31 AM

Chào boys!
* set_timer0(6); đây là phương thức gọi hàm. set_timer0() là một hàm, 6 là tham số. Còn hàm này làm gì thì bạn phải tự tìm hiểu lấy.
* ++count; là thực hiện tăng biến count lên 1 đơn vị. Nó giống lệnh count=count+1. Còn có một cú pháp nhữa là count++. Hai lệnh lệnh này có sự khác nhau về thứ tự thực hiện khi nằm trong một biểu thức so sánh.
* if(count==2000) là phép so sánh. Nếu giá trị của biến count bằng 2000 thì kết quả của phép so sánh là True ngược lại là False.
* a là .. mình chịu thua!?!?:D Còn dịch trái là để nhân đôi giá trị biết. Bạn hãy xem lại đại số bool có rất nhiều điều hay ở đó.
Bạn nên tìm một cuốn sách lập trình C của Quách Tuấn Ngọc để hiểu về những điều này.
Chúc bạn thành công.
hpecom.

boys3509_2006 13-08-2006 03:37 PM

CCS for pic6F877A
 
cảm ơn anh hpecom đã chỉ giáo :D

boys3509_2006 13-08-2006 03:48 PM

CCS C for PIC16F877A
 
Nhân tiện anh cho em hỏi thêm : giả sử em viết một ct nháy led (cho nó chạy như vòng lặp ), đầu tiên kt các khóa để biết ct sẽ nháy led kiểu nào. sau đó thì ct sẽ thực hiện lệnh nháy đèn led, nếu như sau khi ta bấm nút chọn kiểu nháy, ct sẽ tiếp tục thực hiện lệnh tiếp theo mà ta đổi ý bấm nút khác để đổi kiểu thì ct sẽ không nhận vì đang thực hiện các lệnh bật-tắt led. Bài tập này hình như có ở trang 2, 3 dùng interrup và timer0, Tại sao nhỉ ?

hpecom 14-08-2006 09:58 AM

Nếu bạn sử dụng vòng lặp thì nút bấm sẽ ko được nhận trong khi vòng lặp đang thực hiện. Cách giải quyết bài toán như sau:
_ Bạn hãy khai báo 1 biến toàn cục. Biến này lưu kiểu chớp. Hàm chớp sẽ dựa vào giá trị biến này mà đổi kiểu chớp.
_ Sử dụng timer0 làm thời gian chuẩn để trì hoãn chớp tắt (vì nếu dùng làm thời gian trì hoãn chớp tắt thì nó quá ngắn ta không thể thấy chớp được).
_ Khai báo một biến toàn cục làm hệ số cho thời gian trì hoãn. Trong ngắt Timer0 bạn sẽ đếm biến này đến một giá trị nào đó thì gọi hàm chớp tắt.
_ Bạn cũng cần khai báo một biến toàn cục để cho hàm chớp tắt biết mình phải làm gì. Hoặc nếu ko bạn có thể truyền tham số cho hàm.
_ Trong chương trình main, bạn dùng vòng lặp để bắt phím nhấn (hoặc dùng ngắt) và thực hiện thay đổi giá trị của biến kiểu chớp.
Trên đây là giải thuật, đó là phương pháp để giải quyết bài toán. Tất nhiên trong quá trình viết bạn có thể khai báo thêm các biến toàn cục hay cục bộ để thực hiện thuật toán. Tốt nhất là bạn nên viết trước và gặp khó khăn thì đưa cả code lên để mọi người giúp bạn giải quyết.
Đây là một bài toán khá hay, mong rằng bạn sẽ thành công.
hpecom.

boys3509_2006 19-08-2006 04:51 PM

CCS C for PIC16F877A
 
Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé

//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;

//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit :confused:
}
if(a==256)
{
a=1;
count=0;
}
}

//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); :confused:
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a; :confused:
}
}

Anh giải thích mấy cỗ có :confused: giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?

bigtitan 19-08-2006 09:17 PM

Trích:

Nguyên văn bởi nhh
Bài cuối về LCD. Hoạt động theo 8bit interface, có hỏi cờ bận đảm bảo LCD luôn thực thi đúng lệnh yêu cầu ! Chú ý việc hỏi cờ bận là hết sức cần thiết!

Một điều nữa là Protues mô phỏng cho LCD hơi cà thoạt, nên dùng Picsimulator.Tốt nhất kiếm 1 chú LCD làm cho xom!:rolleyes:

Sao em thấy cái PICsimlator này nó tét ra kết quả lâu quá.ngồi đợi nó chạy ra hàng chữ HELLO muốn....tắt mày cho rồi.Mặc dù thiết lập mức độ chạy hết công suất(Ctrl+F5 thì phải) nhưng ó vẫn rề quá.Hay là còn chỗ nào nữa.Các bác chỉ giúp.

namqn 20-08-2006 01:12 AM

Trích:

Nguyên văn bởi bigtitan
Sao em thấy cái PICsimlator này nó tét ra kết quả lâu quá.ngồi đợi nó chạy ra hàng chữ HELLO muốn....tắt mày cho rồi.Mặc dù thiết lập mức độ chạy hết công suất(Ctrl+F5 thì phải) nhưng ó vẫn rề quá.Hay là còn chỗ nào nữa.Các bác chỉ giúp.

Lại nữa rồi, PIC Simulator để kiểm tra logic của chương trình, chứ không phải để thử xem máy tính của bạn chạy nhanh đến mức nào. Bạn vào đọc thêm trong luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=330

Thân,

vtt 20-08-2006 12:34 PM

Chào bác nhh!
Tôi copy nguyen bai delay1s_RB0 của bác về nạp thử, nhưng không hiểu sao nó không chạy, mà phải cắm chân RB3 (chân PGM) xuống đất thì nó mới chạy, bác có thể cho tôi biết tại sao không?
Cám ơn bác!

namqn 20-08-2006 06:59 PM

Trích:

Nguyên văn bởi vtt
Chào bác nhh!
Tôi copy nguyen bai delay1s_RB0 của bác về nạp thử, nhưng không hiểu sao nó không chạy, mà phải cắm chân RB3 (chân PGM) xuống đất thì nó mới chạy, bác có thể cho tôi biết tại sao không?
Cám ơn bác!

Ở một số chip, chân RB3 còn là chân PGM dùng để cấp nguồn cho chế độ nạp chip điện áp thấp (Low-Voltage Programming). Nếu chip của bạn còn mới, có thể nó đang được bật chế độ LVP (mặc định khi xuất xưởng), do đó bạn để hở RB3 sẽ không cho phép chip chạy chương trình, và bạn phải nối RB3 xuống 0V (nên nối qua một điện trở khoảng 1k) thì chip mới không đi vào chế độ LVP và mới chạy được chương trình đã có trong chip.

Thân,

hpecom 21-08-2006 05:07 PM

Trích:

Nguyên văn bởi boys3509_2006
Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé

//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;

//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit :confused:
}
if(a==256)
{
a=1;
count=0;
}
}

//Chuong trinh chinh
main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); :confused:
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a; :confused:
}
}

Anh giải thích mấy cỗ có :confused: giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?

*Dấu :confused: thứ nhất:
[CODE:]
a=a<<1; // dich trai a 1bit
[/CODE]
Như tác giả đã chú thích đó là lệnh dịch trái 1 bit.
VD: trước khi dịch, a có giá trị 0 0 0 0 0 0 0 1 (0x01) thì sau lệnh dịch này giá trị biến a sẽ là 0 0 0 0 0 0 1 0 (0x02).
Vậy lệnh dịch trái sẽ làm tăng giá trị biến bị dịch lên 2 lần: 2 thành 4. Giống như bạn dịch trong hệ thập phân số 0500 thì được 5000 tức tăng 10 lần. Hệ nhị phân (2 số) dịch trái 1 bit sẽ tăng giá trị 2 lần, hệ thập phân (10 số) dịch trái một bit, số sẽ tăng giá trị 10 lần.
Vậy nhiều lệnh dịch sẽ làm cho a thay đổi như sau
0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
* Dấu :confused: thứ 2:
[CODE:]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
[/CODE]
mode may be one or two of the constants defined in the devices .h file. RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L

RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
Bạn hãy đọc Help và các ví dụ của nó thì bạn sẽ hiểu được cách tính.
Bạn hãy tìm hiều kỹ về bộ chia tần trong DataSheet của chip sẽ hiểu tại sao chỉ làm 2 mũ n.
* Dấu :confused: thứ 3:
[CODE:]
portb=a;
[/CODE]
Đây là lệnh xuất giá trị biến a ra PortB. a có 8 bit, PortB có 8 chân B7 đến B0.
Lệnh trên sẽ áp các bit của a vào PortB theo đúng trọng số.
Chúc bạn thành công. (và lần sau hỏi dễ xíu:D ).
hpecom.

lep 21-08-2006 08:42 PM

làm thế naò để vi điêù khiển pic16f877a nhận biết số vong quay cuả motor động cợ? khi khởi động output chân BO cho mức cao high motor động cợ 1 quay 20 vong phát ra 20 xung vuông đến input chân D0 ,chan D0 nhan 20 xung xu li cho ra chan output BO muc thap low motor dong co thu 1 ngung quay va output B1 cao high motor dong co thu 2 quay 10 vong tao ra 10 xung vuong den chan D1 chan D1 nhan 10 xung thi B1 low dong co motor2 dung va B0 high dong co motor 1 quay va nguoc lai
Cho minh hoi cach lam mach dem vong quay motor dong co?xin cac huynh cho luon so do mach nay?va can mua nhung linh kien gi về ráp mạch?
Va xin cac huynh chi cho cach viet chay chuong trinh nay dung ngon ngu C _CCS_C
tan so 20Mhz
pic 16f877a

vtt 21-08-2006 11:08 PM

Cảm ơn ngài trưởng lão Pic bang!
Bây giờ thì tôi đã hiểu, nhưng khi phải nối mass chân RB3 rồi thì coi như chân đó không thể dùng được nữa hả?

namqn 21-08-2006 11:18 PM

Trích:

Nguyên văn bởi vtt
Cảm ơn ngài trưởng lão Pic bang!
Bây giờ thì tôi đã hiểu, nhưng khi phải nối mass chân RB3 rồi thì coi như chân đó không thể dùng được nữa hả?

Bạn vẫn có thể dùng chân RB3 như bình thường khi chip đã ở chế độ chạy chương trình bình thường. Nhưng nếu bạn nối thẳng RB3 vào mức 0V và sau đó dùng RB3 như ngõ ra, thì khi bạn xuất mức cao ra RB3 sẽ gây ngắn mạch giữa các chân Vdd và Vss (vì bạn đã nối thẳng RB3 vào Vss, và sau đó lại yêu cầu ngõ ra RB3 được nối lên Vdd trong chương trình). Đó chính là lý do của lời khuyên nên nối RB3 xuống mức 0V thông qua một điện trở khoảng 1k, nếu bạn muốn RB3 khi dùng như ngõ ra được nhẹ tải hơn thì có thể dùng giá trị 4.7k hay 10k cho điện trở kéo xuống 0V đó.

Thân,

minhquancdt 23-08-2006 09:48 AM

Luồng này sôi động gớm ta!
Sao không thấy bác nhh post bài nữa kà!
Anh em nào rảnh rỗi post tiếp cho bà con hào tham gia với....!:D

Sangcao 23-08-2006 02:30 PM

Mình đang thử ctr điều khiển động cơ: Khi có tín hiệu từ chân RB0 thì động cỏ quay, nếu đang quay mà có tín hiệu từ RB1 thì động cơ quay ngược lại bằng thời gian no đã quay xuôi, bạn nào có thể viết cho mình một ví dụ như vậy bằng CCS được ko, cảm ơn nhiều.


Múi giờ GMT. Hiện tại là 04:53 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