Is it possible to store a word variable to this eeprom? as highbyte and low byte?
Toni
Is it possible to store a word variable to this eeprom? as highbyte and low byte?
Toni
Yes, but usually you'd store Lowbyte first followed by Highbyte - especially if you're loading/unloading from word arrays. Why? Consider an array...
Myword var word [8]
Bit zero as in Myword.0(0) is bit zero of MyWord(0)
Bit 127 as in Myword.0(127) is bit 15 of MyWord(7)
All the 128 bits(0-127) of the entire word (or byte) array are sequentially available to you in that order. Therefore, correspondingly, so are the bytes...
Therefore storing in Lowbyte/Highbyte order makes assembling words and word arrays particularly simple.
Thank you very much Mel
but i still seem to be having problems as i am trying to store the following word data format
0 to addr 0 to 1
1000 to addrs 2 to 3
2000 to addrs 4 to 5
but i seems to be getting the following instead
Eeprom Address = 1 Eeprom Value = 0
Eeprom Address = 4 Eeprom Value = 1000
Eeprom Address = 7 Eeprom Value = 2000
Eeprom Address = 10 Eeprom Value = 3000
Eeprom Address = 13 Eeprom Value = 4000
Eeprom Address = 16 Eeprom Value = 5000
Eeprom Address = 19 Eeprom Value = 6000
Eeprom Address = 22 Eeprom Value = 7000
Eeprom Address = 25 Eeprom Value = 8000
i can't lay my finger on whwere i am going wrong so i put my code below
Your help is appreciated
Toni
DEFINE LOADER_USED 1 ' uses a bootloader
Include "Modedefs.Bas"
Define OSC 20
clear
' Setup Hardware for uart
DEFINE HSER_BAUD 19200
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_CLROERR 1
DEFINE LCD_DREG PORTD ' Use Portd for LCD Data
DEFINE LCD_DBIT 4 ' Use Upper(4) 4 bits of Port
' PORTD-4 thru PORTD-7 connects to
' LCD DB4 thru LCD DB-7 respectively
DEFINE LCD_RSREG PORTE ' PORTE for RegisterSelect (RS) bit
DEFINE LCD_RSBIT 0 ' PORTE-0 pin for LCD's RS line
DEFINE LCD_EREG PORTE ' PORTE for Enable (E) bit
DEFINE LCD_EBIT 1 ' PORTE-1 pin for LCD's E line
DEFINE LCD_BITS 4 ' Using 4-bit bus
DEFINE LCD_LINES 2 ' Using 2 line Display
DEFINE LCD_COMMANDUS 2000 ' Command Delay (uS)
DEFINE LCD_DATAUS 50 ' Data Delay (uS)
' ** Define LCD Control Constants **
I CON 254 ' Control Byte
Clr CON 1 ' Clear the display
Line1 CON 128 ' Point to beginning of line 1
Line2 CON 192 ' Point to beginning of line 2
' Software Defines
' ----------------
' ** Declare the Variables **
Temp VAR word ' General Purpose
Temp2 VAR word ' General Purpose
Data_Out VAR BYTE ' Data read from the Eeprom
Data_In VAR BYTE ' Data written to the Eeprom
' ** Define the Pin assignments **
CS Var PortC.4 ' Chip select pin
SCK Var PortC.3 ' Clock pin
SI Var PortC.5 ' Data in pin
SO Var PortC.5 ' Data out pin
' ** Declare the Variables **
Addr var Word ' Memory address within the eeprom (0-511)
' ** Define the eeprom's op-codes **
WRSR Con 1 ' Write to STATUS REGISTER op-code
EWR Con 2 ' WRITE op-code
ERD Con 3 ' READ op-code
WRDI Con 4 ' DISABLE WRITES op-code
RDSR Con 5 ' Read the STATUS REGISTER op-code
EWEN Con 6 ' ENABLE WRITES op-code
'
' Initialise Hardware
' -------------------
ADCON1=7
TRISA=%00000000
TRISB=%00000000
TRISC=%10000000
TRISD=%00000000
Pause 1000
lcdout I,Clr:Pause 30
lcdout I,Line1," 25LC640 TEST "
lcdout I,Line2+2,"..Power On.. !!"
Pause 1000 '
Data_Out=0: Data_In =0: Temp =0
'WRITE SUB
'=======
For Addr = 0 TO 100 STEP 2 ' Loop 50 times
Data_In =Temp.LowByte ' Data_In is data TO EPPROM
Gosub EWrite
Addr=Addr+1
Data_In =Temp.HighByte ' Data_In is data TO EPPROM
Gosub EWrite
Temp =Temp + 1000 ' Add 1000 to the previous value
Next Addr
loop:
Again:
lcdout I,Clr ' Clear the LCD
For Addr=0 To 100 STEP 2 ' Create a loop of 50 WORD VALUES
Gosub ERead ' Read the byte from the Eeprom
Temp2.LowByte= Data_Out
AddR=AddR+1
Gosub ERead
Temp2.HighByte = Data_Out
lcdout I,Line1," Eprom ADDR:" ,DEC AddR
lcdout I,Line2+2,DEC Temp2
HSerout ["Eeprom Address = ",DEC AddR," Eeprom Value = ",DEC Temp2,10,13]
' Display the WORD values from the eeprom
Pause 1000
Next ' Close the loop
Goto Again ' Do it forever
End
' Read a single byte from the Eeprom
' The address is held in the variable "ADDR"
' The byte read is returned in the variable "Data_Out"
Eread: Low CS ' Enable the eeprom
Shiftout SI,SCK,MSBFIRST,[ERD,Addr.highbyte,Addr.lowbyte]' Send READ COMMAND and address
Shiftin SO,SCK,MSBPRE,[Data_Out] ' Read data
High CS ' Disable the eeprom
Return
' Write a single byte to the Eeprom
' The address is held in the variable "ADDR"
' The byte to be written is held in the variable "Data_in"
Ewrite: Low CS ' Enable the eeprom
Shiftout SI,SCK,MSBFIRST,[EWEN] ' Send WRITE ENABLE command
High CS ' Disable the eeprom, to execute the command
Low CS ' Re-enable the eeprom
Shiftout SI,SCK,MSBFIRST,[EWR,Addr.highbyte,Addr.lowbyte,Data_In]' Send address and data
High CS ' Disable the eeprom
Pause 5 ' Allow the eeprom to allocate the byte
Return
You've caught me in a very busy week... so just briefly try this (I haven't fully checked all your code) and see if there's an improvement...
For the write...
For CounterA=0 to 98 step 2
Addr=CounterA
Data_In =Temp.LowByte ' Data_In is data TO EPPROM
Gosub EWrite
Addr=Addr+1
Data_In =Temp.HighByte ' Data_In is data TO EPPROM
Gosub EWrite
Temp =Temp + 1000 ' Add 1000 to the previous value
Next CounterA
For the read...
For CounterA=0 To 98 STEP 2 ' Create a loop of 50 WORD VALUES
Addr=CounterA
Gosub ERead ' Read the byte from the Eeprom
Temp2.LowByte= Data_Out
AddR=AddR+1
Gosub ERead
Temp2.HighByte = Data_Out
Next CounterA
1. It's dangerous to manually advance the counter variable in a for-next loop, because when it steps, it'll step from your new altered value.
2. Doesn't counting "From 0 to 100 step 2" produce 51 steps (not 50)? Since 0 is the first step, and 100 is the 51st step?
Thanks you for all your Mel,
i am begining to see the light now. by just adding addrs-1 this solves the problem become i am increment addr twice as you pointer out .
This is the working code if someone else needs it .
Biggest Regards
Toni
DEFINE LOADER_USED 1 ' uses a bootloader
Include "Modedefs.Bas"
Define OSC 20
clear
' Setup Hardware for uart
DEFINE HSER_BAUD 19200
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_CLROERR 1
DEFINE LCD_DREG PORTD ' Use Portd for LCD Data
DEFINE LCD_DBIT 4 ' Use Upper(4) 4 bits of Port
' PORTD-4 thru PORTD-7 connects to
' LCD DB4 thru LCD DB-7 respectively
DEFINE LCD_RSREG PORTE ' PORTE for RegisterSelect (RS) bit
DEFINE LCD_RSBIT 0 ' PORTE-0 pin for LCD's RS line
DEFINE LCD_EREG PORTE ' PORTE for Enable (E) bit
DEFINE LCD_EBIT 1 ' PORTE-1 pin for LCD's E line
DEFINE LCD_BITS 4 ' Using 4-bit bus
DEFINE LCD_LINES 2 ' Using 2 line Display
DEFINE LCD_COMMANDUS 2000 ' Command Delay (uS)
DEFINE LCD_DATAUS 50 ' Data Delay (uS)
' ** Define LCD Control Constants **
I CON 254 ' Control Byte
Clr CON 1 ' Clear the display
Line1 CON 128 ' Point to beginning of line 1
Line2 CON 192 ' Point to beginning of line 2
' Software Defines
' ----------------
' ** Declare the Variables **
Temp VAR word ' General Purpose
Temp2 VAR word ' General Purpose
Data_Out VAR BYTE ' Data read from the Eeprom
Data_In VAR BYTE ' Data written to the Eeprom
CounterA var word
' ** Define the Pin assignments **
CS Var PortC.4 ' Chip select pin
SCK Var PortC.3 ' Clock pin
SI Var PortC.5 ' Data in pin
SO Var PortC.5 ' Data out pin
' ** Declare the Variables **
Addr var Word ' Memory address within the eeprom (0-511)
' ** Define the eeprom's op-codes **
WRSR Con 1 ' Write to STATUS REGISTER op-code
EWR Con 2 ' WRITE op-code
ERD Con 3 ' READ op-code
WRDI Con 4 ' DISABLE WRITES op-code
RDSR Con 5 ' Read the STATUS REGISTER op-code
EWEN Con 6 ' ENABLE WRITES op-code
'
' Initialise Hardware
' -------------------
ADCON1=7
TRISA=%00000000
TRISB=%00000000
TRISC=%10000000
TRISD=%00000000
Pause 1000
lcdout I,Clr:Pause 30
lcdout I,Line1," 25LC640 TEST "
lcdout I,Line2+2,"..Power On.. !!"
Pause 1000 '
Data_Out=0: Data_In =0: Temp =0
'WRITE SUB
'==========
For CounterA=0 to 98 step 2
Addr=CounterA
Data_In =Temp.LowByte ' Data_In is data TO EPPROM
Gosub EWrite
Addr=Addr+1
Data_In =Temp.HighByte ' Data_In is data TO EPPROM
Gosub EWrite
Temp =Temp + 1000 ' Add 1000 to the previous value
Next CounterA
Again:
lcdout I,Clr ' Clear the LCD
For CounterA=0 To 98 STEP 2 ' Create a loop of 50 WORD VALUES
Addr=CounterA
Gosub ERead ' Read the byte from the Eeprom
Temp2.LowByte= Data_Out
AddR=AddR+1
Gosub ERead
Temp2.HighByte = Data_Out
lcdout I,Line1," Eprom ADDR:" ,DEC AddR-1
lcdout I,Line2+2,DEC Temp2
HSerout ["Eeprom Address = ",DEC Addr-1," Eeprom Value = ",DEC Temp2,10,13]
' Display the WORD values from the eeprom
Pause 1000
Next CounterA
Goto Again ' Do it forever
End
' Read a single byte from the Eeprom
' The address is held in the variable "ADDR"
' The byte read is returned in the variable "Data_Out"
Eread: Low CS ' Enable the eeprom
Shiftout SI,SCK,MSBFIRST,[ERD,Addr.highbyte,Addr.lowbyte]' Send READ COMMAND and address
Shiftin SO,SCK,MSBPRE,[Data_Out] ' Read data
High CS ' Disable the eeprom
Return
' Write a single byte to the Eeprom
' The address is held in the variable "ADDR"
' The byte to be written is held in the variable "Data_in"
Ewrite: Low CS ' Enable the eeprom
Shiftout SI,SCK,MSBFIRST,[EWEN] ' Send WRITE ENABLE command
High CS ' Disable the eeprom, to execute the command
Low CS ' Re-enable the eeprom
Shiftout SI,SCK,MSBFIRST,[EWR,Addr.highbyte,Addr.lowbyte,Data_In]' Send address and data
High CS ' Disable the eeprom
Pause 5 ' Allow the eeprom to allocate the byte
Return
Bookmarks