Jag råkade googla fram ett mycket liknande problem: https://www.microchip.com/forums/m1076720.aspxsäter skrev:Hur tänkte du här?
Edit: citerar regelstridigt föregående inlägg, eftersom det blev sidbyte i tråden.
Jag råkade googla fram ett mycket liknande problem: https://www.microchip.com/forums/m1076720.aspxsäter skrev:Hur tänkte du här?
Kod: Markera allt
**************************************************************
.RF !! NEW FENCED AREA
**************************************************************
.BC
!! NOT THE REAL ONE !!
* COMMANDS
*CMDTAB BRI ADD PCL,A DON'T USE, SILICONE BUG
CMDTAB STZ PCLATH
SMB PCLATH,1
ADD PCL,A
JMP DOEXEC 00 EXECUTE CODE
JMP DORST 01 RESET EXECUTION
JMP PGREAD 02 READ 32B FLASH
JMP PGERAS 03 ERASE 64B FLASH
JMP PGWRIT 04 WRITE 32B FLASH
JMP DUMMY 05
JMP DUMMY 06
JMP TXTEST 07 SEND TEST STRING
JMP LOAD.LOW 08 LOAD LOWER 32
JMP LOAD.HIGH 09 LOAD UPPER 32
JMP READ 0A READ ALL 64
JMP DUMMY 0B OBSOLETED! READ UPPER 32
JMP DUMMY 0C
JMP DUMMY 0D SET TRIS
JMP PORTIO.SET 0E SET PORT
JMP DUMMY 0F GET PORT
* INDIRECT ACTIONS PERFORMED FROM MAIN LOOP
JMP DUMMY 10
JMP PICRES 11 ENTER RESET TO STOP RUN
JMP PICRUN 12 CLEAR RESET TO ALLOW RUN
JMP HVPBEG 13 START HVP
JMP HVPEND 14 END HVP
JMP LVPBEG 15 START LVP
JMP LVPEND 16 END LVP
JMP BULERA 17 BULK ERASE
JMP ROWERA 18 ROW ERASE
JMP PICRD 19 READ DATA
JMP WRTROW 1A WRITE DATA
JMP DUMMY PCONRD 1B READ CONFIG WORDS
JMP DUMMY PCONWR 1C WRITE CONFIG WORDS
JMP PADRIN 1D INC PIC ADR
JMP PASET 1E SET PIC-18 ADDRESS
JMP WRTONE 1F
.EC
PCMD * PIC PROGRAMMING COMMANDS
.LODADR .EQ $80 LOAD A 24-BIT ADR
.INCADR .EQ $F8 INCREMENT ADDRESS +2
.LDATA .EQ $00 LOAD DATA, NO INC
.LDATAI .EQ $02 LOAD DATA, INC ADR +2
.RDATA .EQ $FC READ DATA, NO INC
.RDATAI .EQ $FE READ DATA, INC ADR +2
.FLASHI .EQ $E0 FLASH DATA INTERNALLY TIMED
.FLASHE .EQ $C0 FLASH DATA EXTERNALLY TIMED
.BULERA .EQ $18 BULK ERASE MEMORY
.EP .EQ $82 END PROGRAMMING/ERASE
.ROWERA .EQ $F0 ROW ERASE PROGRAM MEMORY
****** CLEAR PIC DATA BUF
*
CLRPB LOD BS,#TXBUF/128 !BANK
LOD A,#<PBUF PNT AT BUFFER BEGIN
LOD IXLOW,A
LOD A,#>PBUF
LOD IXHIGH,A
LOD A,#32 INIT WORD COUNT
LOD PCOUNT,A
.NEXT LOD A,#0 GET ZERO
LOD (IX)=+,A CLR A WORD
LOD (IX)=+,A
DSZ PCOUNT ALL DONE?
BRA .NEXT DO NXT BT
.DONE RTS DONE
*18FXXXX
****** FLASH PROGRAM MEM
*
WRTROW;
JSR ADROUT PUT ADDRESS
* DO 1:ST BUFFER
LOD BS,#TXBUF/128 !BANK
LOD A,#<PBUF PNT AT BUFFER BEGIN
LOD IXLOW,A
LOD A,#>PBUF
LOD IXHIGH,A
LOD A,#32 INIT WORD COUNT
LOD PCOUNT,A
JSR .BUFOUT PUT FIRST BUFFER
* DO 2:ND BUFFER
LOD BS,#TXBUF/128 !BANK
LOD A,#<PBUF2 PNT AT BUFFER BEGIN
LOD IXLOW,A
LOD A,#>PBUF2
LOD IXHIGH,A
LOD A,#32-1 INIT WORD COUNT, LEAVE LAST
LOD PCOUNT,A
JSR .BUFOUT
* DO LAST WORD
LOD A,#PCMD.LDATA SEND WORD, LEAVE ADDRESS
JSR CMDOUT
JSR DATOUT
JSR FLASHI DO THE FLASH !! INTERNALLY TIMED FOR NOW !!!!
LOD BS,#TXBUF/128 !BANK
LOD A,#128 BUMP ADR
ADD ADR18.LOW,A
LOD A,#0
ADC ADR18.MID,A
ADC ADR18.TOP,A
LOD A,#$77 RETURN CODE
RTS BLOCK DONE
.BUFOUT
LOD A,#PCMD.LDATAI LOAD DATA INTO PIC AND INC
JSR CMDOUT
JSR DATOUT
INC IXLOW
INC IXLOW
LOD BS,#TXBUF/128 !BANK
DSZ PCOUNT
JMP .BUFOUT DO NXT WORD
RTS BUFFER DONE
* 18FXXXX
****** READ MEMORY
*
**RPROG
PICRD; JSR CLRPB CLEAR BUFFER
*HEERE
JSR ADROUT SEND START ADR TO PIC
LOD A,#<PBUF START AT POS 0 IN PBUF
LOD IXLOW,A
LOD A,#>PBUF
LOD IXHIGH,A
LOD BS,#CMDBUF/128 !BANK
LOD A,CMDBUF+CMDBLK.LENGTH GET IENGTH
LOD BS,#TXBUF/128 !BANK
LOD ADR18.LENGTH,A #WORD TO READ
LOD PCOUNT,A
.NXTWRD LOD A,#PCMD.RDATAI GET READ AND INC CMD
JSR CMDOUT SEND CMD
JSR PICIN READ A WORD
INC IXLOW INC BUF^
INC IXLOW
LOD BS,#TXBUF/128 !BANK
DSZ PCOUNT ALL DONE?
BRA .NXTWRD DO NXT WORD
.BC
LOD A,#$55 DEBUG!!!!!
LOD (IX)0,A
LOD A,#$AA
LOD (IX)1,A
.EC
LOD A,ADR18.LENGTH BUMP PIC ADR
ADD A,ADR18.LENGTH DOUBLE FOR WORDS
ADD ADR18.LOW,A
LOD A,#0
ADC ADR18.MID,A
ADC ADR18.TOP,A
LOD A,#$42 RETURN CODE
RTS DONE
****** WRITE BY SINLE WORD FLASHES
*
WRTONE; LOD BS,#TXBUF/128 !BANK
LOD A,#<CMDBUF PNT AT CMDBLK
LOD IXLOW,A
LOD A,#>CMDBUF
LOD IXHIGH,A
LOD A,(IX)CMDBLK.LENGTH GET #WORDS TO WRITE
LOD PCOUNT,A SET WORD COUNTER
JSR ADROUT SET INITIAL ADR
LOD A,#<PBUF START AT POS 0 IN PBUF
LOD IXLOW,A
LOD A,#>PBUF
LOD IXHIGH,A
.NXTWRD LOD A,#PCMD.LDATA LOAD ONE WORD DATA
JSR CMDOUT COMMAND..
JSR DATOUT ..AND DATA
JSR FLASHI FLASH IT
JSR INCADR NXT ADR IN PIC
INC IXLOW NXT IN BUF, NEVER ROLLS OVER
INC IXLOW
LOD BS,#TXBUF/128 !BANK
LOD A,#2 FOLLOW WITH ADR
ADD ADR18.LOW,A
LOD A,#0
ADC ADR18.MID,A
ADC ADR18.TOP,A
DSZ PCOUNT DO NXT WORD
JMP .NXTWRD
LOD A,#$17 RETURN CODE
RTS DONE
****** SET PIC-18 ADDRESS POINTER
*
PASET; LOD BS,#ADR18/128 !BANK
LOD A,#<CMDBUF PNT AT INPUT DATA
LOD IXLOW,A
LOD A,#>CMDBUF
LOD IXHIGH,A
LOD A,(IX)CMDBLK.ADRLOW PUT ADR IN PLACE
LOD ADR18.LOW,A
LOD A,(IX)CMDBLK.ADRMID
LOD ADR18.MID,A
LOD A,(IX)CMDBLK.ADRTOP
LOD ADR18.TOP,A
LOD A,#$AA RETURN CODE
RTS DONE
****** BULK ERASE
*
BULERA;
JSR ADROUT SEND ADDRESS
LOD A,#PCMD.BULERA SEND CMD
JSR CMDOUT
JSR DELAY.10M WAIT FOR COMPLETION
LOD A,#$33 GET RETURN CODE
RTS DONE
****** ROW ERASE
*
ROWERA;
JSR ADROUT SEND ADDRESS
LOD A,#PCMD.ROWERA SEND CMD
JSR CMDOUT
JSR DELAY.TROW WAIT FOR COMPLETION
LOD A,#$34 GET RETURN CODE
RTS DONE
****** INCREMENT ADR
*
INCADR;
LOD A,#PCMD.INCADR INCREMENT ADDRESS BY 1 WORD
JSR CMDOUT SEND AND EXIT
LOD A,#$22 GET RETURN CODE
RTS DONE
****** DO AN INTERNALY TIMED FLASH
*
FLASHI
LOD A,#PCMD.FLASHI START FLASH
JSR CMDOUT
JMP DELAY.TINTFL WAIT AND EXIT
****** DO AN EXTERNALY TIMED FLASH
*
FLASHE
*SEI BLOCK IRQ'S
LOD A,#PCMD.FLASHE START FLASH
JSR CMDOUT
JSR DELAY.TEXTFL !*CRITICAL WAIT*!
LOD A,#PCMD.EP END FLASH
JSR CMDOUT
*CLI
RTS DONE
****** SEND COMMAND TO PIC
* IN: A = COMMAND
*
CMDOUT LOD BS,#TXBUF/128 !BANK
LOD TXBUF.TOP,A PUT DATA TO SHIFT OUT
LOD A,#8 8 BITS DATA
LOD TXBUF.BITCNT,A
JSR PICOUT SEND IT
JMP DELAY.TDLY WAIT AND EXIT
****** SEND ADR TO PIC
* IN = ADR18
*
ADROUT LOD A,#PCMD.LODADR SEND ADDRESS COMMAND
JSR CMDOUT
LOD BS,#TXBUF/128 !BANK
CLF CY CLEAR LOWEST BIT
ROL A=ADR18.LOW GET AND SHIFT UP
LOD TXBUF.LOW,A PUT FOR SHIFT OUT
ROL A=ADR18.MID HIGH BYTE
LOD TXBUF.MID,A
ROL A=ADR18.TOP UPPER BYTE
LOD TXBUF.TOP,A
LOD A,#24 24 BITS DATA
LOD TXBUF.BITCNT,A
JMP PICOUT SEND IT
****** SEND DATA TO PIC
* IN = (IX)
*
DATOUT LOD BS,#TXBUF/128 !BANK
CLF CY CLEAR LOWEST BIT
LOD A,(IX) GET LOW BYTE
ROL AREG SHIFT UP
LOD TXBUF.LOW,A PUT FOR SHIFT OUT
LOD A,(IX)1 HIGH BYTE
ROL AREG
LOD TXBUF.MID,A
STZ AREG CLEAR TOP BYTE
ROL AREG
LOD TXBUF.TOP,A
LOD A,#24 24 BITS DATA
LOD TXBUF.BITCNT,A
JMP PICOUT SEND IT
****** SEND DATA TO PIC
* IN: TXBUF = DATA SHIFTED TO THE RIGHT POS, TXBUF.BITCNT = #BT
*
PICOUT
.NXT LOD BS,#FLAT/128 !BANK
LOD A,LATC GET OUTPUTS
RMB AREG,3 CLEAR DATA BIT ASSUMING ZERO
LOD BS,#TXBUF/128 !BANK
ROL TXBUF.LOW SHIFT OUT DATA BIT
ROL TXBUF.MID
ROL TXBUF.TOP
SFC CY IS IT A ONE?
SMB AREG,3 YES-SET IT
LOD BS,#FLAT/128 !BANK
LOD LATC,A SET DATA BIT
SEF FLAT.CLOCK WIGGLE PGC
JSR DELAY.TBIT
LOD BS,#FLAT/128 !BANK
CLF FLAT.CLOCK
JSR DELAY.TBIT
LOD BS,#TXBUF/128 !BANK
DSZ TXBUF.BITCNT DO NXT BIT
JMP .NXT
LOD BS,#FLAT/128 !BANK
CLF FLAT.DATA SOME MAGIC? LEAVE PGD AS LOW
RTS DONE
*.DATA .EQ FPORT*8+3 0 16 RC0 DATA
*.STEPUP .EQ PORTA*8+5 1 15 RC1 0=STEP-UP ON
*.RESET .EQ FPORT*8+5 2 14 RC2 1=RESET
*.HVON .EQ FPORT*8+4 3 9 RC7 1=HV ON
*.CLOCK .EQ PORTA*8+4 4 8 RC6 CLOCK
****** GET DATA FROM PIC
* OUT: (IX)
*
PICIN
LOD BS,#TXBUF/128 !BANK
LOD A,#24 24 BITS
LOD TXBUF.BITCNT,A
LOD BS,#FTRIS/128 !BANK
SEF FTRIS.DATA SET INPUT MODE
.NXT LOD BS,#FLAT/128 RISE CLK
SEF FLAT.CLOCK
JSR DELAY.TBIT WAIT
LOD BS,#FPORT/128 !BANK
LOD A,FPORT GET PORT
ROR AREG DATA BIT INTO CY
ROR AREG
ROR AREG
ROR AREG
LOD BS,#TXBUF/128 !BANK
ROL TXBUF.LOW SHIFT IN DATA BIT
ROL TXBUF.MID
ROL TXBUF.TOP
LOD BS,#FLAT/128 !BANK
CLF FLAT.CLOCK LOWER CLK
JSR DELAY.TBIT WAIT
LOD BS,#TXBUF/128 !BANK
DSZ TXBUF.BITCNT DO NXT BIT
JMP .NXT
LOD BS,#FTRIS/128 !BANK
CLF FTRIS.DATA BACK TO OUTPUT MODE
LOD BS,#TXBUF/128 !BANK
ROR A=TXBUF.TOP GET TOP BIT
ROR A=TXBUF.MID GET HIGH BYTE
LOD (IX)1,A PUT HIGH BYTE
ROR A=TXBUF.LOW LOW BYTE
LOD (IX)0,A
.BC !!FOR DEBUG
LOD BS,#TXBUF/128 !BANK
LOD A,TXBUF.TOP GET TOP BIT
LOD (IX)2,A
LOD A,TXBUF.MID GET HIGH BYTE
LOD (IX)1,A PUT HIGH BYTE
LOD A,TXBUF.LOW LOW BYTE
LOD (IX)0,A
.EC
RTS DONE
.BC
* PORT PIN FOR PIC FLASHER
FPORT .EQ PORTC
* I/O PIN PORT
.DATA .EQ FPORT*8+0 01 0 16 RC0 DATA
.STEPUP .EQ FPORT*8+1 02 1 15 RC1 1=STEP-UP ON
.RESET .EQ FPORT*8+2 04 2 14 RC2 1=RESET
.HVON .EQ FPORT*8+7 80 3 9 RC7 1=HV ON
.CLOCK .EQ FPORT*8+6 40 4 8 RC6 CLOCK
.EC
****** INIT PORT AND OUTPUTS, BEGIN LVPMODE
*
LVPBEG; LOD BS,#FLAT/128 ENSURE INIT CONDITIONSS
SEF FLAT.RESET RESET
CLF FLAT.DATA PGC/PGD LOW
CLF FLAT.CLOCK
CLF FLAT.HVON NO HV
SEF FLAT.STEPUP
LOD BS,#FTRIS/128
SEF FTRIS.DATA FLOAT PGC/PGD
SEF FTRIS.CLOCK
CLF FTRIS.RESET ENSURE AS OUTPUTS
CLF FTRIS.HVON
CLF FTRIS.STEPUP
JSR DELAY.10M WAIT A LITTLE
LOD BS,#FLAT/128 GIVE PIC A FRESH RESET
CLF FLAT.RESET RELEASE RESET
JSR DELAY.10M WAIT, START TIMER WON'T EXPIRE
LOD BS,#FLAT/128
SEF FLAT.RESET BACK TO RESET
JSR DELAY.1M SOME WAIT
LOD BS,#FTRIS/128 PGC/PGD AS OUTPUTS
CLF FTRIS.CLOCK
CLF FTRIS.DATA
JSR DELAY.1M WAIT A LITTLE
LOD A,#'M SEND KEYWORD
JSR CMDOUT
LOD A,#'C
JSR CMDOUT
LOD A,#'H
JSR CMDOUT
LOD A,#'P
JSR CMDOUT
JSR DELAY.10M SOME WAIT
LOD A,#$A6 EXIT CODE
RTS DONE
****** EXIT LVP PROGRAMMING MODE
*
LVPEND; JSR DELAY.10M WAIT-JUST IN CASE
LOD BS,#FLAT/128
CLF FLAT.HVON ENSURE NO HV
SEF FLAT.STEPUP
LOD BS,#FTRIS/128 TRISTATE PGC AND PGD
SEF FTRIS.DATA
SEF FTRIS.CLOCK
NOP
NOP
LOD BS,#FLAT/128
CLF FLAT.RESET RELEASE RESET TO EXIT LVP
JSR DELAY.10M 10 MILLISEC, START TIMER WON'T EXPIRE
LOD BS,#FLAT/128
SEF FLAT.RESET BACK TO RESET
LOD A,#$5A GET RETURN VALUE
RTS DONE
****** INIT PORT AND OUTPUTS FOR PROGRAMMING, BEGIN HVPMODE
*
HVPBEG; LOD BS,#FLAT/128 INIT PORT
SEF FLAT.RESET RESET OUT PULLED LOW
CLF FLAT.DATA INIT TO ZERO
CLF FLAT.CLOCK INIT TO ZERO
CLF FLAT.HVON SET OFF
SEF FLAT.STEPUP SET OFF
LOD BS,#FTRIS/128 SET I/O
CLF FTRIS.RESET ENSURE AS OUTPUTS
CLF FTRIS.HVON
CLF FTRIS.STEPUP
JSR DELAY.10M GIVE RESET SOME TIME
CLF FTRIS.DATA DATA. CLOCK AS OUTPUTS
CLF FTRIS.CLOCK
LOD BS,#FLAT/128
CLF FLAT.STEPUP START STEPUP
JSR DELAY.100M WAIT FOR IT TO BUILD UP VOLTAGE
JSR DELAY.100M
LOD BS,#FLAT/128
SEF FLAT.HVON TURN ON HV
NOP
NOP
CLF FLAT.RESET RELEASE RESET INTO VPP
JSR DELAY.10M WAIT
LOD A,#$A5 EXIT CODE
RTS DONE
****** EXIT HVP PROGRAMMING MODE
*
HVPEND; JSR DELAY.10M WAIT-JUST IN CASE
LOD BS,#FLAT/128
SEF FLAT.RESET PULL RESET DIRECTLY FROM VPP
CLF FLAT.HVON TURN OFF HV
SEF FLAT.STEPUP STOP STEPUP
JSR DELAY.10M GIVE IT SOME TIME
LOD BS,#FTRIS/128 TRISTATE PGC AND PGD
SEF FTRIS.DATA
SEF FTRIS.CLOCK
LOD A,#$5A EXIT CODE
RTS DONE
TESTIT;
LOD BS,#FLAT/128
.NXT SEF FLAT.CLOCK
CLF FLAT.DATA
JSR DELAY.TBIT
CLF FLAT.CLOCK
SEF FLAT.DATA
JSR DELAY.TBIT
JMP .NXT
****** DELAYS
*
DELAY
.TDLY JMP .5U BETWEEN CMD AND DATA
.TBIT JMP .50U PGC HIGH/PGC LOW, DO IT SLOW
.TBULK JMP .100M BULK ERASE
.TROW JMP .5M ROW ERASE
.TINTFL JMP .10M INT TIMED FLASH
.TEXTFL JMP .1M EXT TIMED FLASH, SHORTEST POSSIBLE
.50U * 5 MICROSECONDS, MAKE IT 6 TO BE SURE
LOD A,#50*12/4 TIME*SPEED/LOOPLENGTH
.50U0 DSZ AREG DO DELAY LOOP
JMP .50U0
RTS DONE
.5U * 5 MICROSECONDS, MAKE IT 6 TO BE SURE
LOD A,#6*12/4 TIME*SPEED/LOOPLENGTH
.5U0 DSZ AREG DO DELAY LOOP
JMP .5U0
RTS DONE
.1U * 1 MICROSECOND
LOD A,#1*12/4 TIME*SPEED/LOOPLENGTH
.1U0 DSZ AREG DO DELAY LOOP
JMP .1U0
RTS DONE
.5M *
LOD A,#118 5 000US / 42.7US = #LOOPS OF IRQ TIMER
LOD TIMER,A
.5M0 TFZ TIMER WAIT FOR IT TO EXPIRE
SFS Z
JMP .5M0
RTS DONE
.10M *
LOD A,#235 10 000US / 42.7US = #LOOPS OF IRQ TIMER
STZ TIMER START TIMER
DEC TIMER
.10M0 TFZ TIMER WAIT FOR IT TO EXPIRE
SFS Z
JMP .10M0
RTS DONE
.100M * 100 MILLISECONDS
JSR .10M DO 10 * A0 MILLISECONDS
JSR .10M
JSR .10M
JSR .10M
JSR .10M
JSR .10M
JSR .10M
JSR .10M
JSR .10M
JMP .10M
.1M LOD A,#22
LOD TIMER,A
.1M0 TFZ TIMER WAIT FOR IT TO EXPIRE
SFS Z
JMP .1M0
RTS DONE
.BLIP JMP .1U
NOP
NOP
RTS
****** RESET PIC
*
PICRES;
LOD BS,#FLAT/128
SEF FLAT.RESET
CLF TLED
LOD A,#$44
RTS
****** RELEASE PIC RESET
PICRUN;
LOD BS,#FLAT/128
CLF FLAT.RESET
LOD A,#$45
SEF TLED
RTS
.EN