View Single Post
Old 21-08-2008, 03:29 PM   #6
phamminhtuan
Super Moderator
 
phamminhtuan's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 150
:
Trích:
Nguyên văn bởi bazooka2006 View Post
Cám ơn bạn minhtuan, quả thực trong datasheet 16f87xA ko hề nhắc đến điều này, mình nhầm to chỗ này rồi.
  • Một câu hỏi đặt ra là ngay khi thực hiện ngắt 1, có thể tự set bit GIE lên 1 để nhận các ngắt khác không?
  • Thứ 2 là vấn đề của mình vẫn chưa giải quyết được. Như mình đã nói, mình đã test thử là thay vì cho chạy đcơ trong ngắt RDA, thì mình đưa đoạn đó ra ngoài main(), trong ngắt RDA chỉ set 1 bit cờ rồi thoát. Hàm main sẽ lặp vòng hỏi cờ này, nếu thấy =1 thì cho chạy đcơ. Và, khi đoạn này đang chạy, nếu ctắc báo ngắt RB, vẫn ko thể dừng được, nghĩa là ko thực thi ngắt RB được. Chỉ khi hàm quay đcơ này chạy xong, nếu ngắt RB còn, hay mình tự tác động thì nó ngắt tốt.
  • Và nếu đưa đoạn ct quay đcơ ra ngoài main như trên, thì CCS báo "Warning 216 : Interrupt disable..." như đã nói.
    Có lẽ việc dùng delay_ms/us trong các ISR khi ở ngoài cũng có hàm này đang chạy sẽ thực sự gây bug là disable các ISR chăng?
  • Dĩ nhiên, nếu bạn cứ set GIE lên, thì ngắt tiếp theo sẽ xảy ra trong khi đang thực thi ngắt cũ, và các giá trị mà CCS lưu lại sẽ bị đè lên bởi cái mới, giá trị con trỏ chương trình lưu lại chính là cái nơi xảy ra ngắt sau, thế nên chắc chắn 1 điều là chương trình của bạn chỉ có thể trở về tại vị trí nằm trong chương trình xử lý ngắt cũ(tại nơi xảy ra ngắt mới), và không thể trở về tại chương trình chính.
  • Việc bạn xác định ngắt RB không xảy ra trong khi động cơ đang quay bạn cần kiểm chứng bằng LED chẳng hạn
  • Còn hàm delay, bạn dịch thử 1 đoạn có delay, xem file list thì thấy rõ ngay, ví dụ bạn xem sau đây nhé, nó chỉ là những dòng lệnh bình thường như bao dòng lệnh khác thôi, chẳng tác động gì tới ngắt cả, thế nên, delay ở đâu cũng thế cả, có ngắt thì phục vụ ngắt.
PHP Code:
.................... #use delay(clock=4Mhz) 

0053:  MOVLW  29
0054
:  MOVWF  04
0055
:  BCF    03.7
0056
:  MOVF   00,W
0057
:  BTFSC  03.2
0058:  GOTO   067
0059:  MOVLW  01
005A
:  MOVWF  78
005B
:  CLRF   77
005C
:  DECFSZ 77,F
005D
:  GOTO   05C
005E
:  DECFSZ 78,F
005F
:  GOTO   05B
0060
:  MOVLW  4A
0061
:  MOVWF  77
0062
:  DECFSZ 77,F
0063
:  GOTO   062
0064
:  GOTO   065
0065
:  DECFSZ 00,F
0066
:  GOTO   059
0067:  BCF    0A.3
0068:  BCF    0A.4
0069:  GOTO   087 (RETURN)
//và
....................    delay_ms(1000); 
0082:  
MOVLW  04
0083:  MOVWF  28
0084:  MOVLW  FA
0085:  MOVWF  29
0086:  GOTO   053
0087:  DECFSZ 28,F
0088:  GOTO   084 
Bạn thấy rõ, CCS C sẽ tính toán các giá trị nạp vào các ô nhớ RAM ở địa chỉ 28 và 29, sau đó nhảy tới chương trình delay ở địa chỉ 53 để thực thi hàm delay, đến khi thực thi xong, thì lại nhảy 87, làm cho xong hết thì ra khỏi delay, bạn thấy đấy, delay chẳng liên quan gì đến xử lý ngắt cả. Bạn hãy viết các chương trình đơn giản hơn để kiểm nghiệm
phamminhtuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn