Trích:
Nguyên văn bởi sandro_bk
tôi mới tập viết chương trình bằng C30,đang làm về ngắt,tôi thấy bác Nam viết chương trình mẩu có xài ngắt timer1,ngắt ADC nhưng tôi dịch thử mấy file này thì chương trình nó warning là
PSV model not specified for '_ADCInterrupt' đối với ngắt ADC,mấy cái ngắt này khai báo ở đâu và làm sao chương trình nó biết chương trình con này "void _ISR _ADCInterrupt(void)" là phục vụ ngắt ADC,tiện đây cho hỏi chưong trình con phục vụ ngắt PWM là "void _ISR _PWMInterrupt(void)" phải ko? trong chương trình tôi đã add đủ 30f4011.h và 30f4011.gld
|
- Về PSV, các phiên bản 3.x về sau của C30 đã bổ sung thêm thuộc tính liên quan đến PSV cho dẫn hướng liên quan đến khai báo ngắt. Do đó, lấy ví dụ khai báo ngắt Timer 1 trong tập tin 'Vidu2-1.c' của tôi là
Code:
void _ISR _T1Interrupt(void)
cần được chuyển thành
Code:
void _ISR_PSV _T1Interrupt(void)
_ISR đã được định nghĩa sẵn trong C30, còn _ISR_PSV được tôi định nghĩa như sau:
Code:
#define _ISR_PSV __attribute__((interrupt, auto_psv))
- Về việc làm sao trình biên dịch biết chương trình con nào trình phục vụ ngắt cho ngắt gì, bạn mở tập tin '30f4011.gld', và kéo xuống đến phần 'Primary Interrupt Vector Table', bạn sẽ thấy các tên được định nghĩa sẵn (quy ước trước) cho các trình phục vụ ngắt.
- Chẳng hạn, ngắt cho PWM nên được đặt tên là '_PWMInterrupt'. Và bạn định nghĩa nó theo cú pháp mới mà tôi đã nói ở trên, nếu bạn đang dùng C30 phiên bản 3.x trở lên, nghĩa là
Code:
void _ISR_PSV _T1Interrupt(void)
với _ISR_PSV được định nghĩa như trên trong code của bạn.
Thân,