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

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 07-08-2006, 09:31 AM   #76
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
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!?!? 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.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 13-08-2006, 03:37 PM   #77
boys3509_2006
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 32
:
CCS for pic6F877A

cảm ơn anh hpecom đã chỉ giáo
boys3509_2006 vẫn chưa có mặt trong diễn đàn  
Old 13-08-2006, 03:48 PM   #78
boys3509_2006
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 32
:
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ỉ ?
boys3509_2006 vẫn chưa có mặt trong diễn đàn  
Old 14-08-2006, 09:58 AM   #79
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
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.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..
hpecom vẫn chưa có mặt trong diễn đàn  
Old 19-08-2006, 04:51 PM   #80
boys3509_2006
Đệ tử 2 túi
 
Tham gia ngày: Feb 2006
Bài gửi: 32
:
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
}
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);
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a;
}
}

Anh giải thích mấy cỗ có giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?
boys3509_2006 vẫn chưa có mặt trong diễn đàn  
Old 19-08-2006, 09:17 PM   #81
bigtitan
Đệ tử 3 túi
 
Tham gia ngày: Oct 2005
Bài gửi: 47
:
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!
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.
bigtitan vẫn chưa có mặt trong diễn đàn  
Old 20-08-2006, 01:12 AM   #82
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 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,
__________________
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  
Old 20-08-2006, 12:34 PM   #83
vtt
Đệ tử 2 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 44
:
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!
vtt vẫn chưa có mặt trong diễn đàn  
Old 20-08-2006, 06:59 PM   #84
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 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,
__________________
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  
Old 21-08-2006, 05:07 PM   #85
hpecom
Đệ tử 2 túi
 
Tham gia ngày: Nov 2005
Bài gửi: 45
:
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
}
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);
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a;
}
}

Anh giải thích mấy cỗ có 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 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 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 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 ).
hpecom.
__________________
Biết thì nói là biết,
Không biết thì nói là không biết,
..

thay đổi nội dung bởi: hpecom, 22-08-2006 lúc 09:00 AM.
hpecom vẫn chưa có mặt trong diễn đàn  
Old 21-08-2006, 08:42 PM   #86
lep
Đệ tử 1 túi
 
Tham gia ngày: Aug 2006
Bài gửi: 12
:
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
lep vẫn chưa có mặt trong diễn đàn  
Old 21-08-2006, 11:08 PM   #87
vtt
Đệ tử 2 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 44
:
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ả?
vtt vẫn chưa có mặt trong diễn đàn  
Old 21-08-2006, 11:18 PM   #88
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 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,
__________________
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  
Old 23-08-2006, 09:48 AM   #89
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
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....!
minhquancdt vẫn chưa có mặt trong diễn đàn  
Old 23-08-2006, 02:30 PM   #90
Sangcao
Đệ tử 1 túi
 
Tham gia ngày: May 2006
Bài gửi: 25
:
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.
Sangcao vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá


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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 26 07-05-2024 08:55 AM
TUT về USART trong PIC16F877A mafd_47a MPASM 11 04-05-2024 04:43 AM
Lập nhóm PIC16F877A nhh Cơ bản về vi điều khiển và PIC 285 08-03-2017 11:08 PM
Bộ so sánh và PWM cho PIC16F877A anhquangngai Cơ bản về vi điều khiển và PIC 24 08-09-2012 09:00 AM
Pic16f877a TỪ DỄ TỚi KhÓ ntc Cơ bản về vi điều khiển và PIC 373 23-05-2009 10:24 PM


Múi giờ GMT. Hiện tại là 06:54 AM.


Đượ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