EEprom

Bavelt

Golden Member

Ik heb een EEProm, type 24LC64.

Daar wil ik in MikroBasic eens mee lezen en schrijven.

Ik heb:

pic basic code:


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?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

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...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ja, dan wordt het

pic basic code:


  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.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik weet het al: WP stond op High ipv low..
:)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Is zo'n EEPPROM nu eigenlijk dezelfde techniek qua opslag als een USB stick?

Fouten zijn het bewijs dat je het probeert..

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.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Arco

Special Member

EEprom is eigenlijk een voorloper van flash, het is (zeker met schrijven) veel en veel trager...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik heb het in ieder geval wel mooi werkend: :)

Voorbeeld:

pic basic code:


'====================================================================================================
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%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

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?

Fouten zijn het bewijs dat je het probeert..
maartenbakker

Golden Member

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.

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."
Arco

Special Member

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 - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

@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.

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%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

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)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
buckfast_beekeeper

Golden Member

Waarom 2 keer dezelfde (lange) tabel?

Van Lambiek wordt goede geuze gemaakt.
Bavelt

Golden Member

Op 12 mei 2021 11:55:35 schreef buckfast_beekeeper:
Waarom 2 keer dezelfde (lange) tabel?

Was een kopieer foutje. Is aangepast!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

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?

Fouten zijn het bewijs dat je het probeert..
fred101

Golden Member

www.pa4tim.nl, www.schneiderelectronicsrepair.nl, Reparatie van meet- en calibratie apparatuur, ook maritieme en industriele PCBs
bprosman

Golden Member

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 :-)

De jongere generatie loopt veel te vaak zijn PIC achterna.
Arco

Special Member

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…)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

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%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

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...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Raar, (voor mij althans)

Waarom mag dit wel:

pic basic code:



Inh[u1][0].i1 = 0

Maar dit niet:

pic basic code:



Dim TstBit As bit
Inh[u1][0].i1 = TstBit
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Geen idee, ik gebruik ze nooit. (multidimensional arrays wordt bijna altijd een onoverzichtelijk zooitje in een programma)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com