Trích:
Nguyên văn bởi bazooka2006
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