PDA

View Full Version : Mới bắt đầu? Code không chạy? Hãy vào đây!


namqn
13-01-2009, 12:31 AM
Checklist dưới đây được tôi lược dịch từ piclist và cập nhật một số thông tin thích hợp cho người dùng Việt Nam. Những thông tin này rất có ích cho người học PIC, chủ yếu là người mới học, nhưng không loại trừ những người đã có kinh nghiệm dùng PIC lâu năm. Nhiều người dùng lâu năm vẫn chưa biết đến sự tồn tại của piclist và thư viện mã nguồn cùng các thông tin hữu ích của nó.

Nếu code của bạn không chạy, hãy kiểm tra các mục 9 - 17.

1. Biết đến sự tồn tại của www.piclist.com (thư viện mã nguồn rất lớn, cùng các thông tin hữu ích).

2. Chọn một PIC để bắt đầu. Tại VN vào thời điểm này, nên chọn PIC16F886 để có thể học mọi thứ của dòng PIC tầm trung, mà không tốn quá nhiều tiền. Sau đó, hãy chọn một PIC18 để có nhiều tính năng nâng cao (chọn PIC18F2331 nếu thiên về điều khiển động cơ, các hướng khác nên chọn PIC18F2550).

3. Không đụng vào chân của PIC trừ khi bạn đã nối đất bản thân, vì lý do tĩnh điện.

4. Tìm một mạch nạp thích hợp, hỗ trợ PIC của bạn. Các mạch nạp đơn giản được giới thiệu ở đây: http://www4.hcmut.edu.vn/~nqnam/uC.php hoàn toàn hỗ trợ các PIC đã nêu trên.

5. Đừng bật bảo vệ code ở giai đoạn (mới học) này.

6. Chịu khó đọc tài liệu: datasheet cho PIC đang được dùng (www.microchip.com), các tutorial cơ bản cho PIC.

7. Chọn một ngôn ngữ lập trình: hợp ngữ, Pascal, Basic, C/C++, Java, ... Nhiều trình dịch ngôn ngữ cấp cao hiện nay có các phiên bản miễn phí (demo, giới hạn chức năng, phiên bản cho sinh viên, ...).

8. Bắt đầu bằng một bài tập rất đơn giản như bật LED khi công tắc đóng, và phát triển từ đây khi code đã chạy tốt.

9. Đừng thả nổi ngõ vào, kéo lên hoặc kéo xuống các ngõ vào bằng một điện trở 10 k chẳng hạn.

10. Đảm bảo thiết lập đúng các thanh ghi TRISx.

11. Chống nẩy cho các phím/công tắc.

12. Chân RA4 của hầu hết các PIC thuộc loại "cực máng hở", để xuất logic '1' thì cần phải kéo chân này lên VDD bằng một điện trở 500 ohm đến vài k.

13. Tắt WDT nếu không dùng.

14. Kiểm tra xem chân MCLR đã được nối vào VDD (qua một điện trở khoảng 10 k) hay chưa.

15. Nối nguồn tương ứng tất cả chân VDD và VSS của PIC, và đảm bảo giữa mỗi cặp chân VDD và VSS gần nhau đều có một tụ ceramic 100 nF đặt gần các chân này đến mức có thể.

16. Đảm bảo các bit thiết lập dao động là phù hợp cho kiểu mạch/bộ dao động của bạn.

17. Nối một điện trở khoảng 4,7 k từ chân PGM (của các PIC có khả năng nạp chương trình ở điện áp thấp-LVP) đến VSS, trong trường hợp PIC chưa qua sử dụng, hoặc chế độ LVP đang được sử dụng.

18. Code mẫu cho hầu hết các ứng dụng phổ biến có tại www.piclist.com/faq

19. Nếu code của bạn không làm việc tốt: Gạt toàn bộ chương trình sang một bên, tìm cách viết một đoạn code nhỏ và làm cho nó chạy tốt. Sau đó thêm vào từng phần còn lại của code ban đầu, kiểm tra và gỡ rối từng phần, cho đến khi toàn bộ chương trình của bạn làm việc tốt. Chú thích mỗi và mọi dòng code về chức năng của nó, và kiểm tra lại với datasheet.

Thân,

hangocminh1989
01-11-2009, 07:43 AM
thank bang chủ nhiều

danh_lecong1502
24-01-2010, 08:40 AM
Các bác cho em hỏi về vấn đề nạp cho chíp.Em mới làm quen nên có thể là chưa rõ lắm nhờ mọi người chỉ bảo.
Em viết chương trình cho p16f877a và đã viết thành công rồi.Đây là đoạn file hex mà chương trình MPLAP cho ra
:020000040000FA
:1000000001280313831686018312FF30860001281E
:02400E00B13FC0
:00000001FF

Sau đấy em đi nạp thì mạch cũng báo là việc nạp Ok.Nhưng em đi kiểm tra lại code đã nạp bằng cách cho xuất ra export hex file thì thấy không giống so với chương trình mình đã viết.Đây là đoạn hẽ file đã xuất ra :
:020000040000FA
:1000000001280313831686018312FF30860001281E
:10001000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF0
:10002000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE0
:10003000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD0
:10004000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC0
:10005000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB0
:10006000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA0
:10007000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F90
phía dưới còn nhiều hàng tương tự như vậy lắm
Mong nhận được hồi âm sớm của mọi người.Thank

batbatdieu
24-01-2010, 10:40 AM
những vùng có giá trị FF3 là những vùng trắng (chưa ghi ) trong program memory . code bạn đọc lên là đúng rồi

dienbk36
02-02-2010, 09:15 PM
Mình chào mọi người,mình mới bắt đầu học Pic ,mình vừa viết 1 chường trình nhỏ,dịch chương trình cũng đã thành công,nhưng mình không tim thấy file hex để mô phỏng trên proteus,các bạn cho mình ý kiến nhé

greenfield
02-02-2010, 09:35 PM
Bạn lập trình bằng phần mềm gì vậy? Mà nếu dịch thành công thì sẽ tạo ra file hex chứ. Bạn tìm trong thư mục bạn lưu file bạn lập trinhg thử chắc có đó.

tungbka
05-03-2010, 11:12 AM
Em đang viết 1 chương trình hiển thị số lên lcd, các hàm của lcd lấy của bác linhnc308. Tuy nhiên chỉ hiển thị được từ 0-255. Mong các cao thủ chỉ giáo để em hiển thị được số có 4 chữ số. Chương trình như sau:
#include <16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd_lib_4bit.c>
#define enter RA2
#define up RE0
#define down RE1
void ht(int);
void main()
{
int16 k=0;
while(ENTER) {
if(!UP) {while(!UP);
if(k<3000) k++;else k=0;
}
if(!DOWN) {while(!DOWN);
if(k>0) k--;else k=3000;
}
lcd_init();
lcd_putchar("k=");
lcd_putcmd(0x82);
ht(k);
}
while(!ENTER);

}
void ht(int a) {
int nghin,tram,chuc,dvi;
nghin=(int)a/1000;
tram=(int)(a%1000)/100;
chuc=(int)(a%100)/10;
dvi=(int)(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}

namqn
05-03-2010, 11:48 AM
Bạn dùng CCS C, nên mặc định int sẽ là int8 (số nhị phân chứa trong 8-bit). Do đó, bạn chỉ có thể biểu diễn các giá trị từ 0-255.

Hàm ht() của bạn phải nhận đối số 16-bit (tức là kiểu long hay int16, trong CCS C).

Thân,

tungbka
05-03-2010, 11:21 PM
Bạn dùng CCS C, nên mặc định int sẽ là int8 (số nhị phân chứa trong 8-bit). Do đó, bạn chỉ có thể biểu diễn các giá trị từ 0-255.

Hàm ht() của bạn phải nhận đối số 16-bit (tức là kiểu long hay int16, trong CCS C).

Thân,

Vâng, em cũng đã thử thay đổi kiểu trong hàm ht() nhưng khi dịch ra thì lại báo lỗi. Nguyên nhân có lẽ là do các hàm trong lcd_lib_4bit đều có biến kiểu int. Có cách nào để sửa chương trình để em hiển thị được số có 4 chữ số không ạ? Cảm ơn anh nhìu. ^^

namqn
06-03-2010, 09:40 PM
Vâng, em cũng đã thử thay đổi kiểu trong hàm ht() nhưng khi dịch ra thì lại báo lỗi. Nguyên nhân có lẽ là do các hàm trong lcd_lib_4bit đều có biến kiểu int. Có cách nào để sửa chương trình để em hiển thị được số có 4 chữ số không ạ? Cảm ơn anh nhìu. ^^
Bạn chỉ sửa thế này thôi thì thế nào (tôi không dùng CCS C, nên bạn sửa như dưới đây và dịch xem kết quả ra sao):
void ht(long a) {
int nghin,tram,chuc,dvi;
nghin=(int)a/1000;
tram=(int)(a%1000)/100;
chuc=(int)(a%100)/10;
dvi=(int)(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}

Tất nhiên bạn cũng nhớ sửa lại prototype của ht() ở đầu chương trình.

Thân,

tungbka
06-03-2010, 10:59 PM
Ah. Được rồi. Thanks bác Nam nhé. Lần trước em cũng sửa thành long hoặch int16 nhưng chưa sửa prototype của h(t) nên nó báo lỗi. Hihi.

vanlv
15-03-2010, 10:27 AM
Em đang tập viết code thử với ngắt chân RB0, các anh xem hộ đoạn này có sai ở đâu không. Em không có người hướng dẫn nên phải mày mò. Em đã enable_interrupts(INT_RB) ở main() rồi và chọn sườn âm.
#INT_RB
void rb_isr()
{
if(input(PIN_B0)==0)
{
tseconds++;
printf("Press any key to start\n");
delay_ms(50);
}
else {printf("Press any key to stop\n");delay_ms(50);}
}

songphuongbmt
16-03-2010, 10:43 AM
em đang viết code nhập số từ nút ấn từ posd B hiển thị 4led 7 đoạn sao mà nó chạy không đúng ai có chương trình viết trên ccs gưi cho em tham khao với "hepl" cảm ơn nhiều nhiều (Địa chỉ mail " SONGPHUONGBMT@GMAIL.COM)

steve7680768
29-03-2010, 02:07 PM
Vấn đề vẫn tiếp tục với hệ thống của tôi ... Tôi đã sử dụng mã này ... Bây giờ những gì tôi cần phải làm ...?

tungbka
16-05-2010, 06:13 PM
Em đang viết chương trình nhận dữ liệu từ máy tính xuống để điều khiển cái động cơ. Nhưng sau khi biên dịch thì xuất hiện cảnh báo sau:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616).
Em có tham khảo các nguồn thì được biết là do trong hàm ngắt và ngoài hàm ngắt em sử dụng lặp lại 1 hàm hay 1 biến gì đó, nhưng em tìm mãi không thấy sai chỗ nào. Mong các pro chỉ giúp. Em cám ơn nhìu.
Chương trình của em như sau:
(Sorry vì em không biết đưa code vào trong ô code ^^!)

#include <16f877a.h>
#include <def_877a.h>
#include <stdlib.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBRO WNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#include <lcd_lib_4bit.c>
/*#define enter RA2
#define s_t RA3
#define f_r RA5
#define up RE0
#define down RE1
*/
void ht(int16 a);
//void ht1(int16 a);
void init();
void pid();
void nhapheso();
//void up_down();
int16 count, tocdo, C, temp, temp1, k, tocdodat ;
signed int16 e2=0;
signed int16 e1=0;
int16 e_sum;
int16 e_del;
int16 duty;
float Kp=0;
float Ki=0;
float Kd=0;
int flag=0;
float u, T=0.01;

unsigned char text[30], text2[5] ;
unsigned char a1[5], dem=0, i=0, j=0,i1;

#INT_RDA
void Receive_isr()
{
text[dem]=getc();
if(text[dem]=='@') //kiem tra dieu kien ket thuc
{
flag =1; //ket thuc nhan, bat co bao
dem=0;
}
else dem++;
}
#INT_EXT
void ngatR0() {
count++;//set_timer0(0);
}
#int_timer1
void Timer11_isr() { // Ham duoc goi khi TImer1 tran (65535->0)
// Chu ky trich mau 0.01

set_timer1(53036);
tocdo= 30*(count + get_timer0());
// printf("%ld\t",tocdo);
count = 0;
set_timer0(0);


}
void main(){
init();
lcd_putcmd(0x01);
while(true){
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
pid();
if(RC1==0) set_PWM1_duty(duty);
if(RC1==1) set_PWM1_duty(1023 - duty);
lcd_putcmd(0x80);
ht(tocdo);
printf("n%4Lu",tocdo);


//lcd_putchar("hi");


}
}
void init()
{
lcd_init();
nhapheso();
disable_interrupts(int_rda);
disable_interrupts(global);
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_L_TO_H); // Timer0 is Counter
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 255, 1);//4*4*256*1/20000000=204.8us=4.8khz
set_timer0(0);
set_timer1(53036);
enable_interrupts(INT_RTCC);
enable_interrupts(int_timer1);
enable_interrupts(int_ext);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
lcd_putcmd(0x80);
count=0;
trisc=0;
trisd=0;
trisa=255;
trisb=1;
RC1=0;
if(C==1) RC1=1;
If(C==0) RC1=0;
}
void pid(){
e2 = tocdodat - tocdo;
e_sum += e2;
// e_del = e2 - e1;
// e1 = e2;
u = u + Kp*e2 + Ki*e_sum*T;
if (u>24){
u=24;
e_sum -=e2;
}
if (u<0){
u = 0;
e_sum -=e2;
}
duty = u*1023/24;
}
void ht(long a) {
int nghin,tram,chuc,dvi;
nghin=a/1000;
tram=(a%1000)/100;
chuc=(a%100)/10;
dvi=(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}
void nhapheso(){
lcd_putchar("nhap tu PC");
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while(!flag) ;
if(flag){

//if ((strchr(text,'T')) && (strrchr(text, '@')))

text2[0] = text[0];
text2[1] = text[1];
text2[2] = text[2];
text2[3] = text[3];
text2[4] = text[4];
tocdodat = atol(text2);

//----------------------------------------
while (text[i] != 'P')
i++;
while (text[j] != 'I')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

Kp = atof(a1);

printf("P%f",Kp);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != 'D')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

Ki = atof(a1);
printf("I%f",Ki);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != 'C')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

Kd = atof(a1);
printf("D%f",Kd);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != '@')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

C = atol(a1);
printf("C%Lu",C);
flag=0;
i=0; j=0;
dem=0;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

}

}

namqn
16-05-2010, 08:03 PM
...
(Sorry vì em không biết đưa code vào trong ô code ^^!)
...
Bạn đọc hướng dẫn ở đây:
http://www.picvietnam.com/forum/showthread.php?t=2610

Thân,

nhanconan030789
08-12-2010, 12:36 AM
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h>
void init_timer0()
{
T0CS=1;
T0SE=0;
PSA=1;
TMR0=253;
T0IF=0;
T0IE=1;
PEIE=1;
GIE=1;
}
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}
void main()
{
TRISA4=1;
TRISD0=0;
init_timer0();
while(1);

}

nhoczin
09-12-2010, 10:00 PM
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h>
void init_timer0()
{
T0CS=1;
T0SE=0;
PSA=1;
TMR0=253;
T0IF=0;
T0IE=1;
PEIE=1;
GIE=1;
}
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}
void main()
{
TRISA4=1;
TRISD0=0;
init_timer0();
while(1);

}

Mình ko rành HTPIC tuy nhiên theo mình biết chương trình của bạn sẽ không chạy được vì đọc cái code kia ko thấy chỗ nào chú thích cho chương trình ngắt cả. Mình thấy nếu sử dụng chương trình con phục vụ ngắt thì nó phải có 1 kí hiệu gì đó vd #INT.... chẳng hạn, còn chỉ viết thế kia thì trình dịch sẽ hiểu đấy là 1 chương trình con bình thường ( có thể đấy là nguyên nhân ? )>>> với chương trình con bình thường không thấy bạn gọi hàm interrupt_timer0 ở chỗ nào >>> ko chạy được (suy đoán thế, nếu sai thì góp ý nhé).

toandinh1990
12-12-2010, 06:20 PM
Các cao thủ ơi giúp mình với,chả là mình đang làm mạch trái tim bằng PIC tặng Noel này cho nàng, gặp một lỗi rất oái ăm là code dài quá quá bank 0 đi,ko biết cách nào để chuyển sang bank1 được(chuyển dc thì chạy ở bank 0 lại ko đúng hix...)
ai bít giúp mình sớm sớm nhé sắp tới noel rùi mà hjj
lỗi mình up lên đây nè.sr vì ko bít up ảnh lên diễn đàn .thankssss mọi người nhé
http://www.mediafire.com/?lysl6dic6whmb5m

TheHouse
13-12-2010, 10:50 AM
Code của mình cũng không chạy, & có chút thắc mắc về set_tris_b() khác với PORTB = () như thế nào. Khi mình cùng đưa dữ liệu vào port B, thì 2 cách làm này lại cho ra dữ liệu khác nhau. Trong đó, có 1 cái phụ thuộc vào điện trở treo bên trong PIC, còn cái kia thì không. Mình chưa rõ cách dùng chính xác 2 hàm này như thế nào và trong trường hợp nào. Mong được giải đáp.

http://ca8.upanh.com/17.763.22154468.sAR0/portb.jpg
http://ca2.upanh.com/17.763.22154470.Y0e0/settrisbcopullups.jpg
http://ca7.upanh.com/17.763.22154471.YID0/settrisbkopullups.jpg

caovanhuong
13-12-2010, 12:55 PM
Code của mình cũng không chạy, & có chút thắc mắc về set_tris_b() khác với PORTB = () như thế nào. Khi mình cùng đưa dữ liệu vào port B, thì 2 cách làm này lại cho ra dữ liệu khác nhau. Trong đó, có 1 cái phụ thuộc vào điện trở treo bên trong PIC, còn cái kia thì không. Mình chưa rõ cách dùng chính xác 2 hàm này như thế nào và trong trường hợp nào. Mong được giải đáp.

http://ca8.upanh.com/17.763.22154468.sAR0/portb.jpg
http://ca2.upanh.com/17.763.22154470.Y0e0/settrisbcopullups.jpg
http://ca7.upanh.com/17.763.22154471.YID0/settrisbkopullups.jpg

2 hàm này là hoàn tòn khác nhau
set_tris_b(); hàm này dùng để set portb là hàm xuất dữ liệu hay nhận dữ liệu. nếu bạn set là xuất dữ liệu thì khi nối led vào và xuất dữ liệu ra thì led sẽ sáng, còn bạn set là nhận dữ liệu thì khi xuất dữ liệu ra portb nó sẽ không sáng.
portb=; hàm này là hàm chỉ có chức năng xuất dữ liệu ra ngoài. vd bạn viết portb=0xff;
=> từ B0 tới B7 giá trị các cổng là 1
cái hàm set_tris_b(value); nó tương đương với hàm trisb=value;
VD như hình đầu tiên bạn thay trisb=0x00 = set_tris_b(0) thì kết quả cũng giống như nhau. nhưng khi sử dụng hàm set_tris_b thì phải khai báo thêm hàm #use fast_io(b); nữa

ilusmmf
19-12-2010, 08:13 PM
Em hiện đang học về kinh tế, không biết nhiều về điện tử, nhưng vì thấy thích nên có tham khảo quyển Newnes.Advanced.PIC.Microcontroller.Projects.in C và làm được mấy cái mạch dịch led đơn giản. Sau đó theo hướng dẫn của sách trên, em làm mạch máy tính đơn giản. Mô phỏng trên proteus đã chạy nhưng khi làm mạch thật thì chỉ hiện lên 16 ô màu đen ở dòng trên của LCD 16x2 chỉnh biến trở thì thấy độ sáng tối có thay đổi(em mô phỏng trong protues là lcd 16x1 nhưng ko mua được nên ẵm con 16x2 về). Em mượn cái VOM về test thử thì thấy các chân 17,18,23,24,25,26 của PIC tương ứng với các mức logic như mô phỏng trong protues, lcd tương ứng từ 1-14 là 010100_0000_0101 cũng giống trong protues, chân 15 em nối trở 330 nối nguồn, chân 16 nối đất(em mắc y chang con 16x1). em sắp thi học kì, định qua thi rồi tiếp tục làm tiếp, nhưng mạch không ra cứ ấm ức không tập trung ôn bài được rất rất mong các tiền bối chỉ giáo giúp em , em rất rất cảm ơn.

vinhuct
21-01-2011, 02:26 PM
Em viết chương trính CCS C cho PIC8F4431. Đoạn code va mạch trong file đính kèm.Em muốn hiện cả 2 khối như kiểu đèn tín hiệu giao thông, xanh rồi dến đỏ ở 2 pha đường khác nhau. Nhưng khi mô phỏng thì nó chỉ hiện lần lượt xanh rồi đến đỏ ở từng pha mà không hiện đồng thời cả 2 pha. Mong các Bác sửa giúp.
#include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

int dvi1,truc1,dvi2,truc2,dvi3,truc3,dvi4,truc4;
int billy[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x7,0x7F,0x6F };
int16 i,j,a,c,m,n,o,e ;

void doi()
{
truc1=a/10;
dvi1=a%10;
truc2=c/10;
dvi2=c%10;
truc3=m/10;
dvi3=m%10;
truc4=n/10;
dvi4=n%10;
}
void hien1()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b11111110);

output_B(billy[dvi1]);
delay_us(100);

output_D(0b11111101);

output_B(billy[truc1]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}
void hien2()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b111111011);

output_B(billy[dvi2]);
delay_us(100);

output_D(0b111110111);

output_B(billy[truc2]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}
void hien3()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b11101111);

output_B(billy[dvi3]);
delay_us(100);

output_D(0b11011111);

output_B(billy[truc3]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}
void hien4()
{
for(i=0;i<450;i++)
{
if(input(pin_E2))
{
output_D(0b10111111);

output_B(billy[dvi4]);
delay_us(100);

output_D(0b01111111);

output_B(billy[truc4]);
delay_us(100);
}
else output_B(billy[0]);
delay_us(100);
}}


void hien12()
{


for(j=0;j<11;j++)
{
a=10-j;
doi();
hien1();
if(a==0)
break;
}


for(j=0;j<4;j++)
{
c=3-j;
doi();
hien2();
if(c==0)
break;
}

}
void hien34()

{


for(j=0;j<9;j++)
{
m=8-j;
doi();
hien3();
if(m==0)
break;
}


for(j=0;j<6;j++)
{
n=5-j;
doi();
hien4();
if(n==0)
break;
}

}
void main()
{
set_tris_E(0x00001100);
set_tris_B(0x00);
set_tris_D(0x00);
set_tris_C(0x00);
while(1)
{

hien12();
hien34();
}

}

Trevn001
22-01-2011, 12:09 AM
Chào cả nha` mình mới mò PIC được khoảng 1 tuần nay đang có 1 số vấn đề nhờ giải đáp:

1. Mình dùng PIC16F887 mạch nạp PICKIT2 và CCS, mô phỏng bằng PROTUES 7.6
2. Thạch anh 20Mhz và tụ 33pF
3. Đây là code của mình

#include <16f877.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=200000)
void main()
{
// Thiet lap che do cho PORTC
While(1)
{
trisc = 0x00; // Tat ca PORTCdeu la cong xuat du lieu
portc=0xff;
}
}



và đây là các vấn đề của mình :D

1. Trong Protues mình có đo được xung của thạch anh không. mình dung ocylo đo không được chỉ là 1 đường thẳng dài vô tận
2. KHi mình nạp file HEX có 1 cái warning : some configing words not in hex file...
nạp vẫn báo success. cái này liệu có ảnh hưởng gì không.
3. Vấn đề to nhất là mình cắm trên board nó không chạy gì cả. Mình dùng đồng hồ đo chân ra đều 0.8 V là cao. đã thay board khác vẫn khoong được. thay thạch anh, tụ khác vẫn
thế. các chân mình đã dung đông hồ kiểm tra xem co bị hở không rồi.
4. các anh chị em nào ở BKHN có thể chỉ điểm hộ mình được không. Mình rất cần người làm trực tiếp để học.


// mình hỏi có j ngớ ngẫn bỏ qua cho. mình dân cơ khí. :D

vinhuct
22-02-2011, 08:43 AM
Em mới học PIC, lại không biết gì về 89C51. Mong các bác chuyển cho Em đoạn code này sang cho PIC8F4431. Em đã chuyển thử nhưng chỉ được đoạn đầu, đoạn sau thì tit.
#include<reg2051.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<absacc.h>
#include <math.h>
#include<intrins.h>
#include<stdlib.h>
//***Khai bao bien****
sbit Clock=P1^0;
sbit STcp =P1^1;
sbit Data =P1^2;

sbit SelGre1=P1^3;
sbit SelGre2=P1^4;
sbit SelRed1=P1^5;
sbit SelRed2=P1^6;


sbit R=P3^2;
sbit Y=P3^3;
sbit G=P3^4;
//*************
unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A};
unsigned char LED_BUF[2];

unsigned char tic=0,tic2=0;
Sig_in,Num_Err=0;

char G_inc=0,G_dec=0,
R_inc=0,R_dec=0;

bit Flag_1s;
//**************************************
//**************************************
void wait (unsigned int input){
while (input--){;}
}
void Disp_led(char input){
char i;
if(input<0)input=0;
if(input<100){
LED_BUF[0]=Code_7S[input/10];
LED_BUF[1]=Code_7S[input%10];
}
STcp=0;
Clock=0;
for(i=0;i<=7;i++){
if((LED_BUF[0]&0x80)==0)Data=0;
else Data=1;
Clock=1;
LED_BUF[0]=LED_BUF[0]<<1;
Clock=0;
}
for(i=0;i<=7;i++){
if((LED_BUF[1]&0x80)==0)Data=0;
else Data=1;
Clock=1;
LED_BUF[1]=LED_BUF[1]<<1;
Clock=0;
}
STcp=1;
}
void Init_time(void){
while(G);
TR0=1;
while(!G)if(Flag_1s){Flag_1s=0;G_inc++;}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(G_inc>0){G_dec=G_inc;G_inc=0;}
while(R);
TR0=1;
while(!R)if(Flag_1s){Flag_1s=0;R_inc++;}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(R_inc>0){R_dec=R_inc;R_inc=0;}
}

void main(void){
SelGre1=1;SelGre2=1;
SelRed1=1;SelRed2=1;
wait(5000);
Flag_1s=0;
//---Init timer0--
TMOD=0x11;//khoi tao cho Timer0 o che do timer 16 bits
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
ET0=1;//cho phep ngat Timer0
//---Init timer1--
EA=1;//Cho phep ngat toan cuc
Init_time();
//***********
while(1){
while(G);
TR0=1;Disp_led(G_dec);SelGre1=0;SelGre2=0;SelRed1= 1;SelRed2=1;
while(!G)if(Flag_1s){Flag_1s=0;G_inc++;G_dec--;Disp_led(G_dec);}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(G_inc>0){G_dec=G_inc;G_inc=0;}
SelGre1=1;SelGre2=1;
SelRed1=1;SelRed2=1;
while(R);
TR0=1;Disp_led(R_dec);SelGre1=1;SelGre2=1;SelRed1= 0;SelRed2=0;
while(!R)if(Flag_1s){Flag_1s=0;R_inc++;R_dec--;Disp_led(R_dec);}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(R_inc>0){R_dec=R_inc;R_inc=0;}
}
}
//----------------------------------------------------------------------------------------------------------
void INTTimer0_10ms(void) interrupt 1{
TR0=0;TH0=0xD8;TL0=0xF0;TR0=1;
tic++;
if(tic>=100){
Flag_1s=1;
tic=0;
}
}



Em đã chuyển đoạn đầu như sau:
#include <18F4431.h>
#include <math.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
//***Khai bao bien****
#define Clock PIN_B0
#define STcp PIN_B1
#define Data PIN_B2

#define SelGre1 PIN_B3
#define SelGre2 PIN_B4

#define SelRed1 PIN_B5
#define SelRed2 PIN_B6


#define R PIN_B7
#define Y PIN_D0
#define G PIN_D1
//*************
unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A};
unsigned char LED_BUF[2];

unsigned char tic=0,tic2=0,
Sig_in,Num_Err=0;

char G_inc=0,G_dec=0,
R_inc=0,R_dec=0,Flag_1s,TMOD,count;


//**************************************
//**************************************

void Disp_led(char input){
char i;
if(input<0)input=0;
if(input<100){
LED_BUF[0]=Code_7S[input/10];
LED_BUF[1]=Code_7S[input%10];
}
output_low(STcp);
output_low (Clock);
for(i=0;i<=7;i++){
if((LED_BUF[0]&0x80)==0)output_low(Data);
else output_high(Data);
output_high (Clock);
LED_BUF[0]=LED_BUF[0]<<1;
output_low (Clock);
}
for(i=0;i<=7;i++){
if((LED_BUF[1]&0x80)==0)output_low (Data);
else output_high (Data);
output_high (Clock);
LED_BUF[1]=LED_BUF[1]<<1;
output_low(Clock);
}
output_high (STcp);
}
.....
Mong các Bác viết tiếp dùm Em. Cảm ơn nhiều.

vinhuct
22-02-2011, 08:51 AM
Em mới học Pic, không hiểu lắm về các timer. Mong các Anh chuyển giúp đoạn code này sang cho PIC, Em đã chuyển thử 1 phần, nhưng đoạn sau thì tit. Cảm ơn các Anh nhiều.
#include<reg2051.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<absacc.h>
#include <math.h>
#include<intrins.h>
#include<stdlib.h>
//***Khai bao bien****
sbit Clock=P1^0;
sbit STcp =P1^1;
sbit Data =P1^2;

sbit SelGre1=P1^3;
sbit SelGre2=P1^4;
sbit SelRed1=P1^5;
sbit SelRed2=P1^6;


sbit R=P3^2;
sbit Y=P3^3;
sbit G=P3^4;
//*************
unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A};
unsigned char LED_BUF[2];

unsigned char tic=0,tic2=0;
Sig_in,Num_Err=0;

char G_inc=0,G_dec=0,
R_inc=0,R_dec=0;

bit Flag_1s;
//**************************************
//**************************************
void wait (unsigned int input){
while (input--){;}
}
void Disp_led(char input){
char i;
if(input<0)input=0;
if(input<100){
LED_BUF[0]=Code_7S[input/10];
LED_BUF[1]=Code_7S[input%10];
}
STcp=0;
Clock=0;
for(i=0;i<=7;i++){
if((LED_BUF[0]&0x80)==0)Data=0;
else Data=1;
Clock=1;
LED_BUF[0]=LED_BUF[0]<<1;
Clock=0;
}
for(i=0;i<=7;i++){
if((LED_BUF[1]&0x80)==0)Data=0;
else Data=1;
Clock=1;
LED_BUF[1]=LED_BUF[1]<<1;
Clock=0;
}
STcp=1;
}
void Init_time(void){
while(G);
TR0=1;
while(!G)if(Flag_1s){Flag_1s=0;G_inc++;}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(G_inc>0){G_dec=G_inc;G_inc=0;}
while(R);
TR0=1;
while(!R)if(Flag_1s){Flag_1s=0;R_inc++;}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(R_inc>0){R_dec=R_inc;R_inc=0;}
}

void main(void){
SelGre1=1;SelGre2=1;
SelRed1=1;SelRed2=1;
wait(5000);
Flag_1s=0;
//---Init timer0--
TMOD=0x11;//khoi tao cho Timer0 o che do timer 16 bits
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
ET0=1;//cho phep ngat Timer0
//---Init timer1--
EA=1;//Cho phep ngat toan cuc
Init_time();
//***********
while(1){
while(G);
TR0=1;Disp_led(G_dec);SelGre1=0;SelGre2=0;SelRed1= 1;SelRed2=1;
while(!G)if(Flag_1s){Flag_1s=0;G_inc++;G_dec--;Disp_led(G_dec);}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(G_inc>0){G_dec=G_inc;G_inc=0;}
SelGre1=1;SelGre2=1;
SelRed1=1;SelRed2=1;
while(R);
TR0=1;Disp_led(R_dec);SelGre1=1;SelGre2=1;SelRed1= 0;SelRed2=0;
while(!R)if(Flag_1s){Flag_1s=0;R_inc++;R_dec--;Disp_led(R_dec);}
TR0=0;TH0=0xD8;TL0=0xF0;tic=0;
if(R_inc>0){R_dec=R_inc;R_inc=0;}
}
}
//----------------------------------------------------------------------------------------------------------
void INTTimer0_10ms(void) interrupt 1{
TR0=0;TH0=0xD8;TL0=0xF0;TR0=1;
tic++;
if(tic>=100){
Flag_1s=1;
tic=0;
}
}


Và đây là đoạn Em sửa:
#include <18F4431.h>
#include <math.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
//***Khai bao bien****
#define Clock PIN_B0
#define STcp PIN_B1
#define Data PIN_B2

#define SelGre1 PIN_B3
#define SelGre2 PIN_B4

#define SelRed1 PIN_B5
#define SelRed2 PIN_B6


#define R PIN_B7
#define Y PIN_D0
#define G PIN_D1
//*************
unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A};
unsigned char LED_BUF[2];

unsigned char tic=0,tic2=0,
Sig_in,Num_Err=0;

char G_inc=0,G_dec=0,
R_inc=0,R_dec=0,Flag_1s,TMOD,count;


//**************************************
//**************************************

void Disp_led(char input){
char i;
if(input<0)input=0;
if(input<100){
LED_BUF[0]=Code_7S[input/10];
LED_BUF[1]=Code_7S[input%10];
}
output_low(STcp);
output_low (Clock);
for(i=0;i<=7;i++){
if((LED_BUF[0]&0x80)==0)output_low(Data);
else output_high(Data);
output_high (Clock);
LED_BUF[0]=LED_BUF[0]<<1;
output_low (Clock);
}
for(i=0;i<=7;i++){
if((LED_BUF[1]&0x80)==0)output_low (Data);
else output_high (Data);
output_high (Clock);
LED_BUF[1]=LED_BUF[1]<<1;
output_low(Clock);
}
output_high (STcp);
}
....
Không viết được nữa, hiii..Các Ah giúp Em nhé.

pttinh1
28-06-2011, 12:09 PM
9. Đừng thả nổi ngõ vào, kéo lên hoặc kéo xuống các ngõ vào bằng một điện trở 10 k chẳng hạn.



cho mình hỏi thả nổi ngõ vào ở đây là thế nào. Mình đã nạp, cắm pic ,à nó cứ trơ ra, kon lần trước hí hoáy 4 tiếng nó mới chạy lần đầu tiên do mình chạm tay vào chân 13 với 14, kon sau này thì bó tay. mạch nạp và pic vẫn ổn.

duyetpham88
03-07-2011, 11:00 PM
mình làm ví dụ cho xuất số (4 chữ số) ra lcd 16x2 cụ thể là dùng 2 nút nhấn: một nút tăng và một nút giảm cứ nhấn rồi nhả ra thì sẽ tăng hoặc giảm 1 đơn vị nhưng khi mình cho chạy trên protues mới đầu lcd hiện lên 4 con số 0 (0000), khi mình nhấn nút xuống thì lcd hiện chữ u535, mong mọi người xem giùm

// port a là inputs, port d là outputs
int16 nhap_value, y, nghin, tram, chuc, dv;
void main()
{
while(1)
{
doc_bp();
y=nhap_value;
hienthi();
}
}
void hienthi()
{
nghin=y/1000;
tram=(y%1000)/100;
chuc=((y%1000)%100)/10;
dv=((y%1000)%100)%10;

portd =0x38; //hai dong va ma tran 5x7
ghilenh();
portd=0x0C; //bat hien thi, tat con tro
ghilenh();
portd=0xc9;// dua gia tri cua portd len lcd tai vi tri con tro o o so 9 cua hang thu 2
ghilenh();
ghilcd();
}
void ghilcd()
{
portd=mht[nghin];
ghidata();
portd=mht[tram];
ghidata();
portd=mht[chuc];
ghidata();
portd=mht[dv];
ghidata();

}
void ghilenh()
{
e0=0;
e1=0;
e2=1;
e2=0;
delay_ms(10);
}
void ghidata()
{
e2=1;
e0=1;
e1=0;
e2=0;
delay_ms(10);
}
void doc_bp()
{
if(a0==0)
{
do
{}
while(a0==0);
nhap_value++;
}

if(a1==0)
{
do
{}
while(a1==0);
nhap_value--;
}
}

songk32
24-09-2011, 09:20 PM
máy bác cho m hỏi tý!
theo kinh nghiệm các bác thì m mới học pic nên học gì để lập trình cho pic! hồi trước em có học asm và làm vi điều khiển 8051. giờ e muốn học pic để điều khiển led!
theo các bác nên dùng chương trình nào để viết!
e hỏi để tìm phương hướng học tập thêm!mong các bác tận tình giúp đơ!
thank nhiều!!!

eethn
03-10-2011, 03:53 AM
e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.E lập trình bằng C18

phần code hiển thị ra led 7 thanh:

#include "p18f4620.h"
#include "delays.h"
#include "adc.h"
#pragma config OSC=HS, WDT=OFF

const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
int a,b,n,doC,dvi,chuc,tram;
void convert(int a)
{
tram=a/100;
a=a%100;
chuc=a/10;
dvi=a%10;
}
void hienthi() // quet led
{
for(n=0;n<10;n++)
{
PORTB=dig[dvi];
PORTD=0x01; //bat led 1
Delay100TCYx(20); // tre 100us
PORTB=dig[chuc];
PORTD=0x02; // bat led 2
Delay100TCYx(20);
PORTB=dig[tram];
PORTD=0x04; // bat led 3
Delay100TCYx(20);
}
}
void main(void)
{
TRISB=0; // chon cong B la cong ra
TRISD=0; // chon cong D la cong ra
TRISAbits.TRISA0=1; // chon cong A la cong vao
ADCON0=0x03; //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
ADCON1=0x0E; //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
ADCON2bits.ACQT2=1; //
ADCON2bits.ACQT1=0; //
ADCON2bits.ACQT0=0; //3 bits lua chon thoi gian thu thap du lieu TAD
ADCON2bits.ADCS2=1; //
ADCON2bits.ADCS1=0; //
ADCON2bits.ADCS0=1; //3 bits lua chon tan so chuyen doi
Delay10TCY();


b = ReadADC();
doC = (b-558.558)/2.048; //tùy ADC 8bit hay 10 bit tính toán giá tri
a = doC;
convert((int)a);
Delay10TCY();
while(1)
{
b = ReadADC();
doC = (b-558.558)/2.048;
convert((int)a);
hienthi();
}
}


và phần ra LCD
#include "p18f4620.h"
#include "delays.h"
#include "adc.h"
#pragma config OSC=HS, WDT=OFF

char adc;
long s; float doC;
unsigned char li,lj;

#define rs LATDbits.LATD0
#define rw LATDbits.LATD1
#define en LATDbits.LATD2

void delay (unsigned char time ) // ham co tac dung delay thoi gian lon
{
for ( li=0 ; li<80; li++ )
for ( lj=0 ; lj<time; lj++)
{}
}


void lenh_LCD (unsigned char s) // ham dua 1 lenh ra ngoai LCD
{
LATC=s;
rs=0; // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
rw=0;
en=1;
delay(1);
en=0;
delay(1);
}


void data_LCD (unsigned char s) // ham dua 1 lenh ra ngoai LCD
{
LATC=s;
TRISD=0xF8 ; // cho 3 bit thap nhat duoc lam cong ra
rs=1; // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
rw=0;
en=1;
delay(1);
en=0;
}
void main(void)
{
int kq;
INTCON=0x00;
TRISAbits.TRISA0=1; //cong A0 lam dau vao tu cam bien
TRISC=0x00; //cong C lam cong ra du lieu
TRISD=0xF8; //3 bit thap nhat lam cong ra dieu khien
lenh_LCD(0x38); // dua ra LCD gia tri hang cot la 5*7
lenh_LCD(0x0C); // hien con tro
// lenh_LCD(0x01); // xoa man hinh LCD
ADCON0=0x00; //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
ADCON1=0x0E; //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
ADCON2bits.ACQT2=0; //
ADCON2bits.ACQT1=0; //
ADCON2bits.ACQT0=1; //3 bits lua chon thoi gian thu thap du lieu TAD
ADCON2bits.ADCS2=1; //
ADCON2bits.ADCS1=0; //
ADCON2bits.ADCS0=0; //3 bits lua chon tan so chuyen doi
Delay10TCY();

ADCON0bits.ADON=1;
while(1)
{
ADCON0bits.GO=1;
Delay10TCYx(2);
ADCON0bits.GO=0;
adc = ReadADC();
doC=(adc-558.558)/2.048; // ADC 10 bit tính toán giá tri
lenh_LCD(0x01);
delay(100);
kq=(int)doC;

data_LCD((int)doC);
data_LCD('.');
kq=(doC-kq)*100;
data_LCD((unsigned char)kq);
data_LCD('d');
data_LCD('o');
data_LCD('C');
delay(100);

}
}


mạch ở file kèm theo

eethn
04-10-2011, 09:50 PM
k ai giúp đc àh?
k biết là do ADC hay phần đưa ra hiển thị nữa

vipboypro891
21-02-2012, 02:38 AM
em mới học pic em mới lập trình test led
em khai báo
MOVLW d'11111111'
MOVWF PORTB
thì chỉ có 5 led sáng là ở các chân 0 1 2 3 7
nhưng khai báo
MOVLW 0xFF
MOVWF PORTB
thì tất cả đều sáng cho em hỏi với code thứ nhất em bị sai chỗ nào mọi người giúp em với dc không ạ

tdm
21-02-2012, 11:44 AM
em mới học pic em mới lập trình test led
em khai báo
MOVLW d'11111111'
MOVWF PORTB
thì chỉ có 5 led sáng là ở các chân 0 1 2 3 7
nhưng khai báo
MOVLW 0xFF
MOVWF PORTB
thì tất cả đều sáng cho em hỏi với code thứ nhất em bị sai chỗ nào mọi người giúp em với dc không ạ
MOVLW b'11111111'//viết thế này mới đúng cú pháp

vipboypro891
21-02-2012, 12:53 PM
MOVLW b'11111111'//viết thế này mới đúng cú pháp

hì thanks bác nhá em nhầm để em test lại xem tnao :)

soledad_bkfet
22-02-2012, 10:00 PM
các bác cho e hỏi.e mới bắt đàu học vi xử lý đc2 tuần mà thầy giao bt về nhà là thế này:,
Lập trình asembly cho bài toán: bật tắt đèn LED theo chu kì 1s sử dụng delay (đặt vi điều khiển ở trạng thái không làm công việc gì).Chương trình viết trên MPLAB. bác nào có đoạn code cho em xin cho nó chạy cái, chứ bẳt e viết chắc còn lâu nữa mới xong, mà sắ phải nộp bài rôi, cảm ơn các bác nhiều !!!!!!!

soledad_bkfet
22-02-2012, 10:15 PM
Em mới học VXL đc 2 tuần mà thầy gáo yêu cầu bt về nhà như sau:
Lập trình asembly cho bài toán: bật tắt đèn LED theo chu kì 1s sử dụng delay (đặt vi điều khiển ở trạng thái không làm công việc gì). Mong các anh cho em đoạn code bài này, e phải viết trên MPLAB, sắp phải nộp rồi,mong các anh chỉ giáo cho e...thankss các anh !

soxxxcool
03-05-2012, 12:09 AM
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h>
void init_timer0()
{
T0CS=1;
T0SE=0;
PSA=1;
TMR0=253;
T0IF=0;
T0IE=1;
PEIE=1;
GIE=1;
}
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}
void main()
{
TRISA4=1;
TRISD0=0;
init_timer0();
while(1);

}

nếu bạn viết bằng HTPIC thì bạn thiếu dòng "void interrupt" phía trên hàm "void interrrupt_timer0()". interrrupt_timer0() chỉ là hàm con của bạn thôi,bạn nên có 1 dòng "void interrupt" để MBLAB hiểu là bạn muốn thông báo là bạn muốn sử dụng ngắt timer 0. Mình nghĩ bạn nên sửa đoạn ngắt timer lai như thế này:

void interrupt
void interrrupt_timer0()
{
if (T0IF==1)
{
T0IF=0;
TMR0=253;
RD0^=1;
}
}

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

sputnhic11
08-05-2012, 11:36 PM
Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:


/************************************************** *****************************
; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: *
; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle *
************************************************** ******************************
| __________
| | | |
| | | |
|____| |________________________________________|
<--1,5ms-->
<----------------------20ms------------------------->
; Tac gia : Luu Tuan Khanh *

; Don vi : Uneti *

; Ten tap tin : ltchuan.c *

; Ngay : 23/5/2011 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h *

; Cong cu duoc dung: MPLAB X IDE beta6.00.01 *
; C30 3.25 * *

------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
#include <timer.h>
/************************************************** ****************************/
//output SERVO
#define LAT_SERVO1 _LATB0
#define LAT_SERVO2 _LATB1
#define LAT_SERVO3 _LATB2
#define LAT_SERVO4 _LATB3
#define LAT_SERVO5 _LATB4
#define LAT_SERVO6 _LATB5

#define LAT_SERVO7 _LATB6
#define LAT_SERVO8 _LATB7
#define LAT_SERVO9 _LATB8
#define LAT_SERVO10 _LATC13
#define LAT_SERVO11 _LATC14
#define LAT_SERVO12 _LATD9
#define congtac1 _TRISF0
#define congtac2 _TRISF1
#define den _LATB9

/*********************Bat dau khai bao bien*************************/
unsigned long counter_servo = 1;
unsigned int speed_servo[13];
//--------------------Ket thuc khai bao bien------------------------//
void config_servo(void);
void timer1_init(void);
int goc(float goc);

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){
IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF
T1CONbits.TON = 1;
//timer for 1us*20000=20ms
//1ms=1000 thuc te xxx min
//test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te
if(++counter_servo > 2010) counter_servo = 0;
if(counter_servo >= speed_servo[1] + 62) // MAX 240
LAT_SERVO1=0; // MIN 60
else
LAT_SERVO1=1; // MIN 60
if(counter_servo >= speed_servo[2] + 62) // MAX 240
LAT_SERVO2=0; // MIN 60
else
LAT_SERVO2=1;
if(counter_servo >= speed_servo[3] + 62) // MAX 240
LAT_SERVO3=0; // MIN 60
else
LAT_SERVO3=1;
if(counter_servo >= speed_servo[4] + 62) // MAX 240
LAT_SERVO4=0; // MIN 60
else
LAT_SERVO4=1;
if(counter_servo >= speed_servo[5] + 62) // MAX 240
LAT_SERVO5=0; // MIN 60
else
LAT_SERVO5=1;
if(counter_servo >= speed_servo[6] + 62) // MAX 240
LAT_SERVO6=0; // MIN 60
else
LAT_SERVO6=1;
if(counter_servo >= speed_servo[7] + 62) // MAX 240
LAT_SERVO7=0; // MIN 60
else
LAT_SERVO7=1; // MIN 60
if(counter_servo >= speed_servo[8] + 62) // MAX 240
LAT_SERVO8=0; // MIN 60
else
LAT_SERVO8=1;
if(counter_servo >= speed_servo[9] + 62) // MAX 240
LAT_SERVO9=0; // MIN 60
else
LAT_SERVO9=1;
if(counter_servo >= speed_servo[10] + 62) // MAX 240
LAT_SERVO10=0; // MIN 60
else
LAT_SERVO10=1;
if(counter_servo >= speed_servo[11] + 62) // MAX 240
LAT_SERVO11=0; // MIN 60
else
LAT_SERVO11=1;
if(counter_servo >= speed_servo[12] + 62) // MAX 240
LAT_SERVO12=0; // MIN 60
else
LAT_SERVO12=1;
}

void config_servo(void){
ADPCFG = 0xffff;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISF = 0x00;

LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATF = 0x00;

}
void timer1_init(void)
{
config_servo();
T1CON = 0; // Timer reset
T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu
T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1)
//T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1;
IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag
IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong
IEC0bits.T1IE = 1; // Enable Timer1 interrupt

T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1

TMR1 = 0x0000;
PR1 = 295 ; // Ngat khi dem tran 10us
//PR1 = 29491 ; // ngat khi dem tran 1ms
// T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4
// PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us
T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4)
T1CONbits.TON = 1; // Enable Timer1 and start the counter
}
int goc(float goc){
float goc1 = 0;
unsigned int goc2 = 0;
if(goc == 0) return 0;
else{
goc1 = 18 * goc;
goc1 = goc1/18;
goc2 = (int) goc1;
};
return goc2;
}

soxxxcool
11-05-2012, 01:21 PM
Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:


/************************************************** *****************************
; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC *
; Chuong trinh thuc hien viec sau: *
; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle *
************************************************** ******************************
| __________
| | | |
| | | |
|____| |________________________________________|
<--1,5ms-->
<----------------------20ms------------------------->
; Tac gia : Luu Tuan Khanh *

; Don vi : Uneti *

; Ten tap tin : ltchuan.c *

; Ngay : 23/5/2011 *

; Phien ban : 0.01 *

; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h *

; Cong cu duoc dung: MPLAB X IDE beta6.00.01 *
; C30 3.25 * *

------------------------------------------------------------------------------*/
#include <p30fxxxx.h>
#include <timer.h>
/************************************************** ****************************/
//output SERVO
#define LAT_SERVO1 _LATB0
#define LAT_SERVO2 _LATB1
#define LAT_SERVO3 _LATB2
#define LAT_SERVO4 _LATB3
#define LAT_SERVO5 _LATB4
#define LAT_SERVO6 _LATB5

#define LAT_SERVO7 _LATB6
#define LAT_SERVO8 _LATB7
#define LAT_SERVO9 _LATB8
#define LAT_SERVO10 _LATC13
#define LAT_SERVO11 _LATC14
#define LAT_SERVO12 _LATD9
#define congtac1 _TRISF0
#define congtac2 _TRISF1
#define den _LATB9

/*********************Bat dau khai bao bien*************************/
unsigned long counter_servo = 1;
unsigned int speed_servo[13];
//--------------------Ket thuc khai bao bien------------------------//
void config_servo(void);
void timer1_init(void);
int goc(float goc);

void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){
IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF
T1CONbits.TON = 1;
//timer for 1us*20000=20ms
//1ms=1000 thuc te xxx min
//test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te
if(++counter_servo > 2010) counter_servo = 0;
if(counter_servo >= speed_servo[1] + 62) // MAX 240
LAT_SERVO1=0; // MIN 60
else
LAT_SERVO1=1; // MIN 60
if(counter_servo >= speed_servo[2] + 62) // MAX 240
LAT_SERVO2=0; // MIN 60
else
LAT_SERVO2=1;
if(counter_servo >= speed_servo[3] + 62) // MAX 240
LAT_SERVO3=0; // MIN 60
else
LAT_SERVO3=1;
if(counter_servo >= speed_servo[4] + 62) // MAX 240
LAT_SERVO4=0; // MIN 60
else
LAT_SERVO4=1;
if(counter_servo >= speed_servo[5] + 62) // MAX 240
LAT_SERVO5=0; // MIN 60
else
LAT_SERVO5=1;
if(counter_servo >= speed_servo[6] + 62) // MAX 240
LAT_SERVO6=0; // MIN 60
else
LAT_SERVO6=1;
if(counter_servo >= speed_servo[7] + 62) // MAX 240
LAT_SERVO7=0; // MIN 60
else
LAT_SERVO7=1; // MIN 60
if(counter_servo >= speed_servo[8] + 62) // MAX 240
LAT_SERVO8=0; // MIN 60
else
LAT_SERVO8=1;
if(counter_servo >= speed_servo[9] + 62) // MAX 240
LAT_SERVO9=0; // MIN 60
else
LAT_SERVO9=1;
if(counter_servo >= speed_servo[10] + 62) // MAX 240
LAT_SERVO10=0; // MIN 60
else
LAT_SERVO10=1;
if(counter_servo >= speed_servo[11] + 62) // MAX 240
LAT_SERVO11=0; // MIN 60
else
LAT_SERVO11=1;
if(counter_servo >= speed_servo[12] + 62) // MAX 240
LAT_SERVO12=0; // MIN 60
else
LAT_SERVO12=1;
}

void config_servo(void){
ADPCFG = 0xffff;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISF = 0x00;

LATB = 0x00;
LATC = 0x00;
LATD = 0x00;
LATF = 0x00;

}
void timer1_init(void)
{
config_servo();
T1CON = 0; // Timer reset
T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu
T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1)
//T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1;
IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag
IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong
IEC0bits.T1IE = 1; // Enable Timer1 interrupt

T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1

TMR1 = 0x0000;
PR1 = 295 ; // Ngat khi dem tran 10us
//PR1 = 29491 ; // ngat khi dem tran 1ms
// T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4
// PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us
T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4)
T1CONbits.TON = 1; // Enable Timer1 and start the counter
}
int goc(float goc){
float goc1 = 0;
unsigned int goc2 = 0;
if(goc == 0) return 0;
else{
goc1 = 18 * goc;
goc1 = goc1/18;
goc2 = (int) goc1;
};
return goc2;
}


Hi bạn,bạn muốn dùng port F để làm nút nhấn thì theo ý kiến của mình bạn nên set Port F là "TRISF = 0xff" và cấu hình port F là digital (nếu port này có chân nào là Analog,mình chưa đoc datasheet nên ko rõ).
Chúc bạn thành công !

CATBUI7690
13-05-2012, 11:01 PM
em nho may anh giúp dùm vì sắp nộp đồ án rồi.tình hình là em có dặt làm mach ma em khong hiểu ý nghĩa các lệnh.nhờ mấy anh giải thích dùm.vì em hoc mplab nhung code này viết c em k hiểu

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

#define mode RA0
#define dwn RA1
#define up RA2
//khai bao bien
int16 count=0;
int8 sodem=0;
//int8 chuc,dvi;
const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
//chuong trinh con
#INT_TIMER1 //khai bao ngat de dinh thoi gian
VOID NGAT_TIMER1()
{
SET_TIMER1(15536);
count++;
IF(count==100) //20*50000us = 1000000us = 1s
{
sodem++;
count=0;
}
}

void hienthi()
{
int j =0;
while(j<5)
{
portb=dig[sodem/10];
portd = 0x7f;
delay_us(100);
portd = 0xff;
portb=dig[sodem%10];
portd = 0xbf;
delay_us(100);
portd = 0xff;

portc = 0xff;
j++;
}
}

//chuong trinh chinh
void main()
{
trisa = 0xff; // khai bao cac port deu la ngo ra
trisb = 0x00;
trisd = 0x00;
set_tris_c(0);
SETUP_TIMER_1(T1_INTERNAL); //cho phep cac ngat hoat dong de dem thoi gian
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER1);
SET_TIMER1(15536); //T_dinhthoi = (65536-15536)*1us = 50000us

while(true)
{
hienthi();
if(sodem>99) sodem=0;
}
}

mấy anh giúp dùm em nhe em càm ơn.

h2nd0i
18-05-2012, 05:03 PM
http://www.mediafire.com/?99w2emenq1cxb1i đây là file protues



http://www.mediafire.com/?5be6ku4btajr3wk đây la code asm


http://www.mediafire.com/?1tm1asqxl6cnxeo đây là file .hex


mọi người xem dùm e phần code với,sao em nạp trên protues mà mạch ko chạy là sao ạ?mọi người góp ý kiến dùm e nha.thanks 4rum

kaka_87ht
07-07-2012, 10:55 AM
chắc phải học hỏi từ các bạn nhiều rồi....em mới tham gia pic hii

nickyshadow
09-07-2012, 11:26 AM
//Em chưa hiểu cái lỗi "A numeric expression must be appear here"
//Đoạn CT của em ngắn thế này thôi
void main()
{
set_tris_c(0x00);
set_tris_d(0x00);
output_c(0x00);
output_d(0x00);

int j;// nó báo lỗi ngay dòng này cái ỗi "A numeric..,", em đã thử với các kiểu char, int8,...
j=8;

}

//Còn đây là đoạn CT khác, mắc lỗi lặp vô hạn mà em chẳng hiểu tại sao nó vậy
//
char i;
latch=0;
for(i=7;i>=0;i--) //Lỗi lặp vô hạn ở ngay dòng này "The condition always TRUE"
{
int j;
for(j=0;j<8;j++)
{
clk=0;
da=(hang1[i]>>j)&&0x01;
clk=1;
clk=0;
da=(hang2[i]>>j)&&0x01;
}
}
latch=1;

Duynguyen205
29-07-2012, 04:17 PM
bác nào cho em hỏi voi. Em có viết 1 đoạn code của bác Linh chạy thử nhưng mà nó báo lỗi hoài.
còn đây là code chương trình

//================================================
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

void main()
{
TRISB = 0x00;
PORTB = 0xFF;
While(1)
{
PORTB = 0;
delay_ms(250);
PORTB = 0xFF;
delay_ms(250);
}
}
khi biên dịch nó báo lỗi này mà em ko biết xử lí tn. Mong các bác giúp em. thansk cac bac nhieu.

"eross 128'' C.\program file\PICC\devices\def_f877a.h" Line 7(2,6) A #DEVICE required before this line.


line 7 : #byte INDF =0x00 ( trong file def_877a.h)

buivantuyen89th
30-07-2012, 09:02 PM
bác nào cho em hỏi voi. Em có viết 1 đoạn code của bác Linh chạy thử nhưng mà nó báo lỗi hoài.
còn đây là code chương trình

//================================================
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

void main()
{
TRISB = 0x00;
PORTB = 0xFF;
While(1)
{
PORTB = 0;
delay_ms(250);
PORTB = 0xFF;
delay_ms(250);
}
}
khi biên dịch nó báo lỗi này mà em ko biết xử lí tn. Mong các bác giúp em. thansk cac bac nhieu.

"eross 128'' C.\program file\PICC\devices\def_f877a.h" Line 7(2,6) A #DEVICE required before this line.


line 7 : #byte INDF =0x00 ( trong file def_877a.h)

chẳng báo lỗi ở đâu cả bạn ạ. bạn thiếu file def_877a.h thôi. bạn download file này về để trong projec của bạn ấy. không thì bạn copy vào devices trong thư mục cài ccs ấy.
goodluck

nickyshadow
30-07-2012, 10:49 PM
nếu đơn giản bạn chỉ muốn nháy led ở port b thôi sao bạn khai báo nhiều vậy
chỉ cần

#include <16f877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(b) // <<<< dong nay de khai bao dung portb
#byte PORTB=0x006// <<<Đătheo data sheet thì port b là thanh ghi 006
void main()
{
set_tris_b(0x00);
PORTB = 0xFF;
While(1)
{
PORTB = 0;
delay_ms(250);
PORTB = 0xFF;
delay_ms(250);
}
}

Duynguyen205
31-07-2012, 08:23 AM
Cảm ơn anh. Đúng là nó bị lỗi trong device thật. Hôm qua có pro giúp em sửa máy. Mới học

gà quá, bị lỗi cũng ko biết. làm em vất vả với nó.

Duynguyen205
31-07-2012, 08:26 AM
à tại vì em mới học PIC nên toàn khai báo theo kiểu PIC winar. khai báo đầy đủ nào thì

#fuses

nào thì setup ADC().... ^^.

Bác thấy đoạn code của em thừa chỗ nào thì bỏ hộ em rồi post cho em xem với nhé.

Duynguyen205
31-07-2012, 08:32 AM
Có bác nào Viết code mà làm video học PIC luôn ko gửu cho em link với. Đọc sách nhiều cứ

u u cái đầu ý. Tks các pro nhiều

Duynguyen205
31-07-2012, 08:36 AM
chẳng báo lỗi ở đâu cả bạn ạ. bạn thiếu file def_877a.h thôi. bạn download file này về để trong projec của bạn ấy. không thì bạn copy vào devices trong thư mục cài ccs ấy.
goodluck


Cảm ơn anh nhé. Nó bị lỗi trong device thật. Giờ CCS chạy ngon rồi. ^^~

nhquangdt3
17-12-2012, 12:49 AM
mình thử viết code dùng CCS điều khiển mấy chân IO của PIC16f877A. mô phỏng thì chạy ngon lành nhưng khi nạp vào chip thì không chạy. mình có POST code lên. ai biết chỉ giúp với. thanks.
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#define BUTTON_THUAN pin_B5
#define BUTTON_NGHICH pin_B4
#define BUTTON_TANG pin_B3
#define BUTTON_GIAM pin_B2

#define LED_THUAN pin_B1
#define LED_NGUOC pin_B0

#define DIEU_KHIEN_QUAY_THUAN pin_B7
#define DIEU_KHIEN_QUAY_NGUOC pin_B6

#define NGUOC 1
#define THUAN 2
#define DUNG 3

#define TAN_SO_BAM 30

#use delay (clock = 4000000 ) //dung thach anh 20Mhz
#use rs232 (baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7 )

#byte OPTION_REG=0x81

int8 chieu_quay;
int16 van_toc=15,van_toc_max=30;
int16 milisec;

#int_TIMER0
void TIMER0_isr(void)
{

set_timer0(0xD9) ; // Initial Value for 1ms Interrupt
clear_interrupt(int_timer0); // Clear TIMER0 interrupt flag
milisec++;
if(milisec>1000)
milisec=0;
if(input(BUTTON_THUAN)==0)
{
chieu_quay=THUAN;
output_bit(LED_THUAN,1);
output_bit(LED_NGUOC,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);//tat quay nguoc
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,1);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else
milisec=0;

}
else if(input(BUTTON_NGHICH)==0)
{
chieu_quay=NGUOC;
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,1);
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,1);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else
milisec=0;

}
else
{
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,0);
}

}

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
enable_interrupts (int_timer0);//ngat timer 0
enable_interrupts ( global ); //cho phep ngat toan cuc
OPTION_REG=0x07;
while(1)
{
output_high(pin_D0);
output_high(pin_D1);
output_high(pin_D2);
output_high(pin_D3);
output_high(pin_D4);
output_high(pin_D5);
output_high(pin_D6);
output_high(pin_D7);
output_B(0x00);
output_A(0x00);
output_C(0x00);
Delay_ms(500) ;
Output_low (pin_D0);
Output_low (pin_D1);
Output_low (pin_D2);
Output_low (pin_D3);
Output_low (pin_D4);
Output_low (pin_D5);
Output_low (pin_D6);
Output_low (pin_D7);
output_B(0xFF);
output_A(0xFF);
output_C(0xFF);
Delay_ms (500 );
}

// TODO: USER CODE!!
while(1)
{

if(input(BUTTON_TANG)==0)
{
Delay_ms(100);
van_toc++;
if(van_toc>van_toc_max)
van_toc=van_toc_max;
}
else if(input(BUTTON_GIAM)==0)
{
Delay_ms(100);
van_toc--;
if(van_toc<=0)
van_toc=0;
}
}

}

hatuan296
17-12-2012, 08:13 AM
mình thử viết code dùng CCS điều khiển mấy chân IO của PIC16f877A. mô phỏng thì chạy ngon lành nhưng khi nạp vào chip thì không chạy. mình có POST code lên. ai biết chỉ giúp với. thanks.
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#define BUTTON_THUAN pin_B5
#define BUTTON_NGHICH pin_B4
#define BUTTON_TANG pin_B3
#define BUTTON_GIAM pin_B2

#define LED_THUAN pin_B1
#define LED_NGUOC pin_B0

#define DIEU_KHIEN_QUAY_THUAN pin_B7
#define DIEU_KHIEN_QUAY_NGUOC pin_B6

#define NGUOC 1
#define THUAN 2
#define DUNG 3

#define TAN_SO_BAM 30

#use delay (clock = 4000000 ) //dung thach anh 20Mhz
#use rs232 (baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7 )

#byte OPTION_REG=0x81

int8 chieu_quay;
int16 van_toc=15,van_toc_max=30;
int16 milisec;

#int_TIMER0
void TIMER0_isr(void)
{

set_timer0(0xD9) ; // Initial Value for 1ms Interrupt
clear_interrupt(int_timer0); // Clear TIMER0 interrupt flag
milisec++;
if(milisec>1000)
milisec=0;
if(input(BUTTON_THUAN)==0)
{
chieu_quay=THUAN;
output_bit(LED_THUAN,1);
output_bit(LED_NGUOC,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);//tat quay nguoc
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,1);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else
milisec=0;

}
else if(input(BUTTON_NGHICH)==0)
{
chieu_quay=NGUOC;
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,1);
if(milisec<van_toc)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,1);
}
else if(milisec<TAN_SO_BAM)
{
output_bit(DIEU_KHIEN_QUAY_THUAN,0);
output_bit(DIEU_KHIEN_QUAY_NGUOC,0);
}
else
milisec=0;

}
else
{
output_bit(LED_THUAN,0);
output_bit(LED_NGUOC,0);
}

}

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_1,0,1);
enable_interrupts (int_timer0);//ngat timer 0
enable_interrupts ( global ); //cho phep ngat toan cuc
OPTION_REG=0x07;
while(1)
{
output_high(pin_D0);
output_high(pin_D1);
output_high(pin_D2);
output_high(pin_D3);
output_high(pin_D4);
output_high(pin_D5);
output_high(pin_D6);
output_high(pin_D7);
output_B(0x00);
output_A(0x00);
output_C(0x00);
Delay_ms(500) ;
Output_low (pin_D0);
Output_low (pin_D1);
Output_low (pin_D2);
Output_low (pin_D3);
Output_low (pin_D4);
Output_low (pin_D5);
Output_low (pin_D6);
Output_low (pin_D7);
output_B(0xFF);
output_A(0xFF);
output_C(0xFF);
Delay_ms (500 );
}

// TODO: USER CODE!!
while(1)
{

if(input(BUTTON_TANG)==0)
{
Delay_ms(100);
van_toc++;
if(van_toc>van_toc_max)
van_toc=van_toc_max;
}
else if(input(BUTTON_GIAM)==0)
{
Delay_ms(100);
van_toc--;
if(van_toc<=0)
van_toc=0;
}
}

}

Theo bạn mô tả , mô phỏng ok nhưng mạch thật không chạy vậy bạn hãy kiểm tra lại kĩ 2 phần sau .
1/Phần config của thạch anh , mình thấy bạn set là HS trong khi clock lại là 4000000 .
2/Trên mạch thật của bạn có điện trở kéo lên cho MCLR chưa . Các chân nối với phím BUTTON của bạn có các điện trở kéo lên chứ ?

HY vọng giúp được bạn .

nhquangdt3
17-12-2012, 09:48 AM
Theo bạn mô tả , mô phỏng ok nhưng mạch thật không chạy vậy bạn hãy kiểm tra lại kĩ 2 phần sau .
1/Phần config của thạch anh , mình thấy bạn set là HS trong khi clock lại là 4000000 .
2/Trên mạch thật của bạn có điện trở kéo lên cho MCLR chưa . Các chân nối với phím BUTTON của bạn có các điện trở kéo lên chứ ?

HY vọng giúp được bạn .

thanks bác. e dùng kit nên phần cứng OK. em dùng thạch anh ngoài 4Mhz không biết set fuse thế nào nhỉ? thanks

nhquangdt3
17-12-2012, 12:47 PM
có bác nào biết chỉ e với. điều khiển mỗi chân IO mà nó không xuất ra được.

hatuan296
17-12-2012, 07:47 PM
có bác nào biết chỉ e với. điều khiển mỗi chân IO mà nó không xuất ra được.

Mình không dùng CCS bạn ạ , nên giúp bạn chuyên sâu về code thì mình không giúp được rồi . Nhưng tựu chung nó thế này . Bạn nên search trên diễn đàn những code mẫu rồi từ đó bạn rút ra được những đoạn code phù hợp với đề tài của mình .

1/Bạn xem datasheet thì chắc cũng biết , với thạch anh dưới 10Mhz thì ta phải set OSC là XTAL chứ không phải HS
2/ Để điều khiển được từng bit thì bạn phải set bit đó là output trước đã . Thường nó có dạng TRISX.NUMBER=0 , với X là tên port ,vd : b , c . Còn NUMBER là thứ tự bit của PORT đó , vd : portb.0 , portc.5 ....
Khi set cho cả port thì là trisb = %00000000
Trong code của bạn mình chưa thấy bạn làm công việc định chân output này .
3/ Tương tự để nhận một giá trị hoặc 1 bit nào đó thì bạn phải set port hoặc bit là input . Thường có dạng TRISX.NUMBER=1 là cho từng bit , hoặc có dạng TRISX = %11111111 . Trong code của bạn có các phím bấm nhưng mình cũng chưa thấy bạn set phần này .

Về các bước phía trên bạn nên tham khảo thêm các code mẫu có trong diễn đàn nhé , vì mình không chuyên về CCS nên không thể giúp bạn từng câu lệnh được .

Bạn mới bắt đầu nghiên cứu thì tốt hơn là nên thực hành với những bài tập nho nhỏ về phím bấm , về bật tắt led chứ chưa nên đi sâu vào ngắt , vào giao tiếp SPI ....
Từ từ rồi sẽ quen thôi bạn .

learnpicvn
01-01-2013, 06:38 PM
Sao phần này dành cho ngưới mới học pic mà nhiều bài viết các bạn gửi mình thấy cao siêu quá, không phải dành cho member là elementary thì phải!

luong9
01-01-2013, 08:07 PM
Kính chào các bạn trong 4rum, Mình mới học PIC nên có 1 vấn đề nhỏ mong các bạn giúp đỡ;
Mình tạo 1 project bằng CCS 4.14 bằng PIC Wizard, biên dịch OK, chạy được. Nhưng khi mình Chép sang máy tính khác, mở lên, thì mở file lên không được. Hoặc là khi mình Copy toàn thư mục chứ Project sang 1 ổ đĩa khác thì tình trạng cũng tương tự. Vẫn mở lên nhưng không mở file main.c được. Mong các bác có Video hoặc gì đó giúp mình với...


Link CCS 4.14 Mình up mê đi a phai các bạn tải về và làm các bước tạo dự án của các bạn và quay video gửi cho mình với nhé. Cám ơn nhiều các bạn giúp mình.
Thân ái...

http://www.mediafire.com/?xvd2fod6jvhgy4r

acquydo138
24-01-2013, 08:29 PM
e đang viết code để điều khiển động cơ bước. e muốn xuất ra 50 bước code của e ko biết vì sao nó chỉ xuất ta 1 bước mội nguòi xem giúp e nha
signed int i;
void rephai()
{
for (i=0;i<=50;i++)
{
output_high(pin_b0);
delay_ms(2);
output_low(pin_b0);
delay_ms(2);

}
}
void turn_back()
{
for (i=0;i<=50;i++)
{
output_high(pin_b0);
delay_ms(2);
output_low(pin_b0);
delay_ms(2);

}
}

void main()
{
set_tris_b(0x00); //mac dinh port d la dau ra

while(1)
{
output_low(pin_b1);
delay_ms(100);
rephai();
delay_ms(100);
output_high(pin_b1);
turn_back();
delay_ms(100);

}
}

learnpicvn
14-02-2013, 06:49 AM
Help me!
Chào mọi người, xin lỗi vì lại hỏi mọi người vào phần phúc đáp nhanh!
code:
#include<AT892051.h>
void wait_a_second()
{
unsigned int x;
for(x=0; x<33000; x++);
}
main()
{
int LED=0;
for(;; )
{
P1=~LED;
LED++;
wait_a_second();
}
}
Yêu cầu là dùng 8051 đếm 8 bít tăng dần rồi hiển thị ra led đơn!
Em chưa hiểu là
1) làm sao lại tính được ra con số 33000 để tạo trễ cho chương trình khoảng 1s?
2) dòng lệnh for(;; ) có ý nghĩa như thế nào?
Mong mọi người giải đáp giúp?

MINHENG
21-02-2013, 12:52 AM
Chào các Anh,
Em tập viết đoạn code này, mà cái speed nó cứ trơ trơ, không xuất ra chân nào cả, thử biến pulse_Ne, thì nó cũng thế (không bằng 0, cũng không ra giá trị nào cả).
Nhờ các anh chỉ giùm, bế tắt quá.
Em cảm ơn rất nhiều


//================================================== ======
// Ten chuong trinh : DEM XUNG Ne BANG NGAT NGOAI
// Nguoi thuc hien : Minh_mse
// Ngay thuc hien : ………….
// Phien ban : 1.0
// Mo ta phan cung : Dung PIC16F887. Thach anh 20MHz
// : Xung vuong Ne vao chan RB0 (External interrupt)
// : Xuat thu so do toc do ra cac chan RD4-RD6
// :
//================================================== ======
#include<16F887.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD,NOWRT
#use delay(clock=20000000)
int16 pulse_Ne;
float speed;
#int_EXT //Chuong trinh ngat ngoai duoc goi khi co tac dong o chan RB0
EXT_ISR()
{
++pulse_Ne;
}
main()
{
while(1)
{
// Khoi tao ngat ngoai tai RB0
ext_int_edge(H_TO_L); // Ngat canh len RB0
enable_interrupts(INT_EXT); // Cho phep ngat ngoai
enable_interrupts(GLOBAL); // Cho phép ngat toan cuc
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Khoi tao bo dinh thoi gian dem xung-Dung dao dong noi
//(20*10^6)/8=2.500 xung/ms
set_timer1(3037);
//Gia tri ban dau cho timer1 la 65.537-62500=3.037
//timer1 16bits se tran khi bang 65.537
enable_interrupts(INT_TIMER1);
speed=pulse_Ne/(25*1000);
//Tinh bang vong/giay
//Lay mau 25ms/lan
if (speed==0) output_high(PIN_D4);
if ((speed>=1) | (speed<=2))output_high(PIN_D5);
if (speed>3) output_high(PIN_D6);
}
}

hunke92
20-07-2013, 11:57 PM
e dùng điện trở nội trong pic 16f887,e dùng lệnh port_B_pullups(1),nhưng nó cứ báo lối undefined indentifier--port_B_pullups, mong các a jup đỡ

thitoantruot
21-08-2013, 02:54 PM
Mình viết một chương trình đơn giản nạp vào pic16f72

#include <16F72.h>
#device adc=8

#FUSES HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT
#use delay(clock=20000000)

void main()
{
set_tris_b(0);
output_b(0xff);
// TODO: USER CODE!!
while(1)
{
output_b(0);
delay_ms(1000);
output_b(0xff);
delay_ms(1000);
}
}

mình dùng chương trình nạp burn-e và có detect được pic
khi nạp file hex thì có mã hexa như hình vẽ
nhưng sau khi nạp program của pic lại về 3FFF hết
Bạn nào bị lỗi này thì bảo mình với

buivantuyen89th
23-08-2013, 05:36 PM
Mình viết một chương trình đơn giản nạp vào pic16f72

#include <16F72.h>
#device adc=8

#FUSES HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT
#use delay(clock=20000000)

void main()
{
set_tris_b(0);
output_b(0xff);
// TODO: USER CODE!!
while(1)
{
output_b(0);
delay_ms(1000);
output_b(0xff);
delay_ms(1000);
}
}

mình dùng chương trình nạp burn-e và có detect được pic
khi nạp file hex thì có mã hexa như hình vẽ
nhưng sau khi nạp program của pic lại về 3FFF hết
Bạn nào bị lỗi này thì bảo mình với
Mình cũng chưa bị lỗi này. Nhưng bạn thử kiểm tra lại xem. khi mở chương trình Burn-E bạn phải mở đường dẫn đến file Hex của chương trình của mình.
chúc bạn thành công!

toan_320.vn
13-10-2013, 11:25 PM
mọi người xem em cái đoạn code này có sử dụng ngắt timer0 biên dịch ko bị lỗi mà sang mô phỏng chạy ko được, ct em viết hiển thị 2 số 38 lên 2 led 7 đoạn
#INCLUDE P16F877A.INC;/*CHI DAN FILE DINH NGHIA CHIP*//
__CONFIG _XT_OSC&_WDT_OFF&_LVP_OFF;//*KHAI BAO CAU HINH*//


CBLOCK 0X20;KHAI BAO BIEN TAI DAY*//
VONG1,VONG2,VONG3,HCTEMP,HDV,STATUS_TEMP,W_TEMP,DE M
ENDC;//*KET THUC DAT BIEN*//
ORG 0X000;//*CHI THI BIEN DICH*//
;//NHAY TOI CHUONG TRINH CHINH*//
GOTO MAIN
ORG 0X004
GOTO NGAT
ORG 0X005;//*CT CHINH BAT DAU TAI DAY*//
MAIN
BSF STATUS,5;//*CHUYEN TU BANK0 LEN BANK1*//
CLRF TRISD;//*PORTD LA DAU RA*//
CLRF TRISC
MOVLW B'00000100'
MOVWF OPTION_REG
CLRF DEM
BCF INTCON,TMR0IF
BSF INTCON,TMR0IE
BSF INTCON,GIE
BCF STATUS,5; //*CHUYEN XUONG BANK0*//
MOVLW D'100'
MOVWF TMR0
;*****************CHUONG TRINH NGAT***************************
NGAT
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
BCF INTCON,TMR0IF
BTFSC DEM,0
GOTO SAI
GOTO DUNG
DUNG
BCF PORTA,4
BSF PORTA,5
MOVLW D'8' ;// HANG DON VI =8//
CALL BANGMA
MOVWF PORTD
MOVLW D'1'
MOVWF DEM
GOTO THOAT
SAI
BSF PORTA,4
BCF PORTA,5
MOVLW D'3'; // HANG CHUC =3//
CALL BANGMA
MOVWF PORTD
MOVLW D'0'
MOVWF DEM
THOAT
MOVLW D'100'
MOVWF TMR0
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE


;******************CHUONG TRINH BANG MA*************************
BANGMA
ADDWF PCL,F
RETLW 0XC0
RETLW 0XF9
RETLW 0XA4
RETLW 0XB0
RETLW 0X99
RETLW 0X92
RETLW 0X82
RETLW 0XF8
RETLW 0X80
RETLW 0X90
END

bestvietnam999
18-10-2013, 12:32 PM
Cảm ơn bạn nhiều nhé!!!!!!!!1

xmentpro
21-10-2013, 06:00 PM
Mình mới học pic và làm cái code nay nhưng khôg chạy xin chỉ bảo mih với? và tại sao khi set_tris_x() một port thì các chân ra port đó lại có các giá trị 0,1 khác nhau.tks!
#include<16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=10000000)
#use fast_io(b)
void nhay_led(){
output_b(0xff);
delay_ms(200);
output_b(0x00);
delay_ms(200);
}
void main(){
set_tris_c(1);
set_tris_b(0);
if(pin_c1==1)
while(1){
nhay_led();

}

hatdieu999
26-10-2013, 12:43 PM
đội ơn chủ thớt nhiều !!!

minhzx_yt
05-11-2013, 09:02 PM
mình mới viết lập trình PIC,có 1 lỗi này mong mọi nguòi giúp đỡ
MPLINK 4.40, Linker
Device Database Version 1.3
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - Device not specified. Use /p option to specify a device.
Errors : 1

uynhdtvtk34
18-02-2014, 10:59 PM
mình debug mà nó xuất hiện những lỗi này ko biết phải làm sao?

uynhdtvtk34
18-02-2014, 11:06 PM
mình debug mà nó xuất hiện những lỗi này ko biết phải làm sao?

npl.nguyenphi
21-03-2014, 11:25 PM
Bác nào rành về lập trình PIC bằng mikroC Pro for PIC cho e hỏi, em bị lỗi ntn là sao

0 304 C:/Users/WIN7/Desktop/Test PIC/2/MyProject.c:15: error: Can't open include file "16f887.h"
0 304 C:/Users/WIN7/Desktop/Test PIC/New folder/MyProject.c:16: error: Unknown ‪#‎directive‬ "device"
0 304 ‪#‎device‬ *= 16 ADC = 10

picvn1188
02-05-2014, 12:58 AM
các anh chị xem giúp e với ak. em khai báo hàm delay rồi mà nó cứ báo lỗi delay thôi ak. em cảm ơn các anh chị ak.

ngockonvang
08-05-2014, 10:40 PM
Thanks for this informative post. It help me a lot. And it gave mo ideas on how to make more money in marketing business. I hope lots of people visit this site so they can easily learn this informative post.

shaoljndragon
17-06-2014, 07:27 PM
[QUOTE=namqn;33890]Bạn chỉ sửa thế này thôi thì thế nào (tôi không dùng CCS C, nên bạn sửa như dưới đây và dịch xem kết quả ra sao):
void ht(long a) {
int nghin,tram,chuc,dvi;
nghin=(int)a/1000;
tram=(int)(a%1000)/100;
chuc=(int)(a%100)/10;
dvi=(int)(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}

Bạn cho mình hỏi la hiển thị thê này ra chuỗi số hay số vậy!@@
Bây giờ: Mình muốn chuyển chuỗi số trên lcd thành thành số thì làm thế nào! không dùng hàm " atoi" vì thư viện của mình bị lỗi! thanks

minhphuc0311
28-10-2014, 12:55 AM
em đang học PIC nên chả biết viết sai chỗ nào nữa,mong anh e chỉ bảo....
code đây ạ
//Cau Hinh PIC
#include <16f877a.h>//KHAI BAO THU VIEN
#fuses XT,NOWDT,NOPUT,BROWNOUT,NOLVP,NOWRT,NODEBUG,NOPROT ECT//KHAI BAO PIC
#device 16F877*=16 ADC=8
#use delay(clock=4000000)//KHAI BAO TAN SO THACH ANH
void convert_bcd(int8 x);
unsigned char const ma_LED[10]= {0xC0,0xcf,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x90 };//khai bao ma led
int a,b,chuc, n,donvi;//Cac bien chu so
void convert_bcd(int x)
{
chuc=(int)x%10;
donvi=(int)x/10;
donvi=(int)donvi%10;
}

void hienthi() // quet led
{
for(n=0;n<10;n++)
{

OUTPUT_D( ma_LED[chuc]); output_c(0b00000001);
delay_ms(10);
output_c(0b00000000);
OUTPUT_D( ma_LED [donvi]); output_c(0b00000010);
delay_ms(10);
output_c(0b00000000);
}
}
//CHUONG TRINH CHINH
void main()
{
float nhietdo;

{
set_tris_a(0xff);
SET_TRIS_c(0X00); //Port B là output(ngo ra)
SET_TRIS_D(0x00); //port D la output(ngo ra)

setup_ADC(ADC_clock_internal);//T/G lay mau bang xung clock
setup_ADC_ports(AN0);//Lay Vref=5V
set_ADC_channel(0);//chon chan A0 la chan dua tin hieu Analog vao
delay_us(10);//tao khoang t/g de lay mau
a=read_adc();//doc tin hieu vao
nhietdo = (a)/2.048;
b=nhietdo;
convert_bcd((int8)b);//chuyen doi ADC
delay_us(10);
//Vong lap
while(1)
{
a=read_adc();
nhietdo = (a)/2.048;
convert_bcd((int8)b);
hienthi();
}
}
}

hoacvxd
18-11-2014, 03:50 PM
Tôi đang thử nghiệm với con PIC 16F716. Khi mô phỏng trên Proteus thì không có vấn đề gì, mọi thứ suôn xẻ nhưng khi nạp vào IC thì không chạy.
Chương trình viết trên CCS.
Xin hỏi mọi người lỗi tại đâu.
Cảm ơn mọi người.

matmatinhyeu
20-11-2014, 01:08 PM
chào các bạn anh chị. hiện tại mình đang viết chương trình robot Micromouse, mình đang vướng mắc phần thanh ghi Stack trong PIC 18f4550, mình sử dụng CCS C. các bạn hay anh chị nào có thể chỉ cho mình cách thức đọc và ghi vào stack được không ạ:
cụ thể như sau:
STACK của e là 1 mảng có 64 byte khai báo: int8 stackstr[64];
biến con trỏ thanh ghi được khai báo: int: stack_pointer=0;
- khi đọc tài liệu liên quan đến stack register thì vẫn không hiểu nguyên lý hoạt động của nó, làm thế nào để đẩy 1 giá trị vào stack, sau đó lấy nó ra so sánh xong rồi thực hiện vòng lặp liên tục cho đến khi stack rỗng?. Chỗ mình không hiểu là như thế nào là Stack rỗng? và làm sao để biết nó đã rỗng? rổng có phải là giá trị =0 hay là không gán giá trị gì không ạ?
Giúp mình gấp với nhé, Cảm ơn cả nhà nhiều :)

msterdang
04-02-2015, 09:41 PM
có thể giúp em về lệnh retlw,với thanh ghi PC được ko ạ.em viết chương trình đếm 0-9 sử dụng bảng dữ liệu cho led7 đoạn .mà sao xem debug nó cứ lặp lại chương trình từ :main - đến goto bangma đên retlw 0xC0 .chương trình đây ạ.mong các anh giúp đỡ.

#include "p16F887.inc"

; CONFIG1
; __config 0xE0D2
__CONFIG _CONFIG1, _FOSC_HS & _WDTE_OFF
; CONFIG2
; __config 0xFFFF
__CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF
;--------------------khi bao bien--------------
cblock 0x20 ;start of general purpose registers

vong1,vong2,vong3
endc
;************************************************* *********************

;----------------------chong trinh chinh----------------------------------------
org 0x00

goto main ;

org 0x05 ;
main
bsf STATUS,5;
clrf TRISD ; chon port d la cong out
bcf STATUS,5
clrf PORTD
start ; chuong trinh dem
movlw d'0'
goto bangma
movwf PORTD;
goto Delay
;---------------------------
movlw d'1'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'2'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'3'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'4'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'5'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'6'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'7'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'8'
goto bangma
movwf PORTD
goto Delay

;-------------------------------
movlw d'9'
goto bangma
movwf PORTD
goto Delay
goto start
return
;----------------------------------------------------------------
Delay ;chuong trinh con tao tre
movlw d'120'
movwf vong1
movlw d'250'
movwf vong2
movlw d'3'
movwf vong3
decfsz vong1,1
goto $-1
decfsz vong2,1
goto $-3
decfsz vong3,1
goto $-5

return;tro ve ct chinh
bangma ;bang ma cho led
addwf PCL,f
retlw 0xC0
retlw 0xF9
retlw 0xA4
retlw 0xB0
retlw 0x99
retlw 0x92
retlw 0x82
retlw 0xF8
retlw 0x80
retlw 0x90
END

saunai
09-02-2015, 08:36 PM
Nhờ mọi người xem dùm e cái code viết cho 8 led đơn sáng nhấp nháy dùng ngắt, đưa vào mô phỏng nó cứ sáng hoài k chịu nháy.

#include <16f877a.h>
#fuses NOWDT,HS,NOPROTECT
#use delay(clock=4M)
#byte portb=0x06

int16 dem;
int8 a;
//Chuong trinh ngat timer0
#int_timer0
void interrupt_timer0()
{

++dem;
if (dem==1000) //1000*500us=500000us=0.5s
{
dem=0;
if (a=0x00)
a=0xff;
else a=0xff;
}
set_timer0(6);
}
void main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6); //Dinh thoi (256-6)*2*1us=500us
a=0xff;
while(true)
{
portb=a;
}
}

buivantuyen89th
10-02-2015, 08:49 AM
Nhờ mọi người xem dùm e cái code viết cho 8 led đơn sáng nhấp nháy dùng ngắt, đưa vào mô phỏng nó cứ sáng hoài k chịu nháy.

#include <16f877a.h>
#fuses NOWDT,HS,NOPROTECT
#use delay(clock=4M)
#byte portb=0x06

int16 dem;
int8 a;
//Chuong trinh ngat timer0
#int_timer0
void interrupt_timer0()
{

++dem;
if (dem==1000) //1000*500us=500000us=0.5s
{
dem=0;
if (a=0x00)
a=0xff;
else a=0xff;
}
set_timer0(6);
}
void main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6); //Dinh thoi (256-6)*2*1us=500us
a=0xff;
while(true)
{
portb=a;
}
}

bạn bi sai trong chương trình ngắt rồi.
thứ nhất: điều kiện trong lệnh if là "==" chứ k phải là "=".
thứ 2: bạn đang đặt chế độ là. nếu a==0 thì cho a=1. còn khác sẽ là a=1. vì vậy a lúc nào cũng=1.
chúc ạn thành công!

saunai
12-02-2015, 10:45 AM
Nhờ cao thủ check dùm đoạn code đk động cơ. THank!!
#include <16F877A.h>
#include <def_877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define tocdo0 0
#define td_macdinh 10
#define tocdo1 100
#define tocdo2 150
#define tocdo3 200
#define tocdo4 250
#define tocdo5 300


int16 bientocdo=0;
INT16 COUNT=0;
INT8 SOLANLAP=0;
int8 nghin,tram,chuc,donvi;
int16 bientocdodat=0;
int16 duty1=0;
int16 duty2=0;
INT16 TOCDOENCODER=100;
INT16 SOXUNGDEM_1PHUT=0;
//int16 x;
int1 bienthuan=0;
int1 biennghich=0;
INT chieu;

#INT_RTCC // Ngat khi timer0 tran

VOID TIMER0() // tao bo dem timer0 dem so xung vao.............RA4
{
COUNT++;
}

#INT_TIMER1

VOID TIMER1() // dinh thoi 1s bang timer1 va tinh toan toc do....
{
set_timer1(15535); // timer 1 se dem 50 000 lan phuc vu cho dinh thoi 1S

solanlap=solanlap+1;

if (solanlap==25)
{
SOXUNGDEM_1PHUT=(((COUNT*255)+GET_TIMER0())*60)/TOCDOENCODER;
SOLANLAP=0;
SET_TIMER0(0);
COUNT=0;
}

}

void tinhtoan_hienthi(int16 x) // thuc hien tach so va dua ra hien thi
{
nghin = x / 1000 ;
x = x % 1000;
tram = x / 100 ; // tách so hàng tram
x = x % 100; // chia lay phan du
chuc = x / 10 ; // tách lay phan chuc
donvi = x % 10 ; // phan don vi

if (chieu==1) lcd_putchar('+');
else lcd_putchar('-');
lcd_putchar(nghin + 0x30);
lcd_putchar(tram+ 0x30);
lcd_putchar(chuc+ 0x30);
lcd_putchar(donvi+ 0x30);
}


void main(void)
{
set_tris_a(0x0ff);
set_tris_b(0x00);
set_tris_d(0xFF);
lcd_putcmd(0x80);
lcd_init();
delay_ms(5);
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer
set_timer1(12140);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
setup_ccp1(CCP_PWM); //khoi tao bo PWM1
setup_ccp2(CCP_PWM); //khoi tao bo PWM2

setup_timer_2(T2_div_by_16,255,1); //tao chu ky xung Tpwm =(PR2+1)*4*Tosc*N = (255+1)*4*(1/20Mhz)*16 = 0.8 ms


set_pwm1_duty(duty1); //gia tri duty cua PWM duoc tinh
set_pwm2_duty(duty2); //theo cong thuc duty1*t2div/clock
//khoi tao duty=0 ->tat dong co
while(true)
{
if (!bit_test(portD,1)) //neu nhan phim FO : chay thuan
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
delay_ms(1000); //delay 1s de giam quan tinh dc
bienthuan=1;
biennghich=0;
goto next;
}

if (!bit_test(portD,2)) //neu nhan phim RE : chay nghich
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
delay_ms(1000); //delay 1s de giam quan tinh dc
bienthuan=0;
biennghich=1;
goto next;
}

if (!bit_test(portD,3)) //nhan phim toc do 1
{
bientocdo=1;
goto next;
}

if (!bit_test(portD,4)) //nhan phim toc do 2
{
bientocdo=2;
goto next;
}

if (!bit_test(portD,5)) //nhan phim toc do 3
{
bientocdo=3;

goto next;
}

if (!bit_test(portD,6)) //nhan phim toc do 4
{
bientocdo=4;

goto next;
}

if (!bit_test(portD,7)) //nhan phim toc do 5
bientocdo=5;

next:
if (!bit_test(portD,0)) //neu nhan phim OFF
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
bienthuan=0;
biennghich=0;
bientocdo=0; //xoa bien toc do
bientocdodat=0;
}

if (bienthuan)
{
duty2 = tocdo0;
chieu=1;
switch (bientocdo)
{
case 1: duty1= tocdo1;
bientocdodat=100;
break;
case 2: duty1= tocdo2;
bientocdodat=150;
break;
case 3: duty1= tocdo3;
bientocdodat=200;
break;
case 4: duty1= tocdo4;
bientocdodat=250;
break;
case 5: duty1= tocdo5;
bientocdodat=300;
break;
default : duty1 = td_macdinh;
bientocdodat=10;
break;
}
set_pwm1_duty(duty1); //cho dco chay thuan
set_pwm2_duty(duty2);

}

if (biennghich)
{
duty1 = tocdo0;
chieu=0;
switch (bientocdo)
{
case 1: duty2= tocdo1;
bientocdodat=100;
break;
case 2: duty2= tocdo2;
bientocdodat=150;
break;
case 3: duty2= tocdo3;
bientocdodat=200;
break;
case 4: duty2= tocdo4;
bientocdodat=250;
break;
case 5: duty2= tocdo5;
bientocdodat=300;
break;
default : duty2 = td_macdinh;
bientocdodat=10;
break;
}
set_pwm1_duty(duty1); //cho dco chay nghich
set_pwm2_duty(duty2);

}

lcd_putcmd(0x80);
lcd_putchar("Actual:");
lcd_putcmd(0x88);
TINHTOAN_HIENTHI(SOXUNGDEM_1PHUT);
delay_ms(1);
lcd_putcmd(0xc0);
lcd_putchar("Desired:");
lcd_putcmd(0xc8);
TINHTOAN_HIENTHI(bientocdodat);

}
}

teemo
22-09-2015, 09:11 AM
Em đang viết chương trình nhận dữ liệu từ máy tính xuống để điều khiển cái động cơ. Nhưng sau khi biên dịch thì xuất hiện cảnh báo sau:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616).
Em có tham khảo các nguồn thì được biết là do trong hàm ngắt và ngoài hàm ngắt em sử dụng lặp lại 1 hàm hay 1 biến gì đó, nhưng em tìm mãi không thấy sai chỗ nào. Mong các pro chỉ giúp. Em cám ơn nhìu.
Chương trình của em như sau:
(Sorry vì em không biết đưa code vào trong ô code ^^!)

#include <16f877a.h>
#include <def_877a.h>
#include <stdlib.h>
#fuses NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBRO WNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#include <lcd_lib_4bit.c>
/*#define enter RA2
#define s_t RA3
#define f_r RA5
#define up RE0
#define down RE1
*/
void ht(int16 a);
//void ht1(int16 a);
void init();
void pid();
void nhapheso();
//void up_down();
int16 count, tocdo, C, temp, temp1, k, tocdodat ;
signed int16 e2=0;
signed int16 e1=0;
int16 e_sum;
int16 e_del;
int16 duty;
float Kp=0;
float Ki=0;
float Kd=0;
int flag=0;
float u, T=0.01;

unsigned char text[30], text2[5] ;
unsigned char a1[5], dem=0, i=0, j=0,i1;

#INT_RDA
void Receive_isr()
{
text[dem]=getc();
if(text[dem]=='@') //kiem tra dieu kien ket thuc
{
flag =1; //ket thuc nhan, bat co bao
dem=0;
}
else dem++;
}
#INT_EXT
void ngatR0() {
count++;//set_timer0(0);
}
#int_timer1
void Timer11_isr() { // Ham duoc goi khi TImer1 tran (65535->0)
// Chu ky trich mau 0.01

set_timer1(53036);
tocdo= 30*(count + get_timer0());
// printf("%ld\t",tocdo);
count = 0;
set_timer0(0);


}
void main(){
init();
lcd_putcmd(0x01);
while(true){
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
pid();
if(RC1==0) set_PWM1_duty(duty);
if(RC1==1) set_PWM1_duty(1023 - duty);
lcd_putcmd(0x80);
ht(tocdo);
printf("n%4Lu",tocdo);


//lcd_putchar("hi");


}
}
void init()
{
lcd_init();
nhapheso();
disable_interrupts(int_rda);
disable_interrupts(global);
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_L_TO_H); // Timer0 is Counter
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_4, 255, 1);//4*4*256*1/20000000=204.8us=4.8khz
set_timer0(0);
set_timer1(53036);
enable_interrupts(INT_RTCC);
enable_interrupts(int_timer1);
enable_interrupts(int_ext);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL);
lcd_putcmd(0x80);
count=0;
trisc=0;
trisd=0;
trisa=255;
trisb=1;
RC1=0;
if(C==1) RC1=1;
If(C==0) RC1=0;
}
void pid(){
e2 = tocdodat - tocdo;
e_sum += e2;
// e_del = e2 - e1;
// e1 = e2;
u = u + Kp*e2 + Ki*e_sum*T;
if (u>24){
u=24;
e_sum -=e2;
}
if (u<0){
u = 0;
e_sum -=e2;
}
duty = u*1023/24;
}
void ht(long a) {
int nghin,tram,chuc,dvi;
nghin=a/1000;
tram=(a%1000)/100;
chuc=(a%100)/10;
dvi=(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}
void nhapheso(){
lcd_putchar("nhap tu PC");
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
while(!flag) ;
if(flag){

//if ((strchr(text,'T')) && (strrchr(text, '@')))

text2[0] = text[0];
text2[1] = text[1];
text2[2] = text[2];
text2[3] = text[3];
text2[4] = text[4];
tocdodat = atol(text2);

//----------------------------------------
while (text[i] != 'P')
i++;
while (text[j] != 'I')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

Kp = atof(a1);

printf("P%f",Kp);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != 'D')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

Ki = atof(a1);
printf("I%f",Ki);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != 'C')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

Kd = atof(a1);
printf("D%f",Kd);
delay_ms(100);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
i = j;
while (text[j] != '@')
j++;
i1 = i;
temp = j - i;
for (i = 0; i < temp; i++)
a1[i] = text[i1 + i + 1];

C = atol(a1);
printf("C%Lu",C);
flag=0;
i=0; j=0;
dem=0;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

}

}
Không ai trả lời vấn đề này sao???

phongthuy113
27-10-2015, 04:44 PM
Cảm ơn bạn đã chia sẻ thông tin mình đang cần tìm
______________________________________
http://phongthuyviet.info/
Vòng tay đá phong thủy (http://phongthuyviet.info/) , Vòng tay phong thủy (http://phongthuyviet.info/danh-muc/vong-tay-phong-thuy) , Đá phong thủy (http://phongthuyviet.info/danh-muc/da-phong-thuy) , Trang sức phong thuỷ (http://phongthuyviet.info/danh-muc/trang-suc-phong-thuy)
Vòng tay phong thủy (https://www.facebook.com/phongthuyviet.info)

buikhacbinh1996
12-03-2016, 01:24 PM
Em đang viết 1 chương trình hiển thị số lên lcd, các hàm của lcd lấy của bác linhnc308. Tuy nhiên chỉ hiển thị được từ 0-255. Mong các cao thủ chỉ giáo để em hiển thị được số có 4 chữ số. Chương trình như sau:
#include <16f877a.h>
#include <def_877a.h>
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include <lcd_lib_4bit.c>
#define enter RA2
#define up RE0
#define down RE1
void ht(int);
void main()
{
int16 k=0;
while(ENTER) {
if(!UP) {while(!UP);
if(k<3000) k++;else k=0;
}
if(!DOWN) {while(!DOWN);
if(k>0) k--;else k=3000;
}
lcd_init();
lcd_putchar("k=");
lcd_putcmd(0x82);
ht(k);
}
while(!ENTER);

}
void ht(int a) {
int nghin,tram,chuc,dvi;
nghin=(int)a/1000;
tram=(int)(a%1000)/100;
chuc=(int)(a%100)/10;
dvi=(int)(a%10);
lcd_putchar(nghin+48);
lcd_putchar(tram+48);
lcd_putchar(chuc+48);
lcd_putchar(dvi+48);
}
sao mình không dùng được #include <def_877a.h> ở trong picc c nhỉ??

vanthangv
29-06-2016, 08:48 AM
Các bác pro giúp mình vấn đề này với, mình viết code cho con 16f887 nhưng không biết sai thuật toán hay khai báo thiếu cái gì mà khi mô phỏng nó không chạy, yêu cầu của bài là viết code cho mạch đếm sản phẩm dùng 1 counter và 3 led hiển thị từ 000-100 sang 101 thì nhảy lại về 000, mfinh dùng phần mềm CCS để viết code mô phỏng bằng Proteus bác nào chuyên về PIC chỉ cho mình chỗ sai dc không.

Code:
#INCLUDE <16F887.H>
//KHAI BAO THU VIEN PIC 16F887
#FUSES NOWDT,HS,PUT,NOPROTECT,NOLVP
//KHAI BAO CAU HINH PIC16F887
#USE DELAY(CLOCK=20M)
//KHAI BAO TAN SO BO GIAO DONG = 20MHz
CONST UNSIGNED CHAR MA7DOAN[10]={0X00,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
//KHAI BAO MANG MA LED 7 DOAN
UNSIGNED INT8 TO;
//KHAI BAO BIEN T0 O KIEU DU LIEU 8 BIT
VOID MAIN()
//CHUONG TRINH CHINH
{
SET_TRIS_B(0X00); SET_TRIS_C(0X00); SET_TRIS_D(0X00); //SET_TRIS_A(0XFF);
//SET PORT B, C, D CUA VI SU LY LA CONG XUAT DU LIEU
//OUTPUT_B(0XF9); OUTPUT_C(0XA4); OUTPUT_D(0XB0);
SETUP_TIMER_0(T0_EXT_L_TO_H | T0_DIV_1);
//CAI DAT TIMER DUNG BO DEM XUNG NGOAI, DUNG BO CHIA TRUOC VOI TI LE 1:1
SET_TIMER0(0);
//DAT GIA TRI KHOI TAO CHO TIMER0 = 0
WHILE(TRUE)
//VONG LAP VO HAN NEU DIEU KIEN DUNG
TO=GET_TIMER0();
//DAT GIA TRI BIEN T0 = GIA TRI TIMER0
//OUTPUT_B(MA7DOAN[TO/100]);
//XUAT MA 7 DOAN HANG TRAM RA PORT B, MA 7 DOAN = GIA TRI T0 CHIA CHO 100
OUTPUT_C(MA7DOAN[TO/10]);
// XUAT MA 7 DOAN HANG CHUC RA PORT C, MA 7 DOAN = GIA TRI T0 CHIA CHO 10
OUTPUT_D(MA7DOAN[TO%10]);
//XUAT MA 7 DOAN HANG DON VI RA PORT D, MA 7 DOAN = GIA TRI T0 CHIA 10, CHIA TIEP CHO 10 LAY SO DU
}

ngoatnt01
19-09-2017, 03:34 PM
Nội dung bài viết của bạn quá chuẩn, đây toàn là những thông tin mình đang cần, bạn có thể đăng thêm nhiều bài như thế này hơn được không? thanks nhé

ngoatnt01
19-09-2017, 08:05 PM
Bài post của bạn quá chuẩn, đây toàn là những thông tin mình đang tìm kiếm, bạn có thể viết thêm nhiều bài như thế này hơn được không? cảm ơn

ngoatnt01
19-09-2017, 08:21 PM
Nội dung của bạn quá chuẩn, đây toàn là những thông tin mình đang cần, bạn có thể post thêm nhiều bài như thế này hơn được không? Thanks

0977817726
23-04-2018, 03:33 PM
Chào cả nhà.
Chả là thế này tôi mưới học PIC (Tự học). Tôi viết môt chương trình nhỏ trên MicroC fpr pic. Chạy trên proteus thì ok nhưng nạp thì báo lỗ như sau.
"Programming failed at program memory address 0c000000".
Ai đã gặp lỗi này chưa. và giúp mình cách fix lỗi này với.
Tôi dùng. Pic 16f876A mạch nạp Kitpic V2
Chân thành cảm ơn!