PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Chương trình dịch & các công cụ mô phỏng (http://www.picvietnam.com/forum/forumdisplay.php?f=10)
-   -   Không thể mô phỏng chính xác bằng Proteus 7.2 (http://www.picvietnam.com/forum/showthread.php?t=2575)

sirbill 07-07-2008 06:57 PM

Không thể mô phỏng chính xác bằng Proteus 7.2
 
1 Attachment(s)
Chào các anh. Em dùng Proteus 7.2 SP6 mô phỏng mạch test 16F887, dùng đoạn code sau để chạy PIC nhưng khi chạy lại không đúng như yêu cầu:
INCLUDE <P16F887.inc>
;--------------------------------------------------------------
ORG 0X0000
GOTO MAIN

ORG 0X0005
MAIN
BANKSEL TRISB
MOVLW D'00000000'
MOVWF TRISB
BANKSEL PORTB
MOVLW D'10000011'
MOVWF PORTB
GOTO $
END
Nếu đúng như đoạn code trên thì các chân RB0,1,7 sẽ sáng tuy nhiên khi cho chạy mạch thì chân RB0,1,3,7 lại sáng, dù đã set chân RB3 mức thấp. Mong các anh chỉ giúp em. Mạch mô phỏng trong Proteus em gửi theo file đính kèm.

namqn 07-07-2008 08:53 PM

Trích:

Nguyên văn bởi sirbill (Post 17285)
Chào các anh. Em dùng Proteus 7.2 SP6 mô phỏng mạch test 16F887, dùng đoạn code sau để chạy PIC nhưng khi chạy lại không đúng như yêu cầu:
INCLUDE <P16F887.inc>
;--------------------------------------------------------------
ORG 0X0000
GOTO MAIN

ORG 0X0005
MAIN
BANKSEL TRISB
MOVLW D'00000000'
MOVWF TRISB
BANKSEL PORTB
MOVLW D'10000011'
MOVWF PORTB
GOTO $
END
Nếu đúng như đoạn code trên thì các chân RB0,1,7 sẽ sáng tuy nhiên khi cho chạy mạch thì chân RB0,1,3,7 lại sáng, dù đã set chân RB3 mức thấp. Mong các anh chỉ giúp em. Mạch mô phỏng trong Proteus em gửi theo file đính kèm.

Không rõ bạn cấu hình chip ra sao khi viết code. Chân RB3 sẽ không chịu ảnh hưởng của TRISB nếu bạn bật bit LVP trong từ cấu hình của PIC16F887. Bạn cũng nên xóa thanh ghi ANSELH.

Thân,

tallht 07-07-2008 11:21 PM

Ban Cần Thêm Các Câu Lệnh để Set Các Coniguration Bit Trong Css C.trong Tài Liệu Chỉ Dẫn Của Bác Falleaf Có Mà Bro! Chúc Vui!

Configuration Bit.mình Viết Sai,xin đính Chính Lại

namqn: Bạn sirbill đang viết code hợp ngữ, còn bạn đề cập đến CCS C.

sirbill 07-07-2008 11:44 PM

Trích:

Nguyên văn bởi namqn (Post 17287)
Không rõ bạn cấu hình chip ra sao khi viết code. Chân RB3 sẽ không chịu ảnh hưởng của TRISB nếu bạn bật bit LVP trong từ cấu hình của PIC16F887. Bạn cũng nên xóa thanh ghi ANSELH.

Thân,

Anh có thể hướng dẫn rõ thêm cho em được không, em mới học nên chưa biết được nhiều. Cụ thể nếu theo đoạn code em ghi, thì chỉ có chân RB0,1,7 sẽ sáng còn các chân còn lại không sáng, nhưng khi chạy thì có thêm chân RB3 sáng( em không hiểu chỗ này). Cấu hình chip có phải là __CONFIG không anh, em không có khai báo phần đó, tuy nhiên em đã thử thêm vào __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC THÌ BỊ BÁO LỖI NHƯ SAU:Error[126] E:\TAI LIEU\PIC\SAVED FILE\MACH THU.ASM 2 : Argument out of range (not a valid config register address). Mong anh chỉ giúp.

namqn 08-07-2008 01:19 AM

Ví dụ về khai báo cấu hình cho PIC16F887:
Code:

        __CONFIG        _CONFIG1        _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
        __CONFIG        _CONFIG2        _WRT_OFF & _BOR21V

Bạn điều chỉnh lại cho thích hợp với ý định của bạn.

Thân,

dark_electron 21-07-2008 05:39 PM

Proteus ko mô phỏng được ngắt? Hay chương trình viết sai?
 
Hi các bác,
Em có viết đoạn chương trình sau để quét 4 con LED, thực tế em lắp mạch và chạy được rồi tuy nhiên khi mô phỏng bằng Proteus 7.2sp6 thì chương trình báo stack underflow, chạy được vài ngắt rồi đứng yên không chịu chạy nữa. Code như dưới đây:
Code:

        list      p=16f628A          ; list directive to define processor
        #include <p16F628A.inc>      ; processor specific variable definitions

        errorlevel  -302              ; suppress message 302 from list file

        __CONFIG  _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT

;**********************************************************************
;***** CONSTANTS DEFINITIONS WRITTEN HERE
        w_temp                EQU    0x7D        ; variable used for context saving
        status_temp          EQU    0x7E        ; variable used for context saving
        pclath_temp          EQU    0x7F                ; variable used for context saving

        LED_CTRL_TRIS        EQU                TRISA
        LED_CTRL_PORT        EQU                PORTA                ; dat PORTA la cung la PORT co chan dieu khien quet LED
        LED1                        EQU                0                        ; dat chan RA0 dieu khien LED1
        LED2                        EQU                1
        LED3                        EQU                2
        LED4                        EQU                3
       
        LED_DATA_TRIS        EQU        TRISB
        LED_DATA_PORT        EQU                PORTB                ; dat PORTB la PORT cap data cho LED

;***** VARIABLES DEFINITIONS WRITTEN HERE
        ORG                        0x20                                ;start of general purpose registers
;***** VARIABLES FOR MAIN PROG
        LED_COUNT                RES                1                        ; counter for selecting of LED to send data to
        LED4_DATA                RES                1                        ; LED data register
        LED3_DATA                RES                1
        LED2_DATA                RES                1
        LED1_DATA                RES                1
;**********************************************************************
        ORG                            0x000                    ; processor reset vector
        goto                    BEGIN                          ; go to beginning of program
        ORG                            0x0004
        goto                        INTERRUPT
        ORG                    0x0005                    ; interrupt vector location

;**********************************************************************
;*****        MAIN PROGRAM GOES HERE
BEGIN       
        movlw                        0x07
        movwf                        CMCON                                ;turn comparators off

Initialise       
        clrf                        PORTA
        clrf                        PORTB       
        clrf                        INTCON                                ; disable all Interrupt sources and some Interrupt Flags
SetPorts       
        bsf                        STATUS,                RP0                       
        movlw                        0x00                                ; dat cac chan cap DATA cho LED la chan Out
        movwf                        LED_DATA_TRIS
       
        movlw                        0x00                                ; cac chan dieu khien LED la Out
        movwf                        LED_CTRL_TRIS
        bcf                        STATUS,                RP0                       

Main
;****** ENABLE TIMER0 INTERRUPT
        movlw                        b'10100000'               
        movwf                        INTCON                                  ; Enable General Interrupt and Timer0 Interrupt
        bsf                        STATUS, RP0                  ; select bank 1       
        movlw                        b'11000011'               
        movwf                        OPTION_REG                        ; Initialise Timer0 with 1:16 prescaler
        bcf                        STATUS, RP0                  ; select bank 0       
;*****
        movlw                        b'10111111'                        ; so 0
        movwf                        LED4_DATA                        ; set LED data register number 0
        movlw                  b'10000110'                        ; so 1
        movwf                        LED3_DATA                       
          movlw                  b'11011011'                        ; so 2
        movwf                        LED2_DATA
        movlw                  b'11001111'                        ; so 3
        movwf                        LED1_DATA

        clrf                        LED_COUNT
        goto                        $

;**********************************************************************
;***** INTERRUPT SUB-ROUTINES WRITTEN HERE
INTERRUPT
        movwf                  w_temp                                    ; save off current W register contents
        movf                        STATUS,                W                          ; move STATUS register into W register
        movwf                        status_temp                              ; save off contents of STATUS register
        movf                        PCLATH,                W                            ; move PCLATH register into W register
        movwf                        pclath_temp                              ; save off contents of PCLATH register
;*****
        clrf                        STATUS                                                ; Chon bank 0
        btfsc                        INTCON,        T0IF                        ; Ngat tran timer0 da xay ra chua?
        goto                        T0_INT                               
INT_ERROR                                               
        goto                        END_ISR                         
T0_INT                                                                                        ; Xu ly ngat tran timer0
LED4_OUT       
        bcf                                LED_CTRL_PORT,        LED1
        clrf                        LED_DATA_PORT

        movf                        LED_COUNT,        W
        xorlw                        d'0'
        btfss                        STATUS,                Z                                ; kiem tra xem co dung thu tu LED4 ko?
        goto                        LED3_OUT                                        ; neu ko dung thi qua quet LED3
        movf                        LED4_DATA,        W                                ; neu dung thi quet LED4
        movwf                        LED_DATA_PORT                                ; send DATA to LED4 (pin RA3 of PORTA)
        bsf                                LED_CTRL_PORT,        LED4
        incf                        LED_COUNT,        F
        goto                        END_ISR

LED3_OUT
        bcf                                LED_CTRL_PORT,        LED4                ; tat LED4
        clrf                        LED_DATA_PORT                                ; xoa data
       
        movf                        LED_COUNT,        W
        xorlw                        d'1'
        btfss                        STATUS,                Z
        goto                        LED2_OUT
        movf                        LED3_DATA,        W
        movwf                        LED_DATA_PORT                                ; send DATA to LED3 (pin RA2 of PORTA)
        bsf                                LED_CTRL_PORT,        LED3
        incf                        LED_COUNT,        F
        goto                        END_ISR
                       
LED2_OUT
        bcf                                LED_CTRL_PORT,        LED3
        clrf                        LED_DATA_PORT
       
        movf                        LED_COUNT,        W
        xorlw                        d'2'
        btfss                        STATUS,                Z
        goto                        LED1_OUT
        movf                        LED2_DATA,        W
        movwf                        LED_DATA_PORT                                ; send DATA to LED2 (pin RA1 of PORTA)
        bsf                                LED_CTRL_PORT,        LED2
        incf                        LED_COUNT,        F
        goto                        END_ISR

LED1_OUT
        bcf                                LED_CTRL_PORT,        LED2
        clrf                        LED_DATA_PORT

        movf                        LED_COUNT,        W
        xorlw                        d'3'
        btfss                        STATUS,                Z
        goto                        END_ISR
        movf                        LED1_DATA,        W
        movwf                        LED_DATA_PORT                                ; send DATA to LED2 (pin RA0 of PORTA)
        bsf                                LED_CTRL_PORT,        LED1
        clrf                        LED_COUNT                                        ; reset LED counter
        goto                        END_ISR

END_ISR
        bcf                        INTCON, T0IF                                ; Xoa co ngat tran timer0
;*****
        movf                    pclath_temp,        w                    ; retrieve copy of PCLATH register
        movwf                        PCLATH                                    ; restore pre-isr PCLATH register contents
        movf                    status_temp,        w                    ; retrieve copy of STATUS register
        movwf                        STATUS                                    ; restore pre-isr STATUS register contents
        swapf                  w_temp,                        f
        swapf                  w_temp,                        w                  ; restore pre-isr W register contents
                                       
        Retfie                                                                                ; Return from Interrupt

;**********************************************************************
        END                                      ; directive 'end of program'

Như vậy là proteus ko hỗ trợ ngắt cho PIC16 hở các bác? Hay là chương trình em viết sai? Nếu sai thì sai chỗ nào các bác chỉ dùm em với. Thanks.


Múi giờ GMT. Hiện tại là 02:12 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam