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 :)
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ů:
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.
#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 } } }
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ě.
Home
| V1.01 27.4.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /