PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 11-05-2008, 12:19 PM   #1
hanhthien184
Nhập môn đệ tử
 
Tham gia ngày: Oct 2007
Bài gửi: 4
:
Vấn đề ngắt tiếp theo ...

Cũng với chương trình ngắt phía trên:
+Khai báo biến toàn cục:
Code:
 unsigned int ADC_1;
 unsigned int ADC_2;
+Trình phục vụ ngắt:
Code:
void interrupt_int4() org 0x80 {                //When ADS is asserted
           addr_select = PORTA;
           addr_select &= 0x3F;
           if (addr_select == 0)
            {
             LATD = ADC_1;                   //ADC_1
             }
             else if (addr_select == 2)
               {
                LATD = ADC_2;                   //ADC_2
                }
                else
                   {
                    LATD = addr_select;
                   }
           IFS3bits.INT4IF = 0;           //ensure interrupt not pending
       }
Nhưng khi thay đổi giá trị của ADC_1 và ADC_2 trong hàm main()
ví dụ:
Code:
 ADC_1 = 0xAA;
 ADC_2 = 0xBB;
thì LATD không đưa ra giá trị đúng khi có ngắt ngoài INT4.
Vấn đề ở đây là gì ??? Các bác giúp em với
hanhthien184 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2008, 01:05 AM   #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 hanhthien184 View Post
Cũng với chương trình ngắt phía trên:
+Khai báo biến toàn cục:
Code:
 unsigned int ADC_1;
 unsigned int ADC_2;
+Trình phục vụ ngắt:
Code:
void interrupt_int4() org 0x80 {                //When ADS is asserted
           addr_select = PORTA;
           addr_select &= 0x3F;
           if (addr_select == 0)
            {
             LATD = ADC_1;                   //ADC_1
             }
             else if (addr_select == 2)
               {
                LATD = ADC_2;                   //ADC_2
                }
                else
                   {
                    LATD = addr_select;
                   }
           IFS3bits.INT4IF = 0;           //ensure interrupt not pending
       }
Nhưng khi thay đổi giá trị của ADC_1 và ADC_2 trong hàm main()
ví dụ:
Code:
 ADC_1 = 0xAA;
 ADC_2 = 0xBB;
thì LATD không đưa ra giá trị đúng khi có ngắt ngoài INT4.
Vấn đề ở đây là gì ??? Các bác giúp em với
Nếu LATD không hề mang giá trị hợp lý nào trong số ADC_1, ADC_2, và addr_select, thì có nghĩa là trình phục vụ ngắt không được chạy.

Theo tôi thì nên dùng switch case thay cho các if lồng nhau.

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
Old 12-05-2008, 12:04 PM   #3
hanhthien184
Nhập môn đệ tử
 
Tham gia ngày: Oct 2007
Bài gửi: 4
:
Cám ơn anh Nam đã giúp đỡ !!! .Em sẽ nghiên cứu để chuyển sang C30.
Về vấn đề hàm ngắt INT4:
-Ban đầu khi em chưa sử dụng biến ADC_1 và ADC_2 mà đưa luôn giá trị ra PORTD:
Code:
void interrupt_int4() org 0x80 {                //When ADS is asserted
           addr_select = PORTA;
           addr_select &= 0x3F;
           if (addr_select == 0)
            {
             LATD = 0xAA;               
             }
             else if (addr_select == 2)
               {
                LATD = 0xBB;                  
                }
                else
                   {
                    LATD = addr_select;
                   }
           IFS3bits.INT4IF = 0;           //ensure interrupt not pending
       }
thì giá trị đưa ra ở trên PORTD là hợp lý.Nghĩa là ngắt có xảy ra và addr_select là chính xác.
Vấn đề ở đây có lẽ là do cách mình khai báo biến:
Code:
 unsigned int ADC_1;
 unsigned int ADC_2;
Các giá trị ADC_1 và ADC_2 được lấy từ chuyển đổi ADC trên hai kênh(trong hàm main).
1>Liệu có sự thay đổi nào của ADC_1 và ADC_2 khi nhảy vào trong hàm ngắt
2>cách gán giá trị trong hàm ngắt như sau có vấn đề:
Code:
LATD = ADC_1;      
LATD = ADC_2;
Nhờ bác cho ý kiến giúp em...
hanhthien184 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-05-2008, 05:43 AM   #4
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
Ở post #2 bạn đặt các giá trị hằng số vào ADC_1 và ADC_2 và cho biết kết quả không đúng khi có ngắt ngoài, nhưng ở post #4 bạn lại cho biết giá trị của ADC_1 và ADC_2 có được từ việc chuyển đổi A/D. Liệu có khả năng khi bạn thử đặt các giá trị 0xAA và 0xBB vào ADC_1 và ADC_2 thì thao tác chuyển đổi A/D lại ghi các giá trị khác vào ADC_1 và ADC_2 hay không?

Bạn tham khảo ví dụ 5.1 trong tutorial 5 cho dsPIC của tôi. Tôi đã dùng đúng cách mà bạn đang dùng để đọc ngõ vào analog và cập nhật các thanh ghi PDC bằng kết quả chuyển đổi A/D. Tôi cũng dùng biến unsigned int, và không hề có điều gì bất thường xảy ra.

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
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:25 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam