Sari la conținut
ELFORUM - Forumul electronistilor

Ceas RGB WIFI


Kreator

Postări Recomandate

  • Răspunsuri 46
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

16 hours ago, Liviu.Mihaiu said:

Dar in cazul de fata se putea utiliza biblioteca ESP EEPROM emulation

Cum esp-urile n-au eeprom intern, orice salvare de date in "eeprom" se foloseste de emularea de care zici. Da' eu intrebasem de eeproame adevarate, conectate extern la un uController. Orice microcontroller.

Nu conteaza, am fost curios sa vad cum e implementata biblioteca de care zici, am cautat-o si am descoperit ca pentru comunicatie foloseste biblioteca spi_flash. Asa ca am descarcat ultimul SDK si m-am uitat la functiile din spi_flash. Pentru comunicatia efectiva, spi_flash foloseste functii din spi_flash_raw.

Prima functie din spi_flash_raw() e

void Cache_Read_Disable_2(void)
{
    CLEAR_PERI_REG_MASK(CACHE_FLASH_CTRL_REG,CACHE_READ_EN_BIT);
    while(REG_READ(SPI_EXT2(0)) != 0) { }
    CLEAR_PERI_REG_MASK(PERIPHS_SPI_FLASH_CTRL,SPI_ENABLE_AHB);
}

deci blocanta.

A treia functie e

uint32_t spi_flash_get_id_raw(esp_rom_spiflash_chip_t *chip)
{
    uint32_t rdid = 0;

    Cache_Read_Disable();

    Wait_SPI_Idle(chip);
...

Din pacate nu gasesc implementarea lui Wait_SPI_Idle(chip), da' nu pare neblocant. Si e folosit des.

E drept, nu e folosit delay()...

Editat de Liviu M
Link spre comentariu
12 hours ago, cimitavita said:

Este o greșeală să bagi întârzieri la scrierea sau la citirea din eeprom.

 

Datasheetul spune ca dupa orice operatie de scriere trebuie sa astepti tWR = 10 ms ca sa poti scrie din nou in el:
BYTE WRITE: A write operation requires two 8-bit data word addresses following the device address word and acknowledgment. Upon receipt of this address, the EEPROM will again respond with a zero and then clock in the first 8-bit data word. Following receipt of the 8-bit data word, the EEPROM will output a zero and the addressing device, such as a microcontroller, must terminate the write sequence with a stop condition. At this time the EEPROM enters an internally-timed write cycle, tWR, to the nonvolatile memory. All inputs are disabled during this write cycle and the EEPROM will not respond until the write is complete.

Editat de Kreator
Link spre comentariu

Teoretic poti sa "astepti" fara delay - cand vrei sa scrii, verifici intai ca eepromul e disponibil. Daca da, pornesti srierea, daca nu mai dai o tura prin restul programului. Si dai ture pana cand eepromul se elibereaza si poti trimite data.

Asta functioneza daca restul programului nu depinde de datele din eeprom (de obicei nu depinde, ca datele alea sunt si in variable in ram) si implica uneori o complicare a programului. Daca complicarea asta merita sau nu, decide fiecare pentru el.

Editat de Liviu M
Link spre comentariu
Vizitator

@Kreator
Fa te rog un test fara cele doua delay(10) din functia writeEEPROM().
Eu cred ca nu sunt necesare in cazul bibliotecii Wire pentru ESP.
Oricum Wire.write(...) nu trimite efectiv nimic la eeprom. Doar adauga datele intr-un buffer.
Abia Wire.EndTransmission() trimite datele pe I2C. Si face si teste waitbusy().

 

Editat de Vizitator
Link spre comentariu

Nu cred ca wire are treaba cu condittile specifice dispozitivului care atarna de sarmele i2c.

Daca as implementa eu wire, m-as uita doar la acknowledge. Vine cum trebuie dupa fiecare octet trimis, consider comunicatia incheiata.

Cat trebuie sa astepte utilizatorul pana datele scrise isi fac treaba, n-ar trebui sa mai fie treaba bibliotecii de comunicatie.

Link spre comentariu
Vizitator

Majoritatea exemplelor de pe net sunt facute cu copy/paste.
Motivul postarilor fiind de cele mai multe ori obtinerea de bani din publicitatea data de numar de accesari.
Si din cauza asta de multe ori se propaga pe net tot felul de idiotenii provenite de pe site-uri aparent normale.
 

2 hours ago, Liviu M said:

Daca as implementa eu wire, m-as uita doar la acknowledge. Vine cum trebuie dupa fiecare octet trimis, consider comunicatia incheiata.

Cam asta face biblioteca WIRE folosita la ESP.
Endtrasmission() apeleaza write_bit() care face si asa ceva.






 

Link spre comentariu

Ok, și atunci cum rămâne cu cele 4ms cât trebuie să aștepți ca să fii sigur că ce ai scris chiar e scris? Că wire n-așteaptă. Presupunem ca vrei să scrii date în două pagini diferite, așa că trebuie două accese diferite, nu merge cu pui datele în buffer și le trimiți o singură dată. 

Link spre comentariu
Vizitator

Posibil sa mearga cu multiple instante ale clasei Wire.
Si apoi ceva timers la executie. Poate chiar exista pe net incercari de genul asta.



 

 

Editat de Vizitator
Link spre comentariu

Sorry, bătaie de cap inutilă. 

Ori faci că în foaia de catalog, încerci sa să comunici cu eepromul până e acknowledged (dacă vrei să nu pierzi nici o us), ori, dacă îți permiți să "arunci" niște ms, pui un delay(4), că tot cu while sunt implementate ambele. Ba chiar uneori e preferabil delay(), că tentativele de comunicare sunt zgomotoase. 

Link spre comentariu
Vizitator
27 minutes ago, Liviu M said:

Sorry, bătaie de cap inutilă. 

Poate nu.
Incet, incet trebuie sa ne apropiem in programare de modul in care functioneaza al nostru creier.
Delay() nu prea exista. Nici macar in coma indusa.
 

Link spre comentariu

Atâta discuție despre numele unei bucle while... Chiar, while() există in viața de zi cu zi? 

Sunt de acord că e folosit fără... discernământ, da' nu-s de acord că trebuie banat din programele Arduino. După părerea mea, ți-am arătat un caz în care folosirea e justificată, nu am motive să continui discuția. 

Spor la programat (cu sau fără delay()). 

Link spre comentariu
Vizitator

Gresesti.
"Ceasul" lui @Kreator poate sa fie "inceputul unei frumoase prietenii", asa cum spunea ... poetul.
Subiect de discutii sigur este.
Dar sa vedem ce mai zice si user Kreator. Sigur va avansa cu acest proiect cu sau fara parerile noastre.
Si mai discutam dupa.
LE: Eu am sa incerc sa postez in cateva zile o versiune (mai) optimizata a codului.

 

Editat de Vizitator
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări