Wie heeft er succesvol EEPROM ATtiny13A softwarematig weten te schrijven? EEPROM schrijven via programmer lukt wel. Vele andere AVR's altijd zonder probleem. Wie weet waar het aan kan liggen? Dit is de assembly code. (XL en data worden voor rcall geset)

EEwrite:sbic    EECR, EEPE            ;wait EEPROM ready
    rjmp    EEwrite
    ldi    temp, (0<<EEPM1)|(0<<EEPM0)    ;atomic operation
    out    EECR, temp
    out    EEARL, XL            ;set EEPROM address
    out    EEDR, data            ;load EEPROM data
    sbi    EECR, EEMPE            ;enable master program
    sbi    EECR, EEPE            ;& program EEPROM
    ret

Enig idee wat er gebeurt als je een 0 gaat left-shiften? Ik denk dat het 0 blijft... (ja, het staat verkeerd in de datasheet).

Pas ook op met timing: die enable doet het maar even. De boel gaat 'stuk' als er een interrupt voorbij komt.

Gebruik geen interrupts (cli in reset gezet) Zal eens een wait EEPROM ready wachtlus voor de ret(urn) zetten.
Lees dat je maximaal maar 4 cycles mag wachten om EEPE te activeren na schrijven van de EEPMn bits.
Ja er zitten bugs in die ASM code uit datasheet, voor databyte wordt r16 gebruikt die ervoor al voor iets anders wordt gebruikt. bevat dus zero-data. (EEPROM bits staan op 0xff na erase)

Ik doe het niet in ASM maar in GCC, onderstaande werkt bij mij prima op meerdere AVRs, wellicht ook op die van jou.


/*	@brief  EEPROM Write Function
 *	@arg	uiAddress		EEPROM Address to be written to
 *	@arg	ucData			Single byte of data to be written to referenced address
 *	@return	nothing
 */
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
	while(EECR & (1<<EEWE));	/* Wait for completion of previous write */
	EEAR = uiAddress;			/* Set up address and data registers */
	EEDR = ucData;
	EECR |= (1<<EEMWE);			/* Write logical one to EEMWE */
	EECR |= (1<<EEWE);			/* Start eeprom write by setting EEWE */
}

/*	@brief  EEPROM Read Function
 *	@arg	uiAddress		EEPROM Address to be read from
 *	@return	Single byte of data from referenced address
 */
unsigned char EEPROM_read(unsigned int uiAddress)
{
	while(EECR & (1<<EEWE));	/* Wait for completion of previous write */
	EEAR = uiAddress;			/* Set up address register */
	EECR |= (1<<EERE);			/* Start eeprom read by writing EERE */
	return EEDR;				/* Return data from data register */
}

@RES: Heb je door waar het probleem zit? Ik vermoed als ik je response zo zie, dat dat dus niet zo is...

@Pimmetje: In WinAVR zitten daarvoor toch gewoon functions?

Ok, het lag niet aan de software, maar aan de hardware. Een Ucap bankje waar de AVR zijn voedingsspanning van krijgt was net iets te laag geworden (nog geen powersaving en sleep mode geactiveerd)