Kysymys:
Muuttujien tallentaminen mikro-ohjainten muistiin
S Andrew
2016-08-04 17:53:50 UTC
view on stackexchange narkive permalink

Suunnittelen sovellusta, joka sisältää GSM SIM900 ja PIC18F2520 .Sovellus sisältää perus- soitto- ja tekstiviestipalvelut.Käyttäjä painaa painiketta, jolloin soitetaan tiettyyn numeroon.Tätä numeroa voidaan muuttaa tekstiviestillä.Joten aina kun painiketta painetaan uudelleen, soitetaan äskettäin määritettyyn numeroon.Tällä hetkellä käytän näitä muuttujia numeroon:

  char callNumber1 [10]; char callNumber2 [10]; ** char callNumber5 [10];  

Ongelmana on, että nämä muuttujat toimivat odotetusti.Mutta kun sammutan MCU: n virran, niihin tallennetut tiedot menetetään.Haluan, että tiedot pysyvät sellaisina kuin ne ovat virran katkaisun jälkeen, ja niitä voidaan käyttää uudelleen virran kytkemisen jälkeen. Kuinka tallentaa ne MCU: n muistiin.Anna mikä tahansa linkki, josta voin lukea muistista MCU: ssa.Ole hyvä ja auta.

"Minun kohtaama ongelma on, että nämä muuttujat toimivat odotetusti." Se ei ole sinun ongelmasi.
Kaksi vastused:
Ale
2016-08-04 18:03:12 UTC
view on stackexchange narkive permalink

Kaikki, mitä ilmoitat muuttujana koodissasi, on PIC: n RAM-muistissa ja katoaa siten, kun sammutat sen. PIC18F2580: ssa on kuitenkin 256 tavua EEPROM-muistia, joka on haihtumaton. Voit tallentaa puhelinnumerosi sinne joka kerta, kun niitä muokataan, ja ladata ne käynnistyksen yhteydessä muuttujiin.

Jos haluat lukea ja kirjoittaa tavua EEPROM: n tiettyyn osoitteeseen, sinun on käytettävä EECON1 , EECON2 , EEDATL ja EEADRL -rekisterit (katso tietolomakkeen luku 8), esimerkiksi:

  uint8_t read_eeprom (uint8_t addr) {EECON1 = 0; EEADRL = addr; EECON1bit.RD = 1; return EEDATL;} void write_eeprom (uint8_t addr, uint8_t-arvo) {EECON1 = 0; EEADRL = addr; // osoite, johon kirjoitetaan EEDATL = arvo; // arvo kirjoittaa EECON1bits.WREN = 1; // ota kirjoitus käyttöön EECON2 = 0x55; // kirjoita lukituksen avausjärjestys EECON2 = 0xAA; EECON1bits.WR = 1; // tee todellinen kirjoitus EECON1bits.WREN = 0; // poista kirjoittaminen käytöstä (EECON1bits.WR! = 0); // odota kirjoituksen päättymistä EEIF = 0; // tyhjennä EEPROM-keskeytyslippu}  

Ja sitten voit ladata numerosi tällä tavoin:

  void load_number (const uint8_t start_addr, char * n , const int len) {for (uint8_t i = 0; i < n; i ++) {n [i] = read_eeprom (aloitus_addr + i); }} load_number (0, callNumber1, 10); load_number (10, callNumber2, 10); // jne.  

Ja sama ajatus tallennuksesta. Huomaa, että tämä koodi ei käytä EEPROM-muistia kovin tehokkaasti, koska ASCII-numeroiden tallentaminen siihen vie tilaa. Jos EEPROMin 256 tavua rajoittaa sinua, voit esimerkiksi tallentaa numerot BCD-muodossa, jolloin sinulla on kaksi numeroa tavua kohti.

Toisin kuin RAM, haihtumattomilla muisteilla, kuten EEPROM ja Flash, on rajoitettu määrä kirjoitusjaksoja.Vaikka tämä luku on yleensä erittäin korkea (miljoona sykliä PIC18F2580 EEPROM -mallissa), on hyvä käytäntö olla kirjoittamatta haihtumattomaan muistiin, ellei tämä ole tarpeen eli tietoja on todella muokattu ja ne on

Jos tietoja on kirjoitettava säännöllisin väliajoin EEPROM- tai Flash-muistiin, kulumisen tasoitusalgoritmista voi olla hyötyä tasaisen kulumisen jakamiseksi muistisoluille.Tämä voi olla vielä tärkeämpää Flash-pohjaisen haihtumattoman muistin kanssa, jolla on usein vähemmän kirjoitusjaksoja kuin EEPROMilla (esim. PIC18F2580: n Flash-muistilla on "vain" 100 000 kirjoitussyklin kestävyys).

Jos sinulla ei ole EEPROM-tiedostoa käytettävissä, useimmat mikromikrot (kaikki ne, jotka olen törmännyt) antavat laiteohjelmiston kirjoittaa vilkkumaan.Se ei ole niin nopea, helppo tai virtaa säästävä kuin EEPROM, mutta se voidaan tehdä.Jos sinulla on EEPROM, se on ehdottomasti oikea tapa edetä.
Vaikka PIC18F2520: n EEPROM: lla on 1M: n poisto- / kirjoitusjaksospesifikaatio, saattaa olla hyvä mainita asia.Voit käsitellä sitä lyhyesti tai viitata muihin kysymyksiin / resursseihin, jotka kattavat EEPROM-kirjoituskertojen vähentämisen (esim. Kirjoittaminen vain, kun havaitaan virran menetys, kulumisen tasoitus jne.)Vaikka sitä ei ehkä tarvita toimenpideohjelmien erityistilanteessa, olisi hyödyllistä, että ihmiset, jotka näkevät tämän kysymyksen ja vastauksen tulevaisuudessa, ainakin mainitsivat, että on muita näkökohtia kuin ajatella, että heidän pitäisi tallentaa jokin satunnaismuuttuja EEPROM / FLASH: iin.
@Ale Kiitos.Tämä on suurenmoista.Olen opiskellut muistinhallintaa ja kokeillut tätä koodia ja sen toimintaa.Ennen kuin yhdistin tämän koodin nykyiseen GSM-koodiini, testasin koodini GSM: n varalta.Katkaisin MCU: sta virran ja käynnistäin sen uudelleen, ja se toimi.Määritetyt muuttujat toimivat jopa virran katkaisun jälkeen.Nyt tämä on aiheuttanut mielessäni valtavan hämmennyksen.Kuinka muuttuja toimii virran katkaisun jälkeen.Kuinka muuttujien tiedot ovat edelleen turvallisia?
Mikrokontrollereissa on yleensä staattinen RAM ja kondensaattorit, joten ne voivat usein säilyttää arvot lyhyellä virrankatkaisulla.
@Makyen Hyviä huomioita, kiitos!Laajensin vastausta.
Ihannetapauksessa haluat säästää vain virrankatkaisulla, jotta vältät haihtumattoman tallennustilan kulumisen, tee se oikein, vaikka tarvitset laitteistoa virran vähenemisen havaitsemiseksi ja riittävästi kapasitanssia tai muuta energian varastointia, jotta pysyt riittävän pitkään loppuunkirjoita.
voit käyttää tähän SD-korttia (jotain irrotettavaa), säästää aikaisin ja usein, kun se kuluu, anna heille vioittunut korttiviesti ja he voivat ostaa uuden SD-kortin, jotta se toimisi.
@dwelch Sovelluksissa, jotka kirjoittavat intensiivisesti haihtumattomaan muistiin, tämä saattaa olla järkevää, joko SD-kortilla tai vastaavalla muistituki, tai jopa EEPROM DIL-liitännässä (sovelluksesta riippuen yksi tai toinen voi olla järkevämpi).On kuitenkin tarkistettava, mikä on EEPROM: n mahdollinen käyttöikä: olettaen, että ohjelma kirjoittaa EEPROM: lle joka tunti samaan osoitteeseen, PIC18F EEPROMilla on vielä 114 vuotta käyttöikää ennen EOL: n saavuttamista.Vertaa sen Flashin 40 vuoden tietojen säilyttämiseen, ennen kuin sinun on päivitettävä sitä ...
pjc50
2016-08-04 18:34:47 UTC
view on stackexchange narkive permalink

SIM900: lla on itse asiassa oma 'puhelinluettelo', jota voit käyttää numeroiden tallentamiseen.Katso AT + CPBW ja siihen liittyvät komennot.

Esimerkkejä ohjeista.Kirjoita puhelinmuistioon:

AT + CPBW =, "13918 18xxxx", 129, "Daniel"

Lue puhelinluettelosta:

AT+CPBF="Daniel"

palautukset

+ CPBF: 5, "13918186089", 129, "Daniel"

Luettelo puhelinluettelosta:

AT+CPBR=1,10

Tämä menetelmä on hieno, mutta ongelmana on, että kun tallennamme yhteystiedot, se ei kerro meille sijaintia, johon kontakti tallennetaan.Nyt myöhemmin, jos haluan muokata sitä, meidän on ensin poistettava yhteyshenkilö.Poistaessasi sitä kysy kontaktien sijaintia, jota emme tiedä.Vaikka voin käyttää "AT + CPBR" -luetteloa kaikkien yhteystietojen luetteloon, mutta siinä luetellaan kaikki kontaktitiedot, jotka ylittävät puskurin.Yhteystietoa ei poisteta nimellä.
@Andrew Ei ole komentoa yksinkertaisesti muuttaa yhteystiedon määrää?Se on peruskäyttö.


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...