logo_elektromys.eu

/ STM8 GPIO III.|

/ Úvod |

V předchozím díle jsme se věnovali čtení stavu tlačítka, ale přeskočili jsme jednu klíčovou informaci. A to jakým způsobem náš mikrokontrolér rozpoznává logické úrovně. Takže to rychle napravíme :)

/ Logické úrovně |

Tento pojem, už by jste měli znát z předchozích kurzů číslicové techniky. Já si ale nebudu dělat iluze a raději si vše probereme pěkně popořadě. Pro náš mikrokontrolér je log.1 jakékoli napětí větší jak 70% napájecího. Tedy při napájení 5V vnímá jako log.1 ("High") napětí od 3.5V do 5.3V (to je totální maximum jak si jistě vzpomínáte). Za úroveň "Low" (log.0) považuje jakékoli napětí menší jak 30% napájecího, tedy při 5V napájení je to napětí mezi 0V až 1.5V. Procvičte si to raději na dvojici následujících příkladů:

Př.1:
Jako jaké logické úrovně vyhodnotí mikrokontrolér STM8S napájený 4.9V následující napětí na vstupech:
a) 0.1V
b) 4.7V
c) 1.2V
d) 0.9V
e) 3.8V

odpovědi: a) Low, b) High, c) Low, d) Low, e) High

Př.2:
Jaké maximální napětí ještě vyhodnotí mikrokontrolér STM8S napájený napětím 3.3V jako log.0 (Low) ? A jaké minimální napětí vyhodnotí jako log.1 (High) ?

Úroveň High (log.1) musí být větší než 70% napájecího napětí, tedy 0.7*3.3 = 2.31V
Úroveň Low (log.0) musí být menší jak 30% napájecího napětí, tedy 0.3*3.3 = 0.99V

Mikrokontrolér vyhodnotí jako log.0 napětí menší jak 0.99V a jako log.1 napětí větší jak 2.31V.

Možná se teď pozastavujete nad tím co si bude miktrokontrolér myslet o napětí ve zbylé části rozsahu. Tedy mezi 30% a 70% napájecího napětí. Nebo konkrétně, jak vyhodnotí 5V napájený MCU vstupní napětí 3V ? Jednoduše řečeno, jako co se mu zachce. Úplnou libovůli sice nemá, ale pro vás jako začátečníky je dobré počítat s tím že to prostě může být log.1 i log.0 a že si to může mikrokontrolér kdykoli rozmyslet. Není nic jednoduššího než si to zkusit.

Cv.1 Připojte podle schematu na vstup mikrokontroléru (PG4) voltmetr a dělič napětí sestavený z trimru. Trimr zvolte v rozsahu 1k až 100k. Napište jednoduchý program, který rozsvítí LED (na PC5) když ze vstupu PG4 přečte úroveň High a zhasne LED když přečte úroveň Low. Nastavujte trimrem různá napětí a ověřte zda platí to co jsme uváděli dříve. Vyzkoušejte si také jak mikrokontrolér reaguje na napětí z "nedefinovaného" pásma 1.5V až 3.5V.
.


Protože skoro stejný program jsme už psali (když jsme rozsvěceli LEDku pomocí tlačítka), zkusíme si ho teď obohatit o zajímavý prvek. Tím je makro #define, které vám, hodně jednoduše řečeno, umožní nahradit kus zdrojového kód libovolným kusem textu. Jakkoli tato funkce vypadá banálně je velice mocná a skoro jistě během roku narazíme na situace kdy ji oceníte. V tomto případě použití makra #define zpřehledňuje kód. Přece jen výraz ZAPNOUT_LED zcela jasně říká co daný příkaz dělá, na rozdíl od GPIO_WriteHigh(GPIOC,GPIO_PIN_5) ze kterého vydedukujete jen to že na pinu PC5 nastaví úroveň High (ale co je na pinu 5 připojené a co se stane, na to už z toho snadno nepřijdete).

#include "stm8s.h"

// použijeme makra díky kterým bude kód mnohem čitelnější
#define ZAPNOUT_LED GPIO_WriteHigh(GPIOC,GPIO_PIN_5)
#define VYPNOUT_LED GPIO_WriteLow(GPIOC,GPIO_PIN_5)

void main(void){
 // nastavíme PG4 jako vstup a PC5 jako výstup
 GPIO_Init(GPIOG,GPIO_PIN_4,GPIO_MODE_IN_FL_NO_IT);
 GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW);

 while (1){ 
 // stále dokola čteme logickou úroveň ze vstupu PG4 
  if(GPIO_ReadInputPin(GPIOG,GPIO_PIN_4)){
   ZAPNOUT_LED; // a rozsvěcíme LED pokud jsme přečetli úroveň High
  }else{
   VYPNOUT_LED; // nebo zhasínáme LED pokud jsme přečetli úroveň Low
  }
 }
}

/ Detaily pro "zvídavé" |

Při pokusech jste si možná všimli "podivného chování" při přechodu přes "nedefinované" pásmo. Když přecházíte z úrovně Low do úrovně High, tak například napětí 2.6V vnímá MCU stále jako úroveň Low, když ale naopak vycházíte z úrovně High a napětí snižujete, tak totéž napětí 2.6V vyhodnocuje jako úroveň High. Tento jev se jmenuje hystereze, způsobuje ho Schmittův obvod, kterým je vstup vybaven a toto chování je žádoucí. Pomáhá vypořádat se s pomalými signály. Kdykoli totiž nějaký digitální signál mění svou hodnotu, musí napětí projít "nedefinovaným" pásmem. Někdy to trvá nanosekundy, ale u pomalejších signálů to může trvat klidně mnoho milisekund. Hystereze zajistí že během tohoto přechodu nedojde z pohledu mikrokontroléru k mnohonásobné změně vnímané úrovně.

/ K zapamatování |

| Odkazy /

Home
| V1.00 27.4.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /