16f877 ac problem

Status
Not open for further replies.

hani_elashry

New Member
i have pic 16f877a finally my program succed
i build a analog to digital converter to measure 4 to 20mA signal on 250 ohm resistor it works good but some times it reset it self i dont know why
i want help plz.
 
Hi,

Crystal ball broken,

He meant that he could not help you until he could see your circuit diagram and program code to try and establish where the problem is.
 
how can i add image
Code:
LIST P=16F877,W=-302 
#INCLUDE <P16F877A.INC>

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_ON & _WRT_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
        
        ram0    equ    14        ; EMPETY RAM0 SLOT            
        ram1    equ    15        ; EMPETY RAM1 SLOT
        ram2    equ    16        ; EMPETY RAM2 SLOT
        cnt500u equ    17        ; 500usec counter Address
        cnt1m   equ    18        ; 1msec counter Address

    #DEFINE BANK0 BCF    STATUS,RP0 ;SET BANK0
    #DEFINE BANK1 BSF    STATUS,RP0 ;SET BANK1
    
    BAUD_RATE_SPBRG    EQU    D'25'    ;SPBRG

    CBLOCK     0X70
                DATA_BYTE    ;RECEIVED BYTE
    ENDC

    ORG    0X0000
    GOTO    SERIAL_INIT

    CLRF    DATA_BYTE
    CLRF    PORTC
    BCF     STATUS,RP1

SERIAL_INIT
    BANK1
    MOVLW    B'10000000'
    MOVWF    TRISC        ;TX RC6 AND RX RC7'
        movlw   b'00000000'     ; RB7-RB4 and RB1(RX)=input, others output 
        movwf   TRISB 
        movlw   b'00000000'     ; RB7-RB4 and RB1(RX)=input, others output        
        movwf   TRISD 
        movlw   b'00000000'     ; RB7-RB4 and RB1(RX)=input, others output        
        movwf   TRISE 
        movlw   b'10001111'
    movwf    ADCON1        ;ALL analog I/O
    MOVLW    BAUD_RATE_SPBRG
    MOVWF    SPBRG        ;BAUD RATE CONFIG
    MOVLW    B'00000000'
    MOVWF    INTCON          ;NO INTERRUPTIONS
    MOVLW    B'00100100'
    MOVWF    TXSTA        ;ACTIVATE TX AND HIGHT BAUD RATE
    BANK0
    MOVLW    B'10010000'
    MOVWF    RCSTA        ;ACTIVATE SERIAL AND RX

        movf    RCREG,W 
        movf    RCREG,W 
        movf    RCREG,W
        CLRF    PORTB
; 
; --------- 
; MAIN LOOP 
; --------- 
;

start   CALL   TEST
        clrf   ram1
        clrf   ram2
        CLRF   PORTE
        CLRF   PORTD

        goto   address

address 
        btfss   PIR1,RCIF         ; (5) check for addressd data 
        goto    address
        ;movf    ram2,W            ;addressd data{ A=65 >> 255-65=190 } 
        MOVLW   D'190' 
        MOVWF   ram0
        MOVF    RCREG,W
        addwf   ram0,F 
        incfsz  ram0,F
        goto    NOT_OK
        goto    OK
        
stbyte 
        btfss   PIR1,RCIF
        goto    stbyte
        movlw   D'162'            ;addressd data{ 93 }  
        MOVWF   ram0
        MOVF    RCREG,W
        addwf   ram0,F 
        incfsz  ram0,F
        goto    stbyte
;        btfsc   ram1,0
;        call    send             ;IN RECIEVER ONLY
;        bcf     ram1,0
        goto    address        

recdata btfss   PIR1,RCIF
        goto    recdata
        movf    RCREG,W        
        return 
; 
; ------------------------------------------------------------- 
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING 
; ------------------------------------------------------------- 
; 
send    movwf TXREG             ; send data in W 

TransWt bsf STATUS,RP0          ; RAM PAGE 1 
WtHere  btfss TXSTA,TRMT        ; (1) transmission is complete if hi 
        goto WtHere 

        bcf STATUS,RP0          ; RAM PAGE 0 
        return 


 
OK      call    send

        CLRF    PORTE
        CALL    READ_ADCON
        CALL    DELAY



        movlw   ']'
        call    send  
        goto    stbyte   


NOT_OK
        clrf    ram0
        goto    stbyte   


READ_ADCON
        movlw   B'01000001'
        movwf   ADCON0
        bsf     ADCON0,GO       ;Start A/D conversion  
Wait
        btfsc   ADCON0,GO       ;Wait for conversion to complete
        goto    Wait

        bsf     STATUS,RP0      ; Bank 1           
        movf    ADRESL,W
        bcf     STATUS,RP0      ; Bank 0.
        MOVWF   ram0
        ADDLW   D'255'
        MOVWF   ram1 
        INCFSZ  ram1,F
        GOTO    NOT_ZE
        INCF    ram0,F
NOT_ZE  MOVF    ram0,W
        MOVWF   PORTB                        
        movwf   TXREG             ; send data in W 
        bsf     STATUS,RP0          ; RAM PAGE 1 
WtHereL btfss   TXSTA,TRMT        ; (1) transmission is complete if hi 
        goto    WtHereL 
        bcf     STATUS,RP0          ; RAM PAGE 0

        movf    ADRESH,W
        MOVWF   ram0
        ADDLW   D'255'
        MOVWF   ram1 
        INCFSZ  ram1,F
        GOTO    NOT_ZR
        BSF     ram0,7
NOT_ZR  MOVF    ram0,W 
        MOVWF   PORTD
        movwf   TXREG             ; send data in W 
        bsf     STATUS,RP0          ; RAM PAGE 1 
WtHereH btfss   TXSTA,TRMT        ; (1) transmission is complete if hi 
        goto    WtHereH 
        bcf     STATUS,RP0          ; RAM PAGE 0

        RETURN



TEST
        MOVLW   'T'
        CALL    send
        MOVLW   'E'
        CALL    send
        MOVLW   'S'
        CALL    send
        MOVLW   'T'
        CALL    send
        RETURN       

DELAY   MOVLW   D'100'
        MOVWF   ram2   
LOOP    NOP
        NOP
        DECFSZ  ram2
        GOTO    LOOP
        RETURN
 
        END
 
Last edited by a moderator:
Have you tried simulating it in MPLAB? This is always much better than just plugging it in. You can inspect the registers etc to see if anything is overflowing.

In most cases that I have seen where code suddenly 'resets' there is normally a stack overflow somewhere - you are calling a subroutine that does not have a return statement at the end, so the stack overflows.

Simulate it and see what is happening
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…