ATmega128-dojde k výpadku maticového LCD 4x20 při přerušení?

Chcel by som sa spytat skusenejsich, ci nastane problem pri obsluhe riadkoveho LCD 4x20 v pripade, ze bezi napriklad subezne casovac a dochadza pravidelne k obsluhe prerusenia. Predpokladam, ze nastane situacia, kedy pride k preruseniu pocas zapisu do LCD. Nevadi to pri obsluhe LCD? Nedojde k vypadkom? Samozrejme, ze status register a ine registre sa budu pred samotnym vykonanim obsluhy ukladat cez push a potom sa vratia hodnoty cez pop.

:arrow_right: administrator: přejmenováno z "Atmega 128, ovladanie LCD a prerusenia"

Ničeho se neboj, určitě to vadit nebude, LCD počká…

Petr diky. Nebol som si isty.
Este jeden problem: chcem urobit z jedneho celeho riadku bargraph od 0% po 100%. 20 krokov mi nestaci. chcel by som jemnejsie delenie, dajmetomu 40 krokov. teda 2,5% krokovanie. Chcem si urobit v cgram specialny znak: vyciernit polovicu znaku /prve tri stlpce pixelov v znaku/
Ako potom zobrazovat bargraph? napadlo ma riesenie, ze:
urobim si v SRAM dva retazce v dlzke 40 znakov v ktorom bude prvych 20 znakov ciernych a druhych 20 znakov prazdny znak. A program bude iba menit zaciatocnu adresu v pointeri pre SRAM odkial sa zacne nacitavat 20 znakov po sebe iducich do LCD. Nieco ako okienkovy filter - pasmova priepust.
jeden retazec by bol s normalnymi znakmi z ascii tabulky a druhy by mal na hranici ten jeden polovicny speci znak.
Prgram by zistoval, ci sa jedna o parny alebo neparny znak /pocitadlo od 0 do 40/ a podla toho by menil pociatocnu adresu pointeru raz do jedneho retazca znakov v SRAM raz do druheho.
Efekt by mal byt nasledovny, ze sa dosiahne delenie na 40 dielikov v bargraphe.
Bargraph by som prepisoval v LCD vzdy cely riadok kvoli jednoduchosti.

To co popisuješ si neumím představit, musel bych si to napsat a vyzkoušet v reálu. Ale zkus to, třeba to tak bude fungovat. Máš k dispozici dvacet znaků každý s pěti sloupci, udělej rozlišení 1%, bude to lépe vypadat.

moja predstava je v prilohe. pocet znakov je ale mensi iba 10. pre predstavu to snad bude stacit.
delenie az po 1% by uz bolo prilis jemne. teraz je v app 32 krokov a plne to postacuje. zobrazenie je 8xLED bargraph. teda az 4 kroky na jednu LED. nic moc. namisto 8xled tam mozem zavesuit LCD a aj informacii bude podstatne viac.
LCD.jpg

napriklad



#define POCET_ZNAKOV_NA_RIADKU 20
#define POCET_STLPCOV_V_ZNAKU 5
#define ZNAK_0S  0xYA // vloz si kod pre medzeru
#define ZNAK_1S  0xYB // vloz si spravny kod pre ztmavnutie laveho stlpca
#define ZNAK_2S  0xYC // vloz si spravny kod pre znak s dvoma stlpcami z lava
#define ZNAK_3S  0xYD // vloz si spravny kod ...
#define ZNAK_4S  0xYE // vloz si spravny kod ...
#define ZNAK_5S  0xYF // neviem pod akym kodom su vsetky pixle zaciernene, to si zisti a prepis


static uint8_t znak_na_riadku[POCET_ZNAKOV_NA_RIADKU];
static uint8_t znak_bargrafu[POCET_STLPCOV_V_ZNAKU + 1] = {ZNAK_0S, ZNAK_1S, ZNAK_2S, ZNAK_3S, ZNAK_4S, ZNAK_5S};

// ulohou funkcie je naplnenie pola znakov, ktore sa maju potom vyslat
// do displaya a zobrazit v riadku v zavislosti od hodnoty 
// premennej "hodnota"

void fn_napln_pole_kodom(uint8_t hodnota)
{
uint8_t cela_cast, desatina;
   // nejake kontroly na vstupe
    if (hodnota > 100) hodnota = 100;
    cela_cast = hodnota/POCET_STLPCOV_V_ZNAKU;
    desatina = hodnota - (POCET_STLPCOV_V_ZNAKU * cela_cast);

     for (uint8_t i = 0; i < POCET_ZNAKOV_NA_RIADKU; i++) {
        if (i < cela_cast) {
           znak_na_riadku* = znak_bargrafu[5];
           continue;
        }
        if (i == cela_cast) {
           znak_na_riadku* = znak_bargrafu[desatina];
        }
        else znak_na_riadku* = znak_bargrafu[0];
     }
     return;
}

Funkciu, ktora posle 20znakov na display predpokladam uz mas.
Tie 4 znaky (l, ll, lll, llll) si vloz do pamate RAM LCD a volaj ich podla prislusneho kodu. Medzera a plny znak by sa mal nachadzat v nativnej znakovej sade displaya.
Kod som neskusal, tak je s rucenim obmedzenym. Minimalne by Ta mal nasmerovat na sposob riesenia***

diky Martin. Cital som tvoju debatu na temu C. Ja som zacal s asm a zatial som vacsie projekty nerobil, takze si s asm vystacim. Aj ked chrobaka do hlavy si mi uz dal a zohnal som si literaturu ohladne C. Zatial by som sam toho vela nenapisal v C, ale aspon som porozumel tvojmu kodu, co si tu napisal tak na 90%.
Projekt ktory robim je v asm, a nemam cas sa ucit C aj pisat projekt.
Takze ho dokoncim v asm a uvidime do buducnosti. Ked sa posunieme do cortexov a arm aj tak nas C neminie.

Na asm sa vybodni. Dokonca ak uvazujes nad pouzivanim roznych procesorov tak to duplom, je to strata casu aj pre male projekty typu blikanie LEDkou. :slight_smile:

P.S. Nechcem rozvirovat flame, myslim, ze moje nazory su v tomto smere zname :wink: