![]() |
Lỗi không ngắt được trong CCS
Mình viết Ct điều khiển động cơ bước từ máy tính. Cụ thể là điều khiển 1 mâm quay, trên hành trình mâm có công tắc giới hạn, nối vào portB. Cấu trúc ct như sau:
- Phần khai báo biến, mức ưu tiên, RS232... - Các hàm phát xung cho động cơ (dùng delay_us trong CCS). - Hàm phục vụ ngắt nối tiếp (INT_RDA): báo ngắt khi có kí tự gởi xuống, ứng với mỗi kí tự thì gọi hàm phát xung tương ứng - Hàm phục vụ ngắt PortB (INT_RB): khi công tắc báo ngắt thì gọi hàm phát xung. Ý định của mình là khi gửi kí tự A chẳng hạn, hàm ngắt RDA cho mâm quay trái, gặp công tắc thì hàm ngắt RB cho dừng, delay 1s rồi quay ngược lại 1 góc nào đó. Mình đã test thử từng phần riêng, là gửi A thì mâm quay trái tốt, tác động bằng tay lên công tắc thì mâm quay ngược lại tốt, nghĩa là đáp ứng ngắt tốt. Nhưng khi đang quay trái mà gặp công tắc thì không ngắt được. phải đến khi thực hiện hết quay trái của ngắt RDA, nếu t/h ngắt RB còn thì nó mới thực hiện ngắt RB. Lưu ý là mình đã đặt mức ưu tiên ngắt RB cao hơn RDA rồi. Ở đây mình phán đoán nó bị lỗi như giống như trường hợp cảnh báo "Warning 216 : Interrupts disable during call to prevent re_entrancy:tên hàm" lỗi này hình như là 1 ngắt có dùng các hàm delay_us, delay_ms mà ở ngoài cũng có 1 hàm delay này đang chạy thì ngắt sẽ bị disable? Đây là link trên CCSInfo, do trình độ AV có hạn nên mình ko hiểu nhiều lắm: http://www.ccsinfo.com/forum/viewtop...er=asc&start=0 Trường hợp của mình là đều dùng Delay_us trong cả 2 ngắt. Mình chỉ là newbie với PIC, ai có kinh nghiệm có thể giúp mình khắc phục không? |
Bạn có thể post code lên được không, có thể sẽ dễ giải quyết vấn đề hơn, chú ý là ngắt INT_RB là ngắt on change, xử lý không tốt ở đây cũng nảy sinh vấn đề rồi.
|
Ct của mình dùng đk 1 tay máy 3 trục dùng 3 đcơ bước nên nó dài dòng quá, ban đầu post lên sợ ko ai đọc.
Mình tóm tắt là có 3 motor bước, mỗi cái quay 1 trục, trên hành trình có gắn 3 ctắc để set vị trí home, ctắc nối vào chân ngắt của RB. Giao tiếp RS232 báo ngắt khi bộ đệm nhận dữ liệu đầy. Hoạt động: gửi 1 kí tự xuống PIC thì ngắt nối tiếp RDA gọi hàm quay động cơ tương ứng. Gửi kí tự "O" thì ngắt RDA đk 3 trục về vtrí home, bằng cách là khi mỗi trục gặp ctắc, hàm ngắt RB đặt mức ưu tiên cao hơn sẽ ngắt hàm RDA, cho dừng và quay 3 trục về home. Vấn đề ở đây là ngắt RB ko ngắt đc hàm RDA đang thực thi, nên 3 động cơ không dừng như mong muốn. Nếu ngắt RDA ko chạy thì ngắt RB vẫn hoạt động tốt. Mình cũng thử là cho RB ngắt khi chạy phát xung ngoài hàm main, thì vẫn ko ngắt đc. Trình dịch cảnh báo Warning 216 như mình nói. đây là code, mọi ngừoi chịu khó xem giúp mình: Code:
#include <16F877A.h> |
Trích:
PHP Code:
PHP Code:
|
Trích:
Trích:
|
Trích:
PHP Code:
|
code trên không sai nhưng ccsc sai mấy ông mở cái set 16f877a.h ra và coi có set đúng
hay khong tôi từng bị cái này với 16f887.h rồi hầu như ngát RB sai cả sửa lai code theo 16f877a.h thì ok, => phien bản của các cong cụ lạp trình cấp cao chưa chăc hoản toàn đúng ==> khong tin thì sài 16f887 bien dịch mọi phien bản ccsc khác nhau = không chạy RB nếu khong sủa lại 16f887.h |
mình đang gặp lỗi tương tự như trên. Không thể dùng ngắt rb và Rda trong cùng chương trình. Khi bỏ hoàn toàn ngắt rb thì chương trình chạy bình thường, còn khi thêm vào thì lại không chạy được. Ai đã giải quyết được vấn đề này xin giúp đỡ mình
|
mình dùng ngắt và hàm delay cùng lúc không được. mình lập trình bằng CCS
dùng ngắt timer.Khi có cả delay và timer thì chỉ có "ngắt" chạy còn delay thì hoạt đông không chính xác. Delay_ms(2000) mà đợi tới cả chục giây mới có. Bạn nào biết nguyên nhân không và xin cho cách khắc phục vấn đề trên ( mình muốn dùng cả 2 delay và ngắt timer ). Thanks |
Mình cũng đang viết 1 chương trình điều khiển động cơ 1 chiều, dữ liệu được nhập từ máy tính. Trong chương trình có dùng 3 ngắt là RDA, RB0 và ngắt của timer1 để tạo chu kỳ trích mẫu.
Có điều đáng nói là khi chạy thì chương trình thường bị treo sau khoảng 1-2s. Mình nghĩ là có xung đột về ngắt nên đã disable ngắt RDA sau khi nhận được dữ liệu từ máy tính. Và quả thật sau khi disable thì chương trình chạy ngon. Tuy nhiên, khi đang chạy mà muốn truyền thêm dữ liệu từ PC xuống để thay đổi các thông số thì lại ko được (Vì đã disable ngắt RDA). Mình đã thử nhiều cách nhưng vẫn không thay đổi được gì. Mong mọi người cho ý kiến để cải thiện chương trình của mình. Thanks. Sau đây là chương trình của mình: Code:
#include <16f877a.h> |
Trích:
|
lỗi dòng portb=0; là lỗi j zây mọi người, sữa sao được đây
#INCLUDE<16F877A.H> #FUSES HS,NOWDT,NOPROTECT,NOLVP #USE DELAY(CLOCK=40000000) #use fast_io(b) #byte port=0x06 int8 sck,slx,bx,bl,gt; void main() { set_tris_b(0); while(true) { sck=8; bl=0; portb=(0); delay_ms(1000); while(sck>0) { bx=1; slx=sck; while(slx>0) { gt=bl|bx; portb=gt; delay_ms(1000); bx=bx<<1; slx--; } bl=gt; sck--; } } } |
Múi giờ GMT. Hiện tại là 12:34 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam