PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   CCS C for PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=357)

anhthang 07-02-2007 06:04 PM

Luồng này sao ế quá vậy! mình xui quá!

hanspkt 07-02-2007 08:03 PM

Bạn vào đây http://kho.tailieuvietnam.net (hoặc click chuột vào góc phải phía trên đấy).

anhthang 08-02-2007 07:47 AM

Cảm ơn bạn Hanspkt! mình cũng là dân spkt

nghaiha 09-02-2007 04:22 PM

Các bác ơi cho em hỏi, vậy em muốn nhúng một đoạn ASM vào trong 1 function của CCS thì em phải nhúng như thế nào ạ?

namqn 09-02-2007 06:48 PM

Trích:

Nguyên văn bởi nghaiha (Post 7312)
Các bác ơi cho em hỏi, vậy em muốn nhúng một đoạn ASM vào trong 1 function của CCS thì em phải nhúng như thế nào ạ?

Dùng các directive #ASM và #ENDASM để bọc đoạn code đó. Đọc thêm hướng dẫn về hai directive này trong tài liệu hướng dẫn của CCS, ở đó đã có ví dụ.

Thân,

nhh 11-02-2007 03:28 PM

Trích:

Nguyên văn bởi anhthang (Post 7251)
Em thật sự không hiểu câu này:" (nếu dùng hai thì chèn dấu "|"ở giữa) " anh NHH có thể minh họa cho em được không? em mới tìm hiểu về Pic được một tuần, nhưng chắc chắn là anh chỉ rõ hơn thì em sẽ hiểu! cảm ơn anh và chúc anh vui!

Chọn ví dụ như vầy nè : Ví dụ chọn Timer0, chia prescaler 1:2
Code:

setup_timer_0(CC_INTERNAL|RTCC_DIV_2);
Đơn giản vậy thôi !

khangcodt 11-02-2007 07:01 PM

Chào các anh em trong trang diễn đàn CCSC.
Mình cũng đang rất quan tâm đến mảng này.

Thấy mọi người bàn luận khá sôi nổi về các phần ngắt, timer hay giao tiếp LCD... Nhưng sao không thấy ai đề cập về EEPROM vậy?
Theo quan điểm của mình thì EEPROM chính là cải tiến đáng kể nhất của PIC (hay AVR) đối với các bậc MC tiền bối như kiểu 8051.

Tiện thể cũng xin nêu thêm 1 quan điểm nữa. (Nói chung hơi nhiều quan điểm!!!). Bác NHH nói một số ví dụ về các Timer theo kiểu 'định thời' có tác dụng như tạo một khoảng thời gian (thời gian trễ). Tất nhiên điều đó đúng và có thể đó chỉ là những ví dụ để anh em học hỏi, nhưng "tui" thì hay dùng nó như một "đồng hồ bấm giờ". Tức là nó sẽ bấm giờ cho thằng CPU. Thằng CPU đang làm gì mặc kệ, nhưng khi đến giờ của nó thì CPU phải làm việc của nó...

Kiến thức còn nông cạn, mong anh em chỉ giáo thêm!!!

À nếu anh em nào hứng thú với món EEPROM thì chúng ta cùng bàn luận nhé. Nếu có thời gian rảnh hơn mình cũng sẽ cố gắng 'Pót' bài về vấn đề này. (Cũng tỏ vẻ bận rộn một tẹo!!!).

Thanks to everyone.
____________________
PS: Maybe contact with me at Email: khangcodt@yahoo.com

falleaf 11-02-2007 07:48 PM

Những vấn đề này đã được thảo luận rất nhiều và từ rất lâu rồi bạn ạ.

Tuy vậy, hoạt động của diễn đàn luôn là trao đổi liên tục, để những người mới có thể tham gia thảo luận, các bạn muốn thảo luận chuyên mục, sẽ có thể mở ra mục mới. Đừng viết lẫn lộn trong các luồng.

Chúc vui.

khangcodt 13-02-2007 05:29 PM

Hỏi bác NHH (hoặc có cao thủ nào biết thì chỉ bảo giùm):
Khi dùng hàm delay_ms() trong chương trình con ngắt của các Timer (VD như #INT_TIMER1) hình như có vấn đề gì đó.

Khi dịch chương trình thì có cảnh báo " Interrupts disabled..." (Theo mình hiểu thì là mọi ngắt khác điều bị cấm)

Khi chạy, nếu chương trình chính có chạy thì thời gian gây ngắt (của Timer1) lại khác so với khi không chạy gì.
Đây là toàn bộ chương trình:

#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
int i;
int16 count;
#INT_TIMER1
void lapngat()
{
count++;
if (count==200)
while(true)
{
output_high(PIN_C1);
delay_ms(1000);
if(!input(PIN_B3)) break;
output_low(PIN_C1);
delay_ms(1000);
}
else set_timer1(0);
}
void main(void)
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(0);
count=0;
while(true)
if(!input(PIN_B0)) break;
while(true)
{
if(!input(PIN_B1))
while(true)
{
output_high(PIN_C0);
for (i=1;i<=3;i++)
delay_ms(1000);
output_low(PIN_C0);
delay_ms(1000);
if(!input(PIN_B2)) break;
}
}
}

Thanks to everyone who is interested in.

khangcodt 01-03-2007 12:47 PM

Đợi lâu quá không thấy ai trả lời ... Đành tự giải đáp vậy (Để nếu anh em nào mắc phải thì lờ mờ cũng có hướng giải quyết).
Sau khi vào trang Web của CCSC để tìm hiểu về vấn đề này mình lĩnh hội được một vài điều như sau:
- Thứ nhất, một thiết kế sẽ là không tối ưu nếu trong CTC ngắt lại gọi đến một hàm khác đã được sử dụng trong Main hay hàm khác, đặc biệt là khi bản thân hàm này lại gọi đến hàm khác nữa...(những hàm chứa trong các header thường gọi lẫn nhau như vậy).
- Thứ hai nếu sử dụng hàm như nêu trên thì chương trình chạy sẽ không theo đúng ý đồ lập trình (chẳng hạn như trong chương trình mà mình vừa Pót). Điều này xảy ra là do bộ nhớ Stack bị tràn (stack của PIC chỉ có 8 mức) khi gọi hàm chồng chéo (cả hàm Main và CTC ngắt đều gọi...).
- Thứ ba bên CCSC khuyên nếu buộc phải gọi hàm như vậy (chẳng hạn như hàm delay_ms như trên) thì hãy khai báo ở cà hàm Main và hàm ngắt ???.
Điều này thì mình không rõ vì đã thử nhưng không có hiệu quả.

hungnp 02-03-2007 02:56 PM

Vấn đề của bạn như có thể giải thích một cách dễ hiểu như sau:
Nếu cả 2 hàm đều được gọi trong cả hàm ngắt và hàm main thì sẽ phát sinh ra lỗi. Tại sao lại thế. Các bạn thử suy nghĩ mà xem. khi hàm main đang chạy đến hàm mà nó và hàm ngắt cùng gọi. Nếu không có ngắt xẩy ra cùng thời điểm đó thì không có vấn đề gì cả. nhưng nếu có ngắt thì nó phải lưu các thông số hiện tại và nhảy vào ngắt, và khi nó nhảy ra khỏi ngắt thì các dữ liệu đã lưu sẽ bị chồng lên trong khi thực hiện hàm đó trong ngắt. vậy chương trình sẽ không đúng nữa.

Trong Keil C của 89 thì nó chỉ là warning nhưng trong css c thì nó là error. và theo quan điểm của tôi nó phải là một error.

hungnp 02-03-2007 03:07 PM

Nếu bạn muốn dùng 2 cái delay_ms() trong cả ngắt và main thì mình nghĩ không có cách nào đâu. nếu bạn cứ muốn dùng nó thì hãy tạo ra 2 hàm delay_ms1() và delay_ms2() và trong ngắt gọi một hàm và trong main gọi hàm còn lại.

Còn có một cách nữa mình nghĩ nó sẽ pro hơn đấy là.

mình xin viết lại một đoạn chương trình của bạn trong:
bạn khai báo một biến toàn cục như thế này nhé.
//=======
int1 bit_timer0_status;

#INT_TIMER1
void lapngat()
{
bit_timer0_status =1;
}

//===========
// và đưa công việc của bạn muốn thực hiện khi có ngắt vào đây.
//===========
void isr_timer0(void)
{
count++;
if (count==200)
while(true)
{
output_high(PIN_C1);
delay_ms(1000);
if(!input(PIN_B3)) break;
output_low(PIN_C1);
delay_ms(1000);
}

//===========
//và trong hàm main bạn phải làm thế này
//===========
void main(void)
{
if(bit_timer0_status)
{
//có thể cấm ngắt timer0.
//gọi hàm thực hiện công việc.
isr_timer0();
bit_timer0_status=0;
//bật ngắt trở lại
}
}

//ok?

khangcodt 02-03-2007 06:15 PM

Cảm ơn bạn hungnp rất nhiều.
Giải pháp của bạn rất hay, và thực ra sau khi mình tìm hiểu điều này trên chuyên trang của CCSC mình cũng có ý tưởng na ná như vậy.
Nhưng nó vẫn có những hạn chế nhất định. Mình sẽ phân tích cho bạn như sau:
Giả sử chương trình viết theo cách của bạn, khi nó kiểm tra đến lệnh 'if(bit_timer0_status)' mà chưa xảy ra ngắt thì nó sẽ không thực hiện hàm 'isr_timer0()', qua đó rồi ngắt mới xảy ra thì chương trình lại không test 'if(bit_timer0_status)' và không thực hiện hàm 'isr_timer0()', tức là không có ngắt.
Còn nếu trong chương trình mà luôn kiểm tra 'if(bit_timer0_status)' thì đang từ việc sử dụng phương pháp ngắt lại thành ra phương pháp thăm dò ???

Mong bạn có những góp ý thêm.

khangcodt 02-03-2007 06:20 PM

À mình cũng muốn nói thêm vấn đề vừa rồi trong CCSC nó cũng chỉ là 'warning' chứ không phải 'error'

khangcodt 04-03-2007 08:55 AM

Kbd
 
Trích:

Nguyên văn bởi ncv (Post 2927)
Chương trình hiển thị phím số trên bàn phím 4x3 ra đèn 7 đoạn (DÙNG INTERRUPT).

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers

Nhờ bác NCV chỉ giáo.
Có lẽ tại công lực của em còn non kém nên em đọc cái driver này mãi mà chẳng hiểu nó là cái gì, dùng vào đâu, tác dụng ra sao...???
Mong bác rọi đèn pin khai sáng cho em với.
Cảm ơn bác rất nhiều...nhiều!!!

khangcodt 04-03-2007 09:29 AM

Dùng LCD và ngắt
 
Trích:

Nguyên văn bởi nhh (Post 3228)
Có hai cách lập trình cho LCD: dùng 8bit interface (đơn giản) hoặc 4bit interface (phức tạp hơn)

1.8bit interface

2.4bit interface

Sử dụng 4 chân D4 - D7 (hoặc D0-D3 <- ít dùng) để truyền thông tin, dữ liệu đến LCD.
- Để điều khiển LCD (Chọn chế độ LCD, bật/tắt hiển thị, bật/tắt/nhấp nháy/di chuyển con trỏ,...): Nhập giá trị tương ứng vào D0-D7,lấy giá trị 4bit cao D4-D7 rồi gởi lệnh yêu cầu LCD thực thi lệnh điều khiển, tiếp theo cho LCD thời gian trễ để thực thi (hoặc hỏi cờ bận xem LCD sẵn sàng thực hiện lệnh tiếp theo chưa?).Tiếp tục, gởi 4bit thấp D0-D3 rồi gởi lệnh yêu cầu LCD thực thi lệnh điều khiển, tiếp theo cho LCD thời gian trễ để thực thi (hoặc hỏi cờ bận xem LCD sẵn sàng thực hiện lệnh tiếp theo chưa?)

Nếu trong ứng dụng sử dụng ngắt ngoài thì có thể chuyển sang nối với PORTD hoặc tùy thích.

Hôm nay rãnh rỗi Pót hơi nhiều...!!!

Trước hết xin lỗi bác NHH vì cắt dán bài của bác.
Sau đó cảm ơn bác vì em tin bác sẽ trả lời cho em bài này....(Hì hì...!!!)

Nếu sài LCD (theo kiểu gì cũng vậy) thì đều mất toi PortB, hay chính xác hơn là mất hết ngắt ngoài trên PortB. (Nếu sử dụng PIC ít chân thì hết ngắt ngoài...Phí quá!!!). May mà bác có nhắc đến điều này ở cuối bài.
Bác thương thì thương cho chót, bác bày luôn cho anh em cách sử dụng LCD trên các port khác, chẳng hạn portA (kết hợp B1-B3 của portB), portC,D...
Nội lực của em còn đuối, mặc dù đã thử tìm hiểu cấu hình kết nối với LCD trong driver 'LCD.c' nhưng "em chẳng biết, em chẳng thấy...Ở bên người ấy..."

Mong bác chỉ giáo giúp.
Thanks. Thanks. Thanks... And only know to say "thanks"!!!

nhh 05-03-2007 03:23 PM

Bạn muốn kết nối chân LCD với pic theo kiểu nào cũng được, nhưng ko ai làm như vậy cả, lí do:

- Viết code khó, vì mỗi lần xuất dữ liệu điều khiển hay hiển thị đều có mã lệnh riêng, bạn kết nối lộn xộn dẫn đến khó lập trình và ko cơ động.
- Các chân của pic thường được kéo ra ngoài theo từng port. Nếu nối lộn xộn, ko thẩm mỹ.

Bạn muốn nối theo ý bạn, cứ theo nguyên lí hoạt động của LCD thôi. Bạn xem khi nào xuất lệnh điều khiển, khi nào xuất lệnh hiển thị,...kết hợp với thiết kế của bạn mà viết code.

vdt 05-03-2007 08:11 PM

Trích:

Nguyên văn bởi khangcodt (Post 7521)
Hôm nay rãnh rỗi Pót hơi nhiều...!!!

Trước hết xin lỗi bác NHH vì cắt dán bài của bác.
Sau đó cảm ơn bác vì em tin bác sẽ trả lời cho em bài này....(Hì hì...!!!)

Nếu sài LCD (theo kiểu gì cũng vậy) thì đều mất toi PortB, hay chính xác hơn là mất hết ngắt ngoài trên PortB. (Nếu sử dụng PIC ít chân thì hết ngắt ngoài...Phí quá!!!). May mà bác có nhắc đến điều này ở cuối bài.
Bác thương thì thương cho chót, bác bày luôn cho anh em cách sử dụng LCD trên các port khác, chẳng hạn portA (kết hợp B1-B3 của portB), portC,D...
Nội lực của em còn đuối, mặc dù đã thử tìm hiểu cấu hình kết nối với LCD trong driver 'LCD.c' nhưng "em chẳng biết, em chẳng thấy...Ở bên người ấy..."

Mong bác chỉ giáo giúp.
Thanks. Thanks. Thanks... And only know to say "thanks"!!!

Đúng như NHH đã nói, k0 ai làm như bạn đâu. Nếu bạn định dùng Port nào để đ/k LCD thì bạn nên sử dụng nguyên Port đó nhé, như vậy vừa dễ lập trình, vừa dễ trong khi làm mạch, lại dễ dàng hơn trong việc kiểm soát lỗi nữa, tóm lại là nó thực tế hơn bạn ạ.
Còn việc thay vì sử dụng Port B, ta đổi sang dùng port khác thì quá dễ đúng không bạn, chắc không cần phải nói ra ở đây nhé. Bạn nên dung luôn các driver của CCS C cho dễ (ví dụ LCD420.c), sau đó có thể sửa đi đôi chút cho phù hợp với nhu cầu thực tế của bạn, ví dụ như bạn có thể tận dụng chân thiết lập chế độ đọc dữ liệu từ LCD xuống pic (vì k0 có nhu cầu đọc từ LCD xuống PIC) để làm việc khác.
Chúc bạn thành công

hungnp 06-03-2007 09:00 AM

Chào bạn khangcodt,

Bạn chưa đọc kỹ chương trình của mình thì phải. Sẽ không có trường hợp ngắt xẩy ra mà không thực hiện công việc mà bạn mong muốn. Có chăng thì nó chậm hơn so với khi để công việc trong ngắt một chút. thời gian này không đáng kể chỉ khoảng vài 2ms. cái này không ảnh hưởng gì phải không?

Tại sao mình lại bảo không có chuyện như bạn nói.
Trong chương trình phục vụ ngắt mình đã sử dụng một bit 'bit_Timer0_Status', bit này có mục đích khi có ngắt thì bật nó lên để báo cho hàm main biết đã có ngắt xẩy ra. và kể cả khi hàm main đang làm những gì, ở đâu thì khi gặp lệnh if(bit_Timer0_Status) thì nó thực hiện công việc mong muốn. và khi thực hiện công việc này xong phải xóa bit này để dùng cho lần sau.

khangcodt 06-03-2007 12:34 PM

Cám ơn bạn hungnp đã quan tâm.
Như mình đã nói nếu viết theo cách của bạn thì gần như chắc chắn sẽ không thực hiện được hàm ngắt theo mong muốn. Đã đành khi timer1 báo cho(bit_Timer0_Status) =1 (timer đã ngắt), nhưng có thể nói chắc chắn rằng khi chương trình đang kiểm tra 'if(bit_timer0_status)' thì timer chưa ngắt vì nó kiểm tra ngay bắt đầu hàm main. Sau khi đã kiểm tra như vậy rồi thì chương trình có quay lại để tiếp tục kiểm tra đâu mà gọi hàm 'ngắt phụ' như bạn viêt.

Nếu bạn không tin thì hãy lập thử một chương trình đơn giản sử dụng ngắt theo cách bạn viết và mô phỏng thử trên Proteus. (việc này đơn giản và không tốn nhiều thời gian,chắc không cần nói thêm!)

Tiện đây mình nói với bạn về các phương pháp trao đổi dữ liệu nói chung. Có 3 phương pháp chủ yếu là pp thăm dò (polling), pp ngắt (interrupt) và pp trao đổi trực tiếp (pp thú ba mình không nhớ rõ lắm). Làm như cách của bạn chính là chuyển từ pp ngắt sang pp thăm dò.

OKie???
__________
PS: maybe contact me at email:khangcodt@yahoo.com

hungnp 06-03-2007 04:20 PM

Chào khangcodt,

Hóa ra bạn bảo mình là không cho cái if của mình vào trong cái while(true) của bạn. Thật ra cái đấy mình chỉ viết thí dụ thôi. Còn nếu bạn muốn sử dụng thì bạn phải tự làm thêm. Vì mình nghĩ trong một firmware cho vi điều khiển không có cái nào không có lệnh while(true){} cả. Còn nếu đọc đến đây mà bạn vẫn khăng khăng nó không thực hiện được ngắt thì... mình cũng bó tay rồi. Nếu cần mình sẽ cho bạn xem một chương trình của mình, mình đã viết và thành phẩm. Phải nói nó chạy phe phé.

Và cái thứ 2 mình muốn nói thêm. Mình chỉ đưa ra những phương án như trên cho bạn, để bạn tham khảo thôi chứ không phải hay ho gì. nên bạn không cần thiết phải so sánh nó với 3 cái mà bạn nói. Nói thật mình chả hiểu đếch gì về mấy cái đấy cả... hê hê.

Và thêm nữa. Nếu bạn có một sáng kiển nào hay hơn cho vấn đề của bạn thì mong được học hỏi. Thanks.

PIC_Phan 07-03-2007 08:47 PM

Các bác cho em hỏi, Em dùng CCS C 4.014 có mục PROGRAMING A CHIP trong đó có tùy chọn ICD (enable) và MACHX (disable).Em không hiểu, nếu ta chọn ICD thì nạp cho PIC bằng mạch nạp theo chuẩn nào? Chẳng lẽ nó là mạch deburg? Trước giờ em chỉ dịch ra file hex sau đó dùng ic-prog nạp cho chip, nay hỏi để tăng vốn kiến thức 1 tẹo, mong các bác chỉ giúp.
(Xin lỗi trước nếu như vấn đề trên cũ rích và đặt sai chỗ)

namqn 08-03-2007 02:58 AM

Trích:

Nguyên văn bởi PIC_Phan (Post 7588)
Các bác cho em hỏi, Em dùng CCS C 4.014 có mục PROGRAMING A CHIP trong đó có tùy chọn ICD (enable) và MACHX (disable).Em không hiểu, nếu ta chọn ICD thì nạp cho PIC bằng mạch nạp theo chuẩn nào? Chẳng lẽ nó là mạch deburg? Trước giờ em chỉ dịch ra file hex sau đó dùng ic-prog nạp cho chip, nay hỏi để tăng vốn kiến thức 1 tẹo, mong các bác chỉ giúp.
(Xin lỗi trước nếu như vấn đề trên cũ rích và đặt sai chỗ)

Hãng CCS có một mạch nạp/debug gọi tên là ICD, tương tự như ICD 2 của Microchip, nhưng hai loại này không tương thích với nhau. ICD của CCS cũng có cổng nối tiếp và USB, dùng giao thức riêng của CCS.

Thân,

PIC_Phan 08-03-2007 02:55 PM

Cảm ơn bác namqn đã trả lời.Theo bác nói,em hiểu,nếu muốn nạp thẳng bằng CCS C thì ta phải dùng mạch của CCS C.Được, vừa biết vụ này thì tìm hiểu cho kĩ luôn.
Một lần nữa cám ơn bác namqn

namqn 08-03-2007 09:42 PM

Trích:

Nguyên văn bởi PIC_Phan (Post 7595)
Cảm ơn bác namqn đã trả lời.Theo bác nói,em hiểu,nếu muốn nạp thẳng bằng CCS C thì ta phải dùng mạch của CCS C.Được, vừa biết vụ này thì tìm hiểu cho kĩ luôn.
Một lần nữa cám ơn bác namqn

Bạn có thể đọc thêm về ICD của CCS ở đây:
http://www.ccsinfo.com/content.php?page=ICD

CCS cũng có 1 mạch nạp gọi là MachX.

Thân,

manofpic 12-03-2007 08:55 PM

eo ôi! Trang này cũng toàn bài ví dụ hay! Em cảm ơn các admin, THANKS

fdv 14-03-2007 03:03 PM

cho mình hỏi nguồn 4,5 v pic có chạy được không
mình không tài nào tạo được nguồn 5v từ con 7805 được hết
Thanks nhiều

thaithienanh 14-03-2007 06:02 PM

chắc bạn nói trừ hao thôi chứ thường thì áp sau 7805 khoảng 4,75V chạy tốt không vấn đề gì cả ;)

fdv 15-03-2007 04:33 PM

mình mới hoc pic mình đang viết chương trình input output cho con 16f877a
chuong trinh mình viết như thế này không biết đúng không mà nó không chạy được

Code:

#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=10000000)
#define SRAM_SCL PIN_C3
#define SRAM_SDA PIN_C4
#USE RS232(BAUD=9600,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7,BITS=9)
main()
{
/*  setup_adc_ports(AN0_AN1_AN3);
  setup_adc(ADC_CLOCK_INTERNAL);
  set_adc_channel(0);

  setup_ccp1(CCP_CAPTURE_FE);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

  enable_interrupts(INT_CCP1);
  enable_interrupts(INT_EXT1);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);*/

while(1)
{
IF(input(pin_a0))
{
output_low(pin_b0);
}
else
{
output_high(pin_b0);
}
}//while loop
}

chương trình nạp vào pic được nhưng lại không chạy được ,
mình muốn nhập tín hiệu vào port a,xuất ra portb ,không biết bị sai chỗ nào nữa
mong các bạn xem giúp mình
các bạn có thể cho mình một vài ví dụ về vấn đề này không
cám ơn nhiều

thaithienanh 15-03-2007 05:28 PM

à cái này là do cấu hình bạn chọn là dao động nội (Cấu hình XT chạy mà HS không chạy thì có khả năng thạch anh bị overdrive khi cấu hình ở HS, theo Microchip thì có thể thêm vào một điện trở Rs giữa chân OSC2 và chân thạch anh (trong mấy cái datasheet đều có nói đến) nguyên văn của anh Namq), nếu có sẵn thạch anh ở đó bạn cấu hình dùng thạch anh là ok.

fdv 15-03-2007 06:40 PM

cám ơn bạn,nhưng mình mới học pic ,nên không hiểu lắm ,bạn có thể cho mình biết cách sửa chữa cụ thể hơn không,mình xài thach anh 10000000,va sơ đồ mạch lắp đúng với chỉ dẩn của những bài đăng trước

namqn 15-03-2007 07:07 PM

Bạn thiết lập AN0 là ngõ vào analog, nhưng lại dùng nó như ngõ vào digital trong chương trình. Bạn nói rõ hơn về ý định của bạn. 'không chạy được' theo bạn nói là như thế nào? (không thấy thay đổi gì ở portB chăng?)

Thân,

fdv 15-03-2007 07:20 PM

em đang muốn lập trình cho robot bằng tay ,em muốn kick bằng tay cầm port a(hay 1 port bất kì nào cũng được) len mức cao ,tương ứng với các nút trên tay cầm em muốn xuất ra port b các mức thấp tương ứng để điều khiển động cơ
em lập trình pic lần đầu nên còn nhiều thứ căn bản chưa biết mong anh giúp đỡ

thaithienanh 15-03-2007 07:35 PM

bạn đang dùng project phải không (mình ít dùng cái này vì trông nó có vẻ luộm thuộm quá), mình khoái tự khai báo hơn vì nó gọn, theo như bạn nói thì phần code chỉ bây nhiêu đây là đủ rồi :
Code:

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

void main(){
while(true){
IF (input(pin_a0))  output_low(pin_b0);
else  output_high(pin_b0);
}


fdv 16-03-2007 02:46 PM

chuong trình khi mình viết 1 cổng input thì chạy được ,còn viết input cho nhiều cổng thì lại chỉ chạy được 1 input đầu tiên thôi,chương trình mình viết như thế này mong các bạn xem giúp mình
#include<16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=10000000)

void main(){
while(true){
IF (input(pin_a0)) output_low(pin_b0);
else output_high(pin_b0);
IF (input(pin_a1)) output_low(pin_b1);
else output_high(pin_b1);
}}

chương trình trên khi mình nạp thì chỉ chạy được input pina0 à
không biết sao nữa,mong các bạn sửa giúp mình
cám ơn

Sangcao 16-03-2007 04:24 PM

Ban xem lai cau truc lenh, chu y su dung dau {} trong lenh IF
Vi du
if()
{thuc hien lenh;}
else ();
ok!

thaithienanh 16-03-2007 06:26 PM

vậy thì lạ thật :confused: mình thấy code đúng rùi mà.

namqn 16-03-2007 10:01 PM

Trích:

Nguyên văn bởi fdv (Post 7754)
chuong trình khi mình viết 1 cổng input thì chạy được ,còn viết input cho nhiều cổng thì lại chỉ chạy được 1 input đầu tiên thôi,chương trình mình viết như thế này mong các bạn xem giúp mình
#include<16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=10000000)

void main(){
while(true){
IF (input(pin_a0)) output_low(pin_b0);
else output_high(pin_b0);
IF (input(pin_a1)) output_low(pin_b1);
else output_high(pin_b1);
}}

chương trình trên khi mình nạp thì chỉ chạy được input pina0 à
không biết sao nữa,mong các bạn sửa giúp mình
cám ơn

Để khẳng định nhận xét trên của bạn, bạn hãy thử viết code cho 1 input và 1 output, nhưng dùng RA1 thay vì RA0, xem PIC chạy ra sao.

Tôi cho rằng cần xác định thêm trạng thái cho các thanh ghi như ADCON1, TRISA, và TRISB nữa. Tôi không bao giờ viết code mập mờ như vậy, vì tôi không rõ CCS C có xác định trạng thái cho các thanh ghi đó hay không.

Thân,

tranvanthuong 17-03-2007 02:34 PM

mấy anh ơi, em tai mấy phần mên MPLAP Luon phiên bản 7.20,7.50,752 nhưng không biết cách viết bằng CSS anh chi em voi(minh hoạ bằng hình ảnh em cám ơn nhiều

khangcodt 17-03-2007 03:24 PM

Chào bạn tranvanthuong!..
Bạn tải CCSC (trong trang này, mục 'chương trình dịch & các công cụ mô phỏng') về rồi cài ra (tự động nó sẽ plug-in vào MPLAB). Sau đó chọn trong Project của bạn mục Project->Select language Toolsuite là CCSC là được.


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

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