RES
RES
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
retEricP
mét CE
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.
RES
RES
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)
Anoniem
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 */
}
EricP
mét CE
@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?
RES
RES
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)