1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

Help to convert to Anode Display for a 50 V DC Panel Meter...

Discussion in 'Microcontrollers' started by manoj soorya, May 16, 2017.

  1. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    Hello All

    I got this code from internet. Its a good volt meter circuit, I tested. Simple and Locally avilable components. But the code for the Common Cathod Display. Can you someone help to convert it to Common Anode?

    And this is the code...


    Code (text):


    ;==================================================
    ; 18/01/2013
    ; Çàãîëîâîê ê ïðîãðàììå òðåõñåãìåíòíîãî àìïåð/âîëüòìåòðà
    ; ñ âíåøíèì ïåïåêëþ÷àòåëåì ðåæèìà èçìåðåíèÿ.
    ;==================================================
    ;
    Dev_Freq   EQU   D'4000000'   ; Device Frequency is 4 MHz
    ;
    RESET_V       EQU   0x0000   ; Address of RESET Vector
    ISR_V       EQU   0x0004   ; Address of Interrupt Vector
    PMEM_END   EQU   0x03FF   ; Last address in Program Memory
    ;
    #define   SKIP_IF_ZERO   btfss   STATUS,Z
    #define   SKIP_IF_NOZERO   btfsc   STATUS,Z
    #define   SKIP_IF_POSITIVE   btfss   STATUS,C
    #define   SKIP_IF_NEGATIVE   btfsc   STATUS,C
    ;======== ÎÏÐÅÄÅËÅÍÈß =====================
    ;
    ;#define       k   .49   ;çíà÷åíèå êîððåêöèè Ò0 äëÿ F=50 Ãö
    #define       k   .153   ;çíà÷åíèå êîððåêöèè Ò0 äëÿ F=100 Ãö

    ;
    ;ÍÀÇÍÀ×ÅÍÈß ÄËß ÏÎÐÒÎÂ: RA0-âõîä ÀÖÏ; RA3-âõîä ñ ïåðåêëþ÷àòåëÿ
    ;âñå îñòàëüíûå - âûõîäû, ïîäòÿæêè âûêëþ÷åíû.
    ;Ïðè íàçíà÷åíèè ïîðòà RC2 êàê âõîä - òî÷êà ãàñèòñÿ
    ;Ðåçóëüòàò ÀÖÏ - 2-áàéòíûé
    #define TRIS_A       b'00001001'   ;
    #define TRIS_C_dot_ON   b'00000000'
    #define TRIS_C_dot_OFF   b'00000100'
    ;
    #define SW_SENSE   PORTA,3   ;âõîä ïåðåêëþ÷àòåëÿ ðîäà ðàáîò
    #define DIGIT_1       PORTC,4   ;êàòîä ñòàðøåãî ðàçðÿäà èíäèêàòîðà
    #define DIGIT_2       PORTC,3   ;êàòîä ñðåäíåãî ðàçðÿäà èíäèêàòîðà
    #define DIGIT_3       PORTC,2   ;êàòîä ìëàäøåãî ðàçðÿäà èíäèêàòîðà
    ;
    ;============ ÏÅÐÅÌÅÍÍÛÅ =========================================
    ;
       cblock   0x020
       TEMP       ; TEMPorary register
       COUNTER       ;îáùèé ñ÷åò÷èê
       COUNT       ;ñ÷åò÷èêè çàäåðæåê
       COUNT1       ;
    ;
       CCOUNTER   ;ñ÷åò÷èê ïðåðûâàíèé
    ;
       D1   ;Ðàçðÿäû èíäèêàòîðà
       D2
       D3
    ;ðåãèñòðû äëÿ äâîè÷íî-äåñÿòè÷íîãî ïðåîáðàçîâàíèÿ
       DH   ;÷èñëî äëÿ ïðåáîðàçîâàíèÿ bin2bcd
       DL
       ADD_L   ;íàêîïèòåëü ñóììû
       ADD_H
       LED0   ;ðåçóëüòàò ïðåîáðàçîâàíèÿ
       LED1      
       LED2      
       LED3
       LED4
    ;      
       INDEX   ;óêàçàòåëü äëÿ èíäèêàöèè
    ;
       WREG_TEMP   ;storage for WREG during interrupt
       STATUS_TEMP   ;storage for STATUS during interrupt
       PCLATH_TEMP   ;storage for PCLATH during interrupt
       FSR_TEMP   ;storage for FSR during interrupt
    ;
       FLAGS       ;ôëàãè îáùèå
       endc
    ;
    ;
    #define   mode   FLAGS,0   ;,áèò ðåæèìà ðàáîòû U=1, I=0
    ;------------------------------------------------------------
    ;ÎÏÐÅÄÅËÅÍß ÄËß ÈÍÄÈÊÀÖÈÈ
    ;------------------------------------------------------------
    ;Ñîîòâåòñòâèå ñåãìåíòàì: PORTA '--ABiCGi'; PORTC '--F123ED'
    #define coma   PORTC,2   ;áèò âêëþ÷åíèÿ çàïÿòîé
    ;
    ;=======================
    ;**** Ì À Ê Ð Î Ñ Û ****
    ;=======================
    ;------------------------------------------------------------
    ;Ìàêðîñ ïðîèçâîäèò èíêðåìåíò äâóõáàéòîâîãî ÷èñëà NH,NL
    ;------------------------------------------------------------
    INC2B   MACRO   NH,NL   ;ñòàðøèé áàéò, ìëàäøèé áàéò
       clrf   TEMP   ;èíêðåìåíò
       movlw   1   ;2-õ áàéòîâîãî
       addwf   NL,F   ;÷èñëà
       rlf   TEMP,W   ;
       addwf   NH,f   ;
       ENDM
    ;------------------------------------------------------------
    Bank0       MACRO           ;macro to select data RAM bank 0
           bcf   STATUS,RP0
           ENDM

    Bank1       MACRO           ;macro to select data RAM bank 1
           bsf   STATUS,RP0
           ENDM
    ;------------------------------------------------------------


    [end code]

    Thanking you ....
     

    Attached Files:

  2. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,148
    Likes:
    907
    Location:
    Rochdale UK
    ONLINE
    Why is it in the Oshonsoft forum??? Is Oshonsoft the tool you use to work with?
     
  3. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India

    Is Oshonsoft for PIC chip also I think....


    am I correct Master?
     
  4. dave

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    -
    Likes:
    0


     
  5. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India

    and which compier can I use for this code? I try MP Lab 8.92 with Hi-Tech C. I got Error...

    Thanking You...
     
  6. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    Done with Compiler....MP Lab 8.92 with MPASM Tools Suite.... Compilation done..
     
  7. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    Can you someone give me a hint? Please....

    Regards....
     
  8. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,148
    Likes:
    907
    Location:
    Rochdale UK
    ONLINE
    I thought you were done.....
     
  9. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    I just success in compilation only. But its only common cathod. its working good.

    But I need to do with common Anode display. I try much times..

    I just change to -

    Code (text):



           retlw   b'11101011'   ;   ( b'00010100' ; for 1 : this is the original code)

    [code end]

    I just invert all binary number like that...

    But nothing in the display (display OFF.

    any other change I can do?
     
  10. Mike - K8LH

    Mike - K8LH Well-Known Member

    Joined:
    Jan 22, 2005
    Messages:
    3,637
    Likes:
    109
    Location:
    Michigan, USA
    schematic?
     
  11. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    s96400272.jpg
     
  12. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    I am trying to make the change.... Not success.... Please Help me..


    Regards Manoj
     
  13. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    I just invert the avmeter.asm and avmeter.h files. (Invert all the binary number. is it okey or can I do change in the opcode too?
     
  14. Mike - K8LH

    Mike - K8LH Well-Known Member

    Joined:
    Jan 22, 2005
    Messages:
    3,637
    Likes:
    109
    Location:
    Michigan, USA
    The schematic helps a lot... Thank you.

    I believe these are the relevant code sections for the 3-digit display;
    Code (asm):
    LEDTABLE_A
            addwf   PCL,F           ;    --AB-CG- on PORTA
            retlw   b'00110100'     ; 0  --AB-C--
            retlw   b'00010100'     ; 1  ---B-C--
            retlw   b'00110010'     ; 2
            retlw   b'00110110'     ; 3
            retlw   b'00010110'     ; 4
            retlw   b'00100110'     ; 5
            retlw   b'00100110'     ; 6
            retlw   b'00110100'     ; 7
            retlw   b'00110110'     ; 8
            retlw   b'00110110'     ; 9
            retlw   b'00000010'     ;'-'

    LEDTABLE_C
            addwf   PCL,F           ;    --F---ED on PORTB
            retlw   b'00100011'     ; 0  --F---ED
            retlw   b'00000000'     ; 1  --------
            retlw   b'00000011'     ; 2
            retlw   b'00000001'     ; 3
            retlw   b'00100000'     ; 4
            retlw   b'00100001'     ; 5
            retlw   b'00100011'     ; 6
            retlw   b'00000000'     ; 7
            retlw   b'00100011'     ; 8
            retlw   b'00100001'     ; 9
            retlw   b'00000000'     ;'-'
     
    Code (asm):
    DISPLAY
            movlw   b'00011100'     ; cathodes K1(RC4),K2(RC3),K3(RC2) off
            movwf   PORTC           ; segments D(RC0),E(RC1),F(RC5) off
            clrf    PORTA           ; segments G(RA1),C(RA2),B(RA4),A(RA5) off
            Bank1                   ;
            movlw   TRIS_C_dot_OFF  ;
            movwf   TRISC           ; K3/DP pin (RC2) off (hi-z input)
            Bank0                   ;
    ;
    ; ïðîâåðÿåì èíäåêñ èíäèêàòîðîâ
    ; INDEX=0 - ìëàäøèé ðàçðÿä, ïîðò À
    ; INDEX=1 - ìëàäøèé ðàçðÿä, ïîðò Ñ
    ; .......
    ; INDEX=6 - ïåðåãðóçêà ñ÷åò÷èêà
    ;
            movf    INDEX,W         ; LEDIndex -> W
            sublw   .5              ; in range, 0 <= index <= 5?
            skpc                    ; yes, skip, else
            clrf    INDEX           ; reset index to 0
    ;-----------
    sel_cathode:                    ; âûáîð îòîáðàæàåìîãî ðàçðÿäà
            movlw   b'00000100'     ;
            andwf   INDEX,W         ; index 4 or 5?
            skpz                    ; no, skip, else
            goto    sel_MSD         ; display most significant digit
            movlw   b'00000010'     ;
            andwf   INDEX,W         ; index 2 or 3?
            skpz                    ; no, skip, else
            goto    sel_CSD         ; display middle digit
    sel_LSD
            Bank1                   ; index 0 or 1
            movlw   TRIS_C_dot_ON   ;
            movwf   TRISC           ; make K3/DP (RC2) pin output
            Bank0                   ;
            bcf     DIGIT_3         ; active lo DIGIT_3 (RC2) on
            goto    fire_LSD        ; çàæå÷ü ñåãìåíòû ìëàäøåãî ðàçðÿäà
    sel_CSD
            bcf     DIGIT_2         ; active lo DIGIT_2 (RC3) on
            goto    fire_CSD        ; çàæå÷ü ñåãìåíòû ñðåäíåãî ðàçðÿäà
    sel_MSD
            bcf     DIGIT_1         ; active lo DIGIT_1 (RC4) on
            goto    fire_MSD        ; çàæå÷ü ñåãìåíòû ñòàðøåãî ðàçðÿäà
    ;-----------
    ;
    ; çàæèãàíèå ñåãìåíòîâ èíäèêàòîðà
    ;
    fire_LSD
            btfss   INDEX,0        ; âûáîð ÷åòâåðêè ñåãìåíòîâ äëÿ îòîáðàæåíèÿ
            goto    fire_LSD_A     ;
    fire_LSD_C
            movf    D3,W           ; digit 3, 0..9
            call    LEDTABLE_C     ; get segments D/E/F
            iorwf   PORTC,F        ; put on RC0/RC1/RC5
            goto    display_end    ;
    fire_LSD_A
            movf    D3,W           ; digit 3, 0..9
            call    LEDTABLE_A     ; get segments G/C/B/A
            movwf   PORTA          ; put on RA1/RA2/RA4/RA5
            goto    display_end    ;
    ;
    fire_CSD
            btfss   INDEX,0        ; âûáîð ÷åòâåðêè ñåãìåíòîâ äëÿ îòîáðàæåíèÿ
            goto    fire_CSD_A     ;
    fire_CSD_C
            movf    D2,W           ; digit 2, 0..9
            call    LEDTABLE_C     ; get segments D/E/F
            iorwf   PORTC,F        ; put on RC0/RC1/RC5
            btfss   mode           ; display decimal point? yes, skip, else
            goto    display_end    ; branch (finish up)
            Bank1                  ; äà, çàñâå÷èâàåì òî÷êó âî 2-ì ðàçðÿäå
            movlw   TRIS_C_dot_ON  ; display decimal point
            movwf   TRISC          ; K3/DP pin (RC2) on (output)
            Bank0                  ;
            bsf     coma           ; turn on K3/DP (RC2) anode
            goto    display_end    ; branch (finish up)
    fire_CSD_A
            movf    D2,W           ; digit 2, 0..9
            call    LEDTABLE_A     ; get segments G/C/B/A
            movwf   PORTA          ; put on RA1/RA2/RA4/RA5
            goto    display_end    ;

    fire_MSD
            btfss   INDEX,0        ; âûáîð ÷åòâåðêè ñåãìåíòîâ äëÿ îòîáðàæåíèÿ
            goto    fire_MSD_A     ;
    fire_MSD_C
            movf    D1,W           ; digit 1, 0..9
            call    LEDTABLE_C     ; get segments D/E/F
            iorwf   PORTC,F        ; put on RC0/RC1/RC5
            btfsc   mode           ; display decimal point? yes, skip, else
            goto    display_end    ; branch (finish up)
            Bank1                  ; äà, çàñâå÷èâàåì òî÷êó âî 2-ì ðàçðÿäå
            movlw   TRIS_C_dot_ON  ; display decimal point
            movwf   TRISC          ; K3/DP pin (RC2) on (output)
            Bank0                  ;
            bsf     coma           ; turn on K3/DP (RC2) anode
            goto    display_end    ;
    fire_MSD_A
            movf    D1,W           ; digit 1, 0..9
            call    LEDTABLE_A     ; get segments G/C/B/A
            movwf   PORTA          ; put on RA1/RA2/RA4/RA5
            goto    display_end    ;
    ;
    display_end
            incf    INDEX,F        ; bump index 0..5 -> 1..6
            RETLW   0              ;
     
    Quite a few changes are necessary. I have not looked at the single digit LED 'A' / 'V' display, yet. More later...

    Cheerful regards, Mike
     
    Last edited: May 19, 2017
    • Like Like x 1
  15. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India

    But how I convert it to Common Anode?

    Thanks You.
     
  16. Mike - K8LH

    Mike - K8LH Well-Known Member

    Joined:
    Jan 22, 2005
    Messages:
    3,637
    Likes:
    109
    Location:
    Michigan, USA
    Here's my untested first attempt (below). Caveat... There may be errors... I have not had a chance to see if it even assembles correctly.

    All of the changes are in the "DISPLAY" section (the two LED segment tables are unchanged).

    More later. Mike...
    Code (text):
    ;
    ;  display refresh function for Common Anode displays
    ;
    DISPLAY
            movlw   b'00100011'     ; anodes K1(RC4),K2(RC3),K3(RC2) off
            movwf   PORTC           ; segments D(RC0),E(RC1),F(RC5) off
            movlw   b'00110110'     ;
            movwf   PORTA           ; segments G(RA1),C(RA2),B(RA4),A(RA5) off
            movlw   TRISC           ;
            movwf   FSR             ; setup indirect access to TRISC
            movlw   b'00000100'     ; K3/DP pin (RC2) off (hi-z)      |b0
            movwf   INDF            ; trisc = '00000100' RC2 input    |b0
    ;
    ;  select and display digit 1, 2, or 3 based on INDEX 0..5
    ;
            movf    INDEX,W         ; LEDIndex -> W                   |b0
            sublw   .5              ; in range, 0 <= index <= 5?      |b0
            skpc                    ; yes, skip, else                 |b0
            clrf    INDEX           ; reset index to 0                |b0

            btfsc   INDEX,2         ; index 4 or 5? no, skip, else    |b0
            goto    sel_MSD         ; display digit 1                 |b0
            btfsc   INDEX,1         ; index 2 or 3? no, skip, else    |b0
            goto    sel_CSD         ; display digit 2                 |b0

    sel_LSD
            movlw   b'00000000'     ; K3/DP (RC2) pin 'output'        |b0
            movwf   INDF            ; trisc = '00000000' RC2 output   |b0
            bsf     DIGIT_3         ; active hi DIGIT_3 (RC2) 'on'    |b0
            btfss   INDEX,0         ;
            goto    fire_LSD_A      ;
    fire_LSD_C
            movf    D3,W            ; digit 3, 0..9                   |b0
            call    LEDTABLE_C      ; get segments D/E/F              |b0
            xorwf   PORTC,F         ; clr active lo D/E/F segments    |b0
            goto    display_end     ;
    fire_LSD_A                      ;
            movf    D3,W            ; digit 3, 0..9                   |b0
            call    LEDTABLE_A      ; get segments G/C/B/A            |b0
            xorwf   PORTA,F         ; clr active lo G/C/B/A segments  |b0
            goto    display_end     ;

    sel_CSD
            bsf     DIGIT_2         ; active hi DIGIT_2 (RC3) 'on'    |b0
            btfss   INDEX,0         ;
            goto    fire_CSD_A      ;
    fire_CSD_C                      ;
            movf    D2,W            ; digit 2, 0..9                   |b0
            call    LEDTABLE_C      ; get segments D/E/F              |b0
            xorwf   PORTC,F         ; clr active lo D/E/F segments    |b0
            btfsc   mode            ; dec pt? no, skip, else          |b0
            bcf     INDF,2          ; trisc = '00000000' RC2 output   |b0
            goto    display_end     ; branch (finish up)
    fire_CSD_A
            movf    D2,W            ; digit 2, 0..9                   |b0
            call    LEDTABLE_A      ; get segments G/C/B/A            |b0
            xorwf   PORTA,F         ; clr active lo G/C/B/A segments  |b0
            goto    display_end     ;

    sel_MSD
            bsf     DIGIT_1         ; active hi DIGIT_1 (RC4) 'on'    |b0
            btfss   INDEX,0         ;
            goto    fire_MSD_A      ;
    fire_MSD_C                      ;
            movf    D1,W            ; digit 1, 0..9                   |b0
            call    LEDTABLE_C      ; get segments D/E/F              |b0
            xorwf   PORTC,F         ; clr active lo D/E/F segments    |b0
            btfss   mode            ; dec pt? no, skip, else          |b0
            bcf     INDF,2          ; trisc = '00000000' RC2 output   |b0
            goto    display_end     ;
    fire_MSD_A
            movf    D1,W            ; digit 1, 0..9                   |b0
            call    LEDTABLE_A      ; get segments G/C/B/A            |b0
            xorwf   PORTA,F         ; clr active lo G/C/B/A segments  |b0

    display_end
            incf    INDEX,F         ; bump index 0..5 -> 1..6
            retlw   0               ;
     
     

    Attached Files:

    Last edited: May 20, 2017
  17. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    Thanks MIKE...

    Its really amaze me... Thank you so much.

    Your code working very correct.. Thanks for the complete code.. I will study your code for my future use.... Thanks again.... Chears..
     
    Last edited: May 20, 2017
  18. Mike - K8LH

    Mike - K8LH Well-Known Member

    Joined:
    Jan 22, 2005
    Messages:
    3,637
    Likes:
    109
    Location:
    Michigan, USA
    Good. Happy to help. Please post a picture of your project and don't be afraid to hit the 'like' button on my post...

    Cheerful regards, Mike

    <added>
    I combined the <avmeter.h> and the <avmeter(ca).asm> files into a single file called AVMeter_CA.asm, attached below...
     

    Attached Files:

    Last edited: May 20, 2017
    • Like Like x 1
  19. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    Thanks a Lot Mike...

    will post a picture of my project latter when I finish my work...

    Again Thanks a Lot.. and I hope your help in future....


    God bless you Friend. Chears!!
     
  20. manoj soorya

    manoj soorya Member

    Joined:
    Aug 23, 2014
    Messages:
    238
    Likes:
    4
    Location:
    India
    Mike One problem, I detect..

    In your programme, Last Digit, segment 'd' and 'f' have some error.. But Proteus simulation is 100% OK....

    Please check your code again...

    Thanks you..
     
    Last edited: May 20, 2017
  21. Mosaic

    Mosaic Well-Known Member

    Joined:
    Jun 3, 2010
    Messages:
    2,568
    Likes:
    128
    Location:
    Caribbean
    manoj: send me the proteus sim file and the asm code u have, zipped..i can do a check on the timings.
     
    • Like Like x 1

Share This Page