PIC Tutorial Six - I2C EEPROM Programming
       
       These 
      tutorials require the Main Board, the LCD Board, and various of the I2C Boards, as 
      written the tutorials use the LCD Board  on PortA and the I2C Boards on 
      PortB - although these could easily be swapped over, as the I2C Boards 
      don't use either of the two 'difficult' pins for PortA, pins 4 and 5, as 
      outputs.
      Download zipped tutorial files. 
       As 
      with the LCD Tutorial, the idea is to implement a reusable set of I2C 
      routines. 
       Rather 
      than showing the routines on the page as with earlier tutorials (they are 
      getting quite lengthy now), I'm only going to store them in the pages
      download ZIP file so you will need to 
      download them. As the I2C tutorials use a number of different boards, each 
      section is headed by the I2C boards required in bold type. 
       I2C 
      is a protocol designed by Philips Semiconductors, and is for 
      communications between I/C's over a two wire synchronous serial bus, 
      devices are classed as either 'Master' or 'Slave', for our purposes the 
      Main Board processor is the 'Master', and any other devices are 'Slaves'. 
      The initial tutorials use a 24C04, a 512 byte EEPROM memory chip, commonly 
      used for storing the settings in modern TV's and VCR's, where they are 
      used to store all the customer settings (tuning, volume, brightness etc.) 
      and the internal calibration values for the set, which are normally 
      accessed through a special 'service mode'. These chips provide 
      non-volatile memory as a series of 256 byte 'pages', so the 24C04 provides 
      two 'pages' giving 512 bytes of memory. The 24C02 uses 'standard 
      addressing', which gives the 256 byte page limit, other larger chips use 
      'extended addressing', giving a possible 16 bit address space, I've used a 
      24C256 which uses a 15 bit address space, giving 32,768 of memory space. 
      To address these you require two bytes of address data, the programs 
      already include these (but commented out), I've uncommented them for 
      copies of the 
      first two tutorials and called them 6_1a and 6_2a, if you want to use an 
      EEPROM larger than a 24C16 you will need to use these extended addressing 
      versions. 
      I2C EEPROM Board 
       The 
      first tutorial writes sequential numbers through one entire page of 
      memory, and then reads them back, 4 bytes at a time, displaying them on 
      the LCD, separated by about half a second between updates. The second 
      tutorial demonstrates 'sequential writing', the first tutorial uses 'byte 
      writing' (which is why it displays 'Writing..' for a couple of seconds) - 
      a write is fairly slow to EEPROM, taking around 10mS to complete - 
      'sequential writing' allows you to store a number of bytes in RAM inside 
      the EEPROM chip (a 
      maximum of 8 for the 24C04) and then write them all to EEPROM with a 
      single write delay. Tutorial 2 writes 4 bytes at once, to demonstrate how 
      this is done. The third tutorial is simply a cut-down version of the 
      first, I've included it as a useful tool, it simply reads one page of the 
      EEPROM and displays it as tutorial 1 does - useful for checking the 
      contents of an EEPROM. You can deal with the EEPROM write delay in a couple of ways, 
      firstly you can introduce a software delay, and this option is included in 
      the tutorials (but commented out), or you can keep checking until the chip 
      is ready, this is the method I've used in these tutorials, although if you 
      want you can comment that line out and un-comment the 'call delay10' line 
      instead. 
      I2C Clock Board, and I2C Switch Board 
       Now we 
      move onto the I2C Clock board, basically we use exactly the same I2C 
      routines, the only difference being in the way we manipulate the data, we 
      need to read the clock registers from the chip (using a sequential read), 
      apply a little processing, and then display them on the LCD. Actually 
      setting the clock is somewhat more complicated, and the biggest difference 
      is the routines for reading the switch board, and setting the clock chip 
      values - which are then written back to the chip with a sequential write. 
      The four buttons used are (from left to right), 'Set', 'Up', 'Down', and 
      'Next' - in the initial display mode the only button which has an effect 
      is the 'Set' button, this jumps to the 'Clock Set' mode, and starts a 
      flashing cursor on the tens of hours. From this point all four buttons 
      work, pressing 'Set' again will return to display mode, updating the clock 
      values (and zeroing the seconds). Pressing 'Up' will increase the value 
      under the cursor, and 'Down' will decrease the value, with '0' being the 
      lower limit, and '9' being the upper one - I don't currently take account 
      of the different maximum values for particular digits (i.e. tens of hours 
      doesn't go higher than 2), but rely on setting them sensibly. The 'Next' 
      button moves on to the next digit, and if pressed while on the last digit 
      (years units) will return to display mode, just like pressing the 'Set' 
      button. I also don't currently take any account of the correct years, the 
      PCF8583 only provides 0-3 for the years, with 0 being a leap year - extra 
      software routines will be required to do this, with the actual values 
      stored in spare PCF8583 EEPROM memory, and updated when the year changes 
      (remembering that the year might change while the processor is powered 
      down, and the clock is running on it's back-up battery). 
      I2C A2D Board, and I2C Switch Board 
       Again, 
      the A2D board uses the same basic I2C routines as before (but with a 
      different chip address for the PCF8591) as with the I2C Clock Board the 
      differences come in the manipulation of the data. As the board also 
      includes an EEPROM socket this can be used to store samples from the A2D 
      chip - with a single 24C256 we can store up to 32,768 eight bit samples - 
      this introduces a slight 'snag', the 24C256 uses 'extended addressing', 
      while the PCF8591 only uses 'standard addressing', however we can still 
      use the same I2C routines by using a flag to tell the routines which 
      addressing mode to use, simply switching the flag for the different chips 
      - this flag switching becomes part of the reusable I2C routines. 
         
   |