PDA

View Full Version : Mạch testboard có vấn đề-Mọi người cứu em với !!!


helione197
20-11-2012, 02:08 PM
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;
}
}

hatuan296
20-11-2012, 03:31 PM
Bạn kiểm tra lại phần điện trở kéo lên cho các phím nhé .

helione197
20-11-2012, 03:41 PM
Đ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 :((

helione197
20-11-2012, 06:51 PM
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.

hatuan296
20-11-2012, 10:36 PM
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 .

helione197
20-11-2012, 11:36 PM
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