Author: robhamerling
Date: Fri Nov 14 12:21:59 2008
New Revision: 545

Modified:
    trunk/unvalidated/include/peripheral/data_eeprom/pic_data_eeprom.jal

Log:

  Changed byte-offset to word-offset for larger EEPROMs with 18Fs.
  Offset and flags settings for read and write to separate procedure.
  Moved check for write completed ahead of read and write, for better  
performance.
  Added some 'pragma inline' statements (temporary commented out because of
  suspected compiler issue).



Modified:  
trunk/unvalidated/include/peripheral/data_eeprom/pic_data_eeprom.jal
==============================================================================
--- trunk/unvalidated/include/peripheral/data_eeprom/pic_data_eeprom.jal        
 
(original)
+++ trunk/unvalidated/include/peripheral/data_eeprom/pic_data_eeprom.jal        
 
Fri Nov 14 12:21:59 2008
@@ -1,126 +1,203 @@
  -- Title: reading/writing of PIC's data EEPROM
  -- Author: Stef Mientki, Copyright (c) 2002..2006, all rights reserved.
  -- Adapted-by: Sebastien Lelong, Rob Hamerling.
--- Compiler: >=2.4g
+-- Compiler: >=2.4h
  --
  -- This file is part of jallib (http://jallib.googlecode.com)
  -- Released under the BSD license  
(http://www.opensource.org/licenses/bsd-license.php)
  --
  -- Description:
--- Write/read 8-bits data to/from data-eeprom
+-- Read from or write to EEPROM byte, word or double word.
+-- Available procedures:
+--   * data_eeprom_read(<offset>,<byte>)
+--   * data_eeprom_write(<offset>,<byte>)
+--   * data_eeprom_read_word(<offset>,<word>)
+--   * data_eeprom_write_word(<ofset>,<word>)
+--   * data_eeprom_read_dword(<offset>,<dword>)
+--   * data_eeprom_write_dword(<offset>,<dword>)
+-- Available functions:
+--   * <byte> = data_eeprom(<offset>)
+--   * <word> = data_eeprom_word(<offset>)
+--   * <dword> = data_eeprom_dword(<offset>)
+-- Examples of use:
+--   * Read a byte of EEPROM at offset 7 into byte x:
+--         var byte x
+--         data_eeprom_read(7, x)
+--   * Read a word from EEPROM at offset 4 into word y:
+--         var word y
+--         y = data_eeprom_word(4)
+--   * Write a byte to EEPROM at offset 18:
+--         data_eeprom_write(18, 0b1111_0000)
  --
--- Notes: Limited to the first 256 bytes of EEPROM memory
+-- Notes:
+-- - Write-protect bits in configuration memory may prohibit writing.
+-- - Writing to locations outside the available memory may have
+--   unexpected effects!
+-- - Summary of changes
+--   + Changed byte-offset to word-offset for larger EEPROMs with 18Fs
+--   + Offset and flags settings for read and write in separate procedure
+--   + Moved check for write completed ahead of read and write, for
+--     better performance (ahead of read needed for read back of same  
byte).
  --
+--
+-- ------------------------------------------------------------------------
+-- Set memory region bits in EECON1 and load offset register(s)
+-- Wait (spin) until any previous write completed before proceeding.
+-- ------------------------------------------------------------------------
+procedure _prepare_eeprom_access(word in offset) is

+-- pragma inline
+   var byte tempoffset[2] at offset             -- type cast

--- Read byte from data eeprom at given address
--- Result is stored in the passed in-argument
-procedure data_eeprom_read(byte in address, byte out data) is
-   EEADR = address
-   if defined(EECON1_EEPGD) == TRUE then
-      EECON1_EEPGD = FALSE                      -- deselect pgm memory
+   while EECON1_WR loop                         -- allow any previous
+     -- spin as long as any previous write is not completed
+   end loop                                     -- before this write
+
+   EEADR = tempoffset[0]                        -- low order byte of offset
+   if (defined(EEADRH) == TRUE) then            -- PIC with large EEPROM
+      EEADRH = tempoffset[1]                    -- high order byte of  
offset
     end if
-   if defined(EECON1_CFGS) == TRUE then
-      EECON1_CFGS = FALSE                       -- deselect cfg memory
+
+   if (defined(EECON1_CFGS) == TRUE) then       -- config memory supported
+      EECON1_CFGS = FALSE                       -- deselect config region
     end if
-   if defined(EEADRH) == TRUE then              -- large memory
-      EEADRH = 0                                -- reset high address
+
+   if (defined(EECON1_EEPGD) == TRUE) then      -- code memory supported
+      EECON1_EEPGD = FALSE                      -- deselect code region
     end if
-   EECON1_RD = TRUE
-   data = EEDATA
+
  end procedure

--- Read word from data eeprom at given address
+
+-- ------------------------------------------------------------------------
+-- Read byte from data EEPROM at given offset
  -- Result is stored in the passed in-argument
-procedure data_eeprom_read_word(byte in address, word out data) is
-   var byte temp[2] at data
-   data_eeprom_read(address, temp[0])
-   data_eeprom_read(address+1, temp[1])
+-- ------------------------------------------------------------------------
+procedure  data_eeprom_read(word in offset, byte out data) is
+
+   _prepare_eeprom_access(offset)               -- make ready for rea
+
+   EECON1_RD = TRUE                             -- initiate read operation
+
+   data = EEDATA                                -- obtain byte
+
  end procedure

--- Read a dword from data eeprom at given address
--- Result is stored in the passed in-argument
-procedure data_eeprom_read_dword(byte in address, dword out data) is
-   var byte temp[4] at data
-   data_eeprom_read(address, temp[0])
-   data_eeprom_read(address+1, temp[1])
-   data_eeprom_read(address+2, temp[2])
-   data_eeprom_read(address+3, temp[3])
+
+-- ------------------------------------------------------------------------
+-- Write byte to data EEPROM at given offset
+-- ------------------------------------------------------------------------
+procedure data_eeprom_write(word in offset, byte in data) is
+
+   var bit gie_old                              -- GIE state
+
+   _prepare_eeprom_access(offset)               -- make ready for write
+
+   EEDATA = data                                -- byte to write
+
+   EECON1_WREN = TRUE                           -- write enable
+
+   gie_old = INTCON_GIE                         -- save GIE state
+   INTCON_GIE = FALSE                           -- disable interrupts
+
+   EECON2    = 0x55                             -- \ required sequence
+   EECON2    = 0xAA                             -- /
+
+   EECON1_WR = TRUE                             -- initiate write operation
+
+   INTCON_GIE = gie_old                         -- restore interrupt status
+   EECON1_WREN = FALSE                          -- disable further writing
+
  end procedure


--- Read byte from data eeprom at given address and return result
-function data_eeprom(byte in address) return byte is
+-- ------------------------------------------------------------------------
+-- Read byte from data EEPROM at given offset and return result
+-- ------------------------------------------------------------------------
+function  data_eeprom(word in offset) return byte is
+
+-- pragma inline
     var byte data
-   data_eeprom_read(address, data)
+   data_eeprom_read(offset, data)
     return data
+
  end function

--- Read word from data eeprom at given address and return result
-function data_eeprom_word(byte in address) return word is
+
+-- ------------------------------------------------------------------------
+-- Read word from data eeprom at given offset
+-- Result is stored in the passed in-argument
+-- ------------------------------------------------------------------------
+procedure data_eeprom_read_word(word in offset, word out data) is
+
+   var byte tempdata[2] at data
+   data_eeprom_read(offset+0, tempdata[0])
+   data_eeprom_read(offset+1, tempdata[1])
+
+end procedure
+
+
+-- ------------------------------------------------------------------------
+-- Read word from data eeprom at given offset and return result
+-- ------------------------------------------------------------------------
+function data_eeprom_word(word in offset) return word is
+
+-- pragma inline
     var word data
-   data_eeprom_read_word(address, data)
+   data_eeprom_read_word(offset, data)
     return data
-end function

--- Read dword from data eeprom at given address and return result
-function data_eeprom_dword(byte in address) return dword is
-   var dword data
-   data_eeprom_read_dword(address, data)
-   return data
  end function


--- Write byte to data eeprom at given address
--- Wait until finished
-procedure data_eeprom_write(byte in address, byte in data) is
+-- ------------------------------------------------------------------------
+-- Write word to data eeprom at given offset
+-- ------------------------------------------------------------------------
+procedure data_eeprom_write_word(word in offset, word in data) is
+
+   var byte tempdata[2] at data                 -- type cast
+   data_eeprom_write(offset+0, tempdata[0])
+   data_eeprom_write(offset+1, tempdata[1])

-   var bit gie_old                              -- GIE state
+end procedure

-   while EECON1_WR loop                         -- allow any previous
-     -- spin until write completed              -- write to complete
-   end loop                                     -- before this write

-   EEADR  = address
-   EEDATA = data
+-- ------------------------------------------------------------------------
+-- Read a dword from data eeprom at given offset
+-- Result is stored in the passed in-argument
+-- ------------------------------------------------------------------------
+procedure data_eeprom_read_dword(word in offset, dword out data) is

-   if defined(EECON1_EEPGD) == TRUE then
-      EECON1_EEPGD = FALSE                      -- deselect pgm memory
-   end if
-   if defined(EECON1_CFGS) == TRUE then
-      EECON1_CFGS = FALSE                       -- deselect cfg memory
-   end if
-   if defined(EEADRH) == TRUE then              -- large memory
-      EEADRH = 0                                -- reset high address
-   end if
+   var byte tempdata[4] at data
+   data_eeprom_read(offset+0, tempdata[0])
+   data_eeprom_read(offset+1, tempdata[1])
+   data_eeprom_read(offset+2, tempdata[2])
+   data_eeprom_read(offset+3, tempdata[3])

-   gie_old = INTCON_GIE
-   EECON1_WREN = TRUE
-   INTCON_GIE = FALSE
-
-   -- requred sequence (see datasheet)
-   EECON2    = 0x55
-   EECON2    = 0xAA
-   EECON1_WR = TRUE                             -- start write operation
+end procedure

-   INTCON_GIE = gie_old                         -- restore interrupt status
-   EECON1_WREN = FALSE                          -- disable further writing
+-- ------------------------------------------------------------------------
+-- Read dword from data eeprom at given offset and return result
+-- ------------------------------------------------------------------------
+function data_eeprom_dword(word in offset) return dword is

-end procedure
+-- pragma inline
+   var dword data
+   data_eeprom_read_dword(offset, data)
+   return data

--- Write word to data eeprom at given address
-procedure data_eeprom_write_word(byte in address, word in data) is
-   var byte temp[2] at data
-   data_eeprom_write(address, temp[0])
-   data_eeprom_write(address+1, temp[1])
-end procedure
+end function
+
+-- ------------------------------------------------------------------------
+-- Write dword to data eeprom at given offset
+-- ------------------------------------------------------------------------
+procedure data_eeprom_write_dword(word in offset, dword in data) is
+
+   var byte tempdata[4] at data
+   data_eeprom_write(offset+0, tempdata[0])
+   data_eeprom_write(offset+1, tempdata[1])
+   data_eeprom_write(offset+2, tempdata[2])
+   data_eeprom_write(offset+3, tempdata[3])

--- Write dword to data eeprom at given address
-procedure data_eeprom_write_dword(byte in address, dword in data) is
-   var byte temp[4] at data
-   data_eeprom_write(address, temp[0])
-   data_eeprom_write(address+1, temp[1])
-   data_eeprom_write(address+2, temp[2])
-   data_eeprom_write(address+3, temp[3])
  end procedure


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jallib" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/jallib?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to