by Evert Dekker  (This AN has also Part1, follow this link )
  
What is it?
It’s
an Eeprom programmer controlled by Bascom Avr and is capable of programming in
circuit Eeprom’s up to 512Kb. Standard Intel Hex8 file is required. 
Extended Linear Address Records for
Eeprom’s bigger then 16bits addresses is not (yet) supported, but easy to
implant. 
I wrote it primary for my other
application note RC2 sound / voice playback. 
 
Required tools
For the PC
side there’s an upload program that sends the Intel Hex file to the AVR. 
Program is
written in VB6-Sp6, source code is also available. 
 
 Note from MCS
 I liked the idea of Evert very much and extended his application with an ASM-BIN converter so you do not need Studio to convert the files.   
 The code
Code is
written and tested in Bascom 1.11.9.0.001 license.  
  
'-------------------------------------------------------------------- 
' I2C Eeprom programmer 
'Upload your Eeprom files through serial connection in
the I2c Eeprom 
' No
extended address supported, so max 512K Eeprom 
' By Evert
Dekker 2008 i2cprogrammer@Evertdekker dotje com 
' Created with Bascom-Avr: 1.11.9.0.100 
'-------------------------------------------------------------------- 
 
$regfile = "m128def.DAT" 
$crystal = 16000000 
$baud = 19200 
$hwstack = 70 
$swstack = 70 
$framesize = 60 
 
$lib "I2C_TWI.LBX" 'Setting up i2c hardware bus 
Config
Twi = 400000  'Hardware
i2c bus speed 
Config
Scl = Portd.0 'TWI (i2c) ports on the Mega128 
Config
Sda = Portd.1 
Const
Addressw = &B10100000 'slave write address eeprom 
Const
Addressr = &B10100001 'slave read address eeprom 
 
 
Dim
Startbyte As Byte , Instring As String * 45 , Complete As Bit 
Dim
Temp As Byte , Temps As String * 3 
Dim
Bytecount As Byte , Addresshigh As Byte , Addresslow As Byte , Recordtype As Byte , Databyte(16) As Byte , Checksm As Byte 
Dim
Lus As Byte , Pos As Byte , Checksum_calc As Byte , Checksum_error As Bit 
 
Enable
Urxc 
Enable Interrupts 
On
Urxc Bytereceived_isr 
 
 
'=== Main === 
Do 
If
Complete = 1 Then  'Wait
until the buffer is filled with one line 
 Gosub Process_buffer 'Process the buffer 
 Gosub Calculate_checksum 'Calculate the cheksum 
 If Recordtype = &H01 Then  'EOF finished, send a ACK and return 
 Print "Y"; 
 Else 
 If Checksum_error = 0 Then 'If there's no error continue 
 Select Case
Recordtype 'do something with the recordtype 
 Case &H00 'Data byte 
 Gosub Prog_eeprom 'Recordtype &H00 = databyte, so lets programm the Eeprom 
 Case &H02  'Extended
Linear Address Records, not (yet) supported 
 nop 
 End Select 
 Print "Y"; 'Checksum ok, send a ACK 
 Else 
 Print "Z";  'Checksum
error send a Nack 
 End If 
 End If 
 Complete = 0 : Instring = "" 'Reset the variable 
End If 
Loop 
End 
 
 
'=== Subroutines === 
Prog_eeprom: 
 I2cstart 'start condition 
 I2cwbyte Addressw 'slave address 
 I2cwbyte Addresshigh 'Highaddress of EEPROM 
 I2cwbyte Addresslow 'Lowaddress of EEPROM    For Lus = 1 To Bytecount 
    I2cwbyte Databyte(lus) 'value to write 
  Next Lus 
 I2cstop 'stop condition 
 Waitms 10 'wait for 10 milliseconds 
Return 
 
 
Process_buffer: 
Temps = Mid(instring , 1 , 2) : Bytecount = Hexval(temps) 'Read the
numbers of bytes 
Temps = Mid(instring , 3 , 2) : Addresshigh = Hexval(temps) 'Read the high adress 
Temps = Mid(instring , 5 , 2) : Addresslow = Hexval(temps) 'Read the low
adress 
Temps = Mid(instring , 7 , 2) : Recordtype = Hexval(temps) 'Read the
recordtype 
For
Lus = 1 To Bytecount 'Process the number of data bytes 
 Pos = Lus * 2 
 Pos = Pos + 7 
 Temps = Mid(instring ,
Pos , 2) : Databyte(lus) = Hexval(temps) 'Read
the databytes 
Next
Lus 
Pos = Pos + 2 'read the last byte 
Temps = Mid(instring , Pos , 2) : Checksm = Hexval(temps) 'Read checksum 
Return 
 
 
Calculate_checksum: 
Temp = 0 'Add up all the databytes 
Temp = Temp + Bytecount 
Temp = Temp + Addresshigh 
Temp = Temp + Addresslow 
Temp = Temp + Recordtype 
 For Lus = 1 To Bytecount 
 Temp = Temp + Databyte(lus) 
 Next Lus 
Checksum_calc = 256 - Temp 'taking its two's complement 
 If Checksum_calc <> Checksm Then 'Compare it with the readed value 
 Checksum_error = 1 
 Else 
 Checksum_error = 0 
 End If 
Return 
 
Bytereceived_isr: 
Temp = Udr 'get the binary value that came across 
If
Temp = &H0D Then 'Received CR = end of line, line complete 
 If Len(instring) < 8 Then 'To short, startover again 
 Complete = 0 
 Instring = "" 
 Else 
 Complete = 1 'String is complete set the flag 
 End If 
End If 
 
If
Startbyte = &H3A Then  'we have previously received the start byte and this is now data 
 If Temp > &H0F Then 'Add incoming data to buffer 
 Instring = Instring + Chr(temp) 
 If Len(instring) > 45 Then Instring = "" 'String
is to long, reset and startover again 
 End If 
End If 
 
If
Temp = &H3A Then 'if we received an : then its the
beginning of an new line. 
 Startbyte = Temp 
 Complete = 0 
 Instring = "" 
End If 
Return 
			 |