• ext_int_edge Enables the edge on which • ext_int_edge Enables the edge on which the edge interrupt should trigger.. • clear_interrupt This function will clear the specified interrupt f
Trang 1TR ƯỜ NG ðẠ I H Ọ C KHOA H Ọ C T Ự NHIÊN
TR ƯỜ NG ðẠ I H Ọ C KHOA H Ọ C T Ự NHIÊN
Trang 5Ng ắ t 1 c ấ p…
xác ñịnh cờ ngắt cần phục vụ, nó sẽ thực thi
xoá cờ ngắt ñó
5
Trang 6Ng ắ t 2 c ấ p
cao ( high priority )
Trang 9• #INT_RB : b ấ t k ỳ thay ñổ i nào trên chân B4 ñế n B7
• #INT_RC : b ấ t k ỳ thay ñổ i nào trên chân C4 ñế n C7
Trang 10• ext_int_edge() Enables the edge on which
• ext_int_edge() Enables the edge on which the edge interrupt should trigger This can be either rising or falling edge
• clear_interrupt() This function will clear the specified interrupt flag This can be used if a
global isr is used, or to prevent an interrupt from
being serviced
Trang 11• ðể cho phép ngắt ñó hoạt ñộng phải dùng lệnh enable_interrupts ( int_xxxx) và enable_interrupts ( global )
18 và dsPIC
11
Trang 12enable_interrupts ( level )
• level là tên các ng ắ t ñ ã cho ở trên hay là GLOBAL ñể
cho phép ng ắ t ở c ấ p toàn c ụ c
• M ọ i ng ắ t c ủ a VDK ñề u có 1 bit c ờ ng ắ t, 1 bit cho phép
ng ắ t Khi có ng ắ t thì bit c ờ ng ắ t b ị set =1, nh ư ng ng ắ t có
h ọ at ñộ ng ñượ c hay không tu ỳ thu ộ c bit cho phép ng ắ t enable_interrupts (int_xxx ) s ẽ b ậ t bit cho phép ng ắ t
enable_interrupts (int_xxx ) s ẽ b ậ t bit cho phép ng ắ t
Nh ư ng t ấ t c ả các ng ắ t ñề u không th ể th ự c thi n ế u bit cho phép ng ắ t toàn c ụ c = 0
VD : ñể cho phép ng ắ t timer0 và timer1 ho ạ t ñộ ng:
enable_interrupts (int_timer0);
enable_interrupts (int_timer1 ) ;
enable_interrupts ( global ); // ch ỉ c ầ n dùng 1 l ầ n tr ừ
//phi mu ố n có thay ñổ i ñặ c bi ệ t
Trang 14clear_interupt ( level )
• level không có GLOBAL
• Hàm này xoá c ờ ng ắ t c ủ a ng ắ t ñượ c ch ỉ
ñị nh b ở i level
Trang 15ext_int_edge ( source , edge )
EXT nên source = 0
15
Trang 16Relevant Interrupts:
function should be called if an interrupt is triggered but no routine is associated with that interrupt
• #int_global This directive specifies that the following function should be called whenever an interrupt is triggered This function will replace the compiler generated interrupt dispatcher
• #int_xxx This directive specifies that the following
function should be called whenever the xxx interrupt is
triggered If the compiler generated interrupt dispatcher is used, the compiler will take care of clearing the interrupt flag bits
Trang 17VD: Chương trình đọc dữ liệu từ port b xuất ra port D khi có sự thay đổi từ RB4 – RB7
Trang 18VD: Vi ế t ch ươ ng trình ñế m nh ị phân và khi có s ự thay ñổ i t ừ RB4 ñế n RB7 thì m ạ ch ñế m
Trang 19VD: Vi ế t ch ươ ng trình ñế m nh ị phân và khi RB0 chuy ể n t ừ cao xu ố ng th ấ p thì m ạ ch ñế m s ẽ reset
Trang 20VD: Chương trình thực hiện công việc sau:
- Đọc dữ liệu từ port B xuất ra port D khi có sự thay đổi từ bit RB4-RB7
- Nếu bit RB0 = 0 xuất ra port C=0x0f ngược lại thực hiện mạch đếm
set_tris_d(0x00);
set_tris_c(0x00);
enable_interrupts(INT_RB); enable_interrupts(GLOBAL); portc=0;
if(id ==0) portc=0x0f;
else { portc +=1;
delay_ms(2000);
} } }
Trang 21VD: Ch ươ ng trình nh ậ n d ữ li ệ u t ừ c ổ ng COM hi ể n th ị lên port B và d ị ch Led ở port D
Trang 22set_tris_d(0x00);
set_tris_c(0x00);
enable_interrupts(INT_AD); enable_interrupts(GLOBAL);
portd=0;
while(true) {
portd=read_adc();
delay_ms(2000);
} }
Trang 24• It is very easy to make a digital counter using flip-flops Counters can be made which count
up, count down, which can be cleared back to zero, pre-loaded to a certain value, and which
by the provision of an overflow output can be cascaded with other counters.
Trang 25A digital counter made of eight
flip-flops
25
Trang 26The counter as timer
Trang 27Timer 0 module
27
Trang 28• The internal clock is approximately 800 kHz and the instruction cycle rate (Fosc/4) is therefore200 kHz, or
a period of 5 µs Now with this clock frequency,
Timer 0 would count up to its maximum value (255)
in 255 × 5 µs, or 1275 µs, and would overflow on the next cycle, i.e after 1280 µs
• We can, however, make use of the prescaler here If the incoming signal is divided by 4 (i.e PS2, PS1, PS0 set to 001), then Timer 0 will overflow after 256 × 4 ×
5 µs, or 5.120ms
Trang 29• setup_timer_0(mode)
– Sets the source, prescale etc for timer0
• set_timer0(value) or set_rtcc(value)
- Initializes the timer0 clock/counter Value may be a 8 bit or 16 bit
depending on the device.
• value=get_timer0
– Returns the value of the timer0 clo c k/counter
29
Trang 30Relevant Interrupts :
- Interrupt fires when timer0 overflows
Trang 33V ớ i TOV là th ờ i gian tràn
B4: Giá tr ị n ạ p Timer=256-n
33
Trang 35set_tris_d(0x00);
setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_BIT); set_timer0(131);
} }