Giúp đỡ về Ngắt của PIC16F877A
chào các bác.
em là amateur, em đang bị mắc 1 vấn đề. Mong rằng các anh chỉ giáo. Em sử dụng 2 ngắt (RB0 + RDA) thì chương trình dưới PIC ko thể nhận được dữ liệu để xử lý. CÒn lại chương trình vẫn OK. Gửi lên vẫn đc. Ngắt RB0 cứ 10ms lại xãy ra 1 ngắt. Mong các bác hướng dẫn có cách nào để cả 2 làm việc ko? thanks |
Trích:
|
Bạn nên chú ý một việc là: khi chạy hàm thực thi của một ngắt thì các ngắt còn lại sẽ bị disable. Chú ý thêm việc ưu tiên ngắt, ngắt toàn bộ,.... Tất cả đã có trong datasheet. Nó không chạy sai mà chương trình cho nó là không đúng hjhj
|
thanks các bạn.
chạy ngon lành cành đào rồi :D |
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; } } |
Múi giờ GMT. Hiện tại là 06:01 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam