This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:storage [2012/02/19 20:21] – heikopikner | et:examples:storage [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
====== Andmesalvestus ====== | ====== Andmesalvestus ====== | ||
- | <note important> | + | {{ : |
- | ===== Teooria ===== | + | Nii nagu ka arvutitel on mikrokontrollerite kasutamisel olukordi, kus on vaja säilitada muutuvaid andmeid ka pärast kontrolleri taaskäivitamist või pikemat aega ilma toiteta olekut. Kontrolleri töömälu, ehk RAM sisu säilib ainult kontrolleri töö ajal ja muutujatesse salvestatud andmed kontrolleri taaskäivitamisel kustuvad. Andmete säilitamiseks on mikrokontrolleritel mitmeid võimalusi ja need on analoogsed tavaliste arvutite võimalustega. Andmete salvestamise moodus ja füüsilise andmekandja valik sõltub eelkõige andmete iseloomust (formaat ja maht) ning andmesalvestusseadmete ja liideste olemasolust. |
- | [{{ : | + | Kui on vaja salvestada lihtsaid parameetreid, näiteks kasutaja valikud jms, mis on tavalisel tekstilisel kujul ja väikese mahuga, siis sobiks selleks hästi EEPROM mälu. See on mugav ka selle tõttu, et enamusel mikrokontrolleritel |
- | + | ||
- | Secure Digital (SD) on mälukaardi formaat, mille töötas välja SD Card Association (SDA) kasutamiseks kaasaskantavates seadmetes. SD kaart töötab 3,3 V tööpingega. Kaartiga suhtlemiseks saab kasutada kaarti enda SD nimelist liidest ja ka SPI siini. Viimane on hea võimalus kasutada SD kaarti lihtsamates süsteemides. | + | |
- | + | ||
- | SD kaart on iseenesest suur hulk mälupitte, mida saab küll muuta, aga muud seadmed ei oska salvestatud andmetega seljuhul midagi peale hakata. Probleemi lahendamiseks kasutatakse failisüsteemi, mis annab võimaluse töötada kogu kaardi mälumaatriksi asemel failidega. Failisüsteemi üks tähtsamaid ülesandeid | + | |
- | + | ||
- | Portatiivsetel mäluseadmetel ja mälukaartidel | + | |
- | + | ||
- | ===== Praktika ===== | + | |
- | + | ||
- | Kodulabori Kontrollermooduli plaadil on pesa Micro SD mälukaardi sisestamiseks. Ühendatud on see samale SPI siinile koos etherneti kontrolleriga. | + | |
- | + | ||
- | Kodulabori teegis on SD kaardiga suhtlemiseks kaks kihti. Esimene ketta kiht on seotud otseselt kettaga suhtlemise | + | |
- | + | ||
- | Kodulabori teegis oleva FatFs failisüsteemi paketiga | + | |
- | + | ||
- | Järgmine näide demonstreerib tekstifaili lugemist | + | |
- | + | ||
- | ~~PB~~ | + | |
- | + | ||
- | + | ||
- | <code c> | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | + | ||
- | + | ||
- | // LEDide viigud | + | |
- | pin led_red | + | |
- | pin led_yellow = PIN(C, 4); | + | |
- | pin led_green | + | |
- | + | ||
- | // Nuppude viigud | + | |
- | pin button1 = PIN(C, 0); | + | |
- | pin button2 = PIN(C, 1); | + | |
- | pin button3 = PIN(C, 2); | + | |
- | + | ||
- | + | ||
- | int main (void) | + | |
- | { | + | |
- | int f_err_flag = -1; //Ketta vea lipp | + | |
- | int d_err_flag = -1; // | + | |
- | char f_err_buf[16]; | + | |
- | char d_err_buf[16]; | + | |
- | + | ||
- | int variableName = 0; | + | |
- | + | ||
- | static FATFS FATFS_Obj; | + | |
- | FIL fil_obj; | + | |
- | + | ||
- | char read_buf[20]; | + | |
- | + | ||
- | unsigned char new_value1, old_value1 = 0; | + | |
- | unsigned char new_value2, old_value2 = 0; | + | |
- | unsigned char new_value3, old_value3 = 0; | + | |
- | + | ||
- | + | ||
- | // Seab LEDid töökorda | + | |
- | pin_setup_output(led_red); | + | |
- | pin_setup_output(led_yellow); | + | |
- | pin_setup_output(led_green); | + | |
- | + | ||
- | // Seab nupud töökorda | + | |
- | pin_setup_input_with_pullup(button1); | + | |
- | pin_setup_input_with_pullup(button2); | + | |
- | pin_setup_input_with_pullup(button3); | + | |
- | + | ||
- | // Lülitab LEDid välja | + | |
- | pin_set(led_green); | + | |
- | pin_set(led_yellow); | + | |
- | pin_set(led_red); | + | |
- | + | ||
- | // Ekraani seadistamine | + | |
- | lcd_gfx_init(); | + | |
- | + | ||
- | // LCD ekraani puhastamine | + | |
- | lcd_gfx_clear(); | + | |
- | + | ||
- | lcd_gfx_backlight(true); | + | |
- | + | ||
- | // Kursori (nähtamatu) ekraani keskele viimine | + | |
- | lcd_gfx_goto_char_xy(3, | + | |
- | + | ||
- | // Programmi nime kuvamine | + | |
- | lcd_gfx_write_string(" | + | |
- | + | ||
- | + | ||
- | while (1) | + | |
- | { | + | |
- | // Loeb nuppude väärtused. | + | |
- | | + | |
- | new_value2 = pin_get_debounced_value(button2); | + | |
- | new_value3 = pin_get_debounced_value(button3); | + | |
- | + | ||
- | // Nupp S1 alla vajutatud. Registreeritakse ainult üks vajutus. | + | |
- | if((!new_value1) && (old_value1)) | + | |
- | { | + | |
- | // SD kaardi initsialiseerimine. Ebaõnnestumise korral seatakse vealipp. | + | |
- | d_err_flag = disk_initialize(0); | + | |
- | + | ||
- | // Viide | + | |
- | sw_delay_ms(2); | + | |
- | + | ||
- | // Failisüsteemi initsialiseerimine. Ebaõnnestumise korral seatakse vealipp. | + | |
- | f_err_flag = f_mount(0, & | + | |
- | + | ||
- | // Viide | + | |
- | sw_delay_ms(2); | + | |
- | + | ||
- | + | ||
- | } | + | |
- | + | ||
- | // Nupp S2 vajutatud. Registreeritakse ainult üks vajutus. | + | |
- | if((!new_value2) && (old_value2)) | + | |
- | { | + | |
- | // Faili " | + | |
- | f_open(& | + | |
- | + | ||
- | // Failist esimese 14 tähemärgi lugemine. | + | |
- | f_gets (read_buf, | + | |
- | f_close(& | + | |
- | + | ||
- | // Faili esimese 14 tähemärgi ekraanile kirjutamine. | + | |
- | lcd_gfx_goto_char_xy(0, | + | |
- | lcd_gfx_write_string(read_buf); | + | |
- | + | ||
- | } | + | |
- | + | ||
- | // Nupp S3 vajutatud. Registreeritakse ainult üks vajutus | + | |
- | if((!new_value3) && (old_value3)) | + | |
- | { | + | |
- | // Suvaline muutuja, mis salvestatakse faili. | + | |
- | variableName = 4; | + | |
- | + | ||
- | // Kettale luuakse kaust " | + | |
- | f_mkdir(" | + | |
- | + | ||
- | // Loodud kausta tekitatakse tekstifail " | + | |
- | f_open(& | + | |
- | + | ||
- | // Fail avatakse kirjutusreziimis. | + | |
- | f_open(& | + | |
- | + | ||
- | // Faili kirjutamine. | + | |
- | f_printf(& | + | |
- | + | ||
- | // Faili sulgemine | + | |
- | f_close(& | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Jätab eelmise nupu väärtuse meelde | + | |
- | old_value1 = new_value1; | + | |
- | old_value2 = new_value2; | + | |
- | old_value3 = new_value3; | + | |
- | + | ||
- | + | ||
- | // Kui SD-kaart on initsialisseritud | + | |
- | // ja vastupidisel juhul punane LED. | + | |
- | if((f_err_flag == 0) && (d_err_flag == 0)) | + | |
- | { | + | |
- | pin_clear(led_green); | + | |
- | pin_set(led_red); | + | |
- | } | + | |
- | else | + | |
- | { | + | |
- | pin_set(led_green); | + | |
- | pin_clear(led_red); | + | |
- | } | + | |
- | + | ||
- | // Ekraanile kuvatakse vealippude olekud. Need on järgnevad: | + | |
- | // -1 initsialiseerimata | + | |
- | // 0 viga ei ole | + | |
- | // 1 (või suurem) viga | + | |
- | sprintf(f_err_buf, | + | |
- | sprintf(d_err_buf, | + | |
- | + | ||
- | lcd_gfx_goto_char_xy(0, | + | |
- | lcd_gfx_write_string(f_err_buf); | + | |
- | lcd_gfx_goto_char_xy(0, | + | |
- | lcd_gfx_write_string(d_err_buf); | + | |
- | + | ||
- | // Viide | + | |
- | sw_delay_ms(2); | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | </ | + | |