Tänkte börja med att säga att det är ett schysst forum ni har.
Jag har ett litet problem med att EEPROMet i en ATmega88. I mitt program kan jag välja (via en pinne) om det ska läsa in två värden via rs-232 och skriva till EEPROMet eller läsa in de ut de tidigare värdena och skica ut. Om jag skriver in två värden och sedan ställer om pinnen och startar om så skickar den först ut de två värdena korrekt. Om jag sedan startar om igen så blir det första värdet rätt men det andra bilr 0. Startar jag om igen så fortsätter den andra siffran att vara 0.
Jag har skrivit av koden för läsning och skrivning i EEPROMet ifrån databladet så jag tycker att det borde fungera.
Någon som har någon idé om vad det kan bero på?
ATmega88 och EEPROM
Tack. Ok, här är koden. Jag har klippt bort irrelevanta delar.
Kod: Markera allt
void write_eeprom(unsigned char addr, unsigned char data)
{
while (EECR & (1 << EEPE))
;
EEAR = addr;
EEDR = data;
EECR |= (1 << EEMPE);
EECR |= (1 << EEPE);
}
unsigned char read_eeprom(unsigned char addr)
{
while (EECR & (1 << EEPE))
;
EEAR = addr;
EECR |= (1 << EERE);
return EEDR;
}
void init_eeprom()
{
EEARH = 0;
EEARL = 0;
EECR = 0;
}
int main(void)
{
int us_delay = 60, ms_delay=5;
char answer[10];
DDRC = 0;
init_eeprom();
USART_Init(23); //9600 vid 3.68640 MHz
if ((PINC & 1) == 1)
{
USART_sendstring("Us-delay: ");
USART_getstring(answer,9);
us_delay = atoi(answer);
USART_sendstring("Ms-delay: ");
USART_getstring(answer,9);
ms_delay = atoi(answer);
write_eeprom(0, us_delay);
write_eeprom(1, ms_delay);
}
if ((PINC & 2) == 0)
{
us_delay = read_eeprom(0);
ms_delay = read_eeprom(1);
USART_sendnumber_dec(us_delay);
USART_sendnumber_dec(ms_delay);
}
while(1)
{
Do_stuff();
}
return 0;
}
Jag har kollat igenom koden lite snabbt, men hittar inget direkt fel.
Jag misstänker att det är något fel i USART_sendnumber_dec()-funktionen. 'int' är ett 16-bitarstal i avr-gcc. Om du försöker skicka ett 16-bitarstal så kanske du skickar den lägsta byten först och därefter den högsta, som är just 0 om talet är mindre än 256. Kan det vara något sånt?
Ett allmänt råd är att använda dessa typer istället för char, int osv, så är du säker på vad det blir för typ i avr-gcc:
uint8_t - 8 bitar (unsigned)
int8_t - 8 bitar (signed)
uint16_t - 16 bitar (unsigned)
osv.
Jag misstänker att det är något fel i USART_sendnumber_dec()-funktionen. 'int' är ett 16-bitarstal i avr-gcc. Om du försöker skicka ett 16-bitarstal så kanske du skickar den lägsta byten först och därefter den högsta, som är just 0 om talet är mindre än 256. Kan det vara något sånt?
Ett allmänt råd är att använda dessa typer istället för char, int osv, så är du säker på vad det blir för typ i avr-gcc:
uint8_t - 8 bitar (unsigned)
int8_t - 8 bitar (signed)
uint16_t - 16 bitar (unsigned)
osv.