swr999, I have used the "DEFINE WRITE_INT 1" directive with my 18F parts and have had no problems. The READ instructions are not to my knowlege prone to disruption with interrupts enabled.
swr999, I have used the "DEFINE WRITE_INT 1" directive with my 18F parts and have had no problems. The READ instructions are not to my knowlege prone to disruption with interrupts enabled.
Dave Purola,
N8NTA
EN82fn
DEFINE WRITE_INT 1 is used to avoid write errors during a WRITE to EEPROM which might otherwise possibly be caused by an interrupt occurring during the write. The functionality is that it disables interrupts just prior to executing a WRITE instruction, and re-enabls interrupts after the WRITE completes. Appears to be strictly a PBP3 feature.
With regard to the "DEFINE WRITE_INT 1" directive, it appears to be available at least from PBP 2.50 onwards. I misspoke above^^^. Apologies.
Thanks Dave. My "issue" is that I have a 10-mS interrupt running to keep track of elapsed time. I have several EEPROM writes and since EEPROM writes take a while I don't want to lose time by stopping the interrupt for every write.
I did a test program where I repeatedly wrote to EEPROM with a 'random' WORD. For each write I then read back the value that got stored in EEPROM. It turns out that the error rate due to interference from the interrupt was quite low, about 0.04% (~400 errors in a million writes). So what I ended up doing was to do each write with a call to a subroutine:
EEwriteWord:
WRITE addr,xW.byte0:WRITE addr+1,xW.byte1
READ addr,xR.byte0: READ addr+1,xR.byte1
IF xR != xW then
INTCON.7=0
WRITE addr,xW.byte0:WRITE addr+1,xW.byte1
INTCON.7=1
ENDIF
RETURN
This seems to be working well. While the EEPROM write takes several mS the READ is pretty fast, so this doesn't add too much overhead.
Bookmarks