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;
}
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é.
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
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ů