PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Lỗi về Interupt, các anh giúp em với (http://www.picvietnam.com/forum/showthread.php?t=714)

chipchipvn 03-11-2006 07:39 PM

Lỗi về Interupt, các anh giúp em với
 
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)
Code:

        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

1 Attachment(s)
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

2 Attachment(s)
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

1 Attachment(s)
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
Code:

;========================================
        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


Múi giờ GMT. Hiện tại là 05:22 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