PDA

View Full Version : Lỗi về Interupt, các anh giúp em với


chipchipvn
03-11-2006, 07:39 PM
Em viết một cái code rất đơn giản để làm quen với Interupt nhưng sao không biết cái Proteus lại chẳng thực hiện được! T_T, ấn nút mỏi tay mà đèn hông sáng! Các anh xem hộ em với
Em không post phàn khai báo, chỉ có phần chạy thui ^^
Còn đây là ảnh của phần giả lập Proteus
http://s23.quicksharing.com/v/500147/TESTLED.GIF.html (namqn: Link không hoạt động)

ORG 00
Goto Main
ORG 04
Goto LED
Main
bsf INTCON,GIE
bsf INTCON,INTE
banksel TRISB
bsf TRISB,0
bcf TRISB,1
bcf TRISB,2
banksel PORTB
bcf PORTB,0
Goto $
;================================================= =========
LED
bcf PORTB,2
bsf PORTB,2
movwf _work ; Save W in Bank0 or Bank1
btfsc STATUS,RP0 ; Check which bank PIC is in
goto IN_BANK0 ; IF == 0 THEN already in Bank0
; Continue here if PIC is in Bank1 on entry
bcf STATUS,RP0 ; Change into Bank0
swapf STATUS,w ; Save STATUS in Bank0
movwf _status ; in the usual way
bsf _status,RP0 ; Set back saved RP0 in memory
goto INVERT ; and begin the core code
IN_BANK0
swapf STATUS,w ; If already in Bank0
movwf _status ; save STATUS in the usual way
;================================================= ===========
INVERT
bcf INTCON,INTF
movf PORTB,w
xorlw b'00000010'
movwf PORTB
;================================================= ============
; Restore context. Processor in Bank0
swapf _status,w ; Untwist & get old Status from memory
movwf STATUS ; which also restores original bank
swapf _work,f ; Now get original W register from
swapf _work,w ; interrupted bank
retfie ; and return to interrupted background
end

namqn
03-11-2006, 09:06 PM
Kiểm tra lại cách mô phỏng trong Proteus, post lại sơ đồ mạch mô phỏng, tham khảo thêm ví dụ Doorbell của Proteus.

Thân,

chipchipvn
04-11-2006, 04:03 PM
Cảm ơn anh Nam, em đã đính kèm file ảnh!anh giúp hộ em với!

namqn
04-11-2006, 09:22 PM
Khi nhấn nút và thả ra, sẽ có cả 2 cạnh lên và xuống, do đó không cần cổng NOT ở đây. Một bạn nào đó (có lẽ là MoH) đã nhắc là khi nối LED với các ngõ ra của PIC thì phải thêm vào một điện trở khoảng vài trăm ôm giữa chân PIC và LED thì LED mới sáng. Cũng nên chú ý cực tính của LED.

Thân,

chipchipvn
04-11-2006, 10:15 PM
Anh Nam ơi! Em đã mắc thêm R200 vào LED nhưng mà nó vẫn không sáng anh ạ. Còn cái NOT thì quả là không cần nhưng khi có NOT thì em thấy trên Simulation mới xuất hiện mấy cái nút xanh đỏ khi RUN, còn nếu không có NOT thì chả có gì cả! Em kèm theo 2 cái hình mạch đã sửa! Anh xem hộ em lại phàn CODE với, do em mới làm quen với Interupt à, nên không biết có sơ sót gì không!
Cảm ơn anh

MHz
05-11-2006, 01:14 PM
... khi dùng Proteus để mô phỏng mà bác dùng con LED theo sơ đồ đính kèm nó không phát sáng được đâu... bác dùng LED-YELLOW á... :D

namqn
05-11-2006, 06:44 PM
Không nhất thiết phải dùng màu vàng, nhưng phải dùng LED thuộc loại Animated LED model (thuộc thư viện Active chứ không phải thư viện Device) thì mới hiển thị được.

Thân,

chipchipvn
05-11-2006, 07:12 PM
Cảm ơn anh Nam và Mhz, em đã thay đèn LED bằng Led-green (ACTIVE) nhưng nó vẫn không sáng! Mong các anh xem lại hộ em cái code với! chắc là nó có vấn đề gì đó! Nhân tiện xin các anh cho em hỏi làm sao debug trong Proteus ạ, em không biết Debug Interupt trong MPLAB mà qua Proteus cũng không bít sai chỗ nào để mà sửa lun!
Thân

MHz
05-11-2006, 08:24 PM
Thật ra chương trình của bác viết không có gì sai, chỉ thừa một vài lệnh,
dựa vào chương trình của bác tui có Edit lại chút đỉnh, và đã dùng proteus mô phỏng OK... bác thử lại xem... :D

;========================================
TITLE "TESTLED"
PROCESSOR PIC16f877a
INCLUDE <P16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

;================================================= ============================
; KHAI BAO BIEN
;**************
_work equ 0x20
_status equ 0x21

;================================================= =====================================

ORG 0x00
Goto Main
ORG 0x04
Goto LED
Main
bsf INTCON,GIE
bsf INTCON,INTE
banksel TRISB
bsf TRISB,0
bcf TRISB,1

banksel PORTB
bcf PORTB,0
Goto $
;================================================= =========
LED


movwf _work ; Save W in Bank0 or Bank1
btfsc STATUS,RP0 ; Check which bank PIC is in
goto IN_BANK0 ; IF == 0 THEN already in Bank0
; Continue here if PIC is in Bank1 on entry
bcf STATUS,RP0 ; Change into Bank0
swapf STATUS,w ; Save STATUS in Bank0
movwf _status ; in the usual way
bsf _status,RP0 ; Set back saved RP0 in memory
goto INVERT ; and begin the core code
IN_BANK0
swapf STATUS,w ; If already in Bank0
movwf _status ; save STATUS in the usual way
;================================================= ===========
INVERT
bcf INTCON,INTF
movf PORTB,w
xorlw b'00000010'
movwf PORTB
;================================================= ============
; Restore context. Processor in Bank0
swapf _status,w ; Untwist & get old Status from memory
movwf STATUS ; which also restores original bank
swapf _work,f ; Now get original W register from
swapf _work,w ; interrupted bank
retfie ; and return to interrupted background
end

chipchipvn
05-11-2006, 11:43 PM
hà! Cảm ơn bác Mhz, cuối cùng đã giải quyết xong chuỵen này!

giaosucan
19-01-2007, 02:25 PM
tốt nhất bạn nên làm trên mạch thật thì trực quan hơn ,mô phỏng đôi khi ko đúgn