![]() |
![]() |
![]() |
|
|
|||||||
| Micro Controllers Discuss all aspects of micro controllers - building them, coding them, etc. All controllers are welcome - PIC, BASIC, Z8 Encore!, etc. |
|
|
Thread Tools | Display Modes |
|
|
(permalink) |
|
Hi i am new to PIC. I have made a project (Digital Timer) that displays time increasing every sec. The circuit & program I made using PIC 16F72 has multiplexed display segments on PORTA, and to driving transistors (BC547) on PORTC,4 & PORTC,5. The time is displayed perfectly as desired. However when I tried to add one display (PORTC,7) the display gets haywire.
this code is working fine for 2 digits ;************************************************* ******** ; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE ;************************************************* ********; ; B A F G E D C DP TABLE ADDWF PCL,F RETLW B'00010001' ; 0 RETLW B'01111101' ; 1 RETLW B'00100011' ; 2 RETLW B'00101001' ; 3 RETLW B'01001101' ; 4 RETLW B'10001001' ; 5 RETLW B'10000001' ; 6 RETLW B'00111101' ; 7 RETLW B'00000001' ; 8 RETLW B'00001001' ; 9 RETLW 0 ; JUST IN CASE ;************************************************* ******** ; DISPLAY DRIVING ROUTINE ;************************************************* ********; OVER MOVF MSD,W ; MOVE THE VALUE OF MSD IN W BTFSC STATUS,Z ; CHECK IF MSD IS 0 (FOR BLANKING) GOTO STEP_OVER ; IF YES, JUMP TO STEP_OVER CALL TABLE ; OTHERWISE, DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF D_MSD ; ENABLE D_MSD CALL DELAY ; FOR 0.01 SECONDS BCF D_MSD ; THEN DISABLE D_MSD STEP_OVER MOVF LSD,W ; MOVE VALUE OF LSD IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF D_LSD ; ENABLE D_LSD CALL DELAY ; FOR 0.01 SECONDS BCF D_LSD ; THEN DISABLE D_LSD GOTO TEST When I connect three displays. Two displays run concurrently. I have used following code for running three displays : ;************************************************* ****** ; TABLE FOR SEVEN SEGMENT OUTPUT FOR COMMON ANODE ; ;************************************************* ******; ; A F B E D C G DP TABLE ADDWF PCL,F ; ADD PROGRAM COUNTER TO ITSELF RETLW B'00000011' ; SEGMENT OUTPUTS FOR 0 RETLW B'11011011' ; SEGMENT OUTPUTS FOR 1 RETLW B'01000101' ; SEGMENT OUTPUTS FOR 2 RETLW B'01010001' ; SEGMENT OUTPUTS FOR 3 RETLW B'10011001' ; SEGMENT OUTPUTS FOR 4 RETLW B'00110001' ; SEGMENT OUTPUTS FOR 5 RETLW B'00100001' ; SEGMENT OUTPUTS FOR 6 RETLW B'01011011' ; SEGMENT OUTPUTS FOR 7 RETLW B'00000001' ; SEGMENT OUTPUTS FOR 8 RETLW B'00010001' ; SEGMENT OUTPUTS FOR 9 RETLW 0 ; JUST IN CASE ;************************************************* ******; ; DISPLAY DRIVING ROUTINE ; ;************************************************* ******; OVER MOVF HS,W ; MOVE THE VALUE OF HS IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,4 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,4 MOVF TENS,W ; MOVE VALUE OF TENS IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,5 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,5 MOVF ONES,W ; MOVE VALUE OF ONES IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,5 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,5 GOTO TEST PLEASE HELP |
|
|
|
|
|
|
(permalink) |
|
Hello,
I just looked through your code quickly. Where do you set PORTC...bit 7 High?? I think that might be your problem. Good luck....Art |
|
|
|
|
|
|
(permalink) |
|
Hi,
You said that PORTC,7 is added for driving another 7-segment display; but you never do it in your code? The last part of transistor switching should be like this: Code:
MOVF ONES,W ; MOVE VALUE OF ONES IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,7 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,7
__________________
Superman returns..
|
|
|
|
|
|
|
(permalink) |
|
I am sorry . This is a typo. A mistake while copy pasting. the actual code is :
;************************************************* ********;DISPLAY DRIVING ROUTINE ; ;************************************************* ********OVER MOVF HS,W ; MOVE THE VALUE OF HS IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,4 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,4 MOVF TENS,W ; MOVE VALUE OF TENS IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,5 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,5 MOVF ONES,W ; MOVE VALUE OF ONES IN W CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE MOVWF PORTB ; IN DISPLAYS THROUGH PORTB BSF PORTC,6 CALL DELAY ; FOR 0.01 SECONDS BCF PORTC,6 GOTO TEST It does not work. Atleast 2 displays light up concurrently. Please Help |
|
|
|
|
|
|
(permalink) |
|
I'm getting confused
You mentioned that you added another 7-segment display at PORTC,7, and the latest code you showed is still not RC7 but RC6. So it doesn't work, of course.
__________________
Superman returns..
|
|
|
|
|
|
|
(permalink) |
|
Oops. another mistake. Actualy the display is on PORTA,6 & i am plannining to add another one in POATA,7, but I am still stuck at running three displays. Can't move on the fourth. Thanks for pointing out. Thease mistakes are in this post only, not in the code.
|
|
|
|
|
|
|
(permalink) |
|
Oops. another mistake. Actualy the display is on PORTC,6 & i am plannining to add another one in POATC,7, but I am still stuck at running three displays. Can't move on the fourth. Thanks for pointing out. Thease mistakes are in this post only, not in the code.
|
|
|
|
|
|
|
(permalink) |
|
Sir this is the complete code. Please point out any errors. while driving 2 displays everything is ok but when i drive 3 digits, 2digit light up at the same time. When run in the MPLAB simulator, everything is fine.
Code:
LIST P=16F72 ; DEFINE PROCESSOR
#INCLUDE <P16F72.INC> ; INCLUDE DEFINATIONS
__CONFIG _CP_ALL & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
ERRORLEVEL -302 ; SUPRESS MESSAGES
#DEFINE DGT_ONES PORTC,4
#DEFINE DGT_TENS PORTC,5
#DEFINE DGT_HS PORTC,6
#DEFINE DGT_THS PORTC,7
CBLOCK 0X20
ONES, TENS, HS, THS, MSEC, SEC, MIN
TMP_W, TMP_STS, C1, C2, C3, MSECT
ENDC
ORG 0X00
GOTO INIT
ORG 0X04
INTP MOVWF TMP_W ; SAVE VALUE OF W IN TMP_W FILE
SWAPF STATUS,W ; & VALUE OF STATUS REGISTER
MOVWF TMP_STS ; TMP_STS FILE
BTFSS INTCON,2 ; CHECK OF INTERRUPT ROLLOVER
GOTO EXIT ; IF NOT, EXIT FROM INTERRUPT
BCF INTCON,2 ; IF YES, CLEAR INTERRUPT FLAG
MOVLW .6 ; ADD 6 TO TMR0 REGISTER FOR EXACT
ADDWF TMR0, F ; 4000 µS PULSE (16 X 250 µS)
INCF MSEC, F
MOVLW .250 ; 4 MS X 250 = 1 SEC WAS 250
SUBWF MSEC,W ;
BTFSS STATUS,Z ; CHECK 0 STATUS
GOTO EXIT ; IF NOT 0, EXIT FROM INTERRUPT
CALL UPDATE
BCF INTCON,2
EXIT SWAPF TMP_STS,W ; MOVE BACK ORIGINAL VALUES OF W &
MOVWF STATUS ; STATUS TO W & STATUS REGISTERS
MOVF TMP_W,W ;
RETFIE ; & RETURN FROM INTERRUPT
; AFBEDCGDP
TABLE ADDWF PCL,F ; ADD PROGRAM COUNTER TO ITSELF
RETLW B'00000011' ; SEGMENT OUTPUTS FOR 0
RETLW B'11011011' ; SEGMENT OUTPUTS FOR 1
RETLW B'01000101' ; SEGMENT OUTPUTS FOR 2
RETLW B'01010001' ; SEGMENT OUTPUTS FOR 3
RETLW B'10011001' ; SEGMENT OUTPUTS FOR 4
RETLW B'00110001' ; SEGMENT OUTPUTS FOR 5
RETLW B'00100001' ; SEGMENT OUTPUTS FOR 6
RETLW B'01011011' ; SEGMENT OUTPUTS FOR 7
RETLW B'00000001' ; SEGMENT OUTPUTS FOR 8
RETLW B'00010001' ; SEGMENT OUTPUTS FOR 9
RETLW 0 ; JUST IN CASE
OVER MOVF ONES,W ; MOVE THE VALUE OF ONES IN W
CALL TABLE ; OTHERWISE, DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF DGT_ONES
CALL DELAY ; FOR 0.0005 SECONDS
BCF DGT_ONES
MOVF TENS,W ; MOVE VALUE OF TENS IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF DGT_TENS
CALL DELAY ; FOR 0.0005 SECONDS
BCF DGT_TENS
MOVF HS,W ; MOVE VALUE OF HS IN W
CALL TABLE ; DISPLAY SEVEN SEGMENT VALUE
MOVWF PORTB ; IN DISPLAYS THROUGH PORTB
BSF DGT_HS
CALL DELAY ; FOR 0.0005 SECONDS
BCF DGT_HS
GOTO OVER
INIT MOVLW B'00000000' ; STATUS OF PORTA
MOVWF PORTC ;
MOVLW B'00000000' ; STATUS OF PORTB
MOVWF PORTB ;
MOVLW B'00000000' ; STATUS OF PORTC
MOVWF PORTA ;
BANKSEL TRISA ; SWITCH TO BANK1
CLRF TRISA ; ALL OUTPUTS
CLRF TRISB ; ALL OUTPUTS
CLRF TRISC ; ALL OUTPUTS
BANKSEL PORTA ; SWITCH BACK TO BANK0
CLR MOVLW 20H ; MOVE A VALUE OF 20
MOVWF FSR ; IN FILE SELECT REGISTER
CLR_RAM CLRF INDF ; CLEAR INDIRECT FILE
INCF FSR,F ; INCREASE FSR
MOVLW 40H ;
SUBWF FSR,W ; TILL 80H LOCATION
BTFSS STATUS,Z ; IF YES, JUMP TO NEXT COMMAND
GOTO CLR_RAM ; IF NOT, DO UNTILL DONE.
BANKSEL ADCON1 ;
MOVLW 06H ; CONVERT ALL IO PINS
MOVWF ADCON1 ; TO DIGITAL IO'S
MOVLW 03H ; SET PRESCALER TO 1:16
MOVWF OPTION_REG ;
BANKSEL PORTA ;
MOVLW 06H ; (256-6) OVERFLOW EVERY 4 MS
MOVWF TMR0 ; 16 X 250 = 4000 µS
BSF INTCON,TMR0IE ; ENABLE TMR0
BSF INTCON,7 ; ENABLE ALL INTERRUPTS
CLRF PORTC
GOTO OVER ; RUN
UPDATE CLRF MSEC ; CLEAR MSEC
INCF ONES,F ; INCREASE ONES
MOVLW .10 ; CHECK IF IT HAS REACHED 10
SUBWF ONES,W ; OR NOT
BTFSS STATUS,Z ; CHECK 0 STATUS
RETURN
CLRF ONES ; CLEAR ONES
INCF TENS,F ; INCREASE TENS
MOVLW .10 ; CHECK IF IT HAS REACHED 10
SUBWF TENS,W ; OR NOT
BTFSS STATUS,Z ; CHECK 0 STATUS
RETURN
CLRF TENS ; CLEAR TENS
INCF HS,F ; INCREASE HS
MOVLW .10 ; CHECK IF IT HAS REACHED 10
SUBWF HS,W ; OR NOT
BTFSS STATUS,Z ; CHECK 0 STATUS
RETURN
CLRF HS ; CLEAR HS
RETURN
DELAY MOVLW .165
MOVWF C1
LOOP DECFSZ C1,F
GOTO LOOP
NOP
NOP
NOP
NOP
RETURN
END
Last edited by mathur2000; 24th June 2007 at 10:47 PM. |
|
|
|
|
| Bookmarks |
| Thread Tools | |
| Display Modes | |
|
|
|
|
||||
| Thread | Thread Starter | Forum | Replies | Latest |
| Problem with LCD code? | spondootre | Micro Controllers | 15 | 29th April 2008 09:15 AM |
| Design 5 digits LED 7 segment display...(pH meter)! | ayien | Electronic Projects Design/Ideas/Reviews | 1 | 12th January 2007 08:43 AM |
| microchip application A590 /display is ok now | prosound90 | Micro Controllers | 20 | 18th November 2006 09:44 PM |
| driving a 7 segment display, making my own readout driver | boc2100 | Electronic Projects Design/Ideas/Reviews | 5 | 3rd April 2004 08:20 AM |
| Convert Leds to 7 Segment Display | Almazick | General Electronics Chat | 21 | 19th August 2003 07:52 PM |