View Single Post
Old 03-06-2013, 10:54 PM   #5
changnhoc123
Nhập môn đệ tử
 
Tham gia ngày: May 2012
Bài gửi: 3
:
Các bạn giúp mình với code mình bị lỗi ngắt RDA

Mình mô phỏng trên Protus thì nó chạy ok, khi nạp vô PIC thì nó không chạy, nhưng mình sờ tay vào chân RC7 thì nó lại chạy, nhả ra nó đứng im, mình kiểm tra thì khi mình xóa đoạn ngắt RDA trong chương trình thì PIC chạy bình thường. Code mình đây, các bác giúp mình với :
#include <16F877a.h>
#fuses HS
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8,stop=1)
#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)
#DEFINE RS PORTB.5
#DEFINE RW PORTB.6
#DEFINE E PORTB.7
#BYTE PORTB = 0X6
#BYTE PORTC = 0X7
#BYTE PORTD = 0X8
#BIT B5 = PORTB.5
#BIT B6 = PORTB.6
#BIT B7 = PORTB.7
#BIT DIR= PORTC.2
#BIT KENHB = PORTB.1
INT16 Y, Y1, vtcd;
signed int16 p_err, err, p, i, d, out;
int x, t, m, tr, ch, dv, kp, ki, kd;
CHAR S[]={"0123456789"};
VOID PID();
VOID PWM();
VOID LCD();
VOID LENH();
VOID XUAT();
VOID NGAT();
VOID NHANDULIEU();
VOID MAIN()
{
ENABLE_INTERRUPTS(INT_RDA); // cho phep ngat TRUYEN THONG
ENABLE_INTERRUPTS(INT_EXT); // cho phep ngat RB0
ENABLE_INTERRUPTS(GLOBAL); // cho phép ngat toan cuc
SET_TRIS_B(0B00000011);
SET_TRIS_C(0B10000000);
SET_TRIS_D(0B00000000);

PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTD = 0X01;
LENH();

VTCD = 20;
DIR = 0;
kp = 2;
ki = 1;
kd = 3;
Y = Y1 = 0;

WHILE(1)
{
PID();
PWM();
LCD();
DELAY_US(3000);
putc(Y1);
Y1 = Y;
Y = 0;
}
}
VOID PID()
{
err = vtcd - y1;
p = kp * err;
d = kd * (err - p_err);
i+= ki * err;
p_err = err;
out+= p + i + d; // duy tri van toc
if (out <= 0) {out = 1;} // gioi han do rong xung cho dc chay
if (out >= 255) {out = 255;} // gioi han do rong xung cho dc chay
m = out;
}
VOID PWM()
{
setup_ccp2(ccp_pwm);
set_pwm2_duty(m);
setup_timer_2(t2_div_by_1,255,1);
}
VOID LCD()
{
PORTD = 0X38;
LENH();
PORTD = 0X0C;
LENH();
PORTD = 0X80;
LENH();
PORTD = 'V';
XUAT();
PORTD = 'A';
XUAT();
PORTD = 'N';
XUAT();
PORTD = ' ';
XUAT();
PORTD = 'T';
XUAT();
PORTD = 'O';
XUAT();
PORTD = 'C';
XUAT();
PORTD = ' ';
XUAT();
PORTD = 'T';
XUAT();
PORTD = 'H';
XUAT();
PORTD = 'U';
XUAT();
PORTD = 'C';
XUAT();
PORTD = ' ';
XUAT();
PORTD = 'T';
XUAT();
PORTD = 'E';
XUAT();
PORTD = 0Xc0;
LENH();
TR = Y1/100;
CH = Y1%100;
DV = CH%10;
CH = CH/10;
PORTD = S[TR];
XUAT();
PORTD = S[CH];
XUAT();
PORTD = S[DV];
XUAT();
}
VOID LENH()
{
b5 = 0;
b6 = 0;
b7 = 1;
b7 = 0;
DELAY_US(1000);
}
VOID XUAT()
{
b7 = 1;
b5 = 1;
b6 = 0;
b7 = 0;
DELAY_US(1000);
}
#INT_EXT
VOID NGAT()
{
IF (DIR == 0)
{
IF (KENHB == 1)
{
Y++;
}
}
ELSE
{
IF (KENHB == 0)
{
Y++;
}
}
}
#INT_RDA
VOID NHANDULIEU()
{
kp = getc();
ki = getc();
kd = getc();
vtcd = getc();
t = getc();
m = 0;
pwm();
if ( t == 1 )
{
y = 0;
y1 = 0;
p = 0;
i = 0;
d = 0;
out = 0;
dir = 1;
}
if ( t == 0 )
{
y = 0;
y1 = 0;
p = 0;
i = 0;
d = 0;
out = 0;
dir = 0;
}
}
changnhoc123 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn