;Demonstates the use of the EEPROMs ; ;During the programming a counter location, defined in the EEPROM, ;is set to zero. At every restart of the processor this counter is incremented ;and its content is displayed in hex format on the LEDs. ;Please refer to the hints given on the end of this code to avoid confusion! .NOLIST .INCLUDE "8515def.inc" .LIST ;Define constants .equ cnt=$0000 ;Adress of the counter location in the EEPROM ;Define registers .def mpr=R16 ;Universal register .def neu=R17 ;Counter value interim storage ;Reset-/Interrupt-Vector rjmp main ;Jump to main program main: ldi mpr,$FF ;all bits of Port B are Output outDDRB,mpr ;Program reads a byte from the EEPROM location ldi mpr,LOW(cnt) ;Set the EEPROM location to read from out EEARL,mpr ;tell this to EEPROM-Port ldi mpr,HIGH(cnt) ;Low/High-Byte will be read separately out EEARH,mpr ;as there are 512 byte locations available sbi EECR,EERE ;Set the Read-Enable-Bit EERE in the ;EEPROM-Control-Register EECR in neu,EEDR ;Read the byte from the EEPROM-location ;Increment the counter and write back to the same EEPROM location inc neu wart: ;If EEPROM is not ready, wait first sbic EECR,1 ;Read bit 1 in the EEPROM-Control-Register rjmp wart ;and repeat until EEPROM reports ready ;The EEPROM-adress location isn't changed, so we don't need to set that first ;by transfer of the EEPROM-write adress to EEARL/EEARH out EEDR,neu ;New counter value to the EEPROM-data register ;The two write commands must not be interrupted, because they must be executed ;within four commands to ensure prevention of any unwanted write commands to ;the EEPROM. So we have to disable any interrupts before entering the write ;sequence. cli ;disables all interrupts ;Now we can start the two write commands: sbi EECR,EEMWE ;Switches on the EEPROM Master Write Enable sbi EECR,EEWE ;Starts the write command to the EEPROM ;During the following ca. 1,5 milliseconds the byte is written to the EEPROM. ;This affects us only if we want to use the EEPROM for further operations. ;Not here: we write the inverted content of the counter to the Port B, the ;LED-port, and end the program with a indefinite loop. com neu ;invert the counter (XOR FFh) out PORTB,neu ;to Port B loop: rjmp loop ;wait undefinitely ;Here we start defining the initial value of the counter location in the EEPROM ;during programming. ;First we tell the assembler, that the following informations go to the EEPROM. .ESEG ;Now we define the EEPROM-content: .DB $00 ;One byte with a zero ;That's about it. ;IMPORTANT HINTS ;During programming the content of the EEPROM-file TESTEEP.EEP ;will be loaded separately and programmed after the code is loaded. ;Don't forget this! ;During the programming sequence of the different locations for code ;and EEPROM content the software for the board releases the Reset pin ;of the processor, e.g. between programming and verification. As this ;short pause already causes the processor to restart and execute the ;code. Verification of the EEPROM content will therefore fail, because ;the counter is already incremented and does not match its original ;programmed value. Every read operation of the EEPROM content ;onboard will have the same effect. ;The execution of the restart command using the ISP software also ;causes multiple startups of the processor and increases the counter ;value, so don't expect to see correct counting values. ;Exact up-counts are only seen when switching the supply voltage ;of the board off and on. ;To avoid unwanted upcounting during program, verification and read ;operation would require setting a startup delay time, but this is a ;little bit too complex for a beginner.
Friday, October 4, 2013
EEPROM_use
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment