Stránka 2 z 3

Napsal: 18 úno 2010, 20:06
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

Napsal: 18 úno 2010, 20:54
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?

re

Napsal: 18 úno 2010, 20:57
od Toby
jasný napsal jsem to špatně
eeprom se zobrazuje do okna

Napsal: 18 úno 2010, 21:04
od AB1
A co fuses? Není zaplá kompatibilita s M103?

Napsal: 18 úno 2010, 21:15
od Toby
kompatibilitu mám vyplou
není mi jasný proč funkce pro čtení chodí a funkce pro zápis ne

Napsal: 18 úno 2010, 21:58
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)
    {
    }

}

Napsal: 18 úno 2010, 22:27
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 :(

Napsal: 18 úno 2010, 22:56
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á.

re

Napsal: 18 úno 2010, 23:33
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!

Napsal: 19 úno 2010, 00:07
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

re

Napsal: 19 úno 2010, 00:36
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:)

Napsal: 19 úno 2010, 22:22
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

Napsal: 20 úno 2010, 20:11
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

Napsal: 20 úno 2010, 21:03
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é.

re

Napsal: 26 úno 2010, 10:15
od Toby
ahojte ,
plnou verzi CodeVisionAvr, kterou používám je 2.03.4