|
Tài trợ cho PIC Vietnam |
Những câu hỏi thường gặp Những lỗi cơ bản thường gặp khi làm việc với PIC hoặc những vấn đề cơ bản nhất thường được hỏi trong những năm qua |
|
Ðiều Chỉnh | Xếp Bài |
|
20-11-2012, 02:08 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Nov 2011
Bài gửi: 12
: |
Mạch testboard có vấn đề-Mọi người cứu em với !!!
Mọi người cứu em trương hợp này với.
Đây là đoạn code em lập trình khi test trên proteus thì ok mà mắc trên testboard thì số cứ nhảy lung tung mặc dù mình không nhấn phím nào cả. Em cũng đã tháo phần phím ma trận ra khỏi con VĐK(Chỉ kết nối với LCD) mà số vẫn cứ nhảy. Theo như code thì dến phần "Nhap so thu 1" nó phải đứng để mình nhập số vậy mà nó nhảy đâu ra 3 số bất kì rồi chạy đến hết chưong trình. Thế là sao vậy mọi người !!!! Đây là đoạn code+ mạch nguyên lý(em làm trên con PIC6F877A) #include <16F877A.h> #include <def_877a.h> #fuses NOWDT,PUT,HS,NOPROTECT,NOLVP #use delay(clock=10000000) #include <lcd_lib_4bit.c> #use fast_io(b) #use fast_io(d) int tram,chuc,donvi; int sttphim=0; int16 duty1=0; int16 duty2=0; int16 x,y1,y2,y3,a,b,i; int16 p=0,y=0; int1 bienthuan=0; int1 biennghich=0; int1 flag,chieu,o; void checkphim(b); void nhaptocdo(); void tinhtoan_hienthi(int16 x) // thuc hien tach so va dua ra hien thi { tram = x / 100 + 0x30; // tách so hàng tram x = x % 100; // chia lay phan du chuc = x / 10 + 0x30; // tách lay phan chuc donvi = x % 10 + 0x30; // phan don vi if (chieu==1) { lcd_putchar(tram); lcd_putchar(chuc); lcd_putchar(donvi); lcd_putcmd(0xc0); lcd_putchar(" Quay Thuan "); } else { lcd_putchar(tram); lcd_putchar(chuc); lcd_putchar(donvi); lcd_putcmd(0xc0); lcd_putchar(" Quay Nghich "); } } void loichao() { lcd_putcmd(0x80); lcd_putchar(" HCMUS-FETEL"); delay_ms(2500); lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0x80); lcd_putchar(" DK toc do"); lcd_putcmd(0xc0); lcd_putchar(" Dong co "); delay_ms(2500); lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0xc0); lcd_putchar(" "); } void checkphim(b) { switch(b) { case 1:{sttphim=1;break;} case 2:{sttphim=2;break;} case 3:{sttphim=3;break;} case 4:{sttphim=12;break;} case 5:{sttphim=4;break;} case 6:{sttphim=5;break;} case 7:{sttphim=6;break;} case 8:{sttphim=13;break;} case 9:{sttphim=7;break;} case 10:{sttphim=8;break;} case 11:{sttphim=9;break;} case 12:{sttphim=14;break;} case 13:{sttphim=10;break;} case 14:{sttphim=0;break;} case 15:{sttphim=11;break;} case 16:{sttphim=15;break;} } } void quetphim() { a=0; flag=0; int n[4]={0b11101111,0b11011111,0b10111111,0b01111111}; while(flag==0) { for(i=0;i<4;i++) //i la cot { delay_ms(100); output_b(n[i]); if(!bit_test(portb,3)) { delay_ms(10); a=0*4+i+1; checkphim(a); flag=1; } else if(!bit_test(portb,2)) { delay_ms(10); a=1*4+i+1; checkphim(a); flag=1; } else if(!bit_test(portb,1)) { delay_ms(10); a=2*4+i+1; checkphim(a); flag=1; } else if(!bit_test(portb,0)) { delay_ms(10); a=3*4+i+1; checkphim(a); flag=1; } } } } void nhaptocdo() { lcd_putcmd(0x80); lcd_putchar(" Nhap toc do "); lcd_putcmd(0xc0); lcd_putchar(" Max la 620 "); delay_ms(2500); lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0xc0); lcd_putchar(" "); do { clear: lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0xc0); lcd_putchar(" "); //nhap hang tram do { lcd_putcmd(0x80); lcd_putchar(" Nhap so thu 1 "); quetphim(); if(sttphim==13) { y=100;goto run;} if(sttphim==14) { y=500;goto run;} if(sttphim==12) goto clear; //nhap sai nhap lai y1=sttphim; } while(sttphim==10||sttphim==11||sttphim==15); //nhaphangchuc do { lcd_putcmd(0x80); lcd_putchar(" Nhap so thu 2 "); quetphim(); if(sttphim==13) { y=100;goto run;} else if(sttphim==14) { y=500;goto run;} else if(sttphim==12) goto clear; //nhap sai nhap lai y2=sttphim; } while(sttphim==10||sttphim==11||sttphim==15); //nhaphangdv do { lcd_putcmd(0x80); lcd_putchar(" Nhap so thu 3 "); quetphim(); if(sttphim==13) { y=100;goto run;} else if(sttphim==14) { y=500;goto run;} else if(sttphim==12) goto clear; //nhap sai nhap lai y3=sttphim; } while(sttphim==10||sttphim==11||sttphim==15); y=100*y1+10*y2+y3; } while(y>620); run: p=y; //luu gia tri p dk dong co lcd_putcmd(0x80); lcd_putchar("Td da nhap: "); //Xuat toc do da nhap lcd_putcmd(0x8c); y1= y/100 + 0x30; // tách so hàng tram y=y%100; y2=y/10 + 0x30; // tách lay phan chuc y3=y%10 + 0x30; // phan don vi lcd_putchar(y1); lcd_putchar(y2); lcd_putchar(y3); delay_ms(2500); //xac nhan lan cuoi truoc khi chay lcd_putcmd(0x80); lcd_putchar("Nhap lai: CLEAR "); lcd_putcmd(0xc0); lcd_putchar("Bo qua:Phim khac"); quetphim(); if(sttphim==12) goto clear; } void main() { set_tris_b(0xf); //khoi tao port B la port nhap set_tris_d(0x00); lcd_putcmd(0x80); lcd_init(); delay_ms(50); setup_ccp1(CCP_PWM); //khoi tao bo PWM1 setup_ccp2(CCP_PWM); //khoi tao bo PWM2 setup_timer_2(T2_div_by_16,154,1); //tao chu ky xung 1ms //(1/clock)*4*t2div*(period+1) //(1/10e6)*4*16*(154+1)=1e-3=1ms 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 // loichao(); nhaptocdo(); lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0xc0); lcd_putchar(" "); delay_ms(500); lcd_putcmd(0x80); lcd_putchar("Chon chieu quay "); top: quetphim(); if(sttphim!=10&&sttphim!=11&&sttphim!=15) goto top; if (sttphim==10) //neu nhan phim FO : chay thuan { duty1=0; duty2=0; 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; o=1; goto next; } if (sttphim==11) //neu nhan phim RE : chay nghich { duty1=0; duty2=0; 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; o=1; goto next; } next: if (sttphim==15) //neu nhan phim OFF { duty1=0; duty2=0; set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de set_pwm2_duty(duty2); //tat dong co bienthuan=0; biennghich=0; o=0; } if (bienthuan) { duty2=0; chieu=1; duty1=p; set_pwm1_duty(duty1); //cho dco chay thuan set_pwm2_duty(duty2); } if (biennghich) { duty1=0; chieu=0; duty2=p; set_pwm1_duty(duty1); //cho dco chay nghich set_pwm2_duty(duty2); } if(o==0) { lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0xc0); lcd_putchar(" "); lcd_putcmd(0x80); lcd_putchar(" Toc do: 0 "); lcd_putcmd(0xc0); lcd_putchar(" "); goto top; } else { lcd_putcmd(0x80); lcd_putchar(" "); lcd_putcmd(0x80); lcd_putchar("Toc do:"); lcd_putcmd(0x8b); tinhtoan_hienthi(p); goto top; } } |
20-11-2012, 03:31 PM | #2 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Bạn kiểm tra lại phần điện trở kéo lên cho các phím nhé .
|
20-11-2012, 03:41 PM | #3 |
Đệ tử 1 túi
Tham gia ngày: Nov 2011
Bài gửi: 12
: |
Điện trở em chọn là 10k. NHưng em đã ngắt phần ma trận phím ra hết rồi chỉ còn LCD nối với VDK thôi mà nó vẫn lấy số ở đâu ra thế mới tài (
|
20-11-2012, 06:51 PM | #4 |
Đệ tử 1 túi
Tham gia ngày: Nov 2011
Bài gửi: 12
: |
Sau một hồi tìm hiểu em đã phát hiện ra nguyên nhân của nó. Không hiểu sao con PIC cứ hiểu là mình đã nhấn nút tương ứng "sttphim=13" hay "a=8" trong hàm quét phím trong khi không hề có tác động nào cả.
Các bác cao nhân giúp em vấn đề này với. |
20-11-2012, 10:36 PM | #5 |
Làm quen với PIC
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: Hcm
Bài gửi: 160
: |
Lúc bạn tháo bàn phím ra thì những chân dùng để đọc phím có được pull-up không ? Theo mình nghĩ do bạn ngắt phần ma trận phím ra mà không có điện trở kéo lên nối với các chân của PIC nên những chân dùng để đọc phím đang bị "trôi áp" tự do .
|
20-11-2012, 11:36 PM | #6 |
Đệ tử 1 túi
Tham gia ngày: Nov 2011
Bài gửi: 12
: |
cám ơn bác hatuan. Bác đã cứu em 1 bàn thua trông thấy. Còn vài tuần nữa là phải nộp bài rồi ^^. Sẵn tiện đây bác có thể nói rõ hơn về hiện tượng "trôi áp" này đc không
|
|
|