PDA

View Full Version : PIC Help! MY led Keeps Flashing and dimming when displaying the message HELP!



jackd019
- 2nd June 2012, 14:50
I cant seem to fix it
like the numbers displayed or what not goes dim and some are fine but some arent


list p=16f877 #include <p16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF




#define LCD_RS PORTE,0 ;Define the pin for the LCD RS Control Line
#define LCD_RW PORTE,1 ;Define the pin for the LCD R/W Control Line
#define LCD_E PORTE,2 ;Define the pin for the LCD E Control Line
#define LCD_DATA PORTD ;Define the pins for LCD Data Lines


COUNTER1 EQU 0x020 ;Memory address for Counter 1
COUNTER2 EQU 0x021 ;Memory address for Counter 2
COUNTER3 EQU 0x022 ;MEMORY ADDRESS FOR COUNTER 3
ORG 0x0000
RESET_V goto START ;Reset Vector
ORG 0x0005
START clrf PORTD ;Clear PORTD Output Latches.
clrf PORTE ;Clear PORTE Output Latches.
bsf STATUS,RP0 ;Switch to Bank 1.
movlw 0x07 ;Load W with 0x07
movwf ADCON1 ;Copy W into ADCON1 (Switch Port A and E into Digital Mode)

clrf TRISD ;Switch all Port D pins to output mode
clrf TRISE ;Switch all Port E pins to output mode
bcf STATUS,RP0 ;Switch to Bank 0

; call LOCKED_MODE
; call HOLD_LOCKED


; call UNLOCKED_MODE
; call HOLD_UNLOCKED


; call IDLE_MODE
; call HOLD_IDLE


; call STEP_MODE
; call HOLD_STEP


; call POS_MODE
; call HOLD_POS




LOCKED_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD
bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'00111000' ;Load the function set command into working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00001110' ;Load the Display On command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000110' ;Load the Entry Mode Set command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000001' ;Load the Clear Screen command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
Call LONG_DELAY ;Call the Long Delay Subroutine

bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'S' ;Load the first letter of your First Name into the Working Register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'Y' ;Write the remaining letters of your First Name to the screen
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'S'
Call LCD_WRITE
movlw 'T'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE
movlw 'M'
Call LCD_WRITE
movlw '_'
Call LCD_WRITE
movlw 'L'
Call LCD_WRITE
movlw 'O'
Call LCD_WRITE
movlw 'C'
Call LCD_WRITE
movlw 'K'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE



bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD
Call LCD_WRITE ;Call the LCD_Write Subroutine
bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw '1' ;Load the first letter of your Surname into the Working Register
Call LCD_WRITE
movlw '1'
Call LCD_WRITE
movlw '4'
Call LCD_WRITE
movlw '6'
Call LCD_WRITE
movlw '3'
Call LCD_WRITE
movlw '3'
Call LCD_WRITE
movlw '3'
Call LCD_WRITE
movlw '2'
Call LCD_WRITE
; return
HOLD_LOCKED btfsc PORTB, 5
goto HOLD_LOCKED

UNLOCKED_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD
bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'00111000' ;Load the function set command into working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00001110' ;Load the Display On command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000110' ;Load the Entry Mode Set command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000001' ;Load the Clear Screen command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
Call LONG_DELAY ;Call the Long Delay Subroutine

bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'S' ;Load the first letter of your First Name into the Working Register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'Y' ;Write the remaining letters of your First Name to the screen
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'S'
Call LCD_WRITE
movlw 'T'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE
movlw 'M'
Call LCD_WRITE
movlw '_'
Call LCD_WRITE
movlw 'U'
Call LCD_WRITE
movlw 'N'
Call LCD_WRITE
movlw 'L'
Call LCD_WRITE
movlw 'O'
Call LCD_WRITE
movlw 'C'
Call LCD_WRITE
movlw 'K'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE

bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD
Call LCD_WRITE ;Call the LCD_Write Subroutine
bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw '1' ;Load the first letter of your Surname into the Working Register
Call LCD_WRITE
movlw '1'
Call LCD_WRITE
movlw '4'
Call LCD_WRITE
movlw '6'
Call LCD_WRITE
movlw '3'
Call LCD_WRITE
movlw '3'
Call LCD_WRITE
movlw '3'
Call LCD_WRITE
movlw '2'
Call LCD_WRITE
; return
HOLD_UNLOCKED btfsc PORTB, 4
goto HOLD_UNLOCKED


IDLE_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD
bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'00111000' ;Load the function set command into working register
call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00001110' ;Load the Display On command into the working register
call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000110' ;Load the Entry Mode Set command into the working register
call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000001' ;Load the Clear Screen command into the working register
call LCD_WRITE ;Call the LCD_Write Subroutine
call LONG_DELAY ;Call the Long Delay Subroutine

bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'I' ;Load the first letter of your First Name into the Working Register
call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'D' ;Write the remaining letters of your First Name to the screen
call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'L'
call LCD_WRITE
movlw 'E'
call LCD_WRITE
movlw '_'
call LCD_WRITE
movlw 'M'
call LCD_WRITE
movlw 'O'
call LCD_WRITE
movlw 'D'
call LCD_WRITE
movlw 'E'
call LCD_WRITE

bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD
call LCD_WRITE ;Call the LCD_Write Subroutine
bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'S' ;Load the first letter of your Surname into the Working Register
call LCD_WRITE
movlw 'Y'
call LCD_WRITE
movlw 'S'
call LCD_WRITE
movlw 'T'
call LCD_WRITE
movlw 'E'
call LCD_WRITE
movlw 'M'
call LCD_WRITE
movlw '_'
call LCD_WRITE
movlw 'E'
call LCD_WRITE
movlw 'N'
call LCD_WRITE
movlw 'A'
call LCD_WRITE
movlw 'B'
call LCD_WRITE
movlw 'L'
call LCD_WRITE
movlw 'E'
call LCD_WRITE
movlw 'D'
call LCD_WRITE
; return


HOLD_IDLE btfsc PORTB, 2
goto HOLD_IDLE


STEP_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD
bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'00111000' ;Load the function set command into working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00001110' ;Load the Display On command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000110' ;Load the Entry Mode Set command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000001' ;Load the Clear Screen command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
Call LONG_DELAY ;Call the Long Delay Subroutine

bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'S' ;Load the first letter of your First Name into the Working Register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'T' ;Write the remaining letters of your First Name to the screen
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'E'
Call LCD_WRITE
movlw 'P'
Call LCD_WRITE
movlw '_'
Call LCD_WRITE
movlw 'M'
Call LCD_WRITE
movlw 'O'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE

bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD
Call LCD_WRITE ;Call the LCD_Write Subroutine
bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'S' ;Load the first letter of your Surname into the Working Register
Call LCD_WRITE
movlw 'T'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE
movlw 'P'
Call LCD_WRITE
movlw 'S'
Call LCD_WRITE
movlw ':'
Call LCD_WRITE
movlw 'X'
Call LCD_WRITE
movlw 'X'
Call LCD_WRITE
movlw 'Y'
Call LCD_WRITE
movlw 'Y'
Call LCD_WRITE
movlw 'Y'
Call LCD_WRITE
; return
HOLD_STEP btfsc PORTB,2
goto STEP_MODE


POS_MODE bcf LCD_RW ;Clear LCD_RW line to write data to the LCD
bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'00111000' ;Load the function set command into working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00001110' ;Load the Display On command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000110' ;Load the Entry Mode Set command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw B'00000001' ;Load the Clear Screen command into the working register
Call LCD_WRITE ;Call the LCD_Write Subroutine
Call LONG_DELAY ;Call the Long Delay Subroutine


bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'P' ;Load the first letter of your First Name into the Working Register
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'O' ;Write the remaining letters of your First Name to the screen
Call LCD_WRITE ;Call the LCD_Write Subroutine
movlw 'S'
Call LCD_WRITE
movlw 'I'
Call LCD_WRITE
movlw 'O'
Call LCD_WRITE
movlw 'N'
Call LCD_WRITE
movlw '_'
Call LCD_WRITE
movlw 'M'
Call LCD_WRITE
movlw 'O'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE
movlw 'E'
Call LCD_WRITE

bcf LCD_RS ;Clear LCD_RS line to write control commands
movlw B'11000000' ;Load the command into the working register that places the cursor on the second line of the LCD
Call LCD_WRITE ;Call the LCD_Write Subroutine
bsf LCD_RS ;Set the LCD_RS control line to write characters to the display
movlw 'X' ;Load the first letter of your Surname into the Working Register
Call LCD_WRITE
movlw 'X'
Call LCD_WRITE
movlw 'X'
Call LCD_WRITE
movlw ':'
Call LCD_WRITE
movlw 'Y'
Call LCD_WRITE
movlw 'Y'
Call LCD_WRITE
movlw 'Y'
Call LCD_WRITE
movlw ':'
Call LCD_WRITE
movlw 'Z'
Call LCD_WRITE
movlw 'Z'
Call LCD_WRITE
movlw 'Z'
Call LCD_WRITE
movlw ':'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE
movlw 'D'
Call LCD_WRITE
; return
HOLD_POS btfsc PORTB,2
goto HOLD_POS
goto IDLE_MODE
;************************************************* ************************************************** *****
; Subroutine Section
;************************************************* ************************************************** *****
; LCD Write - loads a command into the LCD Controller
;************************************************* ************************************************** *****
LCD_WRITE bsf LCD_E ;Set the LCD Enable Pin
movwf LCD_DATA ;Write the command in the working register to the LCD Data Lines
nop ;No Operation
nop ;No Operation
bcf LCD_E ;Clear the LCD Enable Pin
call SHORT_DELAY ;Call the Short_Delay subroutine to Wait the minimum instruction execution time
return ;Return to where the routine was called from




;************************************************* ************************************************** *****
; Short Delay (approx 60us)
;************************************************* ************************************************** *****
SHORT_DELAY movlw D'100' ;Load 100 into the Working register
movwf COUNTER1 ;Copy the Working register into the Counter1 register
C1_DEC
decfsz COUNTER1,F ;Decrement the Counter 1 register
goto C1_DEC ;Goto C1_DEC
return ;Return to where the routine was called from


;************************************************* ************************************************** *****
; Long Delay (approx 6ms)
;************************************************* ************************************************** *****
LONG_DELAY movlw D'100' ;Load 100 into the Working register
movwf COUNTER2 ;Copy the Working register into the Counter2 register
DLY_C2_DEC
call SHORT_DELAY ;Call the SHORT_DELAY subroutine
decfsz COUNTER2,F ;Decrement the Counter 2 register
goto DLY_C2_DEC ;Goto DLY_C2_DEC
return ;Return to where the routine was called from




END

Thats the Code if someone can help me please

c_moore
- 2nd June 2012, 18:06
well this won't help,but whats the point of using a basic compiler if the code is in asm? you would get more help if it was in the pic basic language.

andywpg
- 2nd June 2012, 20:05
well this won't help,but whats the point of using a basic compiler if the code is in asm? you would get more help if it was in the pic basic language.

I second that - the reason I bought PBP was because I never was very comfortable with ASM - just too dumb, I guess.

BTW, I find it SO much easier to get things working now!

Sorry for the hijacking - we now return you to your regularly scheduled thread!

Ramius
- 9th June 2012, 15:34
Hi Jack,
It sounds more like you may be experiencing "current limiting" where your power supply is not providing enough current (amps) to your circuit. Have you checked the voltage before you power everything up and then what the voltage is when the circuit is operating? A schematic of how things are wired would be helpful especially with what parts you are using. An alternate test would be to send fewer characters and there is also the possibility your LCD display is bad? Maybe just send the letters TEST? Flashing and dimming is typically an indication of a power or wiring problem. Best, Ed