PICAXE a LED displeje (2)

Zobrazení čísla na sedmisegmentovách LED jako výstup z mikrokontroléru je poměrně časté a podobně častý je i problém, který to přináší, potřebu příliš velkého počtu vývodů mikrokontroléru. Podívejme se, co se s tím dá dělat – tentokrát za pomoci čítačů s dekodéry. Příklady budou uváděny pro platformu PICAXE.

Soustředíme se především na vícemístné displeje. Každá jednotlivá znakovka dostane svůj kodér a také čítač. Kaskáda funguje jako čítač pulzů. K ovládání displeje bez ohledu na počet míst stačí jen dva výstupní piny, jedním se posílají čítané pulzy, druhým se všechny čítače společně vynulují. Použít lze například obvod 4026, který v sobě spojuje jak čítač tak dekodér, zapojení dvoumístného displeje ukazuje schéma. Ukázkový program cyklicky zobrazuje čísla 0 až 99.

LED5

Dvě znakovky obsluhované obvody 4026

REM LED dispej s 4026 - PICAXE 20M2
;desetinná tečka se může ovládat samostatně
setfreq m32
do               ;pošli postupně čísla 0 - 99
  for b1=0 to 99
    gosub zobraz 
    pause 5000
    next b1  
  loop
  
zobraz:           ;zobrazí číslo uložené v b1
  pulsout b.1,1   ;reset displeje
  if b1=0 then return endif
  for b0=1 to b1
    pulsout b.0,1 ;vyslání jednoho pulzu
    next b0
  return

Displej je statický co do obsluhy (potřebuje ji jen při změně) i zobrazení (nebliká), lze jej řídit jen dvěma výstupními piny, obslužný program je krajně jednoduchý a teoreticky zvládne libovolný počet míst, ale ve skutečnosti je realita o dost jiná. Při každé změně stavu disleje se musí přenést tolik pulzů, kolik odpovídá zobrazenému číslu, a to trvá nějakou dobu. Plyne z toho také, že přidání jednoho místa zvýší možný počet půlzů (přenosovou dobu) v nejhorším případě 10x. V průběhu přenosu rychle problikávají všechny číslice, obsah displeje se míhá. Při jedné číslici to ani nejde zaregistrovat, u dvou je bliknutí už zřetelné i při nejvyšší pracovní frekvenci mikrokontroléru, ale neruší. Pro více míst, například 4, až ale přenos při obsluze programem PICAXE trvá asi 3 sekundy, pro 5 míst 30 sekund, dál snad nemá smysl pokračovat.

Tento způsob je vhodný pro menší počet míst displeje a především tam, kde se obsah displeje nastaví a pak dlouho nemění (např. kurzovní lístky, elektronické cenovky, …), v takových případech několikasekundové trvání změny („přetáčení“) u vícemístného displeje nijak nevadí.


Je-li potřebné ještě více omezit počet použitých výstupních pinů mikrokontroléru, dá se vystačit i s jedním (méně to opravdu už nepůjde), ovšem za cenu dalšího podstatného zpomalení. Všimneme si, že v předchozím případě k resetování displeje dochází vždy před příchodem série pulzů, můžeme tedy před krátkými pulzy, které slouží k nastavení hodnoty, vyslat po stejném vodiči jeden mnohem delší pulz, z něhož RC článkem odvodíme signál Reset. Schéma ukazuje jen rozdělení signálů pro čítání pulzů a reset, vedle je reálný průběh signálu na výstupu mikrokontroléru (černě) a oddělený signál reset (červeně). Využití tento způsob najde třeba právě u elektronického kurzovního lístku, osmi piny mikrokontroléru se snadno obslouží osm pětimístných displejů.

LED6

Generování signálu reset pro předchozí zapojení

new_hantek405_1

Reálný průběh na výstupu PICAXE a signál reset

REM LED dispej s 4026 - PICAXE 20M2
;desetinná tečka se může ovládat samostatně
setfreq m32
do              ;pošli postupně čísla 0 - 99
  for b1=0 to 99
    gosub zobraz 
    pause 5000
    next b1  
  loop
  
zobraz:           ;zobrazí cislo uložené v b1
  pulsout b.0,200 ;reset displeje
  if b1=0 then return endif
  pause 5
  for b0=1 to b1
    pulsout b.0, 1
    next b0
  return

Předchozí způsob řízení displeje pomocí čítače vyžaduje i při malé změně hodnoty vynulovat displej a „natočit“ do něj kompletně novou hodnotu, což je pomalé. Jestliže pracujeme s hodnotami, které se třeba mění často, ale zpravidla jen o málo (to je většinou případ měření teplot nebo již zmíněné kurzovní lístky, ale také hodiny včetně datumu), pak se uplatní jiná myšlenka.

Použijeme podobný čítač s kodérem sedmisegmentovek jako 4026, ale schopný jak pulzy přičítat, tak odečítat. Ukážeme si řešení s obvodem 40110. Program potom nemusí posílat vždy kompletní počet pulzů, který odpovídá hodnotě, ale jen mnohem menší počet pulzů, který odpovídá změně. Tím se přenos zejména u vícemístných displejů zkrátí o několik řádů.

Musíme použít dva výstupy mikrokontroléru, jeden pro změnu nahoru, druhý pro změnu dolů. Reset nemusí být nutně ovládaný mikrokontrolérem, lze vyjít z toho, že po zapnutí jsou čítače vynulované, nebo může být signál reset odvozen ze zapnutí napájení jako v našem příkladu. Nevýhodou tohoto zapojení je, že pokud se do čítače třeba vlivem rušení na napájení dostane falešný impulz, potom chyba sama nezmizí a zobrazovaný údaj je o tuto chybu „posunutý“ až do vypnutí napájení, takže občas je i tak potřeba „natočit“ celé číslo znova.

Má-li použitý čítač možnost předvolby čísla (40110 ji nemá), lze toho výhodně využít. Je-li třeba obvykle zobrazovaná hodnota přibližně v polovině rozsahu pětimístného displeje (číslo kolem 50000), pak můžeme toto číslo nastavit pomocí předvolby do čítače při startu. Mikrokontrolér o tom ví a nebude začínat čítání od nuly, ale od 50000, čímž se nastavení v součinnosti s přičítáním nebo odečítáním opět výrazně zkrátí. Příklad ukazuje dvoumístný displej bez předvolby, který cyklicky zobrazuje čísla od 0 do 50 a pak zpět, při růstu používá krok 5, při poklesu krok -2.

Všechny displeje založené na čítači (ať už jednoduchém nebo up/down) jsou z principu statické co do obsluhy i zobrazení, nicméně obsluha při více místech (a velkých změnách) může být časově značně náročná a může plně vytěžovat mikrokontrolér desítky sekund.

LED7

Znakovky s UP/DOWN čítačem a dekodérem

REM LED dispej s 40110 - PICAXE 20M2
;desetinná tečka se může ovládat samostatně
setfreq m32
pause 1000       ;počkat na dokončení resetu
do               ;pošli postupně čísla 00 - 50 - 00
  for b1=0 to 50 step 5  gosub zobraz pause 3000 next b1  
  for b1=50 to 0 step -2 gosub zobraz pause 3000 next b1
  loop
  
zobraz:         ;zobrazí číslo uložené v b1, používá b0,b2,b3
  if b1<>b0 then 
    if b1>b0 then let b2=b1-b0  ;zjistit rozdíl, změnit stav
      for b3=1 to b2 pulsout b.0,1 next b3
      else b2=b0-b1
      for b3=1 to b2 pulsout b.1,1 next b3
      endif
    endif  
  b0=b1         ;zapamatuj poslední číslo v b0
  return

Příště se podíváme na jiné způsoby obsluhy znakovek s použitím posuvných registrů.