Ik heb een EEProm, type 24LC64.
Daar wil ik in MikroBasic eens mee lezen en schrijven.
Ik heb:
Address = 0x20
Dat1 = 0x07
I2C1_Start()
I2C1_Wr(0xA0) 'send device address
Temp = Address >> 8 'saving higher order address to temp
I2C1_Wr(temp) 'sending higher order address
I2C1_Wr(Address) 'sending lower order address
I2C1_Wr(Dat1) 'send data (data to be written)
I2C1_Stop()
Delay_ms(20)
WordToHex (Address, Str)
Lcd_String_8x16(0,0, "Adress: 0x" + Str)
WordToHex (Dat1, Str)
Lcd_String_8x16(0,2, "Write: 0x" + Str)
Delay_Ms(1500)
Address = 0x20
Dat1 = 0x00
I2C1_Start()
I2C1_Wr(0xA0) 'send device address
temp = address >> 8 'saving higher order address to temp
I2C1_Wr(temp) 'sending higher order address
I2C1_Wr(address) 'sending lower order address
I2C1_Repeated_Start() 'issue I2C signal repeated start
I2C1_Wr(0xA1) 'send byte (device address)
Dat1 = I2C1_Rd(0) 'Read the data (NO acknowledge)
I2C1_Stop()
Maar het lezen levert een 0x00FF op.
Dus óf het lezen óf het schrijven gaat niet goed.
Heb ik een foutje gemaakt in de Read of Write?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Volgens mij klopt 't wel... (heb al lang geen eeprom meer gebruikt)
Is wel makkelijker om i.p.v. de shifts Lo(address) en Hi(Address) te gebruiken...
Ja, dan wordt het
I2C1_Start()
I2C1_Wr(0xA0) 'Send device address
I2C1_Wr(Hi(Address)) 'Sending higher order address
I2C1_Wr(Lo(Address)) 'Sending lower order address
I2C1_Wr(Dat1) 'Send data (data to be written)
I2C1_Stop()
Delay_ms(20)
Scheelt weer een tijdelijk Word...
Er zal vermoedelijk hier nog iets aan mankeren (omdat de Read een ox0ff oplevert, terwijl ik het veld voor de read op 0x00 zet.
Ik weet het al: WP stond op High ipv low..
Is zo'n EEPPROM nu eigenlijk dezelfde techniek qua opslag als een USB stick?
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Nee: een USB stick is vrijwel altijd NAND flash en moet je per blok erasen. Ook zijn bitjes in een NAND flash mogelijk stuk en zitten er meer flash blokken/areas in om de fouten te repareren.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
EEprom is eigenlijk een voorloper van flash, het is (zeker met schrijven) veel en veel trager...
Ik heb het in ieder geval wel mooi werkend:
Voorbeeld:
'====================================================================================================
Program EEPROM_24LC64
'====================================================================================================
' Project name: EEPROM_24LC64
' MCU: PIC16F1847
' Oscillator: Internal 8 MHz
' Display: Oled I2C 0.96
' SCL-1: PORT B.4 Pin 10
' SDA-1: PORT B.1 Pin 7
' SCL-2: PORT B.5 Pin 11
' SDA-2: PORT B.2 Pin 8
Const Char8x16 As Byte [1520] = (
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, '
0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x00,0x00,0x00, ' !
0x00,0xF3,0xF3,0x00,0x00,0xF3,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ' "
0x30,0xF3,0xF3,0x30,0x30,0xF3,0xF3,0x30,0x03,0x0F,0x0F,0x03,0x03,0x0F,0x0F,0x03, ' #
0x00,0x78,0xF3,0xCF,0xCF,0xCC,0x8C,0x00,0x00,0x0C,0x0C,0x3C,0x3C,0x0F,0x07,0x00, ' $
0x00,0x1C,0x1C,0xC0,0xF0,0x3C,0x0C,0x00,0x00,0x0C,0x0F,0x03,0x00,0x0E,0x0E,0x00, ' %
0x00,0xD8,0xFC,0xCC,0x7C,0x18,0x00,0x00,0x1F,0x3F,0x31,0x33,0x1F,0x3F,0x33,0x00, ' &
0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ' '
0x00,0x00,0x00,0xF0,0xF8,0x1C,0x04,0x00,0x00,0x00,0x00,0x0F,0x1F,0x38,0x20,0x00, ' (
0x00,0x04,0x1C,0xF8,0xF0,0x00,0x00,0x00,0x00,0x20,0x38,0x1F,0x0F,0x00,0x00,0x00, ' )
0xC0,0xCC,0xFC,0xF0,0xF0,0xFC,0xCC,0xC0,0x00,0x0C,0x0F,0x03,0x03,0x0F,0x0C,0x00, ' *
0x00,0xC0,0xC0,0xF8,0xF8,0xC0,0xC0,0x00,0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00, ' +
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x7C,0x3C,0x00,0x00,0x00, ' ,
0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ' -
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x3C,0x00,0x00,0x00, ' .
0x00,0x00,0x00,0x80,0xE0,0x7C,0x1C,0x00,0x00,0x38,0x3E,0x07,0x01,0x00,0x00,0x00, ' /
0x00,0xF8,0xFC,0x0C,0x8C,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x31,0x30,0x3F,0x1F,0x00, ' 0
0x00,0x00,0x30,0xFC,0xFC,0x00,0x00,0x00,0x00,0x30,0x30,0x3F,0x3F,0x30,0x30,0x00, ' 1
0x00,0x38,0x3C,0x0C,0xCC,0xFC,0x38,0x00,0x00,0x30,0x3C,0x3F,0x33,0x30,0x30,0x00, ' 2
0x00,0x0C,0x0C,0xCC,0xFC,0x3C,0x0C,0x00,0x00,0x1C,0x3C,0x30,0x33,0x3F,0x1C,0x00, ' 3
0x00,0x00,0xC0,0xF0,0xFC,0xFC,0x00,0x00,0x00,0x0F,0x0F,0x0C,0x3F,0x3F,0x0C,0x00, ' 4
0x00,0xFC,0xFC,0xCC,0xCC,0xCC,0x8C,0x00,0x00,0x18,0x38,0x30,0x30,0x3F,0x1F,0x00, ' 5
0x00,0xF0,0xF8,0x9C,0x8C,0x8C,0x00,0x00,0x00,0x1F,0x3F,0x31,0x31,0x3F,0x1F,0x00, ' 6
0x00,0x0C,0x0C,0x0C,0xCC,0xFC,0x3C,0x00,0x00,0x00,0x3C,0x3F,0x03,0x00,0x00,0x00, ' 7
0x00,0x38,0xFC,0xCC,0xCC,0xFC,0x38,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' 8
0x00,0x78,0xFC,0xCC,0xCC,0xFC,0xF8,0x00,0x00,0x00,0x30,0x30,0x38,0x1F,0x0F,0x00, ' 9
0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x3C,0x00,0x00,0x00, ' :
0x00,0x00,0x00,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0xC0,0x7C,0x3C,0x00,0x00,0x00, ' ;
0x80,0xC0,0xE0,0x70,0x38,0x18,0x08,0x00,0x00,0x01,0x03,0x07,0x0E,0x0C,0x08,0x00, ' <
0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x00, ' =
0x08,0x18,0x38,0x70,0xE0,0xC0,0x80,0x00,0x08,0x0C,0x0E,0x07,0x03,0x01,0x00,0x00, ' >
0x00,0x38,0x3C,0x0C,0xCC,0xFC,0x38,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x00, ' ?
0xF0,0xF8,0x1C,0xCC,0x4C,0x98,0xF0,0x00,0x0F,0x1F,0x38,0x33,0x32,0x33,0x19,0x00, ' @
0x00,0xF0,0xF8,0x1C,0x1C,0xF8,0xF0,0x00,0x00,0x3F,0x3F,0x03,0x03,0x3F,0x3F,0x00, ' A
0x00,0xFC,0xFC,0xCC,0xCC,0xFC,0x78,0x00,0x00,0x3F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' B
0x00,0xF8,0xFC,0x0C,0x0C,0x3C,0x38,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3C,0x1C,0x00, ' C
0x00,0xFC,0xFC,0x0C,0x1C,0xF8,0xF0,0x00,0x00,0x3F,0x3F,0x30,0x38,0x1F,0x0F,0x00, ' D
0x00,0xFC,0xFC,0xCC,0xCC,0xCC,0x0C,0x00,0x00,0x3F,0x3F,0x30,0x30,0x30,0x30,0x00, ' E
0x00,0xFC,0xFC,0xCC,0xCC,0xCC,0x0C,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, ' F
0x00,0xF8,0xFC,0x0C,0xCC,0xCC,0xCC,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' G
0x00,0xFC,0xFC,0xC0,0xC0,0xFC,0xFC,0x00,0x00,0x3F,0x3F,0x00,0x00,0x3F,0x3F,0x00, ' H
0x00,0x0C,0x0C,0xFC,0xFC,0x0C,0x00,0x00,0x00,0x30,0x30,0x3F,0x3F,0x30,0x00,0x00, ' I
0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x1C,0x3C,0x30,0x30,0x3F,0x1F,0x00, ' J
0xFC,0xFC,0xC0,0xF0,0x3C,0x0C,0x00,0x00,0x3F,0x3F,0x00,0x03,0x0F,0x3C,0x30,0x00, ' K
0x00,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x30,0x30,0x30,0x30,0x00, ' L
0xFC,0xFC,0x70,0xC0,0x70,0xFC,0xFC,0x00,0x3F,0x3F,0x00,0x01,0x00,0x3F,0x3F,0x00, ' M
0x00,0xFC,0xFC,0xE0,0x80,0xFC,0xFC,0x00,0x00,0x3F,0x3F,0x01,0x07,0x3F,0x3F,0x00, ' N
0x00,0xF8,0xFC,0x0C,0x0C,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' O
0x00,0xFC,0xFC,0x0C,0x0C,0xFC,0xF8,0x00,0x00,0x3F,0x3F,0x03,0x03,0x03,0x01,0x00, ' P
0x00,0xF8,0xFC,0x0C,0x0C,0xFC,0xF8,0x00,0x00,0x1F,0x3F,0x38,0x1E,0x3F,0x37,0x00, ' Q
0xFC,0xFC,0x8C,0x8C,0xFC,0xF8,0x00,0x00,0x3F,0x3F,0x01,0x03,0x0F,0x3C,0x30,0x00, ' R
0x00,0x78,0xFC,0xCC,0x8C,0x8C,0x18,0x00,0x00,0x18,0x31,0x31,0x33,0x3F,0x1E,0x00, ' S
0x00,0x0C,0x0C,0xFC,0xFC,0x0C,0x0C,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00, ' T
0x00,0xFC,0xFC,0x00,0x00,0xFC,0xFC,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' U
0x00,0xFC,0xFC,0x00,0x00,0xFC,0xFC,0x00,0x00,0x03,0x0F,0x3C,0x3C,0x0F,0x03,0x00, ' V
0xFC,0xFC,0x00,0x80,0x00,0xFC,0xFC,0x00,0x3F,0x1F,0x0E,0x07,0x0E,0x1F,0x3F,0x00, ' W
0x00,0x1C,0x7C,0xE0,0xE0,0x7C,0x1C,0x00,0x00,0x38,0x3E,0x07,0x07,0x3E,0x38,0x00, ' X
0x00,0x3C,0xFC,0xC0,0xC0,0xFC,0x3C,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00, ' Y
0x00,0x0C,0x0C,0xCC,0xFC,0x3C,0x0C,0x00,0x00,0x3C,0x3F,0x33,0x30,0x30,0x30,0x00, ' Z
0x00,0x00,0x00,0xFC,0xFC,0x0C,0x0C,0x00,0x00,0x00,0x00,0x3F,0x3F,0x30,0x30,0x00, ' [
0x00,0x0C,0x0C,0xFC,0xFC,0x00,0x00,0x00,0x00,0x30,0x30,0x3F,0x3F,0x00,0x00,0x00, ' \
0x80,0xE0,0x78,0x1E,0x78,0xE0,0xE0,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x00, ' ]
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ' ^
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00, ' _
0x00,0x07,0x0E,0x1C,0x38,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ' `
0x00,0x00,0x60,0x60,0x60,0xE0,0xC0,0x00,0x00,0x1E,0x3F,0x33,0x33,0x3F,0x3F,0x00, ' a
0x00,0xFC,0xFC,0x60,0x60,0xE0,0xC0,0x00,0x00,0x3F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' b
0x00,0xC0,0xE0,0x60,0x60,0x60,0x00,0x00,0x00,0x1F,0x3F,0x30,0x30,0x30,0x30,0x00, ' c
0x00,0xC0,0xE0,0x60,0x60,0xFC,0xFC,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x3F,0x00, ' d
0x00,0xC0,0xE0,0x60,0x60,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x32,0x32,0x33,0x33,0x00, ' e
0x00,0xC0,0xC0,0xF8,0xFC,0xCC,0xCC,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00, ' f
0x00,0xC0,0xE0,0x60,0x60,0xE0,0xE0,0x00,0x00,0xCF,0xDF,0xD8,0xD8,0xFF,0x7F,0x00, ' g
0x00,0xFC,0xFC,0x60,0x60,0xE0,0xC0,0x00,0x00,0x3F,0x3F,0x00,0x00,0x3F,0x3F,0x00, ' h
0x00,0x00,0x60,0xEC,0xEC,0x00,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x30,0x00,0x00, ' i
0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xFF,0x7F,0x00,0x00, ' j
0xFC,0xFC,0x80,0xC0,0xE0,0x60,0x00,0x00,0x3F,0x3F,0x03,0x07,0x1E,0x38,0x30,0x00, ' k
0x00,0x00,0x0C,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x30,0x00,0x00, ' l
0xC0,0xE0,0xE0,0xC0,0xE0,0xE0,0xC0,0x00,0x3F,0x3F,0x00,0x07,0x00,0x3F,0x3F,0x00, ' m
0x00,0xC0,0xE0,0x60,0x60,0xE0,0xC0,0x00,0x00,0x3F,0x3F,0x00,0x00,0x3F,0x3F,0x00, ' n
0x00,0xC0,0xE0,0x60,0x60,0xE0,0xC0,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x1F,0x00, ' o
0x00,0xE0,0xE0,0x60,0x60,0xE0,0xC0,0x00,0x00,0xFF,0xFF,0x30,0x30,0x3F,0x1F,0x00, ' p
0x00,0xC0,0xE0,0x60,0x60,0xE0,0xE0,0x00,0x00,0x1F,0x3F,0x30,0x30,0xFF,0xFF,0x00, ' q
0x00,0xE0,0xE0,0x60,0x60,0xE0,0xC0,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, ' r
0x00,0xC0,0xE0,0x60,0x60,0x60,0x60,0x00,0x00,0x31,0x33,0x33,0x36,0x3E,0x3C,0x00, ' s
0x00,0x60,0x60,0xF8,0xF8,0x60,0x60,0x00,0x00,0x00,0x00,0x1F,0x3F,0x30,0x30,0x00, ' t
0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0x1F,0x3F,0x30,0x30,0x3F,0x3F,0x00, ' u
0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0x03,0x0F,0x3C,0x3C,0x0F,0x03,0x00, ' v
0xE0,0xE0,0x00,0x80,0x00,0xE0,0xE0,0x00,0x3F,0x1F,0x0E,0x07,0x0E,0x1F,0x3F,0x00, ' w
0x00,0x60,0xE0,0x80,0x80,0xE0,0x60,0x00,0x00,0x30,0x3D,0x0F,0x0F,0x3D,0x30,0x00, ' x
0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xCF,0xDF,0xD8,0xD8,0xFF,0x7F,0x00, ' y
0x00,0x60,0x60,0x60,0xE0,0xE0,0x60,0x00,0x00,0x30,0x3C,0x3F,0x33,0x30,0x30,0x00, ' z
0x80,0x80,0xC0,0xFC,0x7E,0x02,0x02,0x00,0x01,0x01,0x03,0x3F,0x7E,0x40,0x40,0x00, ' {
0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00, ' |
0x02,0x02,0x7E,0x7C,0xC0,0x80,0x80,0x00,0x40,0x40,0x7E,0x3F,0x03,0x01,0x01,0x00, ' }
0xC0,0x60,0xE0,0xC0,0x80,0x80,0xE0,0x00,0x01,0x00,0x00,0x01,0x01,0x01,0x00,0x00) ' ~
Dim
i1 As Word
d1 As Byte
Str As String[4]
Str1 As String[4]
lx As byte
ly As byte
Address As Word
Dat1 As Word
'====================================================================================================
Sub Procedure Lcd_WrCmd(Dim pCmd As Byte) 'Write data to display
'====================================================================================================
While (I2C2_Is_Idle) = 0 Wend
I2C2_Start()
I2C2_Wr(0x78)
I2C2_Wr(0x80)
I2C2_Wr(pCmd)
I2C2_Stop()
End Sub
'====================================================================================================
Sub Procedure Lcd_WrDat(Dim pDat As Byte) 'Write data to display
'====================================================================================================
While (I2C2_Is_Idle) = 0 Wend
I2C2_Start()
I2C2_Wr(0x78)
I2C2_Wr(0x40)
I2C2_Wr(pDat)
Delay_ms(1)
I2C2_Stop()
End Sub
'====================================================================================================
Sub Procedure Lcd_SetPos(Dim px, py as Byte) 'Set write position on display
'====================================================================================================
Lcd_WrCmd(0xB0 + py)
Lcd_WrCmd((px >> 4) Or 0x10)
Lcd_WrCmd(px And 0x0F)
End Sub
'====================================================================================================
Sub Procedure Lcd_Char_8x16(Dim px, py, pchar As Byte)
'====================================================================================================
Dim lIndex As Word
lIndex = pChar - 0x20
lIndex = (lIndex << 4)
Lcd_SetPos(px, py)
For d1 = 0 to 7
Lcd_WrDat(Char8x16[lIndex+d1])
Next d1
Lcd_SetPos(px, py+1)
For d1 = 8 to 15
Lcd_WrDat(Char8x16[lIndex+d1])
Next d1
End Sub
'====================================================================================================
Sub Procedure LCD_Fill(Dim pFill As Byte) 'Fill display with character pFill
'====================================================================================================
Dim lx, ly As Byte
For ly = 0 To 8
LCD_wrCmd(0xB0 + ly)
LCD_wrCmd(0x00)
LCD_wrCmd(0x10)
For lx = 1 to 128
Lcd_wrDat(pFill)
Next lx
Next ly
End Sub
'====================================================================================================
Sub Procedure Lcd_String_8x16(Dim px, py As Byte, Dim ByRef pDisp As String)
'====================================================================================================
Dim lLen, lCnt As Byte
lLen = Length(pDisp)
For lCnt = 0 To (lLen-1)
Lcd_Char_8x16(px+1, py, pDisp[lCnt])
px = px + 8
Next lCnt
End Sub
'====================================================================================================
Sub Procedure Display_Init()
'====================================================================================================
Lcd_WrCmd(0xA8) 'Multiplex ratio set to
Lcd_WrCmd(0x3F) '63
Lcd_WrCmd(0xD3) 'Display offset RAM counter
Lcd_WrCmd(0x00) 'none
Lcd_WrCmd(0x40) 'Start line address
Lcd_WrCmd(0xA1) 'Set segment remap rotation to left
Lcd_WrCmd(0xC8) 'Common output scan direction
Lcd_WrCmd(0xDA) 'Common signals pad
Lcd_WrCmd(0x12) 'value
Lcd_WrCmd(0x81) 'Contrast control
Lcd_WrCmd(0xFF) 'value
Lcd_WrCmd(0xA4)
Lcd_WrCmd(0xA6) 'Normal display
Lcd_WrCmd(0xD5) 'Clock ratio:oscillator frequency
Lcd_WrCmd(0x80) 'oooo:rrrr
Lcd_WrCmd(0x8D)
Lcd_WrCmd(0x14)
Lcd_WrCmd(0x00) 'Set lower column address
Lcd_WrCmd(0x10) 'Set higher column address
Lcd_WrCmd(0xD9) '15 clocks, discharge 1 clock
Lcd_WrCmd(0xF1) 'dddd:pppp
Lcd_WrCmd(0xDB) 'Common output voltage
Lcd_WrCmd(0x40) 'level
Lcd_WrCmd(0x20) 'Addressing mode
Lcd_WrCmd(0x02) 'value
Lcd_WrCmd(0xAE) 'Turn OLED panel off
End Sub
'====================================================================================================
Sub procedure Read_24LC64(Dim pAdr As Word, Dim pDat as Byte) 'Read Data From EeProm
'====================================================================================================
While (I2C1_Is_Idle) = 0 Wend
I2C1_Start()
I2C1_Wr(0xA0) 'Send device address
I2C1_Wr(Hi(Address)) 'Send higher order address
I2C1_Wr(Lo(address)) 'Send lower order address
I2C1_Repeated_Start() 'Issue I2C signal repeated start
I2C1_Wr(0xA1) 'Send byte (device address + R)
Dat1 = I2C1_Rd(0) 'Read the data (NO acknowledge)
I2C1_Stop()
Delay_ms(20)
End Sub
'====================================================================================================
Sub procedure Write_24LC64 (Dim pAdr as Word, Dim pDat as Byte) 'Write Data to EEPROM
'====================================================================================================
While (I2C1_Is_Idle) = 0 Wend
I2C1_Start()
I2C1_Wr(0xA0) 'Send device address
I2C1_Wr(Hi(pAdr)) 'Send higher order address
I2C1_Wr(Lo(pAdr)) 'Send lower order address
I2C1_Wr(pDat) 'Send data (data to be written)
I2C1_Stop()
Delay_ms(20)
End Sub
'====================================================================================================
main:
'====================================================================================================
ANSELB = %00000000 'All output/digital
TRISB = %00110110 'Port B.1, B2, B.4, B5 input: I2C used
OSCCON = %01110000 '8Mhz internal
I2C1_init(100000) 'Init I2C1 port 100kHz
I2C2_init(100000) 'Init I2C2 port 100kHz
Display_Init()
Delay_Ms(10)
LCD_wrCmd(0xAF) 'Turn Oled Panel on
LCD_Setpos(0,0)
Lcd_fill(0x00)
Lcd_String_8x16(0,0, "Writing...") 'Write Data to EEPROM
For i1 = 0 to 16
Write_24LC64(i1, i1)
Delay_Ms(10)
Next i1
For i1 = 0 to 16 'Read Data from EEPROM
Address = i1
Read_24LC64(Address, Dat1)
Delay_Ms(2)
WordToHex (Address, Str)
WordToHex (Dat1, Str1)
Lcd_String_8x16(0,0, "Address: 0x" + Str)
Lcd_String_8x16(0,2, "Data: 0x" + Str1)
Delay_Ms(500)
Next i1
While True Wend
End.
[Bericht gewijzigd door Bavelt op woensdag 12 mei 2021 12:38:17 (30%)]
Op 12 mei 2021 00:16:04 schreef Arco:
EEprom is eigenlijk een voorloper van flash, het is (zeker met schrijven) veel en veel trager...
Kan ik hieruit een beetje begrijpen dat EEPROM eigenlijk uit de tijd is?
maartenbakker
Golden Member
www.elba-elektro.nl | "The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."
Nee. Een belangrijk voordeel is dat deze per geheugencel adresseerbaar is in plaats van per blok. Ideaal om bijvoorbeeld configuratiegegevens en instellingen in op te slaan.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De nieuwere processoren gebruiken allemaal hun flash om parameters op te slaan. Is meestal per blok van 32 of 64 bytes te wissen en opnieuw te programmeren.
(een paar bytes veranderen kan ook: je leest het blok in en verandert wat moet veranderen, je wist het blok en schrijft de data weer terug...)
@Arco
Ik begrijp uit de datasheets van b.v. de ATSAMD21E17A dat er wel wordt gewaarschuwd dat het aantal write cycles beperkt is, t.o.v. een EEprom, als je de processor flash gebruikt om een EEprom te emuleren. Dus als je vaak data wilt wegschrijven kun je beter een externe EEprom gebruiken. Voor statische parameters kun je het uiteraard wel gebruiken.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Daarnaast HOEF je niet alles in 1x te schrijven.
Mijn processor heeft een flash-page-size van 1k. Als mijn configuratie block 20 bytes is, dan reserveer ik 32 bytes. De eerste schrijf ik "0xaa" om aan te geven: dit blok is geldig. Als ik nu afspreek met mezelf ik begin aan de onderkant en werk naar boven, dan kan ik bij iedere verandering een nieuw record met de tag en 20 config bytes en 11 lege "reserve" schrijven. Bij het opstarten moet ik van boven naar beneden zoeken naar het laatst geschreven blok. Als ik bij schrijven tegen de bovenkant vastloop moet ik het blok wissen en weer bij het begin beginnen. Zo heb ik 32x minder wis-operaties waar het ding van slijt. Zo kan ik met 10000 gegarandeerde wis-schrijf-cycli minimaal 320000 keer de config opslaan.
In de praktijk schrijf ik het op de eerste locatie en wis ik de boel iedere keer. Makkelijker en de eerste chip die kapot gesleten is moet ik nog tegenkomen.
In een Atmel CPU roepen ze dat de eeprom 100k keer gewist mag worden, terwijl de flash maar 10k keer kan. Als je dan bovenstaande truuk gebruikt zit je met de flash toch ook al boven wat je eeprom aankan. Maar ik ga er gewoon van uit dat ik toch die 10k al niet zomaar ga halen.
[Bericht gewijzigd door rew op woensdag 12 mei 2021 11:20:57 (13%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Kleine pics als de 16F1709 hebben bij flash ook 10k erase/write, maar ook een speciaal deel high endurance flash (HEF) voor parameteropslag.
(Dat is 100k erase/write)
Of FRAM ?
https://www.cypress.com/products/f-ram-nonvolatile-ferroelectric-ram
100 trillion (1014) write cycles
Op 12 mei 2021 11:55:35 schreef buckfast_beekeeper:
Waarom 2 keer dezelfde (lange) tabel?
Was een kopieer foutje. Is aangepast!
Ik koos voor een 24LC64. Niet echt onderbouwd, maar omdat ik het ding tegenkwam in een voorbeeld. Het is nog onwaarschijnlijk goedkoop: € 0,53 voor een DIP uitvoering bij Farnell.
Het ding is 64K groot.
Is er nog een ander populair type? Of maakt het gewoon niet uit als je geen hoge eisen stelt aan snelheid, etc?
fred101
Golden Member
www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur en maritieme en industriele PCBs
Op 12 mei 2021 12:38:13 schreef bprosman:
Of FRAM ?
https://www.cypress.com/products/f-ram-nonvolatile-ferroelectric-ram
100 trillion (1014) write cycles[bijlage]
RRAM gaat nog langer mee (MRAM in het Engels)
Op 12 mei 2021 13:08:14 schreef fred101:
[...]
RRAM gaat nog langer mee (MRAM in het Engels)
Klopt maar die zijn er niet voor 3 Euro in een 8 pinnertje
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Meestal is 100k endurance voor 'normale' toepassingen toch wel genoeg...
Ik gebruik meestal de 24LC256 als ik een externe parameteropslag nodig heb. (bijna net zo duur als de 64)
Voor snelle dataopslag een SD card of een IS25 flash van ISSI.
(is in 8Mbit ook net zo duur: https://eu.mouser.com/ProductDetail/ISSI/IS25LP080D-JNLE?qs=pif5%252B9…)
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op 12 mei 2021 12:48:28 schreef Bavelt:
Is er nog een ander populair type?
Ik heb hier een paar w25Q32 liggen. 8Mbyte, (32Mbit) voor ongeveer de helft van wat jij voor 512x minder betaalt.... Maar goed. Dat is dan niet bij Farnell vandaan. (maar ook de betrouwbare chinese onderdelen leverancier heeft ze en daar kosten ze niet veel meer dan een halve dollar).
[Bericht gewijzigd door rew op woensdag 12 mei 2021 14:25:58 (17%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De IS25 kost ook nog geen halve euro per 100, en dat bij een 'gewone' leverancier... : https://www.arrow.com/en/products/is25lp080d-jnle/integrated-silicon-s…
Makkelijk is dat die IS25 een ingebakken uniek serienummer heeft...
Raar, (voor mij althans)
Waarom mag dit wel:
Inh[u1][0].i1 = 0
Maar dit niet:
Dim TstBit As bit
Inh[u1][0].i1 = TstBit
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Geen idee, ik gebruik ze nooit. (multidimensional arrays wordt bijna altijd een onoverzichtelijk zooitje in een programma)