Help needed on PIC16F877A

Discussion in 'Embedded Systems and Microcontrollers' started by pbsllc_2001, Feb 17, 2009.

  1. pbsllc_2001

    Thread Starter New Member

    Feb 16, 2009
    1
    0
    I am new in PIC programing in ASM, i have modified the Demo program on programing PIC16F877A and after loading the program to the chip is not trigging switch command. It is just blinking Ports A,B,C,D but Port E is not getting switch command. If you can help me to correct my code, i really appreciate it. I can not figure this out by myself, i need experts' help on this. Here is the codes:

    ;*****************************************************************************
    ;* Hardw. Rev: P8076'1 Revision..: 1.00 **
    ;* LIST p=16F877A **
    ;* include "16F877A.inc" **
    ;* OSC.......: HS 20MHz Max. POWER.....: 9V DC **
    ;*****************************************************************************
    ;*****************************************************************************
    ;
    ;1.00 02/09/2009 Start of project
    ;
    ;==========================================================================
    ;
    ; Register Definitions
    ;
    ;==========================================================================
    W EQU H'0000'
    F EQU H'0001'
    ;----- Register Files------------------------------------------------------
    INDF EQU H'0000'
    TMR0 EQU H'0001'
    PCL EQU H'0002'
    STATUS EQU H'0003'
    FSR EQU H'0004'
    PORTA EQU H'0005'
    PORTB EQU H'0006'
    PORTC EQU H'0007'
    PORTD EQU H'0008'
    PORTE EQU H'0009'
    INTCON EQU H'000B'
    OPTION_REG EQU H'0081'
    TRISA EQU H'0085'
    TRISB EQU H'0086'
    TRISC EQU H'0087'
    TRISD EQU H'0088'
    TRISE EQU H'0089'
    CMCON EQU H'009C'
    ;----- STATUS Bits --------------------------------------------------------
    IRP EQU H'0007'
    RP1 EQU H'0006'
    RP0 EQU H'0005'
    NOT_TO EQU H'0004'
    NOT_PD EQU H'0003'
    Z EQU H'0002'
    DC EQU H'0001'
    C EQU H'0000'
    ;==========================================================================
    ;
    ; RAM Definition
    ;
    ;==========================================================================
    __MAXRAM H'1FF'
    __BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9B'
    __BADRAM H'105', H'107'-H'109'
    __BADRAM H'185', H'187'-H'189', H'18E'-H'18F'
    ;==========================================================================
    ;
    ; Configuration Bits
    ;
    ;==========================================================================
    _CONFIG EQU H'3F32'
    _CP_ALL EQU H'1FFF'
    _CP_75 EQU H'17FF'
    _CP_50 EQU H'2BFF'
    _CP_OFF EQU H'3FFF'
    _DEBUG_OFF EQU H'3FFF'
    _DEBUG_ON EQU H'37FF'
    _WRT_OFF EQU H'3FFF' ; No prog memmory write protection
    _WRT_256 EQU H'3DFF' ; First 256 prog memmory write protected
    _WRT_1FOURTH EQU H'3BFF' ; First quarter prog memmory write protected
    _WRT_HALF EQU H'39FF' ; First half memmory write protected
    _CPD_OFF EQU H'3FFF'
    _CPD_ON EQU H'3EFF'
    _LVP_ON EQU H'3FFF'
    _LVP_OFF EQU H'3F7F'
    _BODEN_ON EQU H'3FFF'
    _BODEN_OFF EQU H'3FBF'
    _PWRTE_OFF EQU H'3FFF'
    _PWRTE_ON EQU H'3FF7'
    _WDT_ON EQU H'3FFF'
    _WDT_OFF EQU H'3FFB'
    _RC_OSC EQU H'3FFF'
    _HS_OSC EQU H'3FFE'
    _XT_OSC EQU H'3FFD'
    _LP_OSC EQU H'3FFC'
    __CONFIG _BODEN_OFF & _CP_OFF & _DEBUG_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC
    ;==========================================================================
    ; Variable Definition
    ;==========================================================================
    ;INPUTS
    SW1 EQU H'02' ;SW1 is triggering RE2
    TIMER1 EQU H'20' ;Used in delay routine
    TIMER2 EQU H'21' ; " " "
    PATERN EQU H'22' ;Pattern data for effect's

    ORG 0 ;Reset vector address
    GOTO RESET ;goto RESET routine when boot.
    ; *********************************************
    ; * Example of a delay routine *
    ; *********************************************
    DELAY100 MOVLW D'100' ;54 Generate approx 10mS delay at 20Mhz CLK
    MOVWF TIMER2
    GOTO DEL_LOOP1
    ;
    DELAY200 MOVLW D'200' ;54 Generate approx 10mS delay at 20Mhz CLK
    MOVWF TIMER2
    GOTO DEL_LOOP1
    DELAY255 MOVLW D'255' ;54 Generate approx 10mS delay at 20Mhz CLK
    MOVWF TIMER2 ;WARNING OVER 255
    DEL_LOOP1 MOVLW D'255' ;60
    MOVWF TIMER1
    DEL_LOOP2 BTFSC PORTE,SW1
    GOTO MENU
    DECFSZ TIMER1,F
    GOTO DEL_LOOP2
    DECFSZ TIMER2,F
    GOTO DEL_LOOP1
    RETLW 0

    ; **********************************
    ; ** RESET : main boot routine **
    ; **********************************
    RESET MOVLW B'00000111' ;Disable Comparator module's
    MOVWF CMCON
    ;
    BSF STATUS,RP0 ;Switch to register bank 1
    ;Disable pull-ups
    ;INT on rising edge
    ;TMR0 to CLKOUT
    ;TMR0 Incr low2high trans.
    ;Prescaler assign to Timer0
    ;Prescaler rate is 1:256
    MOVLW B'11010111' ;Set PIC options (See datasheet).
    MOVWF OPTION_REG ;Write the OPTION register.
    ;
    CLRF INTCON ;Disable interrupts
    MOVLW B'11000000' ;RA5 input, all RA ports are outputs.
    MOVWF TRISA ;
    CLRF TRISA ;
    MOVLW B'11000000' ;all RB ports are outputs.
    MOVWF TRISB ;
    CLRF TRISB ;
    MOVLW B'00000000' ;all RC ports are outputs.
    MOVWF TRISC ;
    CLRF TRISC ;
    MOVLW B'00000000' ;all RD ports are outputs.
    MOVWF TRISD ;
    CLRF TRISD ;
    MOVLW B'11111111' ;all RE ports are inputs.
    MOVWF TRISE ;
    CLRF TRISE ;
    BCF STATUS,RP0 ;Switch Back to reg. Bank 0
    GOTO EFFECT_2 ;
    ;
    MENU CLRF PORTA ;
    CLRF PORTB ;
    CLRF PORTC ;
    CLRF PORTD ;
    ;
    ;
    BTFSC PORTE,SW1
    GOTO EFFECT_1
    GOTO MENU
    ;
    ;
    EFFECT_1 BTFSC PORTE,SW1
    GOTO EFFECT_1
    E1 MOVLW B'00111111' ;
    MOVWF PORTA
    CALL DELAY100
    CLRF PORTA
    MOVLW B'00111111' ;
    MOVWF PORTB
    CALL DELAY100
    CLRF PORTB
    MOVLW B'11111111' ;
    MOVWF PORTC
    CALL DELAY100
    CLRF PORTC
    MOVLW B'11111111' ;
    MOVWF PORTD
    CALL DELAY100
    CLRF PORTD
    GOTO E1

    EFFECT_2 MOVLW B'00111111' ;
    MOVWF PORTA
    CALL DELAY255
    CALL DELAY255
    CLRF PORTA
    MOVLW B'00111111' ;
    MOVWF PORTB
    CALL DELAY255
    CALL DELAY255
    CLRF PORTB
    MOVLW B'11111111' ;
    MOVWF PORTC
    CALL DELAY255
    CALL DELAY255
    CLRF PORTC
    MOVLW B'11111111' ;
    MOVWF PORTD
    CALL DELAY255
    CALL DELAY255
    CLRF PORTD
    GOTO EFFECT_2
    END
     
  2. SgtWookie

    Expert

    Jul 17, 2007
    22,182
    1,728
    This thread is not in the correct forum; it should have been over here: http://forum.allaboutcircuits.com/forumdisplay.php?f=17

    You didn't post the source code you started with.

    It looks sort of like PORTE may have originally been used as an input to determine whether EFFECT_1 or EFFECT_2 were to be called, but it's hard to tell without the original source.

    Straightening up your source using the CODE blocks:
    Code ( (Unknown Language)):
    1. ;*************************************************  ****************************
    2. ;*          Hardw. Rev: P8076'1          Revision..: 1.00                   **
    3. ;*     LIST p=16F877A                **
    4. ;*          include '16F877A.inc'         **
    5. ;*          OSC.......: HS 20MHz Max.     POWER.....: 9V DC                 **
    6. ;*************************************************  ****************************
    7. ;*************************************************  ****************************
    8. ;
    9. ;1.00   02/09/2009      Start of project
    10. ;
    11. ;=================================================  =========================
    12. ;
    13. ;       Register Definitions
    14. ;
    15. ;=================================================  =========================
    16. W                            EQU     H'0000'
    17. F                            EQU     H'0001'
    18. ;----- Register Files------------------------------------------------------
    19. INDF                         EQU     H'0000'
    20. TMR0                         EQU     H'0001'
    21. PCL                          EQU     H'0002'
    22. STATUS                       EQU     H'0003'
    23. FSR                          EQU     H'0004'
    24. PORTA                        EQU     H'0005'
    25. PORTB                        EQU     H'0006'
    26. PORTC                        EQU     H'0007'
    27. PORTD                        EQU     H'0008'
    28. PORTE                        EQU     H'0009'
    29. INTCON                       EQU     H'000B'
    30. OPTION_REG                   EQU     H'0081'
    31. TRISA                        EQU     H'0085'
    32. TRISB                        EQU     H'0086'
    33. TRISC                        EQU     H'0087'
    34. TRISD                        EQU     H'0088'
    35. TRISE                        EQU     H'0089'
    36. CMCON                        EQU     H'009C'
    37. ;----- STATUS Bits --------------------------------------------------------
    38. IRP                          EQU     H'0007'
    39. RP1                          EQU     H'0006'
    40. RP0                          EQU     H'0005'
    41. NOT_TO                       EQU     H'0004'
    42. NOT_PD                       EQU     H'0003'
    43. Z                            EQU     H'0002'
    44. DC                           EQU     H'0001'
    45. C                            EQU     H'0000'
    46. ;=================================================  =========================
    47. ;
    48. ;       RAM Definition
    49. ;
    50. ;=================================================  =========================
    51.         __MAXRAM H'1FF'
    52.         __BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9B'
    53.         __BADRAM H'105', H'107'-H'109'
    54.         __BADRAM H'185', H'187'-H'189', H'18E'-H'18F'
    55. ;=================================================  =========================
    56. ;
    57. ;       Configuration Bits
    58. ;
    59. ;=================================================  =========================
    60. _CONFIG        EQU     H'3F32'
    61. _CP_ALL                      EQU     H'1FFF'
    62. _CP_75                       EQU     H'17FF'
    63. _CP_50                       EQU     H'2BFF'
    64. _CP_OFF                      EQU     H'3FFF'
    65. _DEBUG_OFF                   EQU     H'3FFF'
    66. _DEBUG_ON                    EQU     H'37FF'
    67. _WRT_OFF                     EQU     H'3FFF'    ; No prog memmory write protection
    68. _WRT_256                     EQU     H'3DFF'    ; First 256 prog memmory write protected
    69. _WRT_1FOURTH                 EQU     H'3BFF'    ; First quarter prog memmory write protected
    70. _WRT_HALF                    EQU     H'39FF'    ; First half memmory write protected
    71. _CPD_OFF                     EQU     H'3FFF'
    72. _CPD_ON                      EQU     H'3EFF'
    73. _LVP_ON                      EQU     H'3FFF'
    74. _LVP_OFF                     EQU     H'3F7F'
    75. _BODEN_ON                    EQU     H'3FFF'
    76. _BODEN_OFF                   EQU     H'3FBF'
    77. _PWRTE_OFF                   EQU     H'3FFF'
    78. _PWRTE_ON                    EQU     H'3FF7'
    79. _WDT_ON                      EQU     H'3FFF'
    80. _WDT_OFF                     EQU     H'3FFB'
    81. _RC_OSC                      EQU     H'3FFF'
    82. _HS_OSC                      EQU     H'3FFE'
    83. _XT_OSC                      EQU     H'3FFD'
    84. _LP_OSC                      EQU     H'3FFC'
    85.  __CONFIG _BODEN_OFF & _CP_OFF & _DEBUG_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC
    86. ;=================================================  =========================
    87. ;       Variable Definition
    88. ;=================================================  =========================
    89. ;INPUTS
    90. SW1  EQU H'02'  ;SW1 is triggering RE2
    91. TIMER1  EQU H'20'  ;Used in delay routine
    92. TIMER2  EQU H'21'  ; ' ' '
    93. PATERN  EQU H'22'  ;Pattern data for effect's
    94.  
    95.   ORG 0  ;Reset vector address
    96.   GOTO RESET  ;goto RESET routine when boot.
    97. ;  *********************************************
    98. ;  *  Example of a delay routine               *
    99. ;  *********************************************
    100. DELAY100 MOVLW   D'100'  ;54 Generate approx 10mS delay at 20Mhz CLK
    101.                 MOVWF   TIMER2
    102.   GOTO DEL_LOOP1
    103.   ;
    104. DELAY200 MOVLW   D'200'  ;54 Generate approx 10mS delay at 20Mhz CLK
    105.                 MOVWF   TIMER2
    106.   GOTO DEL_LOOP1
    107. DELAY255 MOVLW   D'255'  ;54 Generate approx 10mS delay at 20Mhz CLK
    108.                 MOVWF   TIMER2  ;WARNING OVER 255
    109. DEL_LOOP1       MOVLW   D'255'  ;60
    110.                 MOVWF   TIMER1
    111. DEL_LOOP2       BTFSC PORTE,SW1
    112.   GOTO MENU
    113.   DECFSZ  TIMER1,F
    114.                 GOTO    DEL_LOOP2
    115.                 DECFSZ  TIMER2,F
    116.                 GOTO    DEL_LOOP1
    117.   RETLW   0
    118.  
    119. ;        **********************************
    120. ;              **  RESET :  main boot routine  **
    121. ;              **********************************
    122. RESET  MOVLW B'00000111' ;Disable Comparator module's
    123.   MOVWF CMCON
    124.   ;
    125.   BSF STATUS,RP0 ;Switch to register bank 1
    126.      ;Disable pull-ups
    127.      ;INT on rising edge
    128.      ;TMR0 to CLKOUT
    129.      ;TMR0 Incr low2high trans.
    130.      ;Prescaler assign to Timer0
    131.      ;Prescaler rate is 1:256
    132.   MOVLW B'11010111' ;Set PIC options (See datasheet).
    133.   MOVWF OPTION_REG ;Write the OPTION register.
    134.   ;
    135.   CLRF INTCON  ;Disable interrupts
    136.   MOVLW B'11000000' ;RA5 input, all RA ports are outputs.
    137.   MOVWF TRISA  ;
    138.   CLRF TRISA  ;
    139.   MOVLW B'11000000' ;all RB ports are outputs.
    140.   MOVWF TRISB  ;
    141.   CLRF TRISB  ;
    142.   MOVLW B'00000000' ;all RC ports are outputs.
    143.   MOVWF TRISC  ;
    144.   CLRF TRISC  ;
    145.   MOVLW B'00000000' ;all RD ports are outputs.
    146.   MOVWF TRISD  ;
    147.   CLRF TRISD  ;
    148.   MOVLW B'11111111' ;all RE ports are inputs.
    149.   MOVWF TRISE  ;
    150.   CLRF TRISE  ;
    151.   BCF STATUS,RP0 ;Switch Back to reg. Bank 0
    152.   GOTO EFFECT_2 ;
    153.   ;
    154. MENU  CLRF PORTA  ;
    155.   CLRF PORTB  ;
    156.   CLRF PORTC  ;
    157.   CLRF PORTD  ;
    158.   ;
    159.   ;
    160.   BTFSC PORTE,SW1
    161.   GOTO EFFECT_1
    162.   GOTO MENU
    163.   ;
    164.   ;
    165. EFFECT_1 BTFSC PORTE,SW1
    166.   GOTO EFFECT_1
    167. E1  MOVLW B'00111111' ;
    168.   MOVWF PORTA
    169.   CALL DELAY100
    170.   CLRF PORTA
    171.   MOVLW B'00111111' ;
    172.   MOVWF PORTB
    173.   CALL DELAY100
    174.   CLRF PORTB
    175.   MOVLW B'11111111' ;
    176.   MOVWF PORTC
    177.   CALL DELAY100
    178.   CLRF PORTC
    179.   MOVLW B'11111111' ;
    180.   MOVWF PORTD
    181.   CALL DELAY100
    182.   CLRF PORTD
    183.   GOTO E1
    184.  
    185. EFFECT_2 MOVLW B'00111111' ;
    186.   MOVWF PORTA
    187.   CALL DELAY255
    188.   CALL DELAY255
    189.   CLRF PORTA
    190.   MOVLW B'00111111' ;
    191.   MOVWF PORTB
    192.   CALL DELAY255
    193.   CALL DELAY255
    194.   CLRF PORTB
    195.   MOVLW B'11111111' ;
    196.   MOVWF PORTC
    197.   CALL DELAY255
    198.   CALL DELAY255
    199.   CLRF PORTC
    200.   MOVLW B'11111111' ;
    201.   MOVWF PORTD
    202.   CALL DELAY255
    203.   CALL DELAY255
    204.   CLRF PORTD
    205.   GOTO EFFECT_2  
    206.   END
     
Loading...