Atmega8 Problém zo zápisom do EEPROM

Ahoj.
Prosím o pomoc.
Skúšam zápis do eeprom v Atmege8 ale nedarí sa mi.
Potrebujem zapísať napr: int ee_save = 123; //trojciferné číslo
robím to takto:

EEPROM_write(0x00, ee_save)

Potom to načítam:

EEPROM_read(0x00) 

Po tadeto to funguje v poriadku.

Problém nastáva tu.
Chcem uložiť ee_save = 123456 //šesť cifier
Postup rovnaký ako hore, ale výsledok nieje správny. Uloží mi číslo z max hodnotou 255 a viac už nie. Ako to má byť správne zapísané?
ďakujem za odpovede.

Toto mám z datasheetu ATMEGA8.

//****************************************************************************//
//***********************         ZAPIS     **********************************//
//****************************************************************************//
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
 {
 						/* Wait for completion of previous write */
while(EECR & (1<<EEWE)) ; 			/* Set up address and data registers */
EEAR = uiAddress; 
EEDR = ucData; 		/* Write logical one to EEMWE */
EECR |= (1<<EEMWE); 				/* Start eeprom write by setting EEWE */ 
EECR |= (1<<EEWE); 			
}
//****************************************************************************//
//***********************         CITANIE    *********************************//
//****************************************************************************//
unsigned char EEPROM_read(unsigned int uiAddress) 
{ 										/* Wait for completion of previous write */
while(EECR & (1<<EEWE)) ;				/* Set up address register */
EEAR = uiAddress; 					/* Start eeprom read by writing EERE */ 
EECR |= (1<<EERE); 					 
return EEDR; 
}

Proč nevyužíváš knihovnu <avr/eeprom.h> ???
V ní máš už hotové funkce. Např.: eeprom_read_word a/nebo eeprom_write_word a další.

  1. 123456 je větší, než unsigned int (0-65535).
  2. Do funkce, která ukládá unsigned char (8 bitů) cpeš proměnnou unsigned int (16 bitů). Musíš jí tam nacpat jako dvakrát unsigned char na 2 adresy.

Copak nečteš Warning hlášení při překladu ?
Pokud na Tebe vyskočí nějakej Warning, je třeba ho alespoň prověřit, když už ne vyřešit. Osobně překládám programy tak, aby byl překlad naprosto čistý. I v případě přetypování, kdy to překladač udělá sám a vypíše Warning tyto položky přetypovávám sám. Vyčistí se překlad a snáz pak najdeš nějakou tu chybu.

to Divous : Třeba se snaží naučit se a pochopit, jak mcu funguje. Navíc jsou v knihovně některé funkce, které lze pomocí vlastního kódu v asm napsat kratší a efektivnější, než knihovní. Tohle možná ten případ není, ale je to vyzkoušené a ověřené.

Tak podarilo sa použil som knihovnu <avr/eeprom.h>.

Balu.
Warning čítam ,ale mi to ešte nič nehovorí program mi beží tak neviem čo chce napr tu:

../1_Ochrana.c:108: warning: implicit declaration of function 'itoa'

je to tu:

[code]void LCD_update_time()
{
char temp [2];

lcd_gotoxy(0,0);

itoa(hod,temp,10);
if (!temp[1]) lcd_puts (“0”);
lcd_puts(temp);
lcd_puts(":");

itoa(min,temp,10);
if (!temp[1]) lcd_puts (“0”);
lcd_puts(temp);
} [/code]

Toto znamená, že není inkludovaný hlavičkový soubor pro funkci itoa().

Jdu do googlu a napíšu “avr gcc itoa”.
Hned v prvním odkazu je vidět že itoa() je v souboru <stdlib.h>.

Super dakujem. Hneď sú moje projekty bez warningow. :smiley: A aké jednoduche riešenie to malo no to som celí ja nepozorný.

Budem ešte otravný.
Program funguje len ma to dosť zauíma čo je ktorý warning.
Prečo tu nemôžem používať Unsigned char? Keď použijem len char tak je to bez warnigou.

c: In function 'meranie': 143: warning: passing argument 1 of 'sprintf' from incompatible pointer type 144: warning: passing argument 1 of 'lcd_puts' from incompatible pointer type

void meranie() { unsigned char cas [6]; lcd_gotoxy(2,1); sprintf(cas,"%05d",total_time/1); lcd_puts(cas); lcd_puts(": Minut"); }

Použít unsigned můžeš i bez warningu :

[code]unsigned char Znak;

void Otestuj(char Vstup);[/code]

Pokud to máš takhle nadefinovaný, tak volání

Otestuj(Znak);

vypíše warning.

Stačí ale napsat

Otestuj((char)Znak);

a překlad je čistý. Říká se tomu přetypování.

[code]unsigned char cas [6];

sprintf(cas,"%05d",total_time/1);[/code]

Deklarace funkce sprintf() vypadá takto:

int sprintf (char *__s, const char *__fmt,...) (viz <stdio.h>)
Je vidět, že funkce očekává jako první argument (‘cas’) pointer na char (čili očekává string).
Ale ty jí posíláš pointer na unsigned char (pole bajtů).

Proto deklaruj ‘cas’ jako char[6] a varování zmizí;

Je třeba rozlišovat typy:
char = znak
signed char = bajt se znaménkem (-128 až +127)
unsigned char = bajt bez znaménka (0 až 255)

char s] = string (pole znaků)
signed char d] ; unsigned char u] = pole bajtů