PDA

View Full Version : CCS C cho PIC/dsPIC phiên bản 4.xxx


falleaf
24-04-2008, 12:03 PM
Luồng này tiếp theo luồng CCS C cho PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357).

- Tutorial của nhh đã cũ, CCS C có nhiều thay đổi, do vậy từ CCS C 4.xxx một số câu lệnh và ký hiệu được thay đổi.
- Luồng trước quá dài, chúng tôi tạm khoá để mở luồng mới, các thành viên sẽ dễ theo dõi hơn.

Chúc vui

falleaf
24-04-2008, 12:07 PM
cho mình hỏi
port c của con 16f877a này có gì đặc biệt không vậy?
mình dùng 3 chân RC0,RC1,RC2 để nối đến 3 chân điều khiển LCD.nhưng tại sao khi mình không set_tris cổng này mà vẫn điều khiển được LCD.
mình hỏi một câu nữa nhé.
khi dùng các chân RC6,RC7 để truyền nhận thì không được set_tris cổng C? nếu vậy muốn dùng các chân khác với mục đích I/O thì làm ntn?
mình cảm ơn nhiều!!!

Port C của 16f877a tích hợp các modul truyền nhận dữ liệu theo các chuẩn khác nhau như I2C, SPI, .... chứ cũng chẳng có gì đặc biệt cả :o
- Bạn không set_tris nhưng vẫn điều khển được LCD là vì trình dịch CCS hỗ trợ, nó sẽ set_tris giùm bạn ở mỗi câu lệnh liên quan đến I/O => tốc độ xử lý và bộ nhớ giảm đi đáng kể do hành động set_tris lập đi lập lại nhiều lần dẫn đến dài dòng thừa thải :o code đơn giản thì không sao chứ nếu code đòi hỏi tốc độ và dung lượng bộ nhớ lớn thì mình khuyên nên dùng set_tris.
- Bạn dùng lệnh set_tris thì không giao tiếp đuợc với PC qua chuẩn 232, mình cũng chưa để ý cái này, nhưng mình nghĩ chắc chắn là đuợc chứ :o, bạn nên xem lại set i/o của bạn cho hai chân RC6 và RC7 đã đúng chưa :o, lưu ý lại với bạn ở đây chân RC6 là chân truyền (tranmister) tức ngõ ra và chân RC7 là chân nhận (Receiver) tức ngõ vào. Với lại trong câu lệnh set tris để set ngõ vào thì dùng bit (1), và ngõ ra tương ứng với bit (0).

Còn bạn gì ở trên kia muốn tìm hiểu giao tiếp với PC thì tìm lại trên diễn đàn nhé, có quá nhiều bài viết hướng dẫn và cả ví dụ mẫu về nó rồi đấy :o

Chúc các bạn thành công.
Thân.

nhưng mình đã thử lại I/O của port C bằng cách nháy led. Hoàn toàn không được nếu không set_tris. và với các port khác cũng vậy????


Luồng này tiếp tục thảo luận ở đây

Chúc vui

lion
25-04-2008, 09:07 AM
bác F cho em vài link về CCS C 4.xxx

lion
25-04-2008, 09:11 AM
tìm trong diễn đàn này mệt quá

picthanh
25-04-2008, 05:48 PM
to hard : chắc phải tháo ra cài lại thôi, lưu là thằng này và thằng Deepfreeze ko ưa gì nhau, nên cài vào ko chạy dc, báo lỗi tùm lum, lúc trước tui bị một lần rồi.

Hard
25-04-2008, 06:54 PM
Hi,
Đành phải xin phép câu thêm một bài vậy. Bác có thể giải quyết vấn đề bằng cách down phiên bản 4.065 về. Trong phiên bản này có IDEUTILS sẵn, chỉ cần chạy file này để cài đặt, nó tương thích cho cả version 4.068. Bên thread Trình biên dịch và mô phỏng đã đề cập đến vấn đề này rồi. Chúc bác thành công.
Thân ái.

tyhon
27-04-2008, 12:27 PM
em đang làm về phần giao tiếp giữa pic(16f877a) với máy tính dùng phần mềm ccs để lập trình
anh nào có tài liệu thì có thể giúp đơ em, em đang rất cần
mail của em là qvinh_bk86@yahoo.com.vn,
em cảm ơn nhiều
Rất mong thư!

falleaf
27-04-2008, 05:21 PM
bác F cho em vài link về CCS C 4.xxx

Bạn đã đọc list của diễn đàn chưa? Bạn nghĩ rằng bạn có thể tìm cái chương trình nạp đó ở đâu?

Chúc vui

Tuane06_spkt
29-04-2008, 11:10 AM
Hic cac bac oi help me,em down các tài liệu trên điễn đàn về nhà và làm theo như các bác nói,nhưng mà sao nó không chạy,em đang dùng CCS V4.057 hôm nay em quên không mang theo đoan code em làm,nhưng đại loại là em đã khai báo #include <16F877A.h> nhưng không hiểu sao khi compiler lại báo là lỗi "A#device" cần phải thêm vào là sao các bác(hi em dịch ra đầy không biết có đúng không),các bác giúp em nhé,em đang làm đồ án liên quan đến Pic mà lại lập trình bằng C

lion
30-04-2008, 11:10 AM
tui đang dùng phiên bản CCS 4.065
không biết còn phiên bản nào cao hơn không hả anh em ???

falleaf
30-04-2008, 12:27 PM
tui đang dùng phiên bản CCS 4.065
không biết còn phiên bản nào cao hơn không hả anh em ???

Bạn vẫn không chịu nhìn kỹ các tiêu đề được dán lên à? Hãy đọc những bài đầu tiên ở đó trở xuống.

Chúc vui

kennybk04
30-04-2008, 10:28 PM
Em viết chương trình ngắt timer nhấp nháy led, nhưng nạp vào pic phải đợi 1 lúc sau nó mới bắt đầu nháy led, bác nào khắc phục jùm em với.
Đây là code.

#include <16F877A.h>
#include <DEFS_16F877A.h>
#device 16F877*=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
void main()
{
set_tris_b(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(int_timer0);
enable_interrupts(global);
set_timer0(56);

while(true)
{
}
}

namqn
30-04-2008, 10:39 PM
Trước khi vào vòng while(true) trong main(), bạn nên đặt trước giá trị của count, nếu không thì count có thể mang giá trị bất kỳ, và điều kiện (count == 500) của bạn có thể phải sau khi count được tăng vài chục ngàn giá trị mới thỏa mãn (nếu tình cờ sau khi PIC reset biến count mang giá trị ngẫu nhiên là 501 chẳng hạn).

Tôi thường khởi tạo biến count ngay trước khi vào vòng while(true) trong main(), và dùng điều kiện (count >= 500) thay cho (count == 500) trong phần xử lý ngắt.

Thân,

Tuane06_spkt
02-05-2008, 06:29 PM
hi hi em sửa được lỗi đó rùi,nhưng vẫn không hiểu,bác nào giải thích hộ em với,khi em tạo một project mới,ví dụ em tạo trong thư mục "C:\Bai_tap" thỉ trong phần soạn thảo của em xuất hiện khai báo #include "C:\Bai_tap\nhapnhayB.h" nếu em để nguyên như này thì khi compiler sẽ báo lỗi " a #device" gì đó,nhưng khi em bỏ dòng này đi thì mọi việc ok,hic

tyhon
06-05-2008, 01:50 AM
Em có đoạn code sau nhưng em không hiểu là lệnh adcHI và adcLO làm gì (với khai báo
char adcHI,adcLO).Anh nào giải thích hộ em

while(TRUE)
{
adcValue = read_adc(); // Get ADC reading

adcHI = (char)((adcValue >> 5)& 0x1f);
adcLO = (char)((adcValue & 0x1f)|0x80);

putc(adcHI);
putc(adcLO);

delay_ms(10); // Preset delay, repeat every 10ms
}
}

namqn
06-05-2008, 02:13 AM
adcHI và adcLO là các biến kiểu char (8-bit), không phải là lệnh.

Trong đoạn lệnh mà bạn đã đưa ra, kết quả của việc biến đổi A/D được tách thành 2 phần, phần cao chứa trong adcHI, còn 5 bit thấp hơn của kết quả được chứa trong adcLO. Bit 7 của adcLO được bật.

Sau đó adcHI và adcLO được xuất ra thông qua hàm putc().

Thân,

tyhon
06-05-2008, 07:49 AM
adcHI và adcLO là các biến kiểu char (8-bit), không phải là lệnh.

Trong đoạn lệnh mà bạn đã đưa ra, kết quả của việc biến đổi A/D được tách thành 2 phần, phần cao chứa trong adcHI, còn 5 bit thấp hơn của kết quả được chứa trong adcLO. Bit 7 của adcLO được bật.

Sau đó adcHI và adcLO được xuất ra thông qua hàm putc().

Thân,



Cảm ơn anh , nhưng anh có thể giải thích rõ hơn cho em doạn lệnh sau :(ví dụ như (adcValue>>5)&0x1f có nghĩa như thế nào)
adcHI = (char)((adcValue >> 5)& 0x1f);
adcLO = (char)((adcValue & 0x1f)|0x80);
Anh còn bảo là bit 7 của adcLO được bật là sao ha anh?
Rất mong thư!

namqn
06-05-2008, 09:24 AM
Cảm ơn anh , nhưng anh có thể giải thích rõ hơn cho em doạn lệnh sau :(ví dụ như (adcValue>>5)&0x1f có nghĩa như thế nào)
adcHI = (char)((adcValue >> 5)& 0x1f);
adcLO = (char)((adcValue & 0x1f)|0x80);
Anh còn bảo là bit 7 của adcLO được bật là sao ha anh?
Rất mong thư!
Bạn hỏi như vậy tôi đoán là bạn chưa học gì về kỹ thuật số, lập trình C, ... Bạn có thể cho biết bạn đang học ở bậc nào, nếu học đại học thì đến năm thứ mấy, ngành gì. Thông tin về nền tảng kiến thức của bạn sẽ giúp người khác có cách giải thích phù hợp cho bạn (mặc dù đôi khi bạn có thể đặt người khác vào tình huống tương tự như giải thích về tích phân cho học sinh cấp hai).

Thân,

tyhon
06-05-2008, 05:30 PM
Vâng em cũng mới bắt đầu làm quen mà
Anh cũng cho em biết thêm là adcHI và adcLO là 8 bit, thế sao khi A/D tách thành 2 phần thì như anh nói 5 bit thấp hơn lại chứa trong adcLO?

vandungevn
06-05-2008, 11:28 PM
ADC trong PIC có 10bit. adcHI là chứa 5 bits cao của 10 bits, còn adcLO chứa 5 bit thấp như vậy là ghép lại thành 10 bit ad rồi đó:d. còn '>>' có nghĩa là dịch trai 1111100000 >> 5 = 0000011111 => giá trị của adcHI được đưa vào 1 byte là 00011111, như vậy có 5 bit cao của adc 10 bit . x 0x1f, giữ nguyên giá trị của 5 bit cao để khỏi lẫn giá trị của byte thấp, em thử lấy 1 phép toán nào đó làm ví dụ thì thấy ngay. adcLO việc bit 7 của adcLO được bật để phân biệt adcHI và adcLO khi chuyển lên nếu ko thì ko biết mình nhận nó là byte thấp hay byte cao.

tyhon
07-05-2008, 04:57 AM
ADC trong PIC có 10bit. adcHI là chứa 5 bits cao của 10 bits, còn adcLO chứa 5 bit thấp như vậy là ghép lại thành 10 bit ad rồi đó:d. còn '>>' có nghĩa là dịch trai 1111100000 >> 5 = 0000011111 => giá trị của adcHI được đưa vào 1 byte là 00011111, như vậy có 5 bit cao của adc 10 bit . x 0x1f, giữ nguyên giá trị của 5 bit cao để khỏi lẫn giá trị của byte thấp, em thử lấy 1 phép toán nào đó làm ví dụ thì thấy ngay. adcLO việc bit 7 của adcLO được bật để phân biệt adcHI và adcLO khi chuyển lên nếu ko thì ko biết mình nhận nó là byte thấp hay byte cao.

Anh cho em hỏi:
code

while(TRUE)
{
adcValue = read_adc(); // Get ADC reading

adcHI = (char)((adcValue >> 5)& 0x1f);
adcLO = (char)((adcValue & 0x1f)|0x80);

putc(adcHI);
putc(adcLO);

delay_ms(10); // Preset delay, repeat every 10ms
}
}.
Thế ở đây không biết dịch bit để làm gì anh nhỉ ? Tại sao không cho adcHI nhận luôn 5 bit cao của adc trong PIC

tungtot_vl
22-05-2008, 03:04 PM
em đang sai ccsc p3.249. các anh có phiên bản nào mới cho tôi xin link với

love_ac
22-05-2008, 03:47 PM
em đang sai ccsc p3.249. các anh có phiên bản nào mới cho tôi xin link với

Bạn thử link này:
http://rs152.rapidshare.com/files/106075769/PCWH_4.069_Upd.rar

hanspkt
22-05-2008, 03:48 PM
em đang sai ccsc p3.249. các anh có phiên bản nào mới cho tôi xin link với

bạn vào đây:
http://www.picvietnam.com/forum//forumdisplay.php?f=10

tungtot_vl
23-05-2008, 11:57 AM
cảm ơn 2 bác nhiều.

bean984
02-06-2008, 10:35 AM
mình đang làm về giao tiếp 2 con 16f877a theo chuẩn RS485. Con slave đọc giá trị adc. Con master thì liên tục yêu cầu con slave gửi trả giá trị adc để hiển thị lên lcd.
mình thực hiện như sau:

main()
{
//khởi tao các gtri ban đầu
...
while(true)
{
transmit(2,0,0,0);//gửi chuỗi '2000' để yêu cầu slave truyền về giá trị adc
delay_ms(500);//trễ thời gian nhận giá trị adc
}
}
nếu như để lệnh hỏi ngoài vòng while thì nó hoạt động tốt, nhưng khi cho vào trong vòng while thì nó chỉ thực hiện được một lệnh đầu tiên. các lần tiếp theo thì lại không đúng nữa.
thanks mọi người nhiều.

andyhug
03-06-2008, 12:05 PM
Em mới hoc PIC, em đã load dược CCSC For PIC 4.09, MPLAB IDE 8.10, ICProg105D, các bác ai biết thì chỉ giúp em cách mô phỏng cụ thể với? (Từ mô phỏng các cổng, timer, các thanh ghi...)
Cảm ơn các bác!

igbt
07-06-2008, 07:26 PM
Em có một đoạn code muốn nhờ các anh đi trước giúp đỡ mà ko biết cách chèn lên thế nào, đành phải làm thủ công thế này. Đoạn code của em có mục đích là: đầu tiên cho 2 chân RB1 và RB2 ở mức thấp, sau đó kiểm tra trạng thái của RD0 (chân RD0 được nối lên cao qua điện trở 10k), nếu RD0 = 0 thì đưa ra chân RB2 mức 1, trễ 5s, đưa RB2 xuống 0 và RB1 lên 1 trễ 5s và thoát khỏi điều kiện if và tiếp tục kiểm tra RD0. Nhưng khi chạy thử mạch thì RB2 có mức 1 trễ 5s sau đó RB1 có múc 1... mặc dù RD0 vẫn chưa = 0, mà sau đó chương trình cũng chẳng thoát khỏi điều kiện if. Em biết ngày trước đã có bạn hỏi như em và đã được giúp đỡ nhưng em tim lại mãi mà không thấy. Em mới học, mong các anh giúp đỡ! Đoạn code của em như sau:
#include <16F877a.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
main()
{
set_tris_b(0);
set_tris_d(255);
output_low(PIN_B1);
output_low(PIN_B2);
if(RD0=0)
output_high(PIN_B2);
delay_ms(5000);
output_low(PIN_B2);
output_high(PIN_B1);
delay_ms(5000);
}

namqn
07-06-2008, 08:33 PM
Chương trình của bạn nên được sửa lại như sau:
#include <16F877a.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
main()
{
set_tris_b(0);
set_tris_d(255);
output_low(PIN_B1);
output_low(PIN_B2);
if(RD0 == 0) {
output_high(PIN_B2);
delay_ms(5000);
output_low(PIN_B2);
output_high(PIN_B1);
delay_ms(5000);
}
while (1);
}
Bạn hãy tự so sánh với code cũ của bạn để tìm ra những thay đổi, và suy nghĩ xem tại sao phải thay đổi như vậy.

Thân,

igbt
07-06-2008, 09:43 PM
Cảm ơn anh Nam đã giúp đỡ! Nhưng ko biết do Kit của em hay lý do gì mà khi thử mạch, nếu ngắt đường nối lên cao của RD0 thì RB2 có trạng thái 1 sau 5s đến RB1 có trạng thái 1 RB2 xuống 0 và giữ ở trạng thái đó suốt. Nếu giữ đúng sơ đồ, thì ấn nút bấm, chẳng thấy gì xảy ra cả. Anh xem giúp em với! (em dùng Kit của anh SGT)

namqn
08-06-2008, 06:09 AM
Nếu bạn muốn việc kiểm tra trạng thái chân RD0 được thực hiện liên tục thì code của bạn có thể sửa thành như sau:
#include <16F877a.h>
#include <def_877a.h>
#fuses NOWDT,PUT,XT,NOPROTECT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
main()
{
set_tris_b(0);
set_tris_d(255);
output_low(PIN_B1);
output_low(PIN_B2);
while (1) {
if(RD0 == 0) {
output_high(PIN_B2);
delay_ms(5000);
output_low(PIN_B2);
output_high(PIN_B1);
delay_ms(5000);
}
}
}
Bạn hãy so sánh với code trước đó và suy nghĩ xem tại sao lại sửa thành như vậy.

Thân,

bean984
13-06-2008, 09:46 AM
nhờ mọi người giúp đỡ giao tiếp 2 pic16f877a theo chuẩn 485.
ý tưởng của mình như sau:
con master truyền một ký tự 'a' sang cho con slave.sau đó set chân đk của con mas để nó chờ tín hiệu gửi về từ con slave.
con slave nhận đc ký tự từ master gửi đến và kiểm tra nếu đúng ký tự cần thì thực hiện gửi lại ký tự 'b'.
quá trình cứ liên tục như vậy.

bean984
13-06-2008, 09:53 AM
mình đã thử con master chỉ liên tục truyền và con slave liên tục nhận thì không có vấn đề gì. nhưng khi thực hiện hỏi đáp như trên thì ctr không chạy đc.
đây là đoạn code:

///////////////////////////////////////////////////////////////////
//ham nhan ky tu
#INT_RDA
void RECEIVER()
{
int k,l;
output_high(pin_b0);
recei[k]=fgetc(PC);
if (recei[k]=='@')
{
recei[k]=null;
if (recei[0]=='b')
{
output_high(pin_e0);//set chan dk
r232=0;//set co nhan
delay_ms(50);
}
k=0;
}
else
k=k+1;
}
/////////////////////////////////////////////////////////*/
void main(void)
{
int16 i,j;
//int1 r232;
set_tris_a(255);
set_tris_b(0);
set_tris_d(0);
set_tris_e(0);
portb=0;
output_high(pin_e0);
enable_interrupts(global);
enable_interrupts(int_RDA);
lcd_init();
delay_ms(1);
lcd_clear();
delay_ms(1);
r232=0;
while(1)
{
if (r232==0)
{
printf("aa@");
r232=1;
delay_ms(50);
output_low(pin_e0);
delay_ms(100);
}

}
}

bean984
13-06-2008, 09:57 AM
còn đây là code con slave:

////////////////////////////////////////////////////////////*/
//ham nhan ky tu
#INT_RDA
void RECEIVER()
{
int x,y;
chuoi[x]=fgetc(PC);
if (chuoi[x]=='@')
{
chuoi[x]=null;
dodaichuoi=strlen(chuoi);
if (chuoi[0]=='a')
{
count0=count0+1;//dem so lan nhan đc
r232=1;//set co nhan
}
x=0;
}
else x=x+1;
}
//////////////////////////////////////////////////////////
void main(void)
{
int luudiemcat;
set_tris_a(255);
set_tris_b(255);
set_tris_d(0);
set_tris_e(0);
portb=porte=0;
output_low(pin_E0);
portd=0;
r232=0;
enable_interrupts(global);
enable_interrupts(int_RDA);
setup_adc(adc_clock_internal);

while(true)
{
if (r232==1)
{
output_high(pin_e0);
delay_ms(50);
printf("bb@");
delay_ms(200);
output_low(pin_e0);
r232=0;
lcd_display_str(0,0,chuoi);
lcd_display_int8(0,5,dodaichuoi);
lcd_display_int16(0,10,count0,0);
}
}
}

bean984
13-06-2008, 09:58 AM
nhờ mọi người kiểm tra giúp xem đoạn code trên có vấn đề gì không.
cảm ơn mọi người nhiều!!!

kinhaxac
01-07-2008, 05:09 PM
các bác cho em hỏi về counter của con 16F877A :
em chưa hiểu được lệnh này

setup_COUNTERS (rtcc_state, ps_state);

rtcc_state là một trong những constant sau:

RTCC_INTERNAL // tham số này có nghĩa j ?? em tưởng nó chỉ lấy xung từ chân RA4/TOCK1
RTCC_EXT_L_TO_H //
RTCC_EXT_H_TO_L //

ps_state là một trong những constant sau:

RTCC_DIV_2 // chọn cái tỉ số chia này có nghĩa j , có fai cứ 2 xung thì nó tăng bộ đếm lên 1
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128


em viết một chương trình cho timer1 mà nó ko chạy , em sửa nó từ timer0 (đã chạy)

#include <16f877a.h>
#include <def_877a.h>
#fuses NOWDT ,NOPUT ,NOPROTECT ,NODEBUG,NOBROWNOUT,NOLVP,HS
#use delay(clock=20000000)
int16 count;

#int_timer1
void interrupt_timer1()
{
set_timer1(0);
++count;
if(count==20)
{
count=0;
PORTC=~PORTC;
}
}
void main()
{
TRISC=0x00;
PORTC=0x55;
enable_interrupts(int_timer1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(global);
set_timer1(0);
// TODO: USER CODE!!
while(true){}
}

các bác cho ý kiến

picpen
03-07-2008, 12:39 PM
Help Me ........ :geek:
Mình đang tìm hiểu và viết chương trình cho LCD( 2 dòng x 20 ký tự )
Nhưng mình đang gặp một khó khăn nho nhỏ cần các bạn giúp đỡ...
Mình viết chương trình để hiển thị các ký tự và chuỗi ký tự thì rất ok . Nhưng để hiển thị giá trị chứa trong một thanh nghi ,một byte nhớ hay giá trị của một biến INT lên LCD thì mình bị mắc quá ko hiển thị được. Huynh đệ nào biết giúp mình ngay nha :ugeek:
- Bài mình đang mắc như sau : hiển thị giá trị chuyển đổi ADC khi thay đổi tín hiệu đầu vào chân AN0 của pic16f877a lên LCD ( value = read_adc() , giá trị trong biến value cần hiển thị lên LCD )


**************** THANHK **************

david
03-07-2008, 03:41 PM
bạn tách lấy số hàng đơn vị,tách lấy số hàng chục,....
cộng mỗi số với 0x30 rồi putc() lên LCD

kinhaxac
03-07-2008, 04:47 PM
hic khong ai trả lời mình ah`

picpen
04-07-2008, 01:44 AM
Cám ơn bác đã chỉ bảo ,Em đã tách được các số và cho hiển thị lên LCD...
Nhưng em chuă hiểu vì sao khi tách các số ra lại phải cộng với 0x30 ?Có phải khi cộng với 0x30 ta sẽ được mã ASII của số đó không?
Mọi người cho em hỏi đường link để dowload file : lcd_lib_4bit.c

***************** THANKS **************

bean984
04-07-2008, 03:33 PM
cho mình hỏi về cái timer0?????
mình đang gặp một lỗi khi sử dụng timer0. hiện tượng mình gặp phải là lần đầu tiên khi cắm điện vào bo thử để chạy test timer0 thì cái timer0 chạy không đúng(cụ thể là thời gian ngắt nó bị chậm rất nhiều). nhưng những lần tiếp theo đó(k ngắt nguồn điện) thì nó lại chạy đúng.và nếu cứ ngắt nguồn điện thì lại bị hiện tượng này.
ai biết nguyên nhân của lỗi này xin chỉ giúp mình với.
cảm ơn!

Duykiban
11-07-2008, 11:41 PM
Cho mình hỏi mình dùng CCSC 3.249 viết cho Pic 16F877A mà bộ nhớ Rom chỉ khoảng 70% là trình dịch báo out of rom! tại sao thế nhỉ?

vandungevn
12-07-2008, 09:06 AM
RTCC_INTERNAL // Chọn xung kích bên trong
T1_EXTERNAL // chọn xung kích bên ngoài theo đường TOCK
RTCC_EXT_L_TO_H // Xung kicks từ LOW -> High ( sườn "+" )
RTCC_EXT_H_TO_L // Xung kicks từ Hight -> Low ( sườn "-" )


ps_state là một trong những constant sau:

RTCC_DIV_2 // chọn cái tỉ số chia này có nghĩa j , có fai cứ 2 xung thì nó tăng bộ đếm lên 1
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128

chia tần số đầu vào xung kích, đúng như bạn nói,

chúc bạn thành công

vandungevn
12-07-2008, 09:17 AM
có các thắc mắc gì các bạn vào trong nay tham khảo thêm nhé, có đủ các cách lập trình cho 16F877A http://www.picvietnam.com/forum/showthread.php?t=357.
http://www.picvietnam.com/forum/forumdisplay.php?f=12

Chúc thành công.

tungtuantu
12-07-2008, 05:06 PM
bác cho em xin bản mới mà lập trình dc DsPIC đó, e down vài bản rồi đều không hỗ trợ dspic, nhân tiện cho em hỏi, bác nào lập trình cái này cho dspic thì có thấy khác hơn so với pic thường ko ah, thàng này so với thằng C30 có hơn ko ah

ngtdung.nguyen
13-07-2008, 04:54 PM
Em dùng Wizard của CCS 4.065, tạo chương trình xuất xung PWM cho PIC6F877A như sau:
(mục đích là tần số điều xung= 10kHz, 2 xung độ rộng 30% và 80%)

#include "F:\TRANNING-PIC\PWM.H"

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1); //tần số PWM = 10kHz
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_tris_c(0x00);
set_pwm1_duty(150); // độ rộng xung 30%
set_pwm2_duty(400); // độ rộng xung 80%
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while (1);
}

Mô phỏng bằng Proteus 7.2 cho thấy xung ra bị sai, cả về tần số và độ rộng xung
(xin lỗi các bác em chưa biết cách post hình lên)

Khi cài lại duty cycle, thì mô phỏng cho thấy xung ra đúng:

set_pwm1_duty(37);
set_pwm2_duty(100);


2 trường hợp này sai lệch nhau ở hệ số nhân 4 là hệ số chia tần đưa vào timer2.
Em đọc Data sheet thấy trường hợp 1 do CCS tự tính giá trị value là hợp với miêu tả về PWM. Tuy nhiên mô phỏng thấy sai.

Em có mạch chạy PIC tuy nhiên không có Oscilocope nên không biết thực tế ra sao.
Em không biết đây là do CCS sai hay do Proteus mô phỏng sai.

Mong các bác giải đáp giúp em với. Em xin cám ơn.

tungtuantu
21-07-2008, 11:59 PM
em rât mong bác nào có tàiliệu hướng dẫn dùng CCS cho DsPIC cả anh lẫn việt cũng được, post lên cho anh em với, bác nào chỉ bảo luôn dùng phiên bản nào đầy đủ của CCS để lập trình cho DSPIC với

picpen
22-07-2008, 12:57 AM
a ha. ccs ko sai và protues cũng chẳng có vấn đề gì đâu, mà vấn đề nằm ở hai thông số : period ( 124 ) và giá trị value(400) trong lệnh set_pwmx_duty(value)
thứ nhất : 2 giá trị period và value phải nằm trong khoảng : 0..255
thứ hai : khi bạn điều xung như trên thì giá trị : value luôn phải < period ( nếu value = period thì tần số bạn thu được sẽ =0 , nếu value > period thì xung ra là trùm xung ko như bạn tính toán )
Bạn đọc kỹ lại về cấu tạo và hoạt động của bộ tham 2 cũng như khối PWM
***** chúc thành công ********

dungnt7
26-07-2008, 08:17 PM
a ha. ccs ko sai và protues cũng chẳng có vấn đề gì đâu, mà vấn đề nằm ở hai thông số : period ( 124 ) và giá trị value(400) trong lệnh set_pwmx_duty(value)
thứ nhất : 2 giá trị period và value phải nằm trong khoảng : 0..255
thứ hai : khi bạn điều xung như trên thì giá trị : value luôn phải < period ( nếu value = period thì tần số bạn thu được sẽ =0 , nếu value > period thì xung ra là trùm xung ko như bạn tính toán )
Bạn đọc kỹ lại về cấu tạo và hoạt động của bộ tham 2 cũng như khối PWM
***** chúc thành công ********

Theo mình biết thì giá trị value được biểu diễn bằng 10bit, giá trị lớn nhất của value là 1024.

Value không phải lúc nào cũng nhỏ hơn period, theo datasheet thì (pwm_duty/pwm_period)=(value/(4*(tmr2+1))).

Đoạn chương trình sau xuất xung PWM 50%, f=5Khz, ở chân CCP1
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,249,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
set_tris_c(0x00);
}


Vấn đề của bạn ngtdung.nguyen mình cũng chưa hiểu vì sao bị như vậy.

cong1810
11-08-2008, 06:01 PM
Em dùng Wizard của CCS 4.065, tạo chương trình xuất xung PWM cho PIC6F877A như sau:
(mục đích là tần số điều xung= 10kHz, 2 xung độ rộng 30% và 80%)

#include "F:\TRANNING-PIC\PWM.H"

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1); //tần số PWM = 10kHz
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_tris_c(0x00);
set_pwm1_duty(150); // độ rộng xung 30%
set_pwm2_duty(400); // độ rộng xung 80%
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while (1);
}

Mô phỏng bằng Proteus 7.2 cho thấy xung ra bị sai, cả về tần số và độ rộng xung
(xin lỗi các bác em chưa biết cách post hình lên)

Khi cài lại duty cycle, thì mô phỏng cho thấy xung ra đúng:

set_pwm1_duty(37);
set_pwm2_duty(100);


2 trường hợp này sai lệch nhau ở hệ số nhân 4 là hệ số chia tần đưa vào timer2.
Em đọc Data sheet thấy trường hợp 1 do CCS tự tính giá trị value là hợp với miêu tả về PWM. Tuy nhiên mô phỏng thấy sai.

Em có mạch chạy PIC tuy nhiên không có Oscilocope nên không biết thực tế ra sao.
Em không biết đây là do CCS sai hay do Proteus mô phỏng sai.

Mong các bác giải đáp giúp em với. Em xin cám ơn.


mình cũng mới tìm hiểu về PIC và PWM!
vần đề của bạn là ở chỗ duty(150) và 400. đó là 150 là 1 số int còn 400 là số long int.cái này được đề cập trong VDu PWM của CCS c.nếu là duty là số int thì công thức tính: value=4*duty/clock*t2div.
nếu là số long int thì value=duty/clock*t2div.
thân!!

cong1810
11-08-2008, 06:07 PM
các bác cho em hỏi.em viết 1 đoạn code PWM nhỏ và mô phỏng.
lúc để value là hằng số thì mô phỏng đúng.
còn để value là biến số thì mô phỏng ko chạy gì hết.em mất cả buổi mà ko biết tại sao?
các sư huynh chỉ giáo!!em dùng 1 phím nhấn để tăng duty!!

#include<16f877a.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#byte portb=0x06
int8 value=0,period=200,percent=0;
#int_RB
void inter_RB()
{
if(percent==100)
{
percent=100;
}
else
{
percent=percent+5;
}
}
main()
{
set_tris_c(0x00);
set_tris_b(0b00010000);
portb=0x00;
enable_interrupts(INT_RB);
enable_interrupts(global);
ext_int_edge(l_to_h);
setup_CCP1(CCP_PWM);
setup_timer_2(t2_div_by_1,199,1);

while(1)
{
value=percent*period/100;
set_pwm1_duty(value);
}
}

vietkhanh
12-08-2008, 07:09 PM
cho em hỏi tí các anh sao khi em viết chương trình nào mà có dùng thư viện LCD của CCS thì đều bị lỗi khi biên dịch ạ,có hình đính kèm.

cong1810
13-08-2008, 12:48 AM
vấn đề là ở file chính.còn file lcd.c hoàn toàn đúng.

picpen
13-08-2008, 05:00 PM
Cong1810 ! Mình nghĩ biểu thức bạn dùng để tính giá trị value ko ổn ," value=percent*period/100; " , 3 biến value,percent,period bạn đều định nghĩa dạng INT8 ,vậy khi chương trình thực hiện biểu thức nó sẽ làm phép nhân trước " percent*period " ,giá trị của phép nhân này có thể lớn hơn 8 bit ( thường phải lưu vào biến 16 bit) ,nếu giá trị này lưu vào biến 8 bit nó có thể bị tràn và dẫn tới kết quả tính toán bị sai .
Mình thấy đoạn khai báo chương trình chính của bạn sai cú pháp : phải là , VOID main() ( thiếu VOID nha )

namqn
13-08-2008, 06:11 PM
Với C (kiểu dữ liệu của CCS C), bạn có thể viết tổng quát như sau:
value = (int16 (percent*period))/100;

Trong trường hợp cụ thể mà bạn dùng để thử xem nút nhấn có thay đổi được duty cycle hay không, period = 200, do đó có thể viết gọn lại là:
value = percent*2;
sẽ không xảy ra tràn số đối với value.

Thân,

cong1810
14-08-2008, 11:35 AM
Cong1810 ! Mình nghĩ biểu thức bạn dùng để tính giá trị value ko ổn ," value=percent*period/100; " , 3 biến value,percent,period bạn đều định nghĩa dạng INT8 ,vậy khi chương trình thực hiện biểu thức nó sẽ làm phép nhân trước " percent*period " ,giá trị của phép nhân này có thể lớn hơn 8 bit ( thường phải lưu vào biến 16 bit) ,nếu giá trị này lưu vào biến 8 bit nó có thể bị tràn và dẫn tới kết quả tính toán bị sai .
Mình thấy đoạn khai báo chương trình chính của bạn sai cú pháp : phải là , VOID main() ( thiếu VOID nha )

ừ nhỉ.mình ko để ý đến việc này.
cái void main.mình thấy ko có void nó vẫn hoạt động bình thường mà!!
nhưng mà mình sửa như bạn và anh namqn nói.mô phỏng vẫn ko chạy.
nhưng khi đổi sang ngắt ngoài thì ok!!
vậy tại sao vậy nhỉ!!

picpen
16-08-2008, 10:48 PM
Khi mới học lập trình thì những bài toán giao tiếp với LCD và led 7 thanh là rất cơ bản và đơn giản.
Vậy mà đã học được 1 thời gian rùi nay mình lại bị mắc một bài toán : " Hiển thị giá trị số thực lên LCD và Led 7 thanh "
Nhờ các bá cao thủ trên diễn đàn chỉ giáo, ko biết làm thế nào để xác định giá trị trong một biến là số thực hay số nguyên ??? Rồi lại còn phải tách phần nguyên và phần thập phân nữa chứ ....... hóc búa quá .** Mong được mọi người chỉ giáo ...thank ****

picpen
17-08-2008, 12:07 AM
Cong810 ! mình đã load bài của bạn về và chỉnh sửa 1 chút xíu, và giờ thì nó chạy ngon lành rùi, bạn bị mắc một lỗi rất nhỏ lên khó phát hiện ra khi chỉnh sửa.
Khi chương trình nhảy đến trình phục vụ ngắt Rb,nó sẽ thực hiện các câu lệnh trong đó,bạn dùng chân Rb4 để thực hiện phục vụ ngắt,nếu trong trình phục vụ ngắt bạn kiểm tra xem Rb4 có =1 ko, nếu =1 thì thực hiện việc thay đổi giá trị biến " percent " ,nếu ko thoát khỏi trình phục vụ ngắt ,như vậy chương trình sẽ chạy ngon lành
đây là chương trình mình đã sử và cho chạy mo fong được rồi

...#include<16f877a.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#use delay(clock=4000000)
#byte portb=0x06
int8 value=0,period=200,percent=0;
#int_RB
void inter_RB()
{
if( rb4 =1) // phai kiem tra Rb4 nhe
{
if(percent==100)percent=100;

else percent=percent+5;
}
}
main()
{
set_tris_c(0x00);
set_tris_b(0b00010000);
portb=0x00;
enable_interrupts(INT_RB);
enable_interrupts(global);
ext_int_edge(l_to_h);
setup_CCP1(CCP_PWM);
setup_timer_2(t2_div_by_1,199,1);

while(1)
{
value=percent*period/100;
set_pwm1_duty(value);
}
}

picpen
19-08-2008, 01:29 PM
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********

picpen
20-08-2008, 11:39 PM
Mòn mỏi đợi chờ ,ý kiến góp ý ,gợi ý giúp đỡ chỉ giáo của anh em trong gia đình pic mà ko có ai quan tâm giúp đỡ hic ... hic ... Chắc câu hỏi của mình chuối quá hay thiếu " I ỐT " ko biết nữa..hic ...hic

namqn
21-08-2008, 12:01 AM
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
Bạn đã đọc tài liệu hướng dẫn của CCS C chưa? Tôi không dùng CCS C, nhưng đọc qua tài liệu hướng dẫn của CCS C thì nhận thấy những điểm sau:

- Hàm printf có thể in số thực (float), có định dạng
- Hàm printf có thể xuất kết quả đến một hàm khác, thay vì ra stdout

Vậy có thể dùng hàm printf() để in số thực (float) của bạn đến một hàm nào đó, mà hàm đó sẽ xuất kết quả này lên LCD/LED 7 thanh.

Thân,

phamminhtuan
21-08-2008, 12:52 AM
có ai biết thì giúp mình giải quyết vấn đề : Hiển thị giá trị số thực lên LCD và led 7 thanh với *********** thank ***********
Bạn có thể sử dụng như sau cho LCD, dùng thư viện lcd.c của CCS luôn, nếu cần xuất cho led 7 thanh hay cái gì đó thì bạn viết lại 1 hàm giống như hàm lcd_putc() của thư viện này cũng được.

float fvar = 1.2345;
printf(lcd_putc, "Float: %f", fvar);
Nếu muốn in ra LED 7 thanh thì bạn có thể viết 1 hàm chuyển đổi ascii sang mã 7 thanh lưu trong 1 vùng RAM, tham số truyền vào là kí tự ascii, chương trình của bạn sẽ hiển thị vùng RAM đó ra LED 7 thanh, hàm này viết cấu trúc giống như lcd_putc là ok
Hàm lcd_putc như thế này

void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2); break;
case '\b' : lcd_send_byte(0,0x10); break;
default : lcd_send_byte(1,c); break;
}
}
có thể sửa lại giống thế này

unsigned char ptr = 0;
unsigned char buffer[10]; //vùng RAM chứa mã LED 7 đoạn để xuất ra, ở đây là 10 LED
void led7seg( char c) {
unsigned num;
num = c - 0x30;
buffer[ptr] = table_led7doan[num];
ptr++;
if(ptr>=10) ptr = 0;
}
//với table_led7doan[] là bảng const chứa mã 7 đoạn từ 0-9
//Bạn muốn in từ vị trí nào thì cho ptr bằng giá trị đó


//Bạn sử dụng hàm printf như sau
printf(led7seg, "Float: %f",fvar);
//đảm bảo chạy 100%

kebitmat_f
21-08-2008, 09:23 AM
Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.

kebitmat_f
21-08-2008, 09:32 AM
Cho mình hỏi thêm 1 cái nữa : khi sử dụng thạch anh 4Mhz thì chu kì thực thi 1 lệnh của vi điều khiển là 1micros. khi sử dụng thạch anh 20Mhz thì chu kì sẽ khác. Vì trong cái tutor của Nguyễn Trung Chính ở bài " Pic6f877a từ dễ tới khó" có đề cập đến vấn đề này. Sử dụng hàm tạo trễ: thời gian trễ = số chu kì lệnh*thời gian 1 lệnh .Như vậy có điều gì khác khi gọi hàm delay_ms(100) ứng với chọn thạch anh 4Mhz và 20Mhz?

phamminhtuan
21-08-2008, 11:49 AM
Mình thấy khi lập trình ccs khai báo clock=20MHz, nhưng mô phỏng bằng proteus, mục processor clock frequency =4Mhz. 1 cái nữa là thiết kế mạch dao động chọn thạch anh là 20Mhz. Như thế chương trình sẽ chạy theo 4Mhz hay 20Mhz? Tóm lại nó sẽ chạy theo ccs,proteus hay mạch cứng thạch anh? rối quá.... Mong bà kon chỉ bảo sớm.

Khai báo #use delay(clock=xxMhz) là chỉ dẫn để CCS tạo ra mã delay đúng với tần số thạch anh mà mình sử dụng, ví dụ bạn sử dụng thạch anh 4Mhz, thì khai báo #use delay(clock=4Mhz), như thế thì cái hàm delay_ms(100) mới delay đúng 100ms, còn nếu bạn khai báo 4Mhz, nhưng sử dụng thạch anh 20Mhz thì dĩ nhiên hàm delay đó sẽ không còn đúng nữa, lúc này thay vì 100ms thì nó chỉ còn 100/5 = 20ms thôi, ngoài ra nếu bạn sử dụng UART cũng không đúng, vì clock bạn khai báo sai mà.

Thế nên, bạn cứ ép buộc nó chạy thì nó vẫn chạy, không theo ý bạn thôi, muốn nó chạy đúng thì phần cứng ra làm sao, khai báo trong phần mềm như vậy

kebitmat_f
21-08-2008, 05:33 PM
Thanks nhiều nha. Mình hiểu rồi

nguyentanxuyen
21-08-2008, 06:57 PM
mình rất cần phần mềm để viết chương trình nap cho PIC. bạn chia sẽ cho mình với. thanks

namqn
21-08-2008, 07:09 PM
mình rất cần phần mềm để viết chương trình nap cho PIC. bạn chia sẽ cho mình với. thanks
Những thông tin liên quan đến PIC dành cho người mới học:
http://www.picvietnam.com/forum//showthread.php?t=4

Thân,

picpen
22-08-2008, 10:24 PM
Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
printf(led7seg, "Float: %f",fvar);???????
**** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********

phamminhtuan
22-08-2008, 11:56 PM
Cám ơn bác Nam và bác PhạmMinhTuan nhiều !! đúng là em lười biếng quá ,trong tài liệu về css có nói tới hàm printf(), em thấy hàm này rất mạnh và ngắn ngọn, cách use nó trong ccs giống hệt khi use nó trong tubo c ( c căn bản ) hi ..hi..
Từ giờ em phải chịu khó đọc thật nhiều tài liệu mới được, không cái gì cũng đem hỏi các bác thế này thì " quê" quá hic..hic
Như 2 bác chỉ thì em đã hiển thị được số thực lên LCD một cách ngon lành rùi ..... Nhưng vấn đề về led 7 thanh thì em chưa rõ nắm .theo em suy luận thì thế này nhé : giả sử ta có 1 biến giá trị là " VALUE " chẳng hạn , nếu giá trị này là số nguyên thì em biết cách hiển thị rồi ,nhưng nếu nó là số thực thì theo em đầu tiên ta phải tách các chữ số ( bcd) trong giá trị đó ra thành các số như: số hàng trăm,chục,đơn vị..( các số phần nguyên),sau đó xác định các chữ số phần thập phân rồi xác định dấu chấm nằm ở đâu . sau đó ta mới xuất các giá trị đó ra cổng kết nối với led 7 thanh ........
Dù đã cố gấng đọc ct của bác Phamminhtuan em vẫn chưa hiểu sao lại dùng hàm printf() xuất ra led 7 thanh
printf(led7seg, "Float: %f",fvar);???????
**** Cám ơn bác ,mong bác chỉ rõ hơn ********** Thank ********
Có lẽ cũng là bạn bên dientuvietnam.net: http://dientuvietnam.net/forums/showpost.php?p=126768&postcount=6
Mình đã viết rõ trong luồng này rồi, cái bảng table_led7doan[] định nghĩa const với 20 giá trị là mã 7 đoạn từ 0-9 và mã 7 đoạn từ 0-9 có dấu chấm,

luanktd
23-08-2008, 03:06 AM
Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
#include<18f4431.h>
#fuses NOWDT,NOLVP,PUT,XT
#byte PORTB=0xF81
#byte TRISB=0xF93
void main()
{
While(1)
{
TRISB=0x00;
PORTB=0x0F;
}
}
Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo

picpen
23-08-2008, 07:07 PM
Chương trình của bạn thiếu hàm khai báo sử dụng tần số thạch anh cho pic :
#use delay(clock= x ) , x là tần số thạch anh mà bạn dùng cho pic ,nó có thể là 4Mhz ,10,12 hoặc 20Mhz tùy bạn chọn.

namqn
23-08-2008, 07:47 PM
Mình muốn hỏi các bác.Mình có viết một chương trình sau với PIC8F4431 nhưng khi dịch ra chạy thì chạy không đươc
#include<18f4431.h>
#fuses NOWDT,NOLVP,PUT,XT
#byte PORTB=0xF81
#byte TRISB=0xF93
void main()
{
While(1)
{
TRISB=0x00;
PORTB=0x0F;
}
}
Các chân ở portB đều là 0V hết.Mong các bác chỉ giáo
Bạn chạy thử bằng mô phỏng hay mạch thật? Nếu thử bằng mạch thật thì tần số thạch anh được sử dụng là bao nhiêu?

PIC18F4431 có 7 từ cấu hình, trong đó tối thiểu các từ cấu hình 1 đến 4 cần được thiết lập giá trị ban đầu. Bạn chỉ thiết lập có vài cụm cấu hình trong số đó. Tôi đã gặp nhiều trường hợp PIC18F không chạy trong mạch thật, chỉ vì thiết lập thiếu các từ cấu hình.

Khi viết code cho PIC18, tôi luôn thiết lập đầy đủ các từ cấu hình. Ví dụ dưới đây viết cho MPLAB C18, dùng cho các PIC18 như PIC18Fx320:
//Configuration bits
#pragma config OSC = INTIO1
#pragma config FSCM = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 27
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config PBAD = DIG
#pragma config CCP2MX = C1
#pragma config STVR = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF


Thân,

popeye_ts22
26-08-2008, 11:55 PM
Em đọc về ADC rùi gửi lên LCD mà sao chẳng thấy hiển thị đúng ADC mà toàn ra giá trị lung tung các bác ạ.Em bỏ chân biến trở ra mà màn hình vẫn cứ hiện giá trị lung tung.Em biết đấy không phải là ADC nhưng không hiểu vì sao.Các bác giúp thằng em với..

#include <16f877a.h>
#include <def_877a.h>
#device 16F877*=16 ADC=10
#use delay(clock=8000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd_lib_4bit.c>

unsigned int a,b,c,d,adc;
long value;
char *text;
void main()
{
set_tris_d(0);
setup_adc_ports( AN0_AN1_AN3 );
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel( 0 );
delay_ms(100);
text="V";
while(1)
{
adc=read_adc();
//value=(adc*5000)/1023;

value = (long)adc * 5000; // covert adc reading to milivolts
value = value / 1023; // 0..1023 -> 0-5000mV
a=value/1000;
b=(value-(a*1000))/100;
c=(value-(a*1000)-(b*100))/10;
d=(value-(a*1000)-(b*100)-(c*10));
LCD_Init();
LCD_putcmd(0x80);
LCD_putchar(48+a);
LCD_putcmd(0x81);
LCD_putchar(48+b);
LCD_putcmd(0x82);
LCD_putchar(48+c);
LCD_putcmd(0x83);
LCD_putchar(48+d);
LCD_putcmd(0x84);
LCD_putchar(text);
delay_ms(100);
}
}

popeye_ts22
27-08-2008, 12:23 AM
Em còn 1 số câu hỏi nữa tiện thể các bác trả lời luôn cho em:
- Có set đc 1 chân khác của PIC làm chân PWM không ạ.
- Khi Timer2 hoạt động PWM thì còn mình còn dùng làm Timer để đếm thời gian được không.Nếu điều khiển 2 động cơ cùng 1 lúc thì bắt buộc phải dùng đến Timer0,timer1 để đếm xung về,và như thế là hết các bộ timer,counter phải ko ạ.
- ADC có 8 kênh,nếu em dùng cả 8 kênh thì Vref=Vdd.Vậy thì ADC sẽ rất dễ bị nhiễu đúng không ạ.Có cách nào khắc phục được không ạ.
- Trong CCS mình chỉ cần chọn ALL ANALOG là chip mặc định Vref=Vdd có phải ko ạ.

namqn
27-08-2008, 02:09 AM
Em còn 1 số câu hỏi nữa tiện thể các bác trả lời luôn cho em:
- Có set đc 1 chân khác của PIC làm chân PWM không ạ.
- Khi Timer2 hoạt động PWM thì còn mình còn dùng làm Timer để đếm thời gian được không.Nếu điều khiển 2 động cơ cùng 1 lúc thì bắt buộc phải dùng đến Timer0,timer1 để đếm xung về,và như thế là hết các bộ timer,counter phải ko ạ.
- ADC có 8 kênh,nếu em dùng cả 8 kênh thì Vref=Vdd.Vậy thì ADC sẽ rất dễ bị nhiễu đúng không ạ.Có cách nào khắc phục được không ạ.
- Trong CCS mình chỉ cần chọn ALL ANALOG là chip mặc định Vref=Vdd có phải ko ạ.
1. Bạn có thể dùng một chân I/O thông thường để tạo PWM bằng phần mềm (một số đặc điểm về loại tín hiệu PWM này tôi đã từng đề cập trên diễn đàn).

2. Khi Timer2 được dùng cho chức năng PWM của module CCP thì nó vẫn là timer, nếu khéo léo thì chúng ta vẫn dùng được nó như một bộ đếm thời gian. Nếu điều khiển 2 động cơ cùng lúc thì còn tùy vào trường hợp cụ thể, khả năng vận dụng của người thiết kế, không nhất thiết phải dùng hết 3 timer.

3. Nếu thiết kế kém hiệu quả thì một kênh ADC cũng nhiễu, nếu thiết kế tốt thì 8 kênh vẫn chạy tốt.

4. Tôi không dùng CCS C, nhường câu trả lời cho các bạn dùng CCS C.

Thân,

picpen
27-08-2008, 12:18 PM
Đầu vào ADC rất nhạy và cũng rất rễ nhiễu nếu thiết kế phần cứng không tốt
Bác Nam ơi ,bác có thể cho em và mọi người biết: một số biện pháp và chú ý khi thiết kế phần cứng cho bộ chuyển đổi ADC của pic chứ ??
Em cũng đang làm việc với 8 đầu vào ADC của pic6f877a ,8 đầu vào này đc nối với 8 cảm biến,em dùng 1 lá 103 mắc từ mỗi cổng ADC nối xuống mass để lọc nhiễu tần số cao ...... nhưng kết quả cũng ko tốt nắm. vì các cổng tín hiệu vẫn bị nhiễu lẫn nhau : cứ có 1 đầu vào thay đổi thì các đầu vào còn lại it nhiều bị nhiễu ,ảnh hưởng và thay đổi theo

** Mong mọi người giúp đỡ vấn đề trên ****** Thanks ...........

namqn
27-08-2008, 08:12 PM
Đầu vào ADC rất nhạy và cũng rất rễ nhiễu nếu thiết kế phần cứng không tốt
Bác Nam ơi ,bác có thể cho em và mọi người biết: một số biện pháp và chú ý khi thiết kế phần cứng cho bộ chuyển đổi ADC của pic chứ ??
Em cũng đang làm việc với 8 đầu vào ADC của pic6f877a ,8 đầu vào này đc nối với 8 cảm biến,em dùng 1 lá 103 mắc từ mỗi cổng ADC nối xuống mass để lọc nhiễu tần số cao ...... nhưng kết quả cũng ko tốt nắm. vì các cổng tín hiệu vẫn bị nhiễu lẫn nhau : cứ có 1 đầu vào thay đổi thì các đầu vào còn lại it nhiều bị nhiễu ,ảnh hưởng và thay đổi theo

** Mong mọi người giúp đỡ vấn đề trên ****** Thanks ...........
Có nhiều vấn đề liên quan đến câu hỏi của bạn mà hiện giờ tôi cũng chưa có thời gian tìm lại các tài liệu. Bạn có thể xem qua phần "Common Design Mistakes" trong tài liệu "ABCs of ADCs" của National Semiconductor (link download dưới đây), để từ đó tránh được một số lỗi thiết kế thường gặp. Điều này đôi khi có thể giúp bạn có được một thiết kế đủ tốt, chứ chưa cần đến những kỹ thuật phức tạp khác.

http://www.national.com/appinfo/adc/files/ABCs_of_ADCs.pdf

Thân,

picpen
27-08-2008, 11:08 PM
Cám ơn bác Nam nhiều !!!!

bean984
28-08-2008, 11:51 AM
mình đang tìm hiểu con 16f628a. đang làm với 16f877a bg chuyển qua tìm hiểu con này. loay hoay mãi vẫn không điều khiển được chân RA4. mình cũng đã thử kéo con trở 1k lên VDD nhưng cũng k đc. xin hỏi làm sao để set chân RA4 thành chân I/O? con này còn có chân nào đặc biệt không?
cảm ơn mọi người.

namqn
28-08-2008, 10:08 PM
mình đang tìm hiểu con 16f628a. đang làm với 16f877a bg chuyển qua tìm hiểu con này. loay hoay mãi vẫn không điều khiển được chân RA4. mình cũng đã thử kéo con trở 1k lên VDD nhưng cũng k đc. xin hỏi làm sao để set chân RA4 thành chân I/O? con này còn có chân nào đặc biệt không?
cảm ơn mọi người.
Để tránh cho chân RA4 là ngõ ra của bộ so sánh thứ hai, cần đảm bảo 3 bit thấp nhất của thanh ghi CMCON khác với giá trị "110". Vì RA4 là loại ngõ ra cực máng hở, nhất thiết phải có điện trở kéo lên để xuất mức cao ra chân này.

Các chân RA0 .. RA3 sẽ ở trạng thái analog khi vừa reset PIC, cần thay đổi 3 bit thấp nhất của thanh ghi CMCON một cách thích hợp (xem hình 10-1 trong datasheet) để có thể dùng chúng như chân digital.

Thân,

bean984
29-08-2008, 10:42 AM
ý e muốn hỏi là nếu dùng ccs thì sẽ phải làm ntn? (e đã đọc datasheet và cũng đã biết phải thiết lập thanh ghi CMCON như vậy)? e k muốn chèn đoạn mã asm vào trong chương trình.

#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
ngatRB=1;
if(!RB4)
{
//ngatRB4=1;
if(tg==0)
{
tg=30;
goto Thoat;
}
if(tg==30)
{
tg=60;
porta=6;
goto Thoat;
}
if(tg==60)
{
tg=90;
porta=9;
goto Thoat;
}
if(tg==90)
{
tg=120;
porta=1;
goto Thoat;
}
}// Xong RB4
if(!RB5)
{
ngatRB5=1;
}// Endif(RB5)
thoat:
RBIF=0; //Xoa co ngat RB
} // Ket thuc if co ngat
}// Ket thuc ham void*/

a xem giúp e đoạn code trên xem tại sao e phải ấn 2 lần nút bấm tại RB4 thì nó mới chịu thực hiện ngắt? đoạn code đó chạy cho con 16f877a thì ngon lành nhưng khi đưa qua con 628a thì bị như vậy.
thanks!

cong1810
29-08-2008, 11:36 AM
em đang thực hành về LCD 4 bit. sử dụng file lcd.c có sẵn trong thư viện của CCS C.nhưng trong file lcd.c các chân enable RS và RW nó sắp ko theo thứ tự để mỉnh cắm bus cho tiện. em muốn hỏi cách mình thay đổi thứ tự chân E,RW,RS trong file LCD.C. em tìm cả buổi rồi mà ko thấy chỗ nó khai báo.các huynh giúp đệ với!!!!

buiminhtu
29-08-2008, 07:17 PM
bác nào có CCSC 3.242 cho em xin voi
thanks

namqn
29-08-2008, 07:45 PM
bác nào có CCSC 3.242 cho em xin voi
thanks
Bạn đọc kỹ post #1 của luồng này:
http://www.picvietnam.com/forum/showthread.php?t=958

Thân,

popeye_ts22
30-08-2008, 12:29 AM
Chào các bác.Có chút vướng mắc,các bác giúp em với.
Mục đích:Điều khiển động cơ phản hồi tốc độ về LCD
Thực hiện:Điều khiển được động cơ nhưng chưa phản hồi đc.
Em không biết sau mỗi lần gọi ngắt có cần phải để 1 vòng while() để đợi ngắt không.
Em dùng 16F877A,bây giờ điều khiển 1 kênh đã phải cần:TIMER2-PWM,TIMER 0:Đếm xung,TIMER1:Đếm thời gian,dùng để tính toán vận tốc.
Vậy nếu em dùng động cơ thứ 2 phải làm thế nào,có thuật toán nào ko ạ.
Có đoạn code và chương trình mô phỏng,các bác xem cho em:

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#include <lcd_lib_4bit.c>
int16 cnt,cnt2,xung,v;
int8 a,b,c;
#int_TIMER0
void TIMER0_isr(void) //TIMER0 dem xung ve
{
set_timer0(255);
if(tmr0if==1)
{
cnt++;
tmr0if=0;
}
}
#int_TIMER1 //TIMER1 dem tgian,tinh van toc
void TIMER1_isr(void)
{
set_timer1(5565);
if(tmr1if==1)
{
xung=get_timer0()*4;
v=(xung*60)/((100*60*0.001));
tmr1if=0;
}
}
void Lcd()
{
while(1)
{
a=(int)v/100;
b=(int)(v-a*100)/10;
c=(int)v%10;
LCD_putcmd(0xC0);
LCD_putchar("xung encoder");
LCD_putcmd(0x80);
LCD_putchar(a+48);
LCD_putcmd(0x81);
LCD_putchar(b+48);
LCD_putcmd(0x82);
LCD_putchar(c+48);
}
}
void Ngat()
{
set_timer0(255);
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
enable_interrupts(INT_TIMER0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
set_timer1(5565);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
void PWM()
{
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_pwm1_duty(1000);
set_pwm2_duty(1022);
}
void main()
{
set_tris_d(0);
set_tris_a(0xff); //Cho tin hieu di vao RA4
set_tris_c(0);
LCD_Init();
PWM();
Ngat();
Lcd();
delay_ms(100);
}

popeye_ts22
31-08-2008, 12:55 AM
Em đã sửa lại bài chỉn chu rùi,bác nào giúp đỡ em với.Đo vận tốc về nó cứ hiện 215,em thay đổi giá trị biến trở để thay đổi tốc độ mà hiển thị không thay đổi.
**.Em dùng encoder 100 xung/1 vòng

picpen
01-09-2008, 12:32 AM
Mình vẫn theo dõi chuyên mục này đều đặn.Mình đợi mọi người trả lời câu hỏi của bạn Bean984 vì mình cũng đang thắc mắc như bạn, nhưng chưa thấy ai trả lời nên mình xin hỏi lại và nhờ mọi người trên diễn đàn chỉ giúp :
Làm thế nào để sử dụng chân RA4 như 1 chân I/O bình thường trong khi các chân còn lại của portRA vẫn sử dụng chức nằng đầu vào AD ?? trong ccs phải khai báo như nào ? vì nếu sử dụng câu lênh " set_tris_A(??) " để định thực hiện chức năng I/0 cho RA4 thì các chân còn lại của portRA cũng sẽ bị định dạng chức năng I/0 theo ,khi đó ko thể sử dụng làm cổng vào AD được

************ mong mọi người giúp đỡ .. Thanks ********

lion
01-09-2008, 01:00 AM
Mình vẫn theo dõi chuyên mục này đều đặn.Mình đợi mọi người trả lời câu hỏi của bạn Bean984 vì mình cũng đang thắc mắc như bạn, nhưng chưa thấy ai trả lời nên mình xin hỏi lại và nhờ mọi người trên diễn đàn chỉ giúp :
Làm thế nào để sử dụng chân RA4 như 1 chân I/O bình thường trong khi các chân còn lại của portRA vẫn sử dụng chức nằng đầu vào AD ?? trong ccs phải khai báo như nào ? vì nếu sử dụng câu lênh " set_tris_A(??) " để định thực hiện chức năng I/0 cho RA4 thì các chân còn lại của portRA cũng sẽ bị định dạng chức năng I/0 theo ,khi đó ko thể sử dụng làm cổng vào AD được

************ mong mọi người giúp đỡ .. Thanks ********
bạn thử lam` như thế này xem :


...................
...................
...................

#bit TRISA4 = 0x85.4

..................
..................
..................

void main(void)
{
TRISA4=0 ;
............
............
............




};

cong1810
01-09-2008, 07:23 PM
em cũng đang theo dõi câu trả lời cho bài dk động cơ của bạn popeyee mà chưa thấy sư huynh nào trả lời.nên em hỏi vấn đề của em luôn.
em cũng làm 1 bài tập tương tự.nhưng làm mạch thật.em dùng chính tần số PWM để kiểm tra chương trình đếm xung từ động cơ.nhưng khi percent PWM là 100 hay 0% thì LCD luôn hiện số 175 còn khi có xung thì sai lệch rất lớn 40-50%.đây là đoạn code của em.các huynh chỉ giáo!!!

#include <16f877a.h>
//#include <def_877a.h>
#fuses NOWDT,NOPROTECT,XT,NOLVP
#use delay(clock=4000000)
#define use_portd_lcd True
#define portb=0x06
#define portd=0x08
#include <lcd.c>
#define interr_per_second 20//khi set_timer1(15535)timer 1 16 bit=>65535-15535=50.000us
#define interr_per_100ms 2//khi set_timer1(15535)
int8 timer1over,value,percent;
int16 so_vong,count,tram,chuc,donvi,ngan;
#int_rtcc
void interrupt_timer0()//dem so vong dong co
{
++count;
}
#int_timer1 // ngat timer 1 khi timer 1 tran
void interrupt_timer1()
{
if (--timer1over==0)
{ timer1over=interr_per_second;
so_vong=(count*255+get_timer0());//100; //voi encoder la 100 xung tính trong 1 s
count=0;
set_timer0(15535);
}
}
#int_ext
void ngatngoai() // tang he so duty cho DC
{
if(percent==0)percent=0;
else
{
percent=percent-5;
value = percent*2;
}
}
void tao_ma_so_vong()
{
ngan=so_vong/1000;
tram=(so_vong-ngan*1000)/100;
chuc=(so_vong-ngan*1000-tram*100)/10;
donvi=so_vong%10;
}
void hienthi_lcd()
{
lcd_gotoxy(1,2);
lcd_putc(ngan+0x30);
lcd_putc(tram+0x30);
lcd_putc(chuc+0x30);
lcd_putc(donvi+0x30);

}
//ham main chinh
main()
{
delay_ms(100); //tao thoi gian tre de khoi tao LCD
lcd_init(); // khoi tao LCd
// cac cong I O
set_tris_a(0xff); //cho port a la port thu, su dung chan RA4
set_tris_b(0x01);
output_b(0x01); //tao muc cao cho ngat ngoai
set_tris_c(0);
// enable cac timer
setup_timer_0(rtcc_div_1|rtcc_ext_h_to_l); // timer 0 lam couter
set_timer0(0); // gia tri dau timer 0
setup_timer_1(t1_internal|t1_div_by_1); // dung inter clock,dinh thoi gian 1 s
set_timer1(15535); // gia tri de ngat xay ra 20lan/ 1 s
// configue cac ngat
enable_interrupts(global); //cho phep ngat
enable_interrupts(int_rtcc); // ngat timer 0
enable_interrupts(int_timer1); // ngat timer 1
enable_interrupts(int_ext); // cho ngat ngoai
ext_int_edge(h_to_l); // ngat ngoai canh xuong
// khoi tao che do PWm
setup_timer_2(t2_div_by_1,199,1); // t2div=1=>f=5khz,period=200
// setup_timer_2(t2_div_by_4,199,1); //t2div=4=>f=1250hz,period=200
// setup_timer_2(t2_div_by_16,199,1); //t2div=16=>f=312hz,period=200
setup_ccp1(CCP_PWM); // xung PWm tren chan CCP1 RC2
// khoi tao cac gia tri bien ban dau
count=0;
so_vong=0;
timer1over=interr_per_second;
value=200; // do phan cung dieu xung muc thap
percent=100; //phan cung dung xung muc thap
// tao mau cho lcd
lcd_gotoxy(1,1);
lcd_putc('s');
lcd_putc('o');
lcd_putc('-');
lcd_putc('v');
lcd_putc('o');
lcd_putc('n');
lcd_putc('g');
lcd_putc('-');
lcd_putc('1');
lcd_putc('s');
lcd_putc(':');
//bat dau vong lap
while(1)
{
set_pwm1_duty(value);
tao_ma_so_vong();
hienthi_lcd();

}
}

picpen
01-09-2008, 07:31 PM
Thanks Lion !! mình làm như bạn hướng dẫn và mô phỏng proteus rất ổn....

namqn
01-09-2008, 07:34 PM
Mình vẫn theo dõi chuyên mục này đều đặn.Mình đợi mọi người trả lời câu hỏi của bạn Bean984 vì mình cũng đang thắc mắc như bạn, nhưng chưa thấy ai trả lời nên mình xin hỏi lại và nhờ mọi người trên diễn đàn chỉ giúp :
Làm thế nào để sử dụng chân RA4 như 1 chân I/O bình thường trong khi các chân còn lại của portRA vẫn sử dụng chức nằng đầu vào AD ?? trong ccs phải khai báo như nào ? vì nếu sử dụng câu lênh " set_tris_A(??) " để định thực hiện chức năng I/0 cho RA4 thì các chân còn lại của portRA cũng sẽ bị định dạng chức năng I/0 theo ,khi đó ko thể sử dụng làm cổng vào AD được

************ mong mọi người giúp đỡ .. Thanks ********
Bạn bean984 hỏi về PIC16F628A, còn bạn hỏi về PIC16F877A hay PIC16F628A? Tôi hỏi bạn câu này vì PIC16F628A không hề có module AD, mà chỉ có module so sánh tương tự (analog comparator).

TRISA cho phép thiết lập trạng thái vào/ra cho từng chân riêng biệt, không có chuyện không thể dùng các chân RA khác độc lập với RA4.

Bạn cần phân biệt rõ khái niệm chức năng I/O của chân với chế độ làm việc digital hay analog. Nếu chân làm việc ở chế độ analog, nó là ngõ vào (vì PIC không có chức năng xuất tín hiệu analog, thông qua một module DAC). Nếu chân làm việc ở chế độ digital, nó có thể là ngõ vào hay ngõ ra. Nếu bit tương ứng của TRISA là '1', chân đó là ngõ vào, ngược lại, bit tương ứng của TRISA là '0', chân đó là ngõ ra. Điều này đúng cho cả hai chế độ analog và digital của chân I/O.

Thân,

picpen
01-09-2008, 07:48 PM
Công à ! mình chưa làm với encoder bao giờ lên ko thể góp ý với bạn về chương trình được .Nhưng mình thấy chương trình của bạn khá dài do viết mã cho LCD .bạn có thể dùng file LCD.C có sẵn trong thư viện CCS để cho chương trình ngắn gọn hơn, mọi người trên diễn đàn rễ đọc và chỉnh sửa giúp bạn. ví dụ nhé :
đoạn ct con này:

void hienthi_lcd()
{
lcd_gotoxy(1,2);
lcd_putc(ngan+0x30);
lcd_putc(tram+0x30);
lcd_putc(chuc+0x30);
lcd_putc(donvi+0x30);

}
..............
..............
// tao mau cho lcd
lcd_gotoxy(1,1);
lcd_putc('s');
lcd_putc('o');
lcd_putc('-');
lcd_putc('v');
lcd_putc('o');
lcd_putc('n');
lcd_putc('g');
lcd_putc('-');
lcd_putc('1');
lcd_putc('s');
lcd_putc(':');

bạn chỉ cần dùng 1 lệnh duy nhất để hiển thị:
Printf( lcd_putc,"so_vong_1s:%d",value )

lion
02-09-2008, 12:14 AM
Công này đoạn code này gây ra lỗi sai :

//---------------------------------------------------------------
ngan=so_vong/1000;
tram=(so_vong-ngan*1000)/100;
chuc=(so_vong-ngan*1000-tram*100)/10;
donvi=so_vong%10;
//---------------------------------------------------------------

mình cũng đã từng gặp lỗi này , nhưng ko thể nào điều chỉnh được :
nguyên nhân là do trình dịch CCS không sử lý được phép chia > 8 bit :

vi du :

unsigned char so1,so2,so3,so4 ;
//---------------------------------------------------------

void tach_so( unsigned int data )
{
so1 = data / 1000 ;
so2 = (data % 1000)/100 ;
so3 = ((data % 1000)%100)/10 ;
so4 = ((data % 1000)%100)%10 ;
}

//----------------------------------------------------------
void main(void)
{
TRISA=0xff;
TRISB=0xff;
TRISC=0x00;
TRISD=0x00;

while(1)
{

tach_so( 1234 ) // cho kết quả hiển thị sai

hien_thi( so1 );
hien_thi( so2 );
hien_thi( so3 );
hien_thi( so4 );

};
}
//------------------------------------------------

nếu gán cho hàm : tach_so( 1234 ) ( data > 255 ) thì kết quả hiển thị sẽ sai , còn nếu gán cho hàm : tach_so( 223 ) ( data < 255 ) thì kết quả hiển thị đúng .

cong1810
02-09-2008, 12:17 AM
cám ơn anh picpen.nhưng làm theo cách của anh thì em thấy có 1 hạn chế.có lẽ do em chưa tìm ra giải pháp.vần đề thế này.nếu dùng theo cách của anh.chương trình gọn gàng nhiểu lắm nhưng khi tốc độ thay đổi thì những số lớn sẽ ko bị mất.
vd thế này lcd hiển thị số 1111. sau đó vận tốc giảm còn 222.tức là chỉ 3 chữ số.nhưng trên lcd số thứ 4 ko bị mất.nên kết quả hiển thị là 2221.
cách làm của em thế này
lcd_gotoxy(1,1);
Printf( lcd_putc,"so_vong_1s:%ld",so_vong);
do em khởi tạo vị trí đầu là cố định nên có hiện tương trên!!các anh góp ý khắc phục!!

lion
02-09-2008, 12:21 AM
Ko biết có bậc tiền bối nào gặp nỗi này chưa ???
nếu gặp rồi, sửa được nỗi trên xin chi giúp .

cong1810
02-09-2008, 12:25 AM
anh lion!!
em dùng cách hiển thị theo anh PICPEN hướng dẫn.nó cũng hiện lên giống như vậy! dùng lệnh printf! vậy để em thử với tần số nhỏ hơn 255 thử xem.do em dùng xung PWM để kiểm tra! hì hì!!

cong1810
02-09-2008, 12:55 AM
hix!!vẫn ko đúng.chắc em phải mua cái encoder làm cho đàng hoàng thôi!!thanks các huynh đã để tâm!!

popeye_ts22
02-09-2008, 10:32 PM
Mình test mãi và cũng đang nghi ngờ chân tín hiệu của encoder.Bác nào biết giúp em sửa bài đo và phản hồi tốc độ về LCD với.(Bài bên page6)..
Thank's các bác..

picpen
03-09-2008, 01:13 AM
trích:
cám ơn anh picpen.nhưng làm theo cách của anh thì em thấy có 1 hạn chế.có lẽ do em chưa tìm ra giải pháp.vần đề thế này.nếu dùng theo cách của anh.chương trình gọn gàng nhiểu lắm nhưng khi tốc độ thay đổi thì những số lớn sẽ ko bị mất.
vd thế này lcd hiển thị số 1111. sau đó vận tốc giảm còn 222.tức là chỉ 3 chữ số.nhưng trên lcd số thứ 4 ko bị mất.nên kết quả hiển thị là 2221.
cách làm của em thế này
Code:

lcd_gotoxy(1,1);
Printf( lcd_putc,"so_vong_1s:%ld",so_vong);

do em khởi tạo vị trí đầu là cố định nên có hiện tương trên!!các anh góp ý khắc phục!!
Bạn có thể khắc phục cách trên bằng cách: định dạng giá trị cần hiển thị là FLOAT, khi đó lệnh:
Printf( lcd_putc,"so_vong_1s:%f",so_vong);
sẽ in lên lcd giá trị của so_vong , khi so_vong thay đổi thì lcd in đúng giá trị,còn những số đằng sau dấu phẩy ' . ' sẽ là 000... ,cách này hiển thị đúng giá trị số vòng nhưng nhìn ko được đẹp mắt nắm
Cách khác: bạn chỉ cần chèn lệnh xóa màn hình trước khi hiển thị giá trị mới vậy là ok

cong1810
03-09-2008, 07:27 PM
huynh PICPEN ơi.cách thứ 1 có lẽ đúng nhưng chỉ có thể giải quyết vấn đề nêu ra còn ko dùng được.bởi em có dùng đến lệnh % để lấy số dơn vị để hiển thị nên ko dùng được dạng float. cách thứ 2 cũng ko được luôn.bởi vì em cho cập nhật và hiển thị liên tục lên lcd trong vòng lặp while.có lẽ do chương trình còn ngắn nên thời gian giữa lệnh xóa và hiển thị ko đủ lớn =>lcd ko hiển thị gì hết.hì!!
lúc huynh làm thì huynh dùng cách nào vậy! có vướng phải vấn đề trên ko?

popeye_ts22
05-09-2008, 01:41 AM
Mò mẫm mãi cũng ra bài đo tốc độ,đưa xung encoder lên tính vận tốc.Lúc đầu thì encoder hỏng,sau thì tính sai 1 chỗ trong vòng ngắt.hihi.Mới học Pic nên còn gà wá...Em post bài đã làm được lên share cho bác nào cũng mới nghiên cứu PIC như em,gặp phải bài toán này hi vọng các bác sẽ ko bị mất time nữa.
Compiler: CCSC 4.065
PIC:16F877A
Encoder:100xung/vòng
Code:

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#include <lcd.c>
float vantoc,soxung;
int8 a,b,c,d,a1;
int16 sovong,i;
#int_TIMER1
void TIMER1_isr(void)
{
soxung=get_timer0(); //Lay so xung Timer0 dem
set_timer1(55535); // Trong 1ms
if(tmr1if==1)
{
intcon=0; //stop ngat
a1=1;
}
}
void main()
{
trisa=255; //Cho RA4 di vao
trisb=0;
trisc=0;
trisd=0;
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("Beginning....");
delay_ms(1000);
lcd_putc('\f');
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
rd7=0; //Mo role,quay theo 1 chieu
for(i=0;i<1024;i++) //0 la quay nhanh,1024 quay cham-->Do mach thiet ke.
{
set_pwm1_duty(i); // Toc do giam dan
delay_ms(1);
set_timer0(0);
set_timer1(55535);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1); //Che do counter
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
delay_ms(50);
if(a1==1)
{
//while (1)
//{
vantoc=((float)(60*soxung)/(0.01*100)); //Tinh van toc
a=vantoc/1000; //Tach so..
b=(int)(vantoc-1000*a)/100;
c=(int)(vantoc-1000*a-100*b)/10;
d=(int)vantoc%10;
lcd_gotoxy(1,1); //Hien thi
lcd_putc(a+48);
lcd_gotoxy(2,1);
lcd_putc(b+48);
lcd_gotoxy(3,1);
lcd_putc(c+48);
lcd_gotoxy(4,1);
lcd_putc(d+48);
lcd_gotoxy(6,1);
lcd_putc("vong/ph");
lcd_gotoxy(3,2);
lcd_putc("toc do dc");
delay_ms(5); //Vong for0->1024 nen delay it.
tmr0if=0;tmr1if=0; //Xoa tran
}
}
}

Chúc các bác thành công.

picpen
15-09-2008, 03:04 PM
Mọi người cho hỏi ,khi khai báo cấu hình cho pic thì lệnh này có ý nghĩa gì và hoạt động ra sao????

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

khi khai báo lệnh :" xmit=PIN_C6, rcv=PIN_C7 " thì 2 chân RC6,7 luôn ở mức cao ,ko thể sử dụng làm cổng ra được
khi mà xóa lệnh khai báo đó đi thì lại ảnh hưởng tới cổng chuyển đổi ADC .cụ thể như sau : khi mình bỏ lệnh đó đi thì mình thay đổi biến trở ở cổng vào tương tự An0 thấy điện áp tăng ko tuyến tính như khi có lệnh " xmit=PIN_C6, rcv=PIN_C7 " được khai báo .khi mới tăng biến trở từ mức 0% lên 1 it thì điện áp vào An0 đã nhảy tớ >1v ,rồi tăng vọt lên khoảng 4V ,khi này mình tăng biến trở lên thì gần như điện áp ko tăng lên được nữa .

Nói tóm lại là cổng ADC hoạt động ko còn đúng nữa
Rất mong mọi người giải thích cho .trong khi mình cần sử dụng cổng ADC và 2 chân Rc6,7 làm cổng ra

********* Cám ơn mọi người ,mình cần khắc phục vấn đề này gấp ( vì ko còn thời gian ,mình sắp phải bảo vệ rồi ) .......Thanks

cong1810
16-09-2008, 03:39 PM
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) câu lệnh này là khai báo sử dụng cổng nối tiếp RS232,chân C6 là chân truyền data,C7 là nhận.tốc độc truyền là 9600 bauld.em thấy nó ko có liên quan gì đến ADC hết.chắc do chương trình mô phỏng rồi!!

quocloc.pham
16-09-2008, 04:28 PM
Mình viết code cho 18F452 nhưng không compiler được, nó báo lỗi "Unknown device type -- Try PCH", sau đó mình thử viết cho 18F2450,18f4550 đều bị lỗi như thế!
bạn nào biết vui lòng giúp với
mình sử dụng ccsc 3.249

picpen
17-09-2008, 12:55 PM
Trich:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) câu lệnh này là khai báo sử dụng cổng nối tiếp RS232,chân C6 là chân truyền data,C7 là nhận.tốc độc truyền là 9600 bauld.em thấy nó ko có liên quan gì đến ADC hết.chắc do chương trình mô phỏng rồi!!
Đọc kỹ lại tài liệu thì đúng là 2 vấn đề này chẳng liên quan gì đến nhau ,và chạy mạch thực tế thì cũng ok , vậy mà khi mô phổng bằng Proteus thì lại trục trặc.... cái thằng Proteus này nắm lúc nó giở trứng kỳ quặc quá ,sau khi cài lại proteus chạy thì lại ok ,nó làm mình hú vía giờ thì ổn rùi

leejongfan
23-09-2008, 11:16 AM
Cho em hỏi: có cách nào convert tu CCS sang Mikro C ko ah?

cong1810
02-10-2008, 10:23 PM
em khai báo chế độ power pwm cho pic18f4431.hoạt động ở chế độ independent.vậy mà khi set_power_pwm3_duty();cho các chân thì CCS C báo là undefined identify cho các chân 1,3,5. còn các chân 0,2,4 thì ok.vậy em phải khai báo thêm cho nó ở chỗ nào.
các anh giúp với ạ!!

cong1810
02-10-2008, 10:38 PM
hình như không có cách nào làm theo yêu cầu em muốn được.bởi trong data sheet thì chỉ có 1 thanh ghi duty cycle cho 2 chân 0 và 1 .tức là 2 chân này sẽ xuất xung giống nhau ở chế độ independent!! các huynh check lại dùm đệ xem đúng vậy ko!!?

cong1810
02-10-2008, 10:53 PM
các anh ui!! ai có file def_18f4431 .cho em xin với nhé.nếu chưa có thì chắc em phải mần hết 1 ngày quá!! thanks các huynh!!

bean984
16-10-2008, 03:24 PM
giúp mình với!!!!
ai rành về counter xin chi mình cách thiết lập timer ở chế độ đếm?nếu có code thì tốt quá!!!
có phải cứ có 1 xung đếm thì timer sẽ ngắt 1 lần?
mình thử viết như thế này nhưng k thấy nó chạy j cả.

#include "16F877A.h" // PIC16F877A header file
#device 16F877A*=16 ADC=10
#include <defs_16F877A.h>
#fuses HS, NOWDT, PUT, NOPROTECT, NOLVP // for debug mode
#use delay(clock=8000000) // for 4Mhz crystal
#use fast_io(b)

int16 count0;
int8 b0;
///////////////////////////////////////////////////////////
#INT_TIMER0
TIMER0_ISR()
{
++count0;
if (count0==100)
{
count0=0;
b0=b0+1;// dich trai a 1bit
//portd=170;
}
if (b0==2)
{
b0=0;
count0=0;
//HTGT0=1;
portb=0;
//portd=252;
disable_interrupts(int_timer0);
}
}
/////////////////////////////////////////////////////////////////////
void main(void)
{
set_tris_a(255); // Chi co dau vao tuong tu
set_tris_b(0);
set_tris_d(0);
portb=255;
//portd=255;
count0=b0=0;
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_TIMER_0(RTCC_EXT_L_TO_H );
setup_COUNTERS(RTCC_EXT_L_TO_H,RTCC_DIV_2);
set_TIMER0(1);
while(true)
{

}
}

chương trình của mình định thử là nếu đếm đc 200 xung thì tắt hết led ở portB.nhưng khi thử k thấy có hiện tượng j cả.

cong1810
17-10-2008, 12:50 AM
if (b0==2)
{
b0=0;
count0=0;
//HTGT0=1;
portb=0;
//portd=252;
disable_interrupts(int_timer0);
}
}





có lẽ là do đoạn code trên bạn ạ. bạn nhầm tại câu lệnh "disable_interrupts(int_timer0);" có phải bạn muốn xóa cờ ngắt cho lần tiếp theo nhưng câu lệnh trên là xóa bit enable cho ngắt timer0. bạn đọc kĩ lại help CCS C và datasheet của 877a nhé. xem mình có đúng ý bạn ko!! good luck!!

bá vinh
29-10-2008, 06:47 PM
chào các bác
các bác cho em hỏi la:khi viết bàng CSS ma mình sài chức năng UART voi máy tinh. ma khi khai báo ngắt của no thi không bao giờ dược cả ,vi khi dó nó sẽ báo là ngắt toàn cục bị cấm trong khi chương trình chính đang thực hiện :
vd:
puts i

ma trong khai báo ngắt
#int_tbe()
{
led=!led;
}

thi không bao giờ led nay chớp tăt nghĩa la nó không bao giờ nhảy vao ngát la so vây.
mình thi sử dụng được hết các chức năng khác nhưng chỉ con ngắt của Uart la không sai dược, bực mình quá.
nhưng mình viết bằng hợp ngữ thi ok.
mong cac bác chỉ giáo .

dientudong
06-11-2008, 07:17 PM
các bạn cho mình hỏi về đoạn code này :khai báo hàm if(tmr1if==1) sao ki vay tmr1if là gì vậy.Với intcon là gì vậy ? Cảm ơn các bạn .Mình còn yếu.
//////////////////////////////////khai bao va chuong trinh ngat cho TIMER1
#int_TIMER1
void TIMER1_isr(void)
{
soxung=get_timer0(); //Lay so xung ma Timer0 dem
set_timer1(55535); // Trong 1ms
if(tmr1if==1)
{
intcon=0; //stop ngat
a1=1;
}
}

cong1810
06-11-2008, 10:34 PM
có lẽ đó là 1 biến hay đó là bit cờ ngắt của timer 1!! người sử dụng đặt trong file define!!bạn xem trong 2 file mà họ include trong code mẫu!!! có thể từ "if" làm bạn nghĩ là lệnh IF ! thực ra nó là interrupt flag!!
chúc may mắn!

delpiero10
08-11-2008, 03:14 PM
Mới học lập trình ccs ai cho e hỏi file defs_16f877A.h và file def_16f877A.h khác nhau thế nào? Ai có file defs_16F877A up lên cho e được kô. Thanks!

bá vinh
09-11-2008, 05:47 PM
bác F ơi cho em xin phần mềm css cho dsp đi ,em tìm hoài mà không thấy . con thằng mikroe thì không biết làm sao ma nạp nó không chạy ,chắc là nó có nhiều fuse quá em không biết chon cái nào cả ,bác có thể giúp em được không.
sẵn cho em hỏi luôn là sử dụng chức năng usb của pic18f4550 như thế nào và máy tính khai báo ra sao khi em dùng VB để giao tiếp vời pic.

luongnhut
09-11-2008, 07:48 PM
em sử dụng thạch anh 20MHZ cho 16f877a, em viet chuong trình ngắt timer0 1s, nhưng em kiểm tra thấy nó nhanh hon 1s rất nhiều, bác nào chỉ em cho sai chổ nao với. chương trinh của e như sau:


#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(251);
++count;
if(count == 1000000) // 1000000*1us = 1000000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);

a = 0x01;

while(true)
{
PORTB = a;
}
}

cong1810
09-11-2008, 09:22 PM
do bạn set prescale cho timer là 2 nên timer tăng lên sau mỗi 0.4us tức là 0.4*5=2us thì timer ngắt 1 lần chứ ko phải là 1us. bạn nên tham khảo thêm trong phần Help củ PIC C!!
vấn đề thứ 2 là biến count của bạn là biến int 16 bit tức giá trị tối đa chỉ là 2^16=65536!! thì điều kiện If của bạn liệu có đúng ko??
thân!!

picpen
10-11-2008, 12:23 AM
trích :
vấn đề thứ 2 là biến count của bạn là biến int 16 bit tức giá trị tối đa chỉ là 2^16=65536!! thì điều kiện If của bạn liệu có đúng ko??

Thực ra giá trị dương của biến " INT16 " nằm trong khoảng từ : 0 >> 2^15 = 32768
Mọi người chú ý đến phạm vi hoạt động của biến được khai báo nếu không sẽ bị tràn làm sai kết quả

luongnhut
10-11-2008, 10:21 AM
em mới chuyển qua viết bằng ccs, em dang có phần cứng là 8 led 7 đoạn, dung hai port của 16f877a cua xuất mã 7 đoạn và mã quét. quét bằng mức 0, led anot chung. cho 8 led hiện thị từ 0-7, nhưng ko biết viết như thế nào, mấy bác giúp em với

tungtuantu
11-11-2008, 10:43 PM
bạn nào giúp mình với, mình lấy hàm flex_lcd ở trên diễn đàn của CCS, vấn đề của mình là, mình xuất được chữ ra LCD rồi, nhưng trong while(1) mình viết 1 đoặn nháy led đơn giản, nhung led nháy dc 1 lúc đúng theo code, rồi sáng mãi 1 lúc, rồi lại nháy cứ thế mãi, lúc led sáng mãi đồng thời các kí tự trên LCD xuất hiẹn loạn cả lên, mình nghĩ vì 1 lí do nào đó mà vdk bị reset lại, mình đã tắt WDT rồi, ai xem giúp mình với, có ai gặp trường hợp này chưa. Mình dùng 30F4011, dùng bản PCWHD 4.068
Chương trình mình gửi kèm theo

delpiero10
12-11-2008, 05:07 AM
Ai có code của bài giải mã bàn phím 4x4 hiển thị ra LCD thì giúp mình(Bàn phím nối vào 8 chân portb còn LCD nối kiểu 4 bit)? Thank!

longphi_batbai
26-11-2008, 04:43 PM
xin chào các bạn, các anh chị trong diễn đàn picvietnam

em mới bắt đầu làm quen với pic, và đang tập làm bài thực hành điều khiển động cơ dùng pid mà anh Falleaf đã phát động

sau khi tham khảo các luồng về CCS cũng như các TUT trên diễn đàn, em có viết 1 đoạn code dùng ccs để hiển thị tốc độ cần đặt lên 4 led 7 đoạn với hướng làm như sau: khởi đầu hiển thị giá trị 0000, dùng 2 nút INC và DEC lần lượt tăng giảm giá trị ở hàng ngàn, rồi dùng Move để chuyển sang hàng trăm và tiếp tục dùng INC và DEC để tăng giảm giá trị mong muốn....


do mới bắt đầu viết bằng CCS nên tất nhiên code sai nhiều. mong các bạn và các anh chị góp ý giúp em để em có thể học hỏi được nhiều hơn

thank for reading, rất mong được sự hồi âm của các bạn và các anh chị

àh quên, các anh cho em hỏi:

- em định làm 1 chương trình con để đọc giá trị tốc độ từ encoder về timer 0 ở chế độ đếm xung: mỗi khi có ngắt timer 1 thì tính tốc độ động cơ và khi đó gọi 1 hàm con để hiển thị tốc độ vừa tính được lên led 7 đoạn. em ko biết xử lý thế nào? vì khi đó phải quét cả 4 led mà gọi hàm con đó trong ngắt timer 1 thì có vấn đề gì ko. mong các anh giúp giùm em

lion
29-11-2008, 11:15 PM
xin chào các bạn, các anh chị trong diễn đàn picvietnam

em mới bắt đầu làm quen với pic, và đang tập làm bài thực hành điều khiển động cơ dùng pid mà anh Falleaf đã phát động

sau khi tham khảo các luồng về CCS cũng như các TUT trên diễn đàn, em có viết 1 đoạn code dùng ccs để hiển thị tốc độ cần đặt lên 4 led 7 đoạn với hướng làm như sau: khởi đầu hiển thị giá trị 0000, dùng 2 nút INC và DEC lần lượt tăng giảm giá trị ở hàng ngàn, rồi dùng Move để chuyển sang hàng trăm và tiếp tục dùng INC và DEC để tăng giảm giá trị mong muốn....


do mới bắt đầu viết bằng CCS nên tất nhiên code sai nhiều. mong các bạn và các anh chị góp ý giúp em để em có thể học hỏi được nhiều hơn

thank for reading, rất mong được sự hồi âm của các bạn và các anh chị

àh quên, các anh cho em hỏi:

- em định làm 1 chương trình con để đọc giá trị tốc độ từ encoder về timer 0 ở chế độ đếm xung: mỗi khi có ngắt timer 1 thì tính tốc độ động cơ và khi đó gọi 1 hàm con để hiển thị tốc độ vừa tính được lên led 7 đoạn. em ko biết xử lý thế nào? vì khi đó phải quét cả 4 led mà gọi hàm con đó trong ngắt timer 1 thì có vấn đề gì ko. mong các anh giúp giùm em
phương pháp quét led 7 thanh làm cho VDK chỉ bận với công việc quét led liên tục mà ít làm được các việc khác. nếu công việc khác mà mất thời gian quá nâu thì led lại bị nhấp nháy .

phương pháp này chỉ để học mà thực tế chắc chẳng ai dùng . Thường thì người ta dùng thanh ghi dich + chốt đầu ra . VD : 74HC595

dùng IC đệm 74HC595 chỉ mất 3 chân của PIC mà số lượng LED 7 thanh có thể có thể mở rộng bao nhiêu cũng được.

tui đã dùng phương pháp này để điều khiển 103 con LED 7 thanh

longphi_batbai
30-11-2008, 08:21 PM
cám ơn góp ý của Lion nhá, theo như Lion nói, thì mình phải xử lý ngắt để đếm xung và tính tốc độ nên chắc chắn Led bị nhấp nháy. bạn có thể cho mình xin 1 đoạn code mẫu dùng ic đệm 74595 để tham khảo cách viết được ko? nếu được thì cảm ơn Lion lắm lắm.

ketxanh
30-11-2008, 11:34 PM
xin chào các bạn, các anh chị trong diễn đàn picvietnam

em mới bắt đầu làm quen với pic, và đang tập làm bài thực hành điều khiển động cơ dùng pid mà anh Falleaf đã phát động

sau khi tham khảo các luồng về CCS cũng như các TUT trên diễn đàn, em có viết 1 đoạn code dùng ccs để hiển thị tốc độ cần đặt lên 4 led 7 đoạn với hướng làm như sau: khởi đầu hiển thị giá trị 0000, dùng 2 nút INC và DEC lần lượt tăng giảm giá trị ở hàng ngàn, rồi dùng Move để chuyển sang hàng trăm và tiếp tục dùng INC và DEC để tăng giảm giá trị mong muốn....


do mới bắt đầu viết bằng CCS nên tất nhiên code sai nhiều. mong các bạn và các anh chị góp ý giúp em để em có thể học hỏi được nhiều hơn

thank for reading, rất mong được sự hồi âm của các bạn và các anh chị

àh quên, các anh cho em hỏi:

- em định làm 1 chương trình con để đọc giá trị tốc độ từ encoder về timer 0 ở chế độ đếm xung: mỗi khi có ngắt timer 1 thì tính tốc độ động cơ và khi đó gọi 1 hàm con để hiển thị tốc độ vừa tính được lên led 7 đoạn. em ko biết xử lý thế nào? vì khi đó phải quét cả 4 led mà gọi hàm con đó trong ngắt timer 1 thì có vấn đề gì ko. mong các anh giúp giùm em

Mình có xem qua code của bạn.Mình thấy chường chình của bạn khi biên dịch báo lỗi rất nhiều. Các lỗi chủ yếu là thiếu dấu ;. bạn cũng nên coi lại giá trị trong câu lênh set_tris_B(00b11110011);. Bạn nên chú ý, phải inlude cho đúng tên file. Bạn hãy chinh sửa, nếu bạn gặp vấn đề gì mính có thể giúp được mình sẽ giúp hết sức. Chúc bạn sớm thành công

lion
03-12-2008, 07:54 PM
đây là 1 đoạn code viết cho 74hc595 :

//--------------------------------------------------------------
#define DATA RB7
#define CLK RB6
#define STR RB5

void display_used_74hc595(unsigned char x)
{
unsigned char i ;

for(i=0;i<8;i++)
{
if( bit_test(x,0) == 1 )
{
DATA=1 ;
}
else
{
DATA=0 ;
};
CLK=0;
CLK=1;

x = x>>1 ;
};
}
//--------------------------------------------------
void main(void)
{


TRISA=0xff;
TRISB=0x00;
TRISC=0xff;
TRISD=0xff;

while(true)
{



display_used_74hc595( 1 ) ;

STR=1;
STR=0;

};
}

bien_van_khat
24-12-2008, 02:54 PM
trích :
vấn đề thứ 2 là biến count của bạn là biến int 16 bit tức giá trị tối đa chỉ là 2^16=65536!! thì điều kiện If của bạn liệu có đúng ko??

Thực ra giá trị dương của biến " INT16 " nằm trong khoảng từ : 0 >> 2^15 = 32768
Mọi người chú ý đến phạm vi hoạt động của biến được khai báo nếu không sẽ bị tràn làm sai kết quả

int16 mặc định là signed int16, có giá trị từ -32678 đến +32767, bạn chú ý!

kimhuynguyen
25-12-2008, 04:59 PM
Cho mục đích thử nghiệm:
http://www.mediafire.com/file/jtyxvzumtnh/CCS_PCWHD_v4.084.RAR

tallht
08-01-2009, 09:45 PM
hii cho thử nghiệm là sao vậy pác?

kimhuynguyen
09-01-2009, 07:32 AM
hii cho thử nghiệm là sao vậy pác?

Gọi là thử nghiệm vì là sử dụng c***k. Có thể phát sinh lỗi không mong muốn trong quá trình sử dụng. Nếu sử dụng bản này và phát sinh lỗi, có thể chia sẻ với mọi người.

vdtk3
10-01-2009, 12:52 AM
Các bác cho em hỏi tại sao em lập trình với 16f887 trên CCS 4.068 thì khi cho nhấp nháy portb.3 và portb.2 cùng lúc nhưng chỉ có portb.3 là nhấp nháy còn portb.2 thì không ??
Thanks !!

namqn
10-01-2009, 01:21 AM
Các bác cho em hỏi tại sao em lập trình với 16f887 trên CCS 4.068 thì khi cho nhấp nháy portb.3 và portb.2 cùng lúc nhưng chỉ có portb.3 là nhấp nháy còn portb.2 thì không ??
Thanks !!
Bạn thử nghiệm trên mạch thực hay mô phỏng? Code của bạn ra sao?

Thân,

vdtk3
10-01-2009, 03:30 PM
em đã thử cả trên proteus và trên mạch thật. Đây là code của em :
#include <16F887.h>
#include <DEF_887.h>
#device *=16adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use DELAY(clock=20000000)

#include <lcd.c>

void init_main(void)
{
//khoi tao ADC
setup_adc(adc_clock_internal);
setup_adc_ports(all_analog);

//khoi tao pwm
setup_timer_2(T2_DIV_BY_1,250, 1);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_pwm);
//khoi tao I/O
TRISB2 = 0;
TRISB3 = 0;
trisb0 = 1;
trisd = 0x00;
trisc = 0x00;

portb = 0xff ;
}
void main (void)
{
init_main();
while (1)
{
rb2 = 1;
rb3= 1;
delay_ms(1000);
rb2= 0 ;
rb3 = 0;
delay_ms(1000);
}
}

Thanks!!!

namqn
10-01-2009, 06:07 PM
Bạn sửa lại code trong vòng while (1) của bạn thành như sau xem:
while (1)
{
PORTB = PORTB | 0x0C; //Bat cac bit RB2 va RB3
delay_ms(1000);
PORTB = PORTB & 0xF3; //Tat cac bit RB2 va RB3
delay_ms(1000);
}

Bạn đọc thêm về hoạt động read-modify-write đã được nói đến nhiều lần trên diễn đàn, chẳng hạn ở đây:
http://www.picvietnam.com/forum/showthread.php?p=4613

Thân,

vdtk3
10-01-2009, 08:06 PM
Cảm ơn bác Namqn nhiều em thử được rồi ! Mấy hôm trước em cũng viết vậy nhưng vẫn chạy bình thường, cứ tưởng là máy bị Virut cơ chứ .

namqn
10-01-2009, 08:52 PM
Cảm ơn bác Namqn nhiều em thử được rồi ! Mấy hôm trước em cũng viết vậy nhưng vẫn chạy bình thường, cứ tưởng là máy bị Virut cơ chứ .
Với tốc độ xung clock tương đối thấp, bạn có thể gặp may rằng các hiện tượng liên quan đến hoạt động read-modify-write chưa đủ mạnh để làm cho PIC của bạn chạy không đúng ý đồ.

Thân,

ga_dientu
14-01-2009, 04:40 AM
#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;
}
}

Đây là chương trình dùng ngắt Timer0 định thời 1s của anh NHH,mong a chị giải đáp dùng em làm sao tính được thời gian định thời trong chương trình này

ga_dientu
16-01-2009, 08:09 PM
Việc tính toán thời gian định thời của Timer em đã hiểu, chỉ còn vấn đề tại sao lại set_timer0 (6). Mong sớm nhận được câu trả lời .

manhha2799
16-01-2009, 08:53 PM
set_timer0 (6) là để cho chương trình đếm từ bắt đầu từ số 6 chứ không phải là số 0. Tức là mỗi lần tràn là 256-6=250.

namqn
16-01-2009, 09:45 PM
set_timer0 (6) là để cho chương trình đếm từ bắt đầu từ số 6 chứ không phải là số 0. Tức là mỗi lần tràn là 256-6=200.
256 - 6 = 250!

Thân,

ga_dientu
06-02-2009, 10:33 PM
Một số chương trình hiến thị LCD có viết là LCD = 0xC3 // vị trí hàng 2,cột 4//,em chưa hiểu mấy cách xác định vị trí này.

namqn
06-02-2009, 10:57 PM
Một số chương trình hiến thị LCD có viết là LCD = 0xC3 // vị trí hàng 2,cột 4//,em chưa hiểu mấy cách xác định vị trí này.
Bạn tham khảo các tutorial về các module LCD, chẳng hạn như ở đây:
http://www.winpicprog.co.uk/pic_tutorial3.htm

Để đặt con trỏ màn hình LCD ở một vị trí nào đó, bạn sẽ dùng lệnh "Set Display Address", có bit 7 mang giá trị '1' (ứng với giá trị 0x80). 7 bit thấp hơn của lệnh sẽ xác định địa chỉ cần di chuyển con trỏ đến. Thông thường, hàng 1 của LCD có địa chỉ bắt đầu là 0x00, hàng 2 của LCD có địa chỉ bắt đầu là 0x40.

Do đó, cột 4 của hàng 2 sẽ có địa chỉ là 0x43. Như vậy cần xuất lệnh 0x80 + 0x43 = 0xC3 để di chuyển đến hàng 2, cột 4.

Thân,

thaithien
05-03-2009, 10:34 PM
Em lục nhưng chưa thấy link download CCS.Ai biết chỉ dùm.Cám ơn

namqn
06-03-2009, 12:17 AM
Em lục nhưng chưa thấy link download CCS.Ai biết chỉ dùm.Cám ơn
Bạn tìm nhầm luồng rồi, luồng dưới đây mới là chỗ để tìm link download:
http://www.picvietnam.com/forum/showthread.php?t=958

Thân,

vietanh
06-03-2009, 05:54 AM
đây này bản bản 4.084 http://rapidshare.com/files/176228329/CCS_4.084.RAR
con đây la bùa chú // http://rapidshare.com/files/176409172/Key_pcwhd.exe

notbadday
08-03-2009, 05:53 PM
Em đang viết chương trình sử dụng ADC 10 bit. Dùng khai báo #device *=16 ADC=10 nhưng bị báo lỗi. Đã thử ở CCS 4.057 và 4.084 nhưng đều báo lỗi (=> ko phải do phần mềm)
Đây là code của em nó:

#include <16F877A.h>
#include <stdlib.h>
#device *=16 ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP

void main()
{
}

vietanh
08-03-2009, 09:03 PM
kiêm tra lại cai ##include <stdlib.h> cua bạn co trong thư viện không . không co thi xoa dong đó di dich ok

nếu không ban phai viết nhu thế nay thi moi đúng không bao sai
#include <16F877A.h>
#device *=16 ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP
#include <stdlib.h>
void main()
{
}

notbadday
08-03-2009, 11:11 PM
Cám ơn bạn. Mình đã sửa lại được rồi. Khai báo #device ngay dưới dòng #include <16F877A.h> thì không bị báo lỗi nữa. Có lẽ CCS bắt phải theo thứ tự vậy :-/

#include <16F877A.h>
#device *=16 ADC=10
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP

void main()
{
}

lexuantien
11-03-2009, 12:49 AM
Em có đoạn Code , cho led sáng tuần tự trên PORTB .Em không hiểu RTCC_DIV_
2 (chia prescaler 1:2) là gì ? Nó có tác dụng như thế nào trong Time0 , cũng như trong quá trình ngắt của đoạn Code trên.




#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(2);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(2);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;

while(true)
{
PORTB = a;
}
}

mocdailam
15-03-2009, 02:26 AM
Mình nhớ không nhầm thì RTCC_DIV_2 để xác định tần số sử dụng của cái TIMER0 so với tần số gốc. có thể dùng thêm RTCC_DIV_4, ..RTCC_DIV_256
mọi việc thực hiên ngắt như bình thường
với việc cho LED sáng tuần tự ở port B bạn nên dùng cái delay, rotate_right (address, bytes) ... còn nhiều cách đơn giản mà, không cần dùng TIMER

lexuantien
16-03-2009, 01:57 AM
Mình đựợc biết là RTCC_DIV_2 cứ hai chu kì xung thì nó đếm một lần không biết phải không ? Mình cũng đã cho chạy thử với RTCC_DIV_4 thì thấy khi tới LED thứ 8 thì đợi thời gian lâu hơn gấp đôi rồi với quay trở lại LED đầu tiên (so với RTCC_DIV_2) . Như bạn nói là để xác định tần số sử dụng của TIMER0 so với tần số gốc bạn có thể nói rõ hơn không?

cảm ơn!

hathuc
02-04-2009, 03:32 PM
xin chào mọi người. mình có một đoạn chương trình viết cho PIC6F877a thực hiện quá trình thay đổi thời gian trễ dựa vào các phím MENU,TANG,GIAM,OK trên các chân RB0,RB1,RB2,RB3,RB4 nhưng viết chương trình và dịch ra file .hex nhưng khi nạp vào thì chương trình lại không chạy các lệnh thủ tục bên trong nó mà chỉ chạy được duy nhất một lệnh bên ngoài. Nếu ai đã từng làm về chương trình loại này thì giúp đỡ mình với. Cảm ơn nhiều. sau đây là toàn bộ chương trình

thaithien
07-04-2009, 11:31 PM
Câu lệnh #use fast_io(b) mang ý nghĩa gì vậy ?

hathuc
08-04-2009, 03:06 PM
Câu lệnh #use fast_io(b) để dùng cho việc thực thi các lệnh vào ra trên PortB
Ví dụ như câu lệnh set_tris_b(0b11110000); muốn thực thi được thì phải khai báo như trên trước.

ga_dientu
10-04-2009, 12:25 AM
em có đoạn code chương trình dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ sô1 nhu sau:

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};
// ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_ext
void ngat_RB0()
{
int i;
if(i<9)
{
portd=digital[i];
++i;
}
if(i==9)
{
i=0;
}
}
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
{
}

cho em hoi khai báo portd=0b00111111 để làm gì ,

namqn
10-04-2009, 12:31 AM
em có đoạn code chương trình dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ sô1 nhu sau:

#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
#byte portb=0x06
#byte portd=0x08
const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};
// ma hoa digital duoi dang mang
// Chuong trinh ngat
#int_ext
void ngat_RB0()
{
int i;
if(i<9)
{
portd=digital[i];
++i;
}
if(i==9)
{
i=0;
}
}
// Chuong trinh chinh
main()
{
set_tris_b(0b00000001);
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
portd=0b00111111;
while(true)
{
}

cho em hoi khai báo portd=0b00111111 để làm gì ,
portd = 00b00111111 là một phép gán chứ không phải khai báo. Không có sơ đồ mạch thì khó mà phân tích được phép gán này dùng để làm gì trong chương trình trên.

Thân,

ga_dientu
10-04-2009, 10:19 PM
mấy bác giải thích dùm

ga_dientu
16-04-2009, 10:56 PM
hehe, em hieu vi sao roi,thank các bác nhiu

vietanh
17-04-2009, 11:22 AM
minh up lại hai phiên bản cho css 74 va 84 bạn nào không tải được pm vn2005_00@yahoo.com mình send cho ok mọi người lưu y trình bẻ khóa tụi nó toan gắn mã đôc trước khi cài đặt nên tắt kết nôi với mạng ,sau khi bẻ khóa ok quét virut 1 lần ok rui mới cho kết nối nhé

http://rapidshare.com/files/127060922/CCS_PCWHD_v4.074.rar

http://rapidshare.com/files/222279847/CCS4.083.rar

tinhgiac_vp
21-04-2009, 07:00 PM
các bác cho em hỏi làm cách nào để biết được chiều dài của một chuỗi số nguyên 16bit, em khai bao int16 dist[] = {675,786,789,567].nhưng hàm strlen() chỉ trả về giá trị 1, do nó làm việc với chuỗi 8 bit.Mong các bác chỉ giúp em.

namqn
21-04-2009, 07:18 PM
các bác cho em hỏi làm cách nào để biết được chiều dài của một chuỗi số nguyên 16bit, em khai bao int16 dist[] = {675,786,789,567].nhưng hàm strlen() chỉ trả về giá trị 1, do nó làm việc với chuỗi 8 bit.Mong các bác chỉ giúp em.
Hàm strlen() được dùng cho chuỗi (là kiểu tương đương với mảng char), làm sao áp dụng cho mảng int16 của bạn được.

Bạn nên cho biết mục đích cụ thể, từ đó người khác sẽ có thể góp ý cho bạn cách xây dựng kiểu dữ liệu phù hợp với mục đích cụ thể đó.

Thân,

tinhgiac_vp
21-04-2009, 08:24 PM
em muốn gửi 10 giá trị int16 lên PC. Muốn đưa 10 giá trị đó vào 1 chuoi đê viết chương trình cho gọn, không phải viết từng dòng để gửi lên PC mà chỉ cần dùng vòng lặp. Rõ ràng vấn đề không có gì khi em biết mảng đó có 10 giá trị, nhưng trong trường hợp chúng ta không biết mảng đó có bao nhiêu giá trị thì làm thế nào? Em cũng biết là hàm strlen() không trả về giá trị chiều dài trong trường hợp này. Không biết có cách nào xác định chiều dài mảng này không?

mabubeo22
21-04-2009, 09:16 PM
Em có đoạn Code , cho led sáng tuần tự trên PORTB .Em không hiểu RTCC_DIV_
2 (chia prescaler 1:2) là gì ? Nó có tác dụng như thế nào trong Time0 , cũng như trong quá trình ngắt của đoạn Code trên.




#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#byte PORTB = 0x06

int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(2);
++count;
if(count == 2000) // 2000*500us = 500000us = 1s
{
count=0;
rotate_left(&a,1);
}
}
//Chuong trinh chinh
void main(void)
{
set_tris_b(0);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(2);// T_dinhthi = 2*(256 - 6)*1us = 500us
a = 0x01;

while(true)
{
PORTB = a;
}
}



mình cũng mới tìm hiểu về PIC và có xem qua đoạn mắc này giống bạn, đây là câu trả lời đầy đủ của anh ntc, bạn xem xong sẽ hiểu:

rtcc_state là một trong những constant sau:

RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
Mỗi Timer đều có 2 tác dụng:

Tác dụng định thời: Timer sẽ dựa vào các xung tạo ra bởi bộ dao động (thạch anh, dao động RC, ...) cung cấp cho vi điều khiển để đếm. Và dựa vào tần số bộ dao động, giá trị các bộ chia tần số và giá trị của Timer, ta có thể xác định được thời gian thực. Như vậy trong trường hợp muốn Timer hoạt động ở chế độ định thời, ta phải khai báo rtcc_state là "RTCC_INTERNAL" (xử dụng tần số dao động nội).

Tác dụng đếm: Timer sẽ dựa vào các xung lấy từ môi trường bên ngoài để đếm. Tùy theo Timer mà ta sử dụng chân lấy xung tương ứng (Timer 0 là chân RA4, Timer1 là chân RC0). Các xung này có tác dụng phản ánh các hiện tượng trong thực tế, và việc đếm các xung cũng đồng nghĩa với việc đếm các hiện tượng đó. Và để linh động hơn trong quá trình xử lí, Timer còn cho phép chọn cạnh tác động lên bộ đếm (chế độ này chỉ có ở Timer 0). Như vậy muốn Timer hoạt động ở chế độ đếm, ta phải khai báo rtcc_state là một trong 2 trường hợp còn lại (sử dụng dao động ngoài).


Trích:
ps_state là một trong những constant sau:

RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS
Ở đây có đến 2 hàm dùng để ấn định tỉ số chia của prescaler, một hàm là "RTCC_DIV_...", một hàm là "WDT_ ...". Đó là bởi vì Timer 0 và WDT dùng chung bộ chia tần số. Khi bộ chia được Timer 0 sử dụng thì WDT không đựoc hỗ trợ với bộ chia này nữa. Như vậy sự khác biệt về thao tác giữa 2 hàm này có thể là như sau:

Hàm "RTCC_DIV_..." : cho phép Timer 0 sử dụng bộ chia tần số, không cho phép WDT sử dụng và ấn định tỉ số chia của nó.

Hàm "WDT_ ..." : cho phép WDT 0 sử dụng bộ chia tần số, không cho phép Timer 0 sử dụng và ấn định tỉ số chia của nó.

khanhbp
22-04-2009, 06:44 PM
Link download:
http://rapidshare.com/files/224348701/CCS_V.4.088.PCWHD.update.rar
Tested OK

hatbui
02-05-2009, 09:51 AM
Chào các bác.
Bác nào chỉ giúp em đoạn code làm việc với 595 theo 2 cách
- sử dụng SPI module có sẵn của 16F877A
- có thể sử dụng pin khác của Port khác
Giúp em code bằng CCS C được ko ah.


Em xin chân thành cảm ơn.

manhha2799
02-05-2009, 09:11 PM
Đây là cách phần mềm :

#bit SCK=0x06.6
#bit DATA=0x06.4
#bit SCL=0x06.7

void Data_in(int1 k)
{
output_bit(pin_b4,k);
output_low(pin_b6);
output_high(pin_b6);
}
void LatchData()
{
output_low(pin_b7);
output_high(pin_b7);
}


Đây là spi phần cứng :

spi_write(0b11111111);
setup_spi(spi_master |spi_h_to_l|spi_clk_div_4);

mocdailam
02-05-2009, 09:47 PM
bac F ơi! có thời gian trả lời giúp em với

manhha2799
03-05-2009, 09:37 PM
Bạn này hỏi gì thế nhỉ? mà ko thấy câu hỏi gì hết?

bravesoldier
23-06-2009, 05:40 PM
Em tra datasheet của PIC16F877A để tìm hiểu module SPI và xem cả example trong CCS nữa nhưng khi thử trên bo cắm với 5 con 595 thì 40 con LED sáng loạn cả lên. Liệu em có dùng sai hay không? Bác nào dùng SPI cứng của PIC ko chỉ cho em với?

#include <16F877A.h>
#device *=16 ADC=8
#fuses NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x6
#bit SCL = portb.0

void latch_data()
{
SCL=0;
SCL=1;
}

main()
{
byte i;
set_tris_b(0);
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16); // tham kha?o Help

SCL=1;
while (true)
{
for (i=1; i<=5; ++i) {spi_write(0xAA);}
latch_data();
delay_ms(1000);

for (i=1; i<=5; ++i) {spi_write(0x55);}
latch_data();
delay_ms(1000);
}
}

Em lắp xen kẽ 20 con LED xanh với 20 con LED đỏ, viết code để cho chúng nó nhấp nháy.
Theo như datasheet thì em dùng chân RC5 của PIC16F877A để xuất data ra chân 14 của con 595 đầu tiên, chân RC3 làm chân clock (SCK), chân RB0 chọn để chốt.
Em xin cám ơn!

picpen
24-06-2009, 08:49 AM
for (i=1; i<=5; ++i) {spi_write(0xAA);}
latch_data();
delay_ms(1000);

??? tôi ko hiểu ý đồ dùng cấu trúc for của bạn là như thế nào , bạn chú ý khi quản lý khối lệnh bằng {} nhé !
với SPI tôi đã làm rồi , cái giao tiếp này của pic rất rễ nhiễu và bị sai khi bạn dùng cáp để để truyền dữ liệu . Chỉ cần sai 1 bít là tất cả khối dữ liệu sau đó bị sai hết
Bạn nên chú ý với 2 dây dữ liệu và dây clock . phải đảm bảo mấy dây đó phải an toàn ko xảy ra lỗi ...... đó là do cách hoạt động của SPI ko có kiểm tra chẵn lẻ cũng ko có tín hiệu ack
chúc vui !

bravesoldier
24-06-2009, 03:35 PM
??? tôi ko hiểu ý đồ dùng cấu trúc for của bạn là như thế nào , bạn chú ý khi quản lý khối lệnh bằng {} nhé !
với SPI tôi đã làm rồi , cái giao tiếp này của pic rất rễ nhiễu và bị sai khi bạn dùng cáp để để truyền dữ liệu . Chỉ cần sai 1 bít là tất cả khối dữ liệu sau đó bị sai hết
Bạn nên chú ý với 2 dây dữ liệu và dây clock . phải đảm bảo mấy dây đó phải an toàn ko xảy ra lỗi ...... đó là do cách hoạt động của SPI ko có kiểm tra chẵn lẻ cũng ko có tín hiệu ack
chúc vui !

Em dùng for để thực hiện 5 lần SPI_write, để out 5x8 = 40 bit ra dãy LED 40 con
0xAA = 10101010b để LED đỏ tắt, LED xanh sáng
0x55= 01010101b để LED đỏ sáng, LED xanh tắt
đúng là em cắm nhiều dây quá nên nhiễu thật
sờ vào nguồn là cụm 8LED do con 595 thứ 2 nối ra tối hẳn đi, còn các cụm khác vẫn bình thường. Thật là củ chuối!
Đêm qua em tháo hết bo rồi. Mục đích là test chức năng SPI mềm và cứng của PIC 16F877A mà bác.
Bác có gì chỉ bảo, có gì cần chú ý về phần cứng thì giúp em với.
mail của em là dotien.dzung@gmail.com
em xin cảm ơn bác.

bravesoldier
24-06-2009, 03:41 PM
chắc là dây nối dùng SPI cứng của PIC càng ngắn càng tốt các bác nhỉ :)

tonghua19
01-07-2009, 07:05 PM
Em tra datasheet của PIC16F877A để tìm hiểu module SPI và xem cả example trong CCS nữa nhưng khi thử trên bo cắm với 5 con 595 thì 40 con LED sáng loạn cả lên. Liệu em có dùng sai hay không? Bác nào dùng SPI cứng của PIC ko chỉ cho em với?

#include <16F877A.h>
#device *=16 ADC=8
#fuses NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x6
#bit SCL = portb.0

void latch_data()
{
SCL=0;
SCL=1;
}

main()
{
byte i;
set_tris_b(0);
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16); // tham kha?o Help

SCL=1;
while (true)
{
for (i=1; i<=5; ++i) {spi_write(0xAA);}
latch_data();
delay_ms(1000);

for (i=1; i<=5; ++i) {spi_write(0x55);}
latch_data();
delay_ms(1000);
}
}

Em lắp xen kẽ 20 con LED xanh với 20 con LED đỏ, viết code để cho chúng nó nhấp nháy.
Theo như datasheet thì em dùng chân RC5 của PIC16F877A để xuất data ra chân 14 của con 595 đầu tiên, chân RC3 làm chân clock (SCK), chân RB0 chọn để chốt.
Em xin cám ơn!

Chào các bạn
các bạn cho mình hỏi là câu lệnh:
#device *=16 ADC=8
#byte portb=0x6
có nghĩa gì vậy
cho em mình hỏi thêm là làm sao mình mới có thể dùng lệnh các lệnh như trisb, portb, latb,... hay một số thanh ghi như ifs1, iec0,...
Cám ơn các bạn nhiều

thanhvanckbk
02-07-2009, 05:18 PM
Mình là dân mới tập tành học PIC nê sau khi đọc xong TUTOR của bác falleaf mình thấy rất hay, không biết là phần 2 của TUTOR bác đã up lên chưa vậy? Mong cao thủ nào đã có được thì up lên cho anh em tham khảo nha!

thanhvanckbk
02-07-2009, 05:23 PM
ah cho mình hỏi thêm chút với, mình đang muốn dùng PIC để điều khiển 12 RC servo bằng PWM, ai có kinh nghiệm trong việc này thì chỉ giúp mình với, nếu được thì có thể up đoạn code đó cho mình tham khảo chút nha. cám ơn những người cùng yêu thích PIC như mình. hihi

Hailua8x
16-07-2009, 05:42 PM
Em mới bắt đầu nghiên cứu CCS, mong được các anh pro giúp đở
Em đang nghiên cứu con dspic6014, con này có thể chạy với tốc độ 30 MIPs

em sử dụng thạch anh 8 Mhz, các anh cho em hỏi làm sao để nhân tần số thực thi lệnh lên 30 MIPS
Cám ơn mấy anh

Hailua8x
17-07-2009, 05:01 PM
Mấy anh ai có file defs_16F877A.h , cho em xin với !
Mong được mấy anh giúp đở

Hailua8x
17-07-2009, 05:07 PM
Sorry, em viết nhầm, hổng phải con đó mà là con này : dspic30f6014

leethanh
29-07-2009, 11:01 AM
chào các Bác!
em đang gặp rắc rối với việc cài CCS 4074.
em cài luôn bị hỏi tìm file Registration. Nếu k tìm thấy khi kích vào biểu tượng thì luôn hiện bảng báo lỗi "Registration file error".
Bác nào biết chỉ giùm em cái!

tomruoi
29-07-2009, 11:54 AM
em dang lam do án 1, em co de tai dkhien nhiet do dung pic6f877 nhung ma thay ko cho,thay ko cho lam ve nhiet do va dco nua,vi no nhieu nguoi lam qa roi. ban nao co de tai ma co ung dung hay hay ,va it nguoi lam thi giup cho minh voi nha,ONG THAY THICH DE TAI: MOI VA CO UNG DUNG(IT NGUOI LAM CUNG DC),may ban giup minh nhanh nhanh nha,ngay mai (30/07/2009)la het han roi,huhu ma chua co gi het kho qa .DE TAI MINH LAM CHI CAN:VXLI,IC SO.IC SO KO CUNG DC MA CO UNG DUNG LA OK,(KO CAN DUNG GIAO TIEP M TINH)MA DE TAI PAI LAM DC NHA MAY BAN.EM XIN CAM ON TRUOC
mail em: truongquangtuong@gmail.com(ngay nay em cho giup do)

tact
23-08-2009, 12:52 PM
Đã có bản CCS PCWHD v.4.093 bác nào cần thì vào đây (http://picat.dieukhien.net/forum/viewforum.php?f=13&sid=9dcf3ca5ff5e7326ac2f4b6e9f137356) lấy nhá. :D

mocdailam
24-08-2009, 02:26 AM
chào các Bác!
em đang gặp rắc rối với việc cài CCS 4074.
em cài luôn bị hỏi tìm file Registration. Nếu k tìm thấy khi kích vào biểu tượng thì luôn hiện bảng báo lỗi "Registration file error".
Bác nào biết chỉ giùm em cái!
bạn chưa crack ấy mà! lên tải phần crack đi! ma đã có cái CCS 4.0.88 rùi! mất công dùng lậu thì dùng cho xịn luôn! hic!

thanhvanckbk
26-08-2009, 12:35 PM
chào mọi người, mình mới học PIC nên mình muốn hỏi các bậc cao thủ một số vấn đề như sau:
1- Có cách nào để dùng timer điều khiển theo kiểu PWM được không(duty=1-2ms, period=20ms), cho các chân I/O tùy ý không phải các chân CCP
2- chỉ giúp mình cách viết code để ghi và đọc dữ liệu từ RAM của PIC

vinh86
26-08-2009, 06:43 PM
cac bac co tai lieu huong dan su dung ccs cho de voi
de moi bat dau hoc pic ah
mong cac bac tien boi chi giup

vinh86
26-08-2009, 06:45 PM
em rat can tai lieu ve ccs
các anh giúp đệ với đệ không thể dow được

vinh86
26-08-2009, 06:47 PM
co ai giúp đệ thì gửi cho đệ qua mail : nguyenvinh.vp@gmail.com
cảm ơn các anh chị nhiều

Hard
28-08-2009, 09:50 AM
Hi,
CCS là một trình biên dịch cự kỳ dễ sử dụng, hỗ trợ hầu hết các hàm giúp người lập trình nhanh chóng phát triển ứng dụng. Nếu các bác muốn học thì chỉ việc cài lên, mở một ví dụ bất kỳ rồi bấm phím F1 để biết thêm chi tiết. Nếu bác nào đã từng làm việc với ngôn ngữ C thì chỉ cần 1 tuần là có thể làm chủ được CCS và dùng CCS để phát triển mọi ứng dụng.
Đối với lập trình phần mềm thì ai cũng bắt đầu bằng chương trình "Hello" còn đối với lập trình VDK thì ai cũng bắt đầu bằng chương trình "BlinkLed". Đối với CCS nếu viết chương trình BlinkLed sử dụng các hàm dựng sẵn (build in) của nó thì coi như là đã đi được 1/2 chặng đường. Tiếp theo là chỉ việc bấm phím F1 để phát triển ứng dụng thôi.
Thân ái.

hanspkt
29-08-2009, 01:06 AM
em rat can tai lieu ve ccs
các anh giúp đệ với đệ không thể dow được

Bạn vào đây: http://www.picvietnam.com/forum/showthread.php?t=612&page=3

Rbm_13
19-10-2009, 05:42 PM
Help me??? Mình đang dùng CCSC 4.084, phiên bản này cho phép nạp chíp trực tiếp, bạn nào đã sử dụng thì giúp mình dùng với....

vungchua
21-10-2009, 11:42 AM
Hi Rbm_13
Bạn sử dụng CCSC trong MPLAB IDE sẽ có nhiều lựa chọn cho các kit nạp. Mình đang sử dụng bản CCSC này và chỉ thấy nó cho phép kết nối với ICD.

nhamdtk4
06-11-2009, 11:13 AM
#BIT TMR0I=0X0B.2
- Đặt tên cho địa chỉ 0x0B.2 trong RAM là: TMR0I (Đây chính là địa chỉ cờ ngắt của timer0).
nếu bây giờ mình cần cho chân nhận nút bấm là chấn khác của PORTA thì sao? Giả sử là chân RA5.
- Còn chỗ này thì bạn đã nhầm: Đây là CT đếm xung chân RA4 là chân nhận xung ngoài của timer0 nên khi dùng timer0 đếm xung thì làm sao mắc vào RA5 đc.

nhamdtk4
10-11-2009, 06:32 PM
dùng 2 button hiển thị trên led 7 đoạn, một tăng một giảm được không
Muốn làm đc như vậy thì CT cần nhận biết đc phím nào đc bấm, cách dễ dàng nhất đó là dùng ngắt ngoài (hoặc ngắt RB) và ADC. Bạn đọc cách sử dụng tập lệnh của 2 modul này thì sẽ giải quyết đc thôi, có j thì cứ hỏi mọi người sẽ giúp bạn.
Chúc thành công!

hangocminh1989
18-11-2009, 08:51 AM
em vẫn chưa khai báo được cái nút nhấn,hum ny em không mang theo code và cái sơ đồ,cả nhà có ai đã làm thành công nhiều về vấn đề này xin giúp đỡ em với,có code và sơ đồ luôn thi càng tốt,hic,mệt cái này quá,
thanks

nhamdtk4
18-11-2009, 09:31 AM
em vẫn chưa khai báo được cái nút nhấn,hum ny em không mang theo code và cái sơ đồ,cả nhà có ai đã làm thành công nhiều về vấn đề này xin giúp đỡ em với,có code và sơ đồ luôn thi càng tốt,hic,mệt cái này quá,
thanks
It's here:

#include<16f877a.h>
#fuses nowdt,hs,noprotect,nodebug
#use delay(clock=20M)

#bit button2 =0x008.2
#bit button1 =0x008.0

void main()
{
int a=5;
set_tris_b(0x00);
set_tris_d(0xff);
output_b(0);
while(true)
{
if(button1) {delay_ms(40); while(button1){}; a++;}
if(button2) {delay_ms(40); while(button2){}; a--;}
output_b(a);
}
}

ngoyeungoc
25-11-2009, 09:42 AM
Chào mọi người !Mình đang viết chương trình điều khiển Step Motor nhưng đang mắc kẹt lại ở chỗ này không tìm được cách giải quyết mấy ngày nay rồi.Đã cố gắng nhưng không ra nên rất mọi người giúp đỡ mình với.Đây là code của mình
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#byte intcon=0x000B
#bit RB4=portb.4
#bit RB5=portb.5
#bit RB6=portb.6
#bit RB7=portb.7
#bit RBIF=intcon.0 //dinh nghia co ngat RB
#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
int a=0x11,speed=1000;
// Chuong trinh ngat
#int_RB
void ngat_RB()
{
if((RBIF)&&(RBIE))
{
//Quay nguoc chieu kim dong ho
{
if(RB4==0)
while (true)
{
rotate_left(&a,1);
portb=a;
delay_ms(1000);
}

}
//Quay cung chieu kim dong ho
{
if(RB5==0)
while (true)
{
rotate_right(&a,1);
portb=a;
delay_ms(1000);
}
}
//Quay nguoc chieu kim dong ho nhanh dan
{
if(RB6==0)
{
speed=-50;
while (true)
{
rotate_left(&a,1);
portb=a;
delay_ms(speed);
}
}
}
//Quay cung chieu kim dong ho nhanh dan
{
if(RB7==0)
{
speed=-50;
while (true)
{
rotate_right(&a,1);
portb=a;
delay_ms(speed);
}
}
}
RBIF=0; //Xoa co ngat RB
}
}
// Chuong trinh chinh
main()
{
set_tris_b(0xF0);
portb=0x0F;
enable_interrupts(global);
enable_interrupts(int_RB);
ext_int_edge(H_to_L);
while(true)
{

}
}
Nội dung của bài mình là điều khiển chiều quay và tốc độ của động cơ(mình đã chú thích trên đoạn code).Lỗi mình gặp phải là khi mình ấn SW để động cơ quay nhanh dần thì nó quay nhanh thật nhưng nhấn nữa thì tốc độ không tăng nữa mà vẫn giữ nguyên tốc độ.Các bạn có thể giúp mình sữa lại sao cho mỗi lần mình nhấn SW để tăng tốc độ động cơ thì nó tăng dần .Và mình hỏi thêm 1 điều nữa sao mỗi lần mình cho quay cùng chiều đồng hồ thì lúc đầu nó quay ngược chiều một bước rồi mới quay cùng chiều(và ngược lại).Có cách nào khắc phục không giup mình với.
Mình cảm ơn các bạn nhiều.
Mình còn file mô phỏng mà không biết upload lên diễn đàn sao cả,đành up lên mediafire vậy.Mong các bạn chỉ bảo thêm.
Link download :
http://www.mediafire.com/?zzhg2intnmt
http://www.mediafire.com/?jzzut3v3yyy
http://www.mediafire.com/?wj0ort4wbnn

ngoyeungoc
30-11-2009, 10:29 PM
Ui,các bạn đâu rồi??? Sao không thấy ai giúp đỡ mình hết dzậy! Mình đang rất cần...Help me!

0903579509
01-12-2009, 03:47 AM
Ui,các bạn đâu rồi??? Sao không thấy ai giúp đỡ mình hết dzậy! Mình đang rất cần...Help me!

Tôi không hiểu lắm về Code của bạn, nhưng tôi thấy với đoạn code trên, vi điều khiển không bao giờ thoát khỏi chương trình ngắt khi chạy vòng lặp while(1). Thêm vào đó ngắt xãy ra rất nhanh, chỉ cần một động tác nhấn phím, ngắt đã xãy ra nhiều lần do rung phím, kết quả hàm delay_ms() trở thành giá trị tối thiểu -> chỉ nhấn 1 lần tốc độ động cơ đã lên tối đa.
Thân!

ngoyeungoc
06-12-2009, 11:41 PM
Mình cảm ơn bạn.Các bạn có thể giải thích rõ về PWM của PIC không.Trong luồng "CCS C cho PIC16F877A" mình đọc qua nhưng không hiểu rõ lắm.Mình đang lập trình điều khiển cho động cơ bước(loai 6 dây ra). Để điều khiển tốc độ động cơ thì phải dùng PWM(đoạn code trên mình dùng delay để thay đổi tốc độ nhưng không được). PIC 16F877A chỉ có 2 ngõ ra RC1 và RC2 là dùng trong PWM,trong khi mình cần 4 ngõ vào điều khiển.Các bạn hướng dẫn cho mình cách dùng PWM để điều khiển tốc độ cho động cơ bước 4 pha với.Mình cảm ơn nhiều!

vinhlec4
08-12-2009, 01:44 PM
mình đang cân tập lệnh trong ccs để viết chương trình đây nhung không biết lam sao. ai có cho minh với?
cho mình hoi với:#FUSES NOWDT , HS , NOPROTECT
dòng tren co nghĩa là j? lam sao biết các chế độ đó

vinhlec4
08-12-2009, 01:46 PM
ai co đã dùng pic8f4331 roi chỉ dạy em với? làm sao để viết chuong trình pwm 4331 day?vì mình chưa biết tập lệnh mà:
các bác dạy e với

ngoyeungoc
11-12-2009, 07:32 AM
Không biết mình hỏi không rõ ràng hay các cao thủ ít vào luồng này nữa hay sao mà chẳng thấy ai giúp mình hết vậy?Tại mình đang làm đồ án về điều khiển động cơ bước với 5 switch:
SW1: stop
SW2: quay cùng chiều kim đồng hồ(KDH).
SW3: quay ngược chiều KDH.
SW4: quay cùng chiều KDH có tốc độ tăng dần mỗi lần ấn.
SW5: quay ngược chiều KHD tốc độ tăng dần sau mỗi lần ấn.
Mình mới tìm hiểu về PIC, mình đã tự tìm hiểu, đã cố gắng lập trình nhưng chỉ làm được 3 điều khiển đầu tiên, điều khiển tốc độ động cơ tăng dần mình chưa làm được.Vì sắp bảo vệ đồ án rồi nên mình rất mong các bạn có thể giúp mình.Mình không hi vọng các bạn sẽ làm tất cả cho mình: viết code,vẽ mạch,...(phải có cái gì đó của mình nữa chứ), mình chỉ mong các bạn có thể hướng dẫn cho mình cách dùng chức năng PWM của con PIC để điều khiển tốc độ tăng dần cho step motor.Rất mong các bạn có thể giúp mình sớm sớm.Thời gian không còn nhiều nữa.Mình thực sự bó tay rồi.Chưa có tiền mua mạch nạp nữa chứ,hỏi mượn nhưng chờ đứa bạn làm xong mới cho mình mượn.Mình cảm ơn các bạn rất nhiều.

8051topic
13-12-2009, 10:59 AM
Hic, mình cũng đang tìm hiểu về PWM (CCP), mình có đoạn code này bạn thử xem sao nha.

// Setup the CCP1 for PWM
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_pwm1_duty(100); //cái này là giá trị duty, bạn thay đổi giá trị này nhé, từ 0 -> 255


Về mạch nạp bạn có thể làm mạch PG2C để dùng, mạch này đơn giản lại không cần chip Master chỉ có điều PC của bạn phải có cổng COM, cáp USB-COM không dùng được với mạch này nha.
Chúc bạn sớm hoàn thành đề tài.

lkkt_group
14-12-2009, 09:59 AM
Em đang làm mạch điện điều khiển motor bằng ngắt timer.Em đang dùng Pic C 4.069Em dùn. g timer0 de ngat. Tuy nhiên không hiểu sao không thấy hiển thị ra led sau thời gian 6 giay em đã set (đã test thử các chương trình in put output mấy cổng đó thấy ok) chắc tại ngắt timer có vấn đề nhưng không tìm ra lỗi. Các sư huynh nào biết tham khảo rồi chỉ dùm với. Cảm ơn rất nhiều http://www.picvietnam.com/forum/images/icons/icon9.gif

Em gửi file lập trình và sơ đồ mạch cho các sư huynh tham khảo

http://www.4shared.com/file/172430058/f159e8d2/coffee_roater_PicC1.html
http://www.4shared.com/file/172430065/a4c5c7ac/lap_trinh.html
http://www.4shared.com/file/172430056/16e1c5d5/Main_roaster1.html

Các sư huynh chịu khó down về nghen

necati
07-01-2010, 04:41 AM
http://www.fileden.com/files/2010/1/4/2713447/C4104.rar
password: charon

http://rapidshare.com/files/330322076/C4104.rar
same pw unlimited

http://www.megaupload.com/?d=041Y86AW

http://www.sonsivri.com/forum/index.php?board=3.0

Kevin
03-02-2010, 03:02 PM
http://rapidshare.com/files/330322076/C4104.rar
password la gi`?

hangocminh1989
08-04-2010, 08:33 PM
password la gi`?

charon.....pass ngay đó mà sao ko đọc??????????

haruoi
08-04-2010, 11:53 PM
Các bác hướng dẫn e cách lập trình cho dispic 30f4011 bằng CCS với. E cài CSS bản 4.023 nhưng không hỗ trợ cho dispic. Thanks nhiều!

hoanghuy911
19-04-2010, 01:03 AM
Xin chào các cao thủ trên diễn đàn PIC VIỆT NAM mình là người mới tìm hiểu về PIC và đang dùng PIC16F877A mình muốn hỏi chương trình dùng tín hiệu vào ADC và dùng PWM để điều khiển độ sáng cho một con LED công suất. Bác nào có chương trình mẫu thì cho mình tham khảo với đây là chương trình của mình nhưng khi mô phỏng thấy im re biên dịch thì không có lỗi.
Phần cứng: Nút nhấn trên RB0 và biến trở nối với nguồn 5V và cho vào AN0.
Tạm thời mình chưa tìm hiểu cách post hình lên diễn đàn và đóng khung code nên mới viết như vậy mong mọi ng thông cảm. Mong hồi âm và xin chân thành cảm ơn!

code______________________________________________ _____________________

#include "C:\Documents and Settings\SMART HOME\Desktop\LAP TRINH PIC\CCS for PIC16F877A\PWM\cht\main.h"
// su dung adc o che do 8 bit
// chuong chinh doc 3 moc gia tri adc xuat ra tuong ung 3 muc sang cua den led
byte value;
void main()
{
byte value;

setup_adc_ports(AN0); // Thiet lap cong AN0 la cong vao ADC.
setup_adc(ADC_CLOCK_INTERNAL ); // Thiet lap che do xung mo rong
// setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(0);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!
set_tris_b(0x0f);
while(true)
{
if(input(PIN_B0)==1) //Tin hieu cam bien

{
set_adc_channel( 0 );
value = read_adc();
if((value>0)&&(value<100))
set_pwm1_duty(50);
else if((value>100)&&(value<200))
set_pwm1_duty(150);
else
set_pwm1_duty(255);
delay_ms(10);
}
else
set_pwm1_duty(0);
}

}
__________________________________________________ _______________________

hoanghuy911
19-04-2010, 01:19 AM
Thêm một điều nữa mình dùng PIC16F877A và thạch anh 4Mhz để cho led sáng trong 1s tắt trong 1s thì mình delay_ms(?) mình khai báo là delay_ms(1000) mà mô phỏng trên ông Proteus nó vẫn cứ nháy loạn hết cả lên mà không đúng 1s. Xin các bạn giải thích dùm mình với? Xin chân thành cám ơn.

Hard
03-05-2010, 06:50 AM
Xin chào các cao thủ trên diễn đàn PIC VIỆT NAM mình là người mới tìm hiểu về PIC và đang dùng PIC16F877A mình muốn hỏi chương trình dùng tín hiệu vào ADC và dùng PWM để điều khiển độ sáng cho một con LED công suất. Bác nào có chương trình mẫu thì cho mình tham khảo với đây là chương trình của mình nhưng khi mô phỏng thấy im re biên dịch thì không có lỗi.
Phần cứng: Nút nhấn trên RB0 và biến trở nối với nguồn 5V và cho vào AN0.
Tạm thời mình chưa tìm hiểu cách post hình lên diễn đàn và đóng khung code nên mới viết như vậy mong mọi ng thông cảm. Mong hồi âm và xin chân thành cảm ơn!

code______________________________________________ _____________________

#include "C:\Documents and Settings\SMART HOME\Desktop\LAP TRINH PIC\CCS for PIC16F877A\PWM\cht\main.h"
// su dung adc o che do 8 bit
// chuong chinh doc 3 moc gia tri adc xuat ra tuong ung 3 muc sang cua den led
byte value;
void main()
{
byte value;

setup_adc_ports(AN0); // Thiet lap cong AN0 la cong vao ADC.
setup_adc(ADC_CLOCK_INTERNAL ); // Thiet lap che do xung mo rong
// setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(0);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

// TODO: USER CODE!!
set_tris_b(0x0f);
while(true)
{
if(input(PIN_B0)==1) //Tin hieu cam bien

{
set_adc_channel( 0 );
value = read_adc();
if((value>0)&&(value<100))
set_pwm1_duty(50);
else if((value>100)&&(value<200))
set_pwm1_duty(150);
else
set_pwm1_duty(255);
delay_ms(10);
}
else
set_pwm1_duty(0);
}

}
__________________________________________________ _______________________

Hi,
Đôi khi mô phỏng Protues không chạy nhưng thực tế lại chạy ngon ơ đó. Protues có một lỗi khi mô phỏng PWM, để khắc phục trước mắt xem chương trình của bác có chạy không thì bác thêm vào một dòng setup_timer_2(xxx) ngay sau khi thực hiện set_pwm1_duty(xx).
Để khắc phục lỗi củ chuối này của Protues, bác down file Pic16.dll sau và thay thế file Pic16.dll trong thư mục cài đặt. Lúc này không cần phải setup_timer_2(xx) nữa.
Thân ái.

hatbui
04-05-2010, 12:57 PM
Chào các bác

Em đang tập viết chương trình dùng CCSC

chương trình đơn giản bên dưới. Compile không báo lỗi nhưng khi chạy mô phỏng thì không chạy/

#include <16f877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT,
#use delay(clock=20000000)


//===========Chuong trinh chinh================
void main()
{
unsigned char i;

While(true)
{
for (i=0x01;i<0x80;i++)
{
PORTB=i;
delay_ms(100);
}
for (i=0x80;i>0x01;i--)
{
PORTB=i;
delay_ms(100);
}
}
}




Các bác giúp em với.

trieucn
26-05-2010, 05:50 PM
Alo! có ai biết trong CCS, hàm so sánh xem xâu S2 có trong xâu S1 là j` không ạ?
Sử dụng như thế nào ạ?
Em đọc trong help thì hình như là hàm strstr();
Nhưng em so sánh ko thành công

nguyenvu149
05-06-2010, 12:25 PM
Chào mọi người, mình mới bắt đầu nghiên cứu về PIC, hiện tại cũng đang cài đặt và sử dụng CCS 4.65, tuy nhiên vì chưa biết gì nên lúc vào thử viết code thì không biết phải viết ở mục nào, chọn PIC trong CCS ra sao, liên kết với MPLAB như thế nào, sau khi biêt xong thì dịch ra file cho PIC như thế nào, file này cuối cùng có phải là nạp vào PIC để mô phỏng trong protues không?

Ai biết chỉ giáo dùm với? chỉ cần viết cũng được, không cần minh họa hình ảnh.

tungtot_vl
05-06-2010, 01:02 PM
Chào các bác

Em đang tập viết chương trình dùng CCSC

chương trình đơn giản bên dưới. Compile không báo lỗi nhưng khi chạy mô phỏng thì không chạy/

#include <16f877A.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT,
#use delay(clock=20000000)


//===========Chuong trinh chinh================
void main()
{
unsigned char i;

While(true)
{
for (i=0x01;i<0x80;i++)
{
PORTB=i;
delay_ms(100);
}
for (i=0x80;i>0x01;i--)
{
PORTB=i;
delay_ms(100);
}
}
}




Các bác giúp em với.
thêm dòng lệnh là chạy được
set_tris_b(0x00);

tranquoclap
09-06-2010, 02:06 PM
anh em nào có link down ccs c post lại cho mình với!!! link bác F post từ đời nào rồi, giờ ko down dc!

pocolo276
21-06-2010, 06:47 PM
là gà Pic.Nên cho mình hỏi lỗi này trong CCS

bean984
11-08-2010, 04:12 PM
xin các bác giải thích các dùng watchdog hiệu quả?
nếu có ví dụ kèm theo thì tốt quá.thấy mọi người nói cái này rất quan trọng nhưng khi hướng dẫn thì không thấy các bác nhắc tới.
thanks mọi người!

bean984
26-08-2010, 03:07 PM
cac cao thủ giấu bài kinh quá
không ai giúp đỡ mình sao

gawafer
06-09-2010, 12:28 PM
Các bác ơi giúp em với. em muốn lập trình cho led ma trận chạy chữ với pic6F877A bằng ngôn ngữ C ,em không biết lập trình như thế nào các bác giúp em với
Địa chi mail của em : gawafer@yahoo.com

Mr.Bi
06-01-2011, 10:04 AM
là gà Pic.Nên cho mình hỏi lỗi này trong CCS

chữa lại (bỏ 2 dòng đó đi)

// long CCP_1
// long CCP_2

tui không hiểu vì sao trong thư viện của u lại có vậy ,vì tui nhìn dòng bên dưới thì thấy đã định nghĩa

# byte CCP_1 ...
# byte CCP_2

Mr.Bi
06-01-2011, 10:05 AM
Chào mọi người, mình mới bắt đầu nghiên cứu về PIC, hiện tại cũng đang cài đặt và sử dụng CCS 4.65, tuy nhiên vì chưa biết gì nên lúc vào thử viết code thì không biết phải viết ở mục nào, chọn PIC trong CCS ra sao, liên kết với MPLAB như thế nào, sau khi biêt xong thì dịch ra file cho PIC như thế nào, file này cuối cùng có phải là nạp vào PIC để mô phỏng trong protues không?

Ai biết chỉ giáo dùm với? chỉ cần viết cũng được, không cần minh họa hình ảnh.

đọc lại bài 1 của luồng này

quangvanvo
09-01-2011, 09:59 AM
các anh chị ơi em dịch chương trình thì được nhưng nó cứ báo warning la sao nhưng vẫn dich sang file de chạy trên prôtust được

bean984
15-02-2011, 10:17 AM
mọi người cho mình hỏi dòng PIC nào hỗ trợ 2 cổng USART vây?
Thanks!

phu_vinh77
19-03-2011, 04:01 PM
Các anh các bạn các vị tiền bối ơi, sao em đọc thấy nhiều topic nói mà ko thấy trả lời.
CCS có hổ trợ compiler cho dsPIC ko vậy ạ.
Em cảm ơn.

hamster.khin
04-06-2011, 10:08 AM
Chào các bác.Có chút vướng mắc,các bác giúp em với.
Mục đích:Điều khiển động cơ phản hồi tốc độ về LCD
Thực hiện:Điều khiển được động cơ nhưng chưa phản hồi đc.
Em không biết sau mỗi lần gọi ngắt có cần phải để 1 vòng while() để đợi ngắt không.
Em dùng 16F877A,bây giờ điều khiển 1 kênh đã phải cần:TIMER2-PWM,TIMER 0:Đếm xung,TIMER1:Đếm thời gian,dùng để tính toán vận tốc.
Vậy nếu em dùng động cơ thứ 2 phải làm thế nào,có thuật toán nào ko ạ.
Có đoạn code và chương trình mô phỏng,các bác xem cho em:

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#include <lcd_lib_4bit.c>
int16 cnt,cnt2,xung,v;
int8 a,b,c;
#int_TIMER0
void TIMER0_isr(void) //TIMER0 dem xung ve
{
set_timer0(255);
if(tmr0if==1)
{
cnt++;
tmr0if=0;
}
}
#int_TIMER1 //TIMER1 dem tgian,tinh van toc
void TIMER1_isr(void)
{
set_timer1(5565);
if(tmr1if==1)
{
xung=get_timer0()*4;
v=(xung*60)/((100*60*0.001));
tmr1if=0;
}
}
void Lcd()
{
while(1)
{
a=(int)v/100;
b=(int)(v-a*100)/10;
c=(int)v%10;
LCD_putcmd(0xC0);
LCD_putchar("xung encoder");
LCD_putcmd(0x80);
LCD_putchar(a+48);
LCD_putcmd(0x81);
LCD_putchar(b+48);
LCD_putcmd(0x82);
LCD_putchar(c+48);
}
}
void Ngat()
{
set_timer0(255);
setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
enable_interrupts(INT_TIMER0);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
set_timer1(5565);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
void PWM()
{
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_pwm1_duty(1000);
set_pwm2_duty(1022);
}
void main()
{
set_tris_d(0);
set_tris_a(0xff); //Cho tin hieu di vao RA4
set_tris_c(0);
LCD_Init();
PWM();
Ngat();
Lcd();
delay_ms(100);
}


bạn có thể up file lên được không cho mình xem với, mình cop code về sao không buil được file hex, xem giúp mình với !

auto_tvt
09-08-2011, 12:08 AM
minh mới tập tành học vxl, va hiện mình Mikro-C , nhưng vì mới làm quen vxl nên lang thang trên mạng nhưng chẳng có code cho nó gì hết ah,
sao mọi người không ai dùng phần mềm này ah,
qua đây cho mình hỏi có ai dùng thi chỉ giáo cho mình với.. thanks mọi người.
mail của em: auto.tvt@gmail.com

caremlanh
09-08-2011, 03:59 PM
minh mới tập tành học vxl, va hiện mình Mikro-C , nhưng vì mới làm quen vxl nên lang thang trên mạng nhưng chẳng có code cho nó gì hết ah,
sao mọi người không ai dùng phần mềm này ah,
qua đây cho mình hỏi có ai dùng thi chỉ giáo cho mình với.. thanks mọi người.
mail của em: auto.tvt@gmail.com
tốt nhất là dùng CCS đi, ko thì HT PIC chứ Micro C chả hỏi được ai đâu

nguyenminhthi90
03-10-2011, 02:28 PM
chào các bác!
em tập theo cái tuto của pác linh thì đã có thể gửi ký tự từ PC lên LCD bình thường rồi, nhưng phần ngược lại, dù có printf cỡ nào nó cũng không truyền được vào hyper terminal được ah :(. cái này em mô phỏng bên con 8051 thì ngon lành cành đào ạ, hix :|
sau đây là code của e:

#include <16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)

#include <lcd_lib_4bit.c>
//#include <input.c>

int8 count=0;
int1 t=1;

#INT_RDA
Receive_isr() {
char c;
count++;
c = getc();
putc(c);
if (c=='z')
{
LCD_putcmd(0x01); //Clear Screen
count=0;
}

if ((count<=16) && (c!='z'))
{
LCD_putchar(c);
}
if ((count > 16) && (t==1))
{
count=1;
LCD_putcmd(0xc0);
LCD_putchar(c);
t=0;
}
if ((count > 16) && (t==0))
{
count=1;
LCD_putcmd(0x01);
LCD_putchar(c);
t=1;
}
}
void main()
{

enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
lcd_init();
lcd_putcmd(0x01);
lcd_putcmd(line_1);
printf("hello!");
while (1) {}
}

em có gửi theo mấy cái file, mọi người chỉ giúp e nhé :).

ngdnhanbk
11-01-2012, 02:59 AM
Theo mình biết thì giá trị value được biểu diễn bằng 10bit, giá trị lớn nhất của value là 1024.

Value không phải lúc nào cũng nhỏ hơn period, theo datasheet thì (pwm_duty/pwm_period)=(value/(4*(tmr2+1))).

Đoạn chương trình sau xuất xung PWM 50%, f=5Khz, ở chân CCP1
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,249,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
set_tris_c(0x00);
}


Vấn đề của bạn ngtdung.nguyen mình cũng chưa hiểu vì sao bị như vậy.
Không cần set_tris_c(0x00) liệu có ảnh hưởng gì ko bạn

ngdnhanbk
11-01-2012, 03:13 AM
Có nhiều vấn đề liên quan đến câu hỏi của bạn mà hiện giờ tôi cũng chưa có thời gian tìm lại các tài liệu. Bạn có thể xem qua phần "Common Design Mistakes" trong tài liệu "ABCs of ADCs" của National Semiconductor (link download dưới đây), để từ đó tránh được một số lỗi thiết kế thường gặp. Điều này đôi khi có thể giúp bạn có được một thiết kế đủ tốt, chứ chưa cần đến những kỹ thuật phức tạp khác.

http://www.national.com/appinfo/adc/files/ABCs_of_ADCs.pdf

Thân,

Anh có thể up lại tài liệu trên được không, link die rồi ạ

DunLop
30-03-2012, 12:27 PM
e mới học vdk...đang viết 1 mạch đo nhiệt độ dùng lm335 và 16f877a hiển thị led 7 đoạn
ko bik đoạn code e viết sai chỗ nào, mong ae giúp cho..thanks
# include <16f877a.h>
# fuses hs,nowdt,nolvp
# DEVICE 16f877a*=16 ADC=10
# use delay (clock=4000000)

int Maled[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
int hc=0,hdv=0,nhietdo,giatriadc;
# int_timer1
void ngattimer()
{
set_adc_channel(0);
delay_ms(10);
giatriadc=read_adc();
nhietdo=((giatriadc-558.558)/2.048);
hc=nhietdo/10;
hdv=nhietdo%10;
set_timer1(40536);
}
void hienthi();
void main()
{
set_tris_a (0xff);
set_tris_b (0x00);
set_tris_c (0x00);
setup_timer_1(t1_internal|t1_div_by_8);
set_timer1(40536);
enable_interrupts(int_timer1);
enable_interrupts(global);
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);

while(1)
{

hienthi();
}

}
void hienthi()
{

output_high (pin_c0);
output_low (pin_c1);
output_b (Maled[hc]);
delay_ms(5);
output_high (pin_c1);
output_low(pin_c0);
output_b (Maled[hdv]);
delay_ms (5);


}

sơ đồ mạch:

lt10dkdt
06-04-2012, 10:42 AM
Em có đoạn code sau nhưng em không hiểu là lệnh adcHI và adcLO làm gì (với khai báo
char adcHI,adcLO).Anh nào giải thích hộ em

while(TRUE)
{
adcValue = read_adc(); // Get ADC reading

adcHI = (char)((adcValue >> 5)& 0x1f);
adcLO = (char)((adcValue & 0x1f)|0x80);

putc(adcHI);
putc(adcLO);

delay_ms(10); // Preset delay, repeat every 10ms
}
}
em có đoạn code sau.tình hình là như thế này.em kết hợp nút ấn bên ngoài với ngắt. đoạn nhấp nháy thì oke hết rùi.nhưng khi khai báo ở void main thì toàn báo lỗi ở *case" ai biết chỉ dùm em với.em đang học về pic thôi.tim mãi mà không ra:

#include "16f877a.h"
#use delay(clock=20000000)
#int_rb

unsigned char x,i,a,b,tre;
int16 mode;

void trai()// chuong trinh con nhay trai sang
{

x=0x01;
output_d(x);
delay_ms(tre);
for(i=1;i<=7;i++)
{x=x<<1;
output_d(x);
delay_ms(tre);
}
}

void phai()//chuong trinh con nhay phai sang
{

x=0x80;
output_d(x);
delay_ms(tre);
for(i=1;i<=7;i++)
{
x=x>>1;
output_d(x);
delay_ms(tre);
}
}

void trong() //chuong trinh con nhay trong ra
{
a=0x01;
b=0x80;
for(i=1;i<=7;i++)
{
a<<=1;
b>>=1;
output_d(a|b);
delay_ms(tre);
}
}
void ngat()
{
if(input(pin_b0))
if(mode<2)mode++;//chuyen che do tang len o b0
if(input(pin_b1))
if(mode<0 )mode--;//chuyen che do tang len o b1
if(input(pin_b2))
if(tre<100) tre=tre+100;//tang thoi gian tre cho led
if(input(pin_b3))
if(tre>100) tre=tre-100;//giam thoi gian tre cho led

}

void main()
{
set_tris_b(0xff);
enable_interrupts(int_rb);
enable_interrupts(GLOBAL);

mode=0;
while (true)
case 0: trai();break;
case 1: phai();break;
case 2: trong();break;
}

yannibandari
04-05-2012, 01:00 AM
mọi người ơi giúp mình với. mình tìm chương trình pic c cả ngày rồi,cài vào rồi lại xóa không biết bao nhiêu lần mà cũng không tìm ra phiên bản thích hợp. cứ mỗi lần compile cái file.c (đã chạy tốt trên máy khác,có thể phiên bản cũ) thì nó lại báo error! mình xài win 7 64bit untimate. ức chế quá!

vietthanh123
28-08-2012, 05:25 PM
đoạn nhấp nháy thì oke hết rùi.nhưng khi khai báo ở void main thì toàn báo lỗi ở *case" ai biết chỉ dùm em với.em đang học về pic thôi.tim mãi mà không ra:

Báo lỗi vì cấu trúc của hàm case bị thiếu. Cấu trúc có nó là:
switch (cmd)
{
case 0: sthing;
break;
case 1: sthing;
break;
case 2: sthing;
break;

}

tranhien5291
04-11-2012, 11:14 PM
Các bác ơi cho e hỏi e cài CCS nhưng mà bị báo lỗi " Exception EInoutError in module pcwwiz.exe at 00833f6 I/O error 123 " , k biết phải làm thế nào nữa. Các pro chỉ cho e với ạ!!! e cảm ơn ạ.

huydungsh
06-11-2012, 04:14 PM
các anh cho em hỏi đoạn chương trình sau co nghĩa như thế nào ak?
#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
theo em nghĩ thì khi timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến cuont tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần tương ứng với 100ms thì con pic16f877a có làm gì không? nếu làm thì khi thỏa mãn điều kiện IF thì làm sao pic có thể thực hiện các lệnh trong điều kiện đó. thanks all!

quanghuy_125
07-11-2012, 01:31 AM
các anh cho em hỏi đoạn chương trình sau co nghĩa như thế nào ak?
#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
theo em nghĩ thì khi timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến cuont tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần tương ứng với 100ms thì con pic16f877a có làm gì không? nếu làm thì khi thỏa mãn điều kiện IF thì làm sao pic có thể thực hiện các lệnh trong điều kiện đó. thanks all!

Đúng theo bạn nói" timer0 đêm được 200 lần( set_timer0(56); 256-56=200) thì biến count tăng lên 1. vậy trong quá trình chờ biến count đếm được 500 lần "
Cái 100ms không tính được vì nó phụ thuộc vào xung nhịp mà mình đưa vào.
Khi count=500; thì count=0; a = đảo a; chân RB0 =a; và quá trình lại được tiếp diễn...

huydungsh
07-11-2012, 01:56 AM
cảm ơn các anh đã giải thích! nguyên code là như sau:
#include <16F877A.h>
#include <DEFS_16F877A.h>
#device 16F877*=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

#int_timer0
void interrupt_timer0(){
int1 a;
int16 count;
set_timer0(56);
++count;
if(count == 500)
{
count=0;
a=~a;
RB0=a;
}


}
void main()
{
set_tris_b(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(int_timer0);
enable_interrupts(global);
set_timer0(56);

while(true)
{
}
}
em chỉ copy ở page 1 thôi thắc ở cái đoạn đó mong các anh giải thích giúp em!! thanks all

huydungsh
12-11-2012, 06:55 PM
các anh ơi cho em hỏi trong ccs có hàm nào để thay đổi tần số xung trong điều chế PWM không ak! thanks các anh

ducthang50k2
23-11-2012, 01:58 AM
có anh nào biết cách tính thời gian giữa 2 lần bấm phim không vậy? chỉ cho em với . 2 phím này là ở 2 chân ngắt khác nhau .

cảm ơn !!

huydungsh
13-12-2012, 10:25 AM
anh Nhh đâu rồi ây nhỉ các bài của anh rất hay!! em đọc và đã hiểu rất nhiều mong anh lại tiếp tục post nữa!!! em cũng đang tập tạnh viết nếu có kết quả cũng được xin chia sẻ với mọi người

huydungsh
13-12-2012, 10:30 AM
bác F khóa luồng của anh Nhh thực sự là tôi không đồng ý!! cái lý do lệnh đã cũ rồi không phù hợp nữa nhưng đó là phần mền mới. có người vẫn còn xài phần mền cũ thì sao???? tồi thiết nghĩ các bài của anh Nhh rất hay rất chi tiết và có cả vi dụ! đọc là hiều làm việc thì phải hiểu đã rồi mới làm tốt được chứ không phải cái gì cũng mới là tốt đâu!

ngocnamdhgtpic
27-04-2013, 11:19 PM
anh F ơi cho em hỏi về lỗi của CCS 4.104
em cài phần mềm này trên win7, đang chạy bình thường thì bị lỗi như sau:
khi F9 thì nó báo lỗi: "Error 28... ... ...: Expecting an identifier
bôi xanh ký tự sau ham "void"
em thử loại bỏ cả hàm void đó đi thì lại báo lỗi hàm oid tiếp theo, lỗi cả void main luôn :((
e đã cài lại win 2 lần mà không hết cái lỗi này. Ai biết cách sửa lỗi này xin chỉ giúp em với. em chân thành cảm ơn!

loivannhudon
28-06-2014, 07:03 PM
em thấy topic này hay vậy sao mọi người không tiếp tục thực hiện, qua các diễn đàn khác tìm hiểu em toàn thấy mọi người bàn về MLAP, tìm hiểu về CCS khó quá, mong các anh tiếp tục phát triển chủ đề này.
Thân.