Continue to Site

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.

  • 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.

Migrating 16c57 to 16F57

Status
Not open for further replies.

j_norrie

New Member
Can anyone suggest the quickest way to convert .ASM or OBJ (INHX16) files for the pic 16C57 microcontroller to the 16F57 newer flash version. The files
.obj were originally created in PICCALC and programmed using the PICPLUS programmer which uses INHX16 .obj files which MPLABS does not support.

Any suggestions would be greatly appreciated.

:)
 
This a listing of the first part of the program up to the goto main
I have to configure the programmer for protect or no protect , watchdog or no watchdog, rc or xl or not.
thanks for your help.

john
;
LIST F=INHX16,P=16C57 ;

; GPF Bank 00 memory 00 -1F
PC equ .02 ; Program Counter
FLAREG equ .03 ; Flag register - DC,Z,C
FSR equ .04 ; File Select Register
PORTA equ .05 ;
PORTB equ .06 ; PORT allocations
PORTC equ .07 ;
VAL1 equ .08 ;
VAL2 equ .09 ;
HBYTE equ .10 ; HI byte of ICL7109 A/D
LBYTE equ .11 ; LO byte of ICL7109 A/D
REG1 equ .12 ;
REG2 equ .13 ;
REG3 equ .14 ; Registers for Digital
REG4 equ .15 ; Display ( REG1-5 )
REG5 equ .16 ;
TEMPST equ .17 ; Temporary Store
DATREG equ .18 ; Location for DATA output
COUNT1 equ .19 ; Counter 1
COUNT2 equ .20 ; Counter 2
STORE1 equ .21 ; Zero Hi Byte store
STORE2 equ .22 ; Zero Lo Byte store
DRIFTC equ .23 ; Drift Counter
ACT1 equ .24 ; Locations where Analogue
ACT2 equ .25 ; inputs kept thro program.
GENR1 equ .26 ; General Scratch Pad
GENR2 equ .27 ; Registers

; GPF Bank 01 memory 30 -3F
INP1 equ .48 ; Storage addresses for Digital
INP2 equ .49 ; Scale inputs used to determime
INP3 equ .50 ; Range of Meter. ( INP1-4 )
INP4 equ .51 ;
REG6 equ .52 ; REG6 - 9 used in Scaling
REG7 equ .53 ; Calculation.
REG8 equ .54 ;
REG9 equ .55 ;
ACCaHI equ .56 ;
ACCaLO equ .57 ;
ACCcHI equ .58 ; ACC..... registers for 16 bit division
ACCcLO equ .59 ;
ACCdHI equ .60 ;
ACCdLO equ .61 ;
MULCND equ .62 ; MUL..... registers for 8 bit multiplication
MULPLR equ .63 ;
;
SIGNED equ 0
ZVAL equ .21
;
org 00
goto MAIN
 
That's JUST the header, you only have one program line (goto), and that doesn't tell us anything about what the assembler uses. The header section is easily used in MPASM though.
 
Hi again, I have been looking at the include file for the 16F57 and changing the equ names throughout the ASM file to suit the include file. I will then remove these from the ASM file header. Have look at the rest of the program and see what you think.

thanks again john
; Standard Programmable
; L.E.D. Panel Meter - Ranges 0000 -9999

; GPF Bank 00 memory 00 -1F
PCL equ .02 ; Program Counter
STATUS equ .03 ; Flag register - DC,Z,C
INDF equ 0
GATHER nop ; Get Input from A/D ICL7109
movlw 07 ; Bin 0000 0111
nop
movwf PORTB ; CE/LOAD
movlw 0F ; Bin 0000 1111
nop
movwf PORTB ; RUN/HOLD
LP1 nop
btfss PORTB,4 ; Test Status ( Is 1 ?)
goto LP1 ; No - Loop
LP2 nop ;
btfsc PORTB,4 ; Test Status ( Is 0 ?)
goto LP2 ; No - Loop
NEXT nop ;
movlw 0D ; Bin 1101
movwf PORTB ; Enable Lower Byte
movf PORTC,w ; Load W reg
movwf LBYTE ; Load Lower Byte
movwf ACT2 ; Actual Signal as seen by A/D
movlw 0B ; Bin 1011
movwf PORTB ; Enable High byte
movf PORTC,w ; Load W reg
andlw 3F ; Mask bits 0-5
movwf TEMPST ;
btfsc TEMPST,4 ; Test Polarity
incf REG5 ; Polarity Digit -ve
nop
btfsc TEMPST,5 ; Test for Overload
bsf DATREG,0
movlw 0F ;
andwf TEMPST,w ; Mask bits 0-3
movwf HBYTE ; Load Nibble
movwf ACT1 ; Actual Signal as seen by A/D
movlw 2F ; Bin 0010 1111
movwf PORTB ;
retlw 0
;
LTABLE addwf PCL ; Look-up table for LED
retlw 080 ; character 0
retlw 0F3 ; " " 1
retlw 048 ; " " 2
retlw 060 ; " " 3
retlw 032 ; " " 4
retlw 024 ; " " 5
retlw 004 ; " " 6
retlw 0F0 ; " " 7
retlw 000 ; " " 8
retlw 020 ; " " 9
retlw 07E ; " " -
retlw 0FE ; " " Blank
retlw 08E ; " " L
retlw 010 ; " " A
retlw 042 ; " " d
retlw 00C ; " " E ; NOT REVERSED POSSIBLY
retlw 05E ; " " r
retlw 018 ; " " P
retlw 046 ; " " o
retlw 012 ; " " H
;
;
;
MPYS clrf VAL1 ; Multiplication Subroutine
clrf VAL2
movlw 8
movwf ACCaLO
movf MULCND,w
bcf STATUS,0
LOOPA rrf MULPLR
btfsc STATUS,0
addwf VAL1
rrf VAL1
rrf VAL2
decfsz ACCaLO
goto LOOPA
retlw 0
;
B2_BCD bcf STATUS,0 ; BCD Conversion Subroutine
movlw .16
movwf COUNT1
clrf REG1
clrf REG2
clrf REG3
LOOP16 rlf LBYTE
rlf HBYTE
rlf REG1
rlf REG2
rlf REG3
decfsz COUNT1
goto ADJDEC
movlw 00F ; Mask and seperate No. into Registers
andwf REG1,w
movwf REG4 ; LS Digit
movlw 0F0
andwf REG1,w
movwf REG3
swapf REG3,w
movwf REG3
movlw 0F0
andwf REG2,w ; MS Digit
movwf REG1
swapf REG1,w
movwf REG1
movlw 00F
andwf REG2,w
movwf REG2
retlw 0
;
ADJDEC movlw REG3
movwf FSR
call ADJBCD
movlw REG2
movwf FSR
call ADJBCD
movlw REG1
movwf FSR
call ADJBCD
goto LOOP16
;
ADJBCD movlw 3
addwf 0,w
movwf MULCND
btfsc MULCND,3
movwf 0
movlw 30
addwf 0,w
movwf MULCND
btfsc MULCND,7
movwf 0
retlw 0
;
;
Ddivs ; Division Subroutine
IF INDF
call SSIGN
ENDIF
movlw .16
movwf MULCND
movf VAL1,w
movwf ACCdHI
movf VAL2,w
movwf ACCdLO
clrf VAL1
clrf VAL2
clrf ACCcHI
clrf ACCcLO
DLOOP bcf STATUS,0
rlf ACCdLO
rlf ACCdHI
rlf ACCcLO
rlf ACCcHI
movf ACCaHI,w
subwf ACCcHI,w
btfss STATUS,2
goto NOCHK
movf ACCaLO,w
subwf ACCcLO,w
NOCHK btfss STATUS,0
goto NOGO
movf ACCaLO,w
subwf ACCcLO
btfss STATUS,0
decf ACCcHI
movf ACCaHI,w
subwf ACCcHI
bsf STATUS,0
NOGO rlf VAL2
rlf VAL1
decfsz MULCND
goto DLOOP
;
IF INDF
btfss SIGN,7
retlw 0
goto NEGA
ELSE
retlw 0
ENDIF
;
;
;
;
;
;
;
;
;
NEGA comf ACCaLO
incf ACCaLO
btfsc STATUS,2
decf ACCaHI
comf ACCaHI
retlw 0
;
IF INDF
;
SSIGN movf ACCaHI,w
xorwf VAL1,w
movwf SIGN
btfss ACCaHI,7
goto CHEKA
;
comf VAL2
incf VAL2
btfsc STATUS,2
decf VAL1
comf VAL1
;
CHEKA btfss ACCaHI,7
retlw 0
goto NEGA
;
ENDIF
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
MAIN clrf 05 ; Initial Setup
clrf 06 ;
clrf 07 ;
clrwdt ; Clear watchdog
clrf 1 ;
movlw 00F ;
option ; Load option
clrw ;
tris PORTA ; Config PortA
movlw 050 ;
tris PORTB ; Config PortB
movlw 0FF ;
tris PORTC ; Config PortC
RANGE movlw 0B0 ; Change Page of FSR
movwf FSR ; to Bank 01
movlw 021 ;
movwf PORTB ; Enable Latch1
movf PORTC,w ;
; movlw 21
movwf INP1 ; Load Unit,tenth No.s
movlw 024 ;
movwf PORTB ; Enable Latch2
movf PORTC,w ;
; movlw 12
movwf INP2 ; Load Hundredth,thousandth No.s
movlw 2F
movwf PORTB
movlw 00F ; Mask and seperate No. into Registers
andwf INP1,w ;
movwf INP4 ; LS Digit
movlw 0F0 ;
andwf INP1,w ;
movwf INP3 ;
swapf INP3,w ;
movwf INP3 ;
movlw 030 ;
andwf INP2,w ; MS Digit
movwf INP1 ;
swapf INP1,w ;
movwf INP1 ;
movlw 00F ;
andwf INP2,w ;
movwf INP2 ;
; movlw 0C
; andwf INP1,w ;
; andlw 0C ;
; movwf VAL1 ;
; rrf VAL1 ;
; rrf VAL1 ;
; movf INP1,w ;
; andlw 03 ;
; movwf INP1 ;
bsf PORTB,7 ; LED Display Off
; call DELAY ;
call DELAY ;
bcf PORTB,7 ; LED Display On
; movlw 0F
; movwf HBYTE
; movlw 0FE
; movwf LBYTE
movf INP1,w
movwf REG1
movf INP2,w
movwf REG2
movf INP3,w
movwf REG3
movf INP4,w
movwf REG4
movlw 090
movwf FSR
clrf STORE1
clrf STORE2
goto TRY
; movlw 090 ; Change Page of FSR
; movwf FSR ; to Bank 00
; movlw 00
; movwf DATREG
; goto PED
;
GET movlw 0B0
movwf FSR
movf INP1,w ;
andlw 0C ;
movlw 0C
movwf VAL1 ;
rrf VAL1 ;
rrf VAL1 ;
movlw 01
addwf VAL1
; movlw 02
; movwf VAL1
movlw 090 ; Change Page of FSR
movwf FSR ; to Bank 00
clrw
movwf DATREG
movlw 0A ;
movwf REG5 ;
call GATHER ; Get A/D 12 Bit input
movf 090
movwf FSR
; movlw 07
; movwf HBYTE
; movwf ACT1
; movlw 044
; movwf LBYTE
; movwf ACT2
; movlw 0F ;
; andwf HBYTE,w ;
movlw 021 ;
movwf PORTB ; Enable Latch2
movf PORTC,w ;
movwf TEMPST
movlw 02F
movwf PORTB
movlw 0C0
andwf TEMPST,w
; btfss STATUS,2
; goto ZERO
; goto SUBT
PED movlw 0F
andwf HBYTE
movlw 0B0 ; Change Page of FSR
movwf FSR ; to Bank 01
; movf INP1,w
; movwf REG1
; movf INP2,w
; movwf REG2
; movf INP3,w
; movwf REG3
; movf INP4,w
; movwf REG4
; movlw 090
; movwf FSR
; goto TRY
movf INP1,w ; Calculation
movwf MULPLR ; x UNIT
movf LBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL1,w ;
addwf REG1 ;
movf VAL2,w ;
addwf REG2 ;
movf INP1,w ; x UNIT
movwf MULPLR ;
movf HBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL2,w ;
LZ1 addwf REG1 ;
;
movf INP2,w ; x 0.1
movwf MULPLR ;
movf LBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL1,w ;
addwf REG3 ;
movf VAL2,w ;
addwf REG4 ;
movf INP2,w ; x 0.1
movwf MULPLR ;
movf HBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL2,w ;
addwf REG3 ;
movlw 000 ; Division by 10 ($000A)
movwf ACCaHI ;
movlw 00A ;
movwf ACCaLO ;
movf REG3,w ; Load Result x0.1 (REG3,REG4)
movwf VAL1 ;
movf REG4,w ;
movwf VAL2 ;
call Ddivs ; Call 16-Bit Division Sub.
movf VAL1,w ;
movwf REG3 ;
movf VAL2,w ;
LZ2 movwf REG4 ;
;
movf INP3,w ; x 0.01
movwf MULPLR ;
movf LBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL1,w ;
addwf REG6 ;
movf VAL2,w ;
addwf REG7 ;
movf INP3,w ; x 0.01
movwf MULPLR ;
movf HBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL2,w ;
addwf REG6 ;
movlw 000 ; Division by 100 ($064)
movwf ACCaHI ;
movlw 064 ;
movwf ACCaLO ;
movf REG6,w ; Load Result x4 (REG3,REG4)
movwf VAL1 ;
movf REG7,w ;
movwf VAL2 ;
call Ddivs ; Call 16-Bit Division Sub.
movf VAL1,w ;
movwf REG6 ;
movf VAL2,w ;
LZ3 movwf REG7 ;
;
movf INP4,w ; x 0.001
movwf MULPLR ;
movf LBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL1,w ;
addwf REG8 ;
movf VAL2,w ;
addwf REG9 ;
movf INP4,w ; x 0.001
movwf MULPLR ;
movf HBYTE,w ;
movwf MULCND ;
call MPYS ; Call 8-Bit Multiplication Sub.
movf VAL2,w ;
addwf REG8 ;
movlw 003 ; Division by 1000 ($03E8)
movwf ACCaHI ;
movlw 0E8 ;
movwf ACCaLO ;
movf REG8,w ; Load Result x4 (VAL3,VAL4)
movwf VAL1 ;
movf REG9,w ;
movwf VAL2 ;
call Ddivs ; Call 16-Bit Division Sub.
movf VAL2,w ;
LZ4 movwf REG9 ;
;
movf REG9,w ; Total Addition
addwf REG7 ; of REG1 - REG9
btfsc STATUS,0 ; giving Calculated
incf REG6 ; Value of Analogue
movf REG7,w ; Input x Scale.
addwf REG4 ;
btfsc STATUS,0 ;
incf REG3 ;
movf REG6,w ;
addwf REG3 ;
movf REG4,w ;
addwf REG2 ;
btfsc STATUS,0 ;
incf REG1 ;
movf REG3,w ;
addwf REG1 ;
movf REG1,w ;
movwf HBYTE ;
movf REG2,w ;
movwf LBYTE
movlw 090 ; Change Page of FSR
movwf FSR ; to Bank 00
call B2_BCD ; Change to BCD Format
TRY clrf 1
movlw 0F
option
clrf COUNT2
goto DISPLY ; Display
;
;
DIGIT decfsz COUNT2 ; Which Digit to Output
goto SB2
movf REG4,w ; Digit 1
goto J4
SB2 decfsz COUNT2
goto SB3
movf REG3,w ; Digit 10
goto J4
SB3 decfsz COUNT2
goto SB4
movf REG2,w ; Digit 100
goto J4
SB4 decfsz COUNT2
goto SB5
movf REG1,w ; Digit 1000
goto J4
SB5 movf REG5,w ; Digit Polarity
goto J4
;
;
;
DISPLY bsf PORTA,0 ; bit 0 - Data +VE
nop
bsf PORTA,1 ; bit 1 - Clock (+VE)
call DELAY
bcf PORTA,1 ; bit 1 - Clock (-VE)
nop
bcf PORTA,0 ; bit 0 - Data -VE
movlw .5 ; 5 times
movwf 0B ; w into F11
btfsc DATREG,0 ;
goto OLOAD ;
B movf 0B,w ;
movwf COUNT2 ;
movlw .7 ; number times loop
movwf COUNT1 ; place w in Counter
goto DIGIT
J4 call LTABLE ; Goto Look-up Table
movwf DATREG ; Value to output to L.E.D.
rrf DATREG ;
clrf 1
movlw 0F
option
goto LOOPX ;
J1 decfsz 0B ; Digit Counter -1
goto B ; Next digit No.
clrf REG1 ; If 0 then next Reading
clrf REG2 ;
clrf REG3 ;
clrf REG4 ; Clear Registers
clrf DATREG ;
clrf VAL1 ;
clrf VAL2 ;
movlw 0B0 ; Change Page Bank
movwf FSR ; to 01
clrf REG6 ;
clrf REG7 ;
clrf REG8 ;
clrf REG9 ;
goto GET ;
;
;
;
;
;
LOOPX rrf DATREG ; Shift Data
btfss 3,0 ; Test Carry(1 if skip)
goto A ; Subroutine
nop
bsf PORTA,0 ; Send 1 out
nop
J3 bsf PORTA,1 ; bit 1 - Clock (+VE)
call DELAY
bcf PORTA,1 ; bit 1 - Clock (-VE)
decfsz COUNT1 ; 7 times?
goto LOOPX ; Loop
goto J1 ; If 7 next Digit
nop
A bcf PORTA,0 ; Send 0 out
goto J3
;
OLOAD movlw 0B ; Overload
movwf REG5
movlw 00
movwf REG1
movlw 0C
movwf REG2
movlw 0E
movwf REG3
movlw 0E
movwf REG4
goto B
;
ZERO movf HBYTE,w ; Make current Analogue Value Zero
movwf STORE1 ;
movf LBYTE,w ;
movwf STORE2 ;
SUBT movf STORE2,w ; Subtract Zero Value from Input
movwf GENR2
movf STORE1,w
movwf GENR1
comf GENR2
incf GENR2 ; 2s complement Lo Byte Zero
btfsc STATUS,2
decf GENR1
comf GENR1 ; 2s complement Hi Byte Zero
movf GENR2,w
addwf LBYTE
btfss STATUS,0 ; Check Carry
goto BOB
incf HBYTE
BOB movf GENR1,w
andlw 00F
addwf HBYTE
btfsc STATUS,2
bsf HBYTE,4
btfss HBYTE,4
goto MINUS
goto AUTOZ

MINUS movlw 0F ; If Input < Zero value negate
andwf HBYTE
movlw 0A
movwf REG5
comf LBYTE
incf LBYTE
btfsc STATUS,2
decf HBYTE
comf HBYTE
nop
nop
goto AUTOZ
;
AUTOZ movlw 0F
andwf HBYTE
movf HBYTE,w ; Autozero Routine
andlw 00F
btfss STATUS,2 ; Is HBYTE = 0 ?
goto PED ; No
movlw 006 ; Yes
nop
nop
nop
subwf LBYTE,w ;
btfss STATUS,0 ; Is LBYTE < 6 ?
goto PED ; No
movlw 015 ;
subwf DRIFTC,w ;
btfss STATUS,0 ; Is The Amp Drifting
goto AZ1 ;
clrw ;
movwf DRIFTC ; Clear Drift Counter
movf ACT1,w ; Re-Zero with the
movwf STORE1 ; actual Analogue
movf ACT2,w ; input value
movwf STORE2 ;
goto PED
AZ1 incf DRIFTC ; +1 Counter
btfss STATUS,0 ;
goto PED ;
nop
goto PED
;
org 7FF

goto MAIN
END
 
16c57c to 16f57 migration complete

Thanks for the assistance. I have now programmed a PIC16F57 with the PIC16C57 code and it works ! . I had to make few minor alterations. Mplabs did not like the the way the hex addresses were written, I had to add an h behind these to let it know they were hex, I also had to change some of the symbol names but all in all after a few builds it is now working ok.
I have now got a few other files to convert.

Many thanks again John
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top