View Single Post
Old 31-10-2007, 05:40 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi sandro_bk View Post
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn