přiřazení přímé hodnoty z adresy

zdravím, mám např toto:
.ESEG
.ORG 0x0000
X0: .DB 0b10111110
X1: .DB 0b10001000
X2: .DB 0b11110100

XA: .DB X0, X1
XB: .DB X0, X2

lze nějakým způsobem udělat, aby se mi do XA nepřiřazovala adresa (t.j. 00, 01) ale přímo hodnota adresy (t.j. 0b10111110, 0b10001000)?
Díky

Takhle jednoduše to udělat nejde. Musíš to obejít, třeba takto :

[code].ESEG
.ORG 0x0000

#define Hodnota_X0 0b10111110
#define Hodnota_X1 0b10001000
#define Hodnota_X2 0b11110100

X0: .DB Hodnota_X0
X1: .DB Hodnota_X1
X2: .DB Hodnota_X2

XA: .DB Hodnota_X0, Hodnota_X1
XB: .DB Hodnota_X0, Hodnota_X2
[/code]

Pokud jsem záměr použití pochopil správně, pak jsou to výchozí hodnoty, které AVR Studio hodí jako HEX do souboru s příponou .EEP při překladu a Ty je pak nahraješ do mcu spolu s vlastním programem. Uvědom si, že jakmile je programem přepíšeš, už je nevrátíš a hlavně - data jsou na různých pozicích paměti, tj. když v programu přepíšeš informaci na pozici X0, tak v XA ani v XB se NEZMĚNÍ - to si musí program ohlídat sám. V zařízení by ale bylo lepší, kdyby sis “tovární nastavení” do EEPROMky vygeneroval sám. Například načíst data z EEPROM a pokud jsou tam samý 0xFF (EEPROMka je smazaná) nebo nesmyslný data nebo pokud byl požadavek na defaultní nastavení vyvolán uživatelem, pak do EEPROM uložit defaultní data.

Druhá varianta je, že pokud ze 2 8-bitových hodnot skládáš 16-bitovou, můžeš použít toto :

[code].ESEG
.ORG 0x0000

XA:
X0: .DB 0b10111110
X1: .DB 0b10001000
XB:
X2: .DB 0b11110100
X3: .DB 0b01101010

[/code]

Pak dostáváš XA=[X0,X1], XB=[X2,X3] (nebo správně XA=[X1…X0], XB=[X3,X2] - první byte je low, druhý high) . Tys měl XB=[X0,X2], proto to nešlo tak jednoduše. V tomhle případě pak jedním zápisem do X0 nebo X1 změníš vlastně i XA.

Jo, to je přesně to co jsem měl na mysli.
To že je vše v EEPROM “natvrdo” samozřejmě vím. Hodnoty takto definované se nikdy měnit nebudou, pouze případně ve Studiu. Jedná se v podstatě o něco jako ascii kody. X0 je byte písmenka a XA pak slovo sestavené z X0:Xx :slight_smile:
Když už tam ta EEPROM je, tak proč jí takto nevyužít a zbytečně plácat programovou paměť :slight_smile:

V tom případě je jednodušší a méně časově i paměťově náročné, když použiješ

#define Hodnota_X0 0b10111110 #define Hodnota_X1 0b10001000 #define Hodnota_X2 0b11110100

a definované hodnoty použiješ přímo v programu, místo toho, abys je četl z EEPROMky. Když víš, že potřebuješ hodnoty například X0:X5, tak místo, abys četl X0 a X5 z EEPROM a pak to šoupal třeba do XH:XL, tak v kódu napíšeš

ldi XL, Hodnota_X5 ldi XH, Hodnota_X0

Jsou to 2 instrukce a pokud nepoužíváš EEPROMku k uživatelskému nastavení a stejně jí přeprogramováváš v AVR Studiu, je zbytečné do programové paměti cpát rutiny pro čtení EEPROM. Konstrukce #define Hodnota_X0 0b10111110 je jenom informace pro překladač, v programové paměti nezabírá ani byte a změna hodnot v definicích se dělá úplně stejně, tak proč to nepoužít. Jediný rozdíl je v tom, že při přeprogramování nepřepisuješ programátorem EEPROMku, ale programovou paměť.

noo… tohle byl jen jako příklad. Těch ins. by muselo být 20 na každou zprávu. Takhle je jen těch 20 + čtení eeprom. Šlo by samozřejmě vše uložit do CSEG, ale zde se mi hodí každý kousek a navíc rychlost mě tolik netrápí a načítání uživ dat z eprom se používá také, takže čtení tam je tak i tak. To s tim #define je přesně vyhovující :slight_smile: Díky moc