suggested changes to eeprom_write_byte (in file eeprom.h) :

/** \ingroup avr_eeprom
    Write a byte \a __value to EEPROM address \a __p.
 */
static __inline__ void eeprom_write_byte (uint8_t *__p, uint8_t __value)
{
    do {} while (!eeprom_is_ready ());

#if    E2END <= 0xFF
    EEARL = (unsigned)__p;
#else
    EEAR = (unsigned)__p;
#endif
    
    /* read data and compare to __value */
    EECR |= (1 << EERE);
    if (EEDR != __value) {

#if    defined(EEPM0) && defined(EEPM1)
    /* Set programming mode */
    if (__value == 0xff) EECR = (1 << EEPM0); /* erase */
    else EECR = 0;        /* erase and write.    */
#elif    defined(EEPM0) || defined(EEPM1)
# warning "Unknown EECR register, eeprom_write_byte() has become outdated."
#endif

    EEDR = __value;

    __asm__ __volatile__ (
        "/* START EEPROM WRITE CRITICAL SECTION */\n\t"
        "in    r0, %[__sreg]        \n\t"
        "cli                \n\t"
        "sbi    %[__eecr], %[__eemwe]    \n\t"
        "sbi    %[__eecr], %[__eewe]    \n\t"
        "out    %[__sreg], r0        \n\t"
        "/* END EEPROM WRITE CRITICAL SECTION */"
        :
        : [__eecr]  "i" (_SFR_IO_ADDR(EECR)),
          [__sreg]  "i" (_SFR_IO_ADDR(SREG)),
          [__eemwe] "i" (EEMWE),
          [__eewe]  "i" (EEWE)
        : "r0"
    );
  }
}



_______________________________________________
AVR-libc-dev mailing list
AVR-libc-dev@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev

Reply via email to