čtení a zápis do eeprom u Atmegy128

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

#16 Příspěvek od Toby »

Andrea píše:
Toby píše:#asm("cli") // zakaz GIE
EEPROM_write(0x0001,0x01); // zapis na pozici 1 hodnotu 1
delay_ms(500); // cekej
EEPROM_read(0x0001); // precti data na pozici 1
#asm("sei") // povol GIE
A jak zjišťuješ, co jsi přečetl, když přečtenou hodnotu nikam neukládáš?
tímhle zapisuji data
EEPROM_write(0x0001,0x01); // zapis na pozici 1 hodnotu 1

a eeprom pak čtu za běhu programu v Programu ASIX UP

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#17 Příspěvek od AB1 »

eeprom pak čtu za běhu programu v Programu ASIX UP
Tomu nerozumím.
Asix je programovací software? Jak může číst za běhu?

Každý programátor umí přečíst eeprom do okna nebo do souboru (ne za běhu). Proč ne tak?

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#18 Příspěvek od Toby »

jasný napsal jsem to špatně
eeprom se zobrazuje do okna

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#19 Příspěvek od AB1 »

A co fuses? Není zaplá kompatibilita s M103?

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

#20 Příspěvek od Toby »

kompatibilitu mám vyplou
není mi jasný proč funkce pro čtení chodí a funkce pro zápis ne

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#21 Příspěvek od AB1 »

Zkusil bych ještě toto

Kód: Vybrat vše

#include <mega128.h>

eeprom unsigned int x,y; 

void main(void)
{
    x = 0x3412;
    y = 0x7856;

    while (1)
    {
    }

}

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

#22 Příspěvek od Toby »

jj to funguje, nechtěl jsem to schválně sem psát
podobný program je napsaný v knížce od Váni s pomocí pointerů
mě by spíš zajímala ta write funkce proč to nešlape, přitom je napsaná v každém datasheetu avr :(

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#23 Příspěvek od AB1 »

Problém může být tento:

EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);

Bit EEWE musí být nastavený nejpozději 4 cykly po nastavení EEMWE.
Je to popsáno někde v datašítu.

Pak záleží jak překladač kód přeloží. Na jeho optimalizaci.
Např. Avr-gcc s vypnutou optimalizací to přeloží tak, že je tam 5 nebo 6 cyklů a kód nejde.

Čili chce to podívat se na přeložený asm a spočítat cykly.

Nebo na zkoušku napsat kritickou část v asm.

Kód: Vybrat vše

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
    while(EECR & (1<<EEWE));     
    EEAR = uiAddress;
    EEDR = ucData;
    //EECR |= (1<<EEMWE);         
    //EECR |= (1<<EEWE);          
    #asm
    SBI       0x1C,2
    SBI       0x1C,1 
    #endasm
} 
Nic jiného mne nenapadá.

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#24 Příspěvek od Toby »

už tě nemusí nic dál napadat, protože ta poslední funkce s tou "asm" náhradou funguje :D teď se to zobrazí po přečtení eeprom jak pomocí funkce pro čtení tak i v prostředí UP
kouknul jsem do nastavení CodeVisionAVR a tam je nastavená maximální optimalizace, co to jde a stejně to předtím nešlapalo.
Hoši od atmelu mají funkce pro eeprom v datasheetu napsané správně.
Já měl problém s optimalizací.
Ještě bych tě požádal o vysvětlení těch dvou příkazů napsané v asm
SBI 0x1C,2
SBI 0x1C,1
to vůbec nechápu jak tyto výrazy souvisí s výrazy
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);

ale jinak moc dík za pomoc jsi borec!

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#25 Příspěvek od AB1 »

Opsal jsem to z přeloženého asm.
0x1c je adresa registru EECR

Totéž je
SBI EECR,EEMWE // set bit EECR.EEMWE
SBI EECR,EEWE

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#26 Příspěvek od Toby »

jsem rád, že jsi mi helpnul:wink:
kombim to tady s přestávkama od rána, ale zatím tak daleko nejsem, abych si vzpomněl na optimalizaci:)

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#27 Příspěvek od ZdenekHQ »

AB1 píše:
Pak záleží jak překladač kód přeloží. Na jeho optimalizaci.
Např. Avr-gcc s vypnutou optimalizací to přeloží tak, že je tam 5 nebo 6 cyklů a kód nejde.
To je potom skutečně radost v něčem podobným programovat... 8O
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#28 Příspěvek od AB1 »

To je potom skutečně radost v něčem podobným programovat..
Není to tak zlé. To co jsem napsal je jenom pro ilustraci problému. Předpoklá se, že nikdo nebude používat překladač bez optimalizace. Bylo by to jako dát do formule1 motor z trabanta.
Teprve optimalizace určuje výkonnost překladače.

Za druhé, pokud používáme vestavěné funkce překladače tak podobný problém nehrozí. Tyto funkce vyhoví v 99% případů. Myslím tím funkce pro periferie.

Výše v tomto vlákně je vidět, že zápis do eeprom přes proměnné funguje.

Bylo by zajímavé vědět v jaké versi cvavr Toby překládal.
Já jsem zkoušel v demo verzi 2.04.6 Evaluation s nejnižší optimalizací a přesto byl kód přeložený správně.

výpis z přeloženého asm

Kód: Vybrat vše

; 0000 0013     EECR |= (1<<EEMWE);
	SBI  0x1C,2
; 0000 0014     EECR |= (1<<EEWE);
	SBI  0x1C,1

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#29 Příspěvek od Andrea »

Bohužel někdy je problém právě v zapnuté optimalizaci. Když je nastavená příliš velká optimalizace, tak kompiler (gcc) přehází nebo sloučí instrukce a výsledek je opět nefunkční program. Proto jsem psala, ať se podívá, jak je to přeložené.

Uživatelský avatar
Toby
Příspěvky: 25
Registrován: 18 úno 2010, 01:00

re

#30 Příspěvek od Toby »

ahojte ,
plnou verzi CodeVisionAvr, kterou používám je 2.03.4

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“