ATmega88 och EEPROM

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

ATmega88 och EEPROM

Inlägg av Megge »

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å?
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Välkommen hit!!
Men.....
Utan kod tror jag inte du kan få särskilt mycket hjälp tyvärr.
Megge
Inlägg: 33
Blev medlem: 2 oktober 2005, 19:36:27
Ort: Linköping

Inlägg av Megge »

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;
}
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

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.
Skriv svar