logo_elektromys.eu

/ STM8 GPIO I.|

/ Úvod |

Zkratkou GPIO (General Purpose Input Output) se označují vstupy/výstupy či též "vývody" nebo "piny" mikrokontroléru. Tyto vstupy a výstupy jsou tím nejdůležitějším co musíte při práci s mikrokontrolérem ovládat. Skrze GPIO může mikrokontrolér vnímat a ovládat okolní svět. Prakticky neexistuje aplikace kdy by mikrokontrolér vstupy a výstupy nepotřeboval. Protože k GPIO se připojuje veškerý okolní hardware je nutné znát a dodržovat jejich elektrické parametry a limity. Je toho docela hodně, takže se rovnou pustíme do práce.

/ GPIO na STM8S |

Z dílu o Nucleo kitu už víte jak jsou rozloženy vývody mikrokontroléru na postranních konektorech. Taky jste se tam dočetli že na vývodu PC5 je připojena LED dioda. Ti bystřejší z vás si mohli všimnout že GPIO se sdružují do osmic (zvaných též "porty"). Když si v datasheetu nalistujete kapitolu "Pinouts and pin description", uvidíte že náš mikrokontrolér (od teď už jen MCU) má porty GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG a GPIOI. Jednotlivé vývody v portu se označují číslem mezi 0 a 7 (např. PE0, PC6 atd.). Některé porty neobsahují všech osm pinů. Například GPIOA na našem MCU neobsahuje PA0 a PA7 nebo GPIOI má jen jeden vývod a to PI0. S každým GPIO se dá pracovat naprosto samostatně. Takže třeba PE0 může sloužit k ovládání LEDky, PE1 naopak snímat stav tlačítka a podobně. Navíc ale můžeme portem pracovat jako s celkem, tedy ovládat všech jeho (až) 8 vývodů zároveň (to se vám bude hodit třeba při ovládání segmentovky a možná později i k mnohem sofistikovanějším funkcím). No a my si teď motivačně zablikáme LEDkou a pak se pustíme do ostré práce.

/ Ovládáme LEDku |

#include "stm8s.h"

void main(void){
 // tyto příkazy se vykonají jednou po restartu MCU
 // LEDku máme na pinu PC5
 // nastavíme Pin 5 portu C jako výstup (OUT) typu Push-Pull (PP) s výstupem v log.0 (LOW) a s nízkou (SLOW) rychlostí. 
 GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_SLOW);

  while (1){
  // toto se vykonává stále dokola
  GPIO_WriteHigh(GPIOC,GPIO_PIN_5); // zapíšeme na PC5 log. úroveň High (log.1) - rozsvítí LED
  GPIO_WriteLow(GPIOC,GPIO_PIN_5); // zapíšeme na PC5 log. úroveň Low (log.0) - zhasne LED
  }
}

Když si tento kód přeložíte a pomocí debuggeru krokujete, uvidíte že střídavě zhasíná a rozsvěcí LEDku. Když ale program spustíte aby běžel plnou rychlostí, žádné blikání neuvidíte. Program se totiž vykonává tak rychle že LEDku stihne rozsvítit a zhasnout "milionkrát" za sekundu. My se přirozeně časem dopracujeme k tomu jak s LEDkou blikat libovolnou rychlostí, ale kvůli tomu tady teď nejsme. Jsme tu proto abychom se naučili ovládat GPIO. Podívejme se tedy na náš příklad. Obsahoval tři funkce.

/ GPIO jako výstup |

Motivaci máme za sebou a začneme pořádně od základů. Tedy od "elektriky", od hardwaru. Oprašte své znalosti o zatěžovací charakteristice zdroje napětí neboť přichází první příklad.

Př.1:
Jaké bude svorkové (výstupní) napětí měkkého zdroje 5V s vnitřním odporem 120Ohmu, zapojíme-li na jeho svorky rezistor 1k ? 22k ? 330 Ohm ?


Vnitřní odpor měkkého zdroje se zatěžovacím rezistorem tvoří dělič napětí připojený k 5V zdroji. Stačí tedy spočítat výstupní napětí děliče, to jistě zvládáte, takže nebudeme ztrácet čas odvozováním vztahu a napíšeme rovnou:
Uvyst = Uzdroje * Rzat / (Ri+Rzat) = 5 * 1000 / (120+1000) = 4.46V.

Výstupní napětí zdroje při zatížení rezistorem 1k je 4.46V, při zatížení odporem 22k je 4.97V a při zatížení odporem 330Ohm je 3.67V.

Jestli jste si před rokem mysleli, že vám zrovna tahle "teorie" k ničemu nebude, tak jste na omylu. Protože přesně takhle se chovají výstupy našeho mikrokontroléru. Pin nakonfigurovaný jako výstup typu push-pull se při nastavení do log.1 (úroveň "high") chová jako zdroj napětí 5V s vnitřním odporem přibližně 120 Ohm. Samozřejmě že to platí pro mikrokontrolér napájený napětím 5V. Při napájení 3.3V se chová jako měkký zdroj 3.3V. Zkusme si raději ještě jeden příklad.

Př.2:
Jaké bude svorkové (výstupní) napětí měkkého zdroje 0V s vnitřním odporem 70Ohmu zatížíme-li ho proudem -5mA ? (Proud teče směrem do zdroje viz obrázek)


Použijeme Ohmův zákon a spočítáme úbytek napětí na vnitřním odporu
Uri = Izat * Ri = 5m * 70 = 0.35 V

Na výstupní svorce bude napětí přibližně 0.35V.

Tento příklad demonstruje opačnou situaci. Tedy stav kdy je pin nastaven jako výstup s log. úrovní Low (log.0). Opět se chová jako "měkký" zdroj 0V. Jeho vnitřní odpor v tomto stavu bývá okolo 70Ohm. Je tedy o něco "tvrdší" než v log.1. Obě tyto situace si můžete snadno vyzkoušet.

Cv.2:
Nastavte pin PB7 jako výstup typu push-pull do úrovně "High". Zapojujte mezi něj a GND postupně rezistory 330Ohm, 1k a 22k a měřte napětí na pinu (proti GND). Sledujte jak moc výsledky měření se shodují s výpočtem z příkladu 1. Poté nastavte pin PB7 jako výstup typu push-pull do úrovně "Low" a připojte mezi něj a 5V napájení rezistor 1k. Změřte proud tekoucí rezistorem a poté napětí na pinu (proti GND). Výsledky srovnejte s Př.2.

Ke konfiguraci použijeme funkci GPIO_Init. Prvním argumentem bude GPIOB (protože chceme konfigurovat pin na portu "B"), druhým argumentem bude GPIO_PIN_7 (protože nastavujeme pin PB7). Třetím argumentem bude
GPIO_MODE_OUT_PP_HIGH_SLOW - nastavuje pin jako výstup typu push-pull a zároveň nastavuje úroveň "High" (log.1)
GPIO_MODE_OUT_PP_LOW_SLOW - nastavuje pin jako výstup typu push-pull a zároveň nastavuje úroveň "Low" (log.0)

void main(void){
 // kód tady se vykoná jednorázově po spuštění nebo restartu programu
 GPIO_Init(GPIOB,GPIO_PIN_7,GPIO_MODE_OUT_PP_HIGH_SLOW); // nastavíme PB7 jako výstup typu push-pull (LEDka) do úrovně High (log.1)

 while (1){ 
  // kód zde se vykonává stále dokola až do vypnutí MCU - zrovna nemá co dělat :)
 }
}

Poslední příklad nás přivede k jedné z nejdůležitějších informací.

Př.3:
Spočítejte zkratový proud zdroje o napětí 5V a vnitřním odporu 120 Ohm.


Na to opět postačí Ohmův zákon.
Izkrat = Uzdroj / Ri = 5/120 = 41.7mA

Zkratový proud takového zdroje je přibližně 41.7mA.

Asi tušíte, že tenhle případ nebudeme procvičovat. Jedná se totiž o zkrat výstupu a proud jsme odhadli na něco přes 40mA. Takový zkrat by měl neblahé důsledky pro náš mikrokontrolér. V datasheetu se můžeme dočíst že Maximální povolený proud tekoucí výstupem nebo vstupem je 20mA !. V tomto případě bychom ho tedy překročili 2x a mohli bychom mikrokontrolér zničit. Buďte opatrní a této situaci se vyhýbejte.

/ Detaily pro "zvídavé" |

Vnitřní odpor není konstantních 120 nebo 70 Ohm. Je závislý na zatěžovacím proudu a může se lišit až o desítky procent. Není stejný na všech pinech, některé piny našeho MCU jsou tzv. "High Sink" a mají menší vnitřní odpor když jsou v úrovni Low. Závislosti výstupního napětí na zatěžovacím proudu jsou vykreslené v grafech figure 24figure 31 v datasheetu ("Typical output level curves"). Možná se také pozastavujete nad slovíčkem SLOW v konfiguraci výstupu a zamýšlíte se zda existuje taky nějaké FAST ? Ano existuje, volbou SLOW nebo FAST si volíme rychlost přeběhu (strmost hrany přechodu mezi log.1 a log.0). Já jsem se ale rozhodl vám tím zatím neplést hlavu, protože to jsou funkce, které využijete až jako pokročilí. Volba SLOW je pro začátek výhodnější kvůli nižšímu rušení :) Nebojte i tak se jedná o časy v řádu jednotek až desítek nanosekund.

/ K zapamatování |

| Odkazy /

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