Thanks Android,
These pictures are quite pretty, thanks a million for taking the effort!
I can do the same thing with IDs programming, now works perfect, except my word!, everything is bit too all one-ish in programming results.
I have everything working now except the code flash programming.I even bought a few more brand new chips..same result!
I can display any 32-byte region of memory or ID's or Config Data.
I can modify CONFIG bits or change ID's, just can't seem to get the *#@a@! Program Flash pgm. Mem. to write a single byte.
Note: LastAddr DW W Ju mSec, PgmCodeSize, are declared Public
'=======================================================================================
Private Sub Pgm18F25K()
Call BulkErase18Fx 'ERASES everything but CONFIGW are set to DEFAULT VALUES
'Erases Program mem even if CP=1
'and erases Data mem even if CPD=1
cls
LPT_Form.FontSize = 14
Print "Bulk Erase Completed"
Call FindLastAddr
Print "Programming from 0 to "; LastAddr; "Started ": T = Timer
U = 0: H = 0: L = 0
Dim N As Integer
Ju = 0
Do While Ju < LastAddr
IsBlank = True
For L1 = Ju To Ju + 31
If Pdm(L1) <> &HFFFF Then IsBlank = False: Exit For
Next
If (IsBlank = True) Then
L = L + 32
If (L = 256) Then
H = H + 1
L = 0
End If
Ju = Ju + 32
GoTo SkipBlanks
End If
N = 0
DW = &H8EA6: Call CID16 'Configures ECON1 register to Enable Programming
DW = &H9CA6: Call CID16 'CFGS set to Program Flash or IDs
DW = &H84A6: Call CID16 'WREN write enable enabled
DW = &HE00 + U: Call CID16 'Set Table Ptr Regs
DW = &H6EF8: Call CID16 'writes &H20 to TBLPTRU
DW = &HE00 + H: Call CID16
DW = &H6EF7: Call CID16 'Writes &H0 to TBLPTRH
DW = &HE00 + L: Call CID16
DW = &H6EF6: Call CID16 'Writes &H0 to TBLPTRL
Again: 'Loop to fill 64-byte write buffer with 32 Pdm() words
Call W2HiLoBytesInc2 'Cmd 1101 Table Buffer Writes 2 bytes with post Inc 2
Ju = Ju + 1
N = N + 2
If N = 62 Then
Call Pgm64Bytes18F 'Writes last 2 bytes and starts programming
N = 0: Ju = Ju + 1
Else
GoTo Again
End If
L = L + 32
If (L = 256) Then
H = H + 1
L = 0
End If
SkipBlanks:
Loop
ExitPgm18F:
Print "Last Address Programmed: "; LastAddr
Print "Programming of "; PgmCodeSize; " Bytes Completed in ";
Print Format(Timer - T, "###.# Seconds.")
mSec = 1: Call Dly1
End Sub
'========================================================================================
Private Sub Pgm64Bytes18F() 'Writes last 2 bytes and starts programming
' Special NOP(0000) holds 4th data bit high for Pgm Time(3mS) and then Lo=200uS
DW = Pdm(Ju)
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 0=1 cmd clk'd in
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 1=1 cmd clk'd in
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 2=1 cmd clk'd in
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 3=1 cmd clk'd, Cmd 1111 StartWrite clk'd in
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'resets Clk and Data, ready for next instruction/data bits
Dim Bit As Integer
For Bit = 0 To 15 ' Clocks in 16-bits of Payload data LSB First
If (2 ^ Bit) And DW Then ' Clock in a 1
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW ' Clock Lo, Data Hi, Vpgm=VpgmHi bit Bit bit=1 of DW clk'd in
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'resets Clk and Data, ready for next instruction/data bits
Else 'Clk in a 0
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi Bit bit =0 of DW clk'd in
End If
Next Bit
' 0000 Special NOP that starts programming the ID bits on 4th bit
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'bit 1=0 cmd entered
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'bit 2=0 cmd clk'd in
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'bit 3=0 cmd clk'd in
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi PROGRAMMING of ID bits Starts
mSec = 3: Call Dly1 ' Tprog for StartWrite must wait TDelay5=P9 with Clock held hi for programming to complete
'30mSec exceeds spec P9 wait spec=1mSec.. wait extended for debugging tests
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi wait time starts with 'bit 4=0 Cmd=0000 clk'd in.
mSec = 1: Call Dly1 ' (P10 Clk Lo must wait =TDly6 is Spec'd at 200uSec Minimum), wait extended for debugging test
' Now clock in NOP Payload = 0
For Bit = 0 To 15 ' Clocks in 16-bits of Payload data LSB First
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi bit B of DW 0 clk'd in
Next Bit
End Sub
'======================================================================================
Private Sub W2HiLoBytesInc2()
'Cmd 1101
DW = Pdm(Ju)
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 0=1 cmd clk'd in
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'bit 1=0 cmd clk'd in
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 2=1 cmd clk'd in
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW: ' Clock Lo, Data Hi, Vpgm=VpgmHi 'bit 3=1 cmd clk'd in
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi
'clock into buffer two bytes
Dim Bit As Integer
For Bit = 0 To 15 ' Clocks in 8-bits of Lo-Byte Payload data LSb First
If (2 ^ Bit) And DW Then ' Clock in a 1
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H14: Out P, CW ' Clock Hi, Data Hi, Vpgm=VpgmHi
CW = &H15: Out P, CW ' Clock Lo, Data Hi, Vpgm=VpgmHi bit Bit of DW = 1 clk'd in
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi 'resets Clk and Data, ready for next instruction/data bits
Else 'Clk in a 0
CW = &H1E: Out P, CW ' Clock Hi, Data Lo, Vpgm=VpgmHi
CW = &H1D: Out P, CW ' Clock Lo, Data Lo, Vpgm=VpgmHi bit Bit of DW=0 clk'd in
End If
Next Bit
End Sub
'========================================================================================
Private Sub FindLastAddr()
LastAddr = 0
For J = 65535 To 0 Step -1
If Pdm(J) <> &HFFFF Then LastAddr = J + 1: Exit For
Next
'If LastAddr > &H7FFF Then LastAddr = &H7FFF 'later a problem with 64KB Chip??
End Sub