GPIO

**GPIO** ehk (inglise keeles ''general purpose input/output'') on mitmeotstarbeline sisend/väljund.

Kasutaja saab ise kontrollida signaali käitumist ning määrata, kas see toimib sisendi või väljundina. GPIO-sid vaikimisi ei kasutata ning neil pole vaikimisi määratud kindlat eesmärki. 

## Ajalugu
GPIO arenes välja protsessorist. Mikroprotsessorist Intel 4004, mis tuli müügile aastal 1971 arenes 1974. aastaks esimene mikrokontroller TMS1000 ning seda hakati kutsuma “kalkulaator kiibis”, sest saadi kompaktsem plaat, kuhu ei olnud lisaks enam kiipe juurde vaja. Seda hakati kasutama ka mängude tootmisel, ning see oli tol ajal võrdlemisi odav. Tänapäeval kasutatakse mikrokontrollereid juba valmis arendusplaadi peal. Ühed tuntumatest GPIO-dega arendusplaatidest on erinevad Arduino perekonnad. 
 

## Integreeritud GPIO-d
Integreeritud vooluringi (inglise keeles *integrated circuit*) GPIO-sid rakendatakse mitmel viisil. Mõned pakuvad GPIO-sid peamise funktsioonina, teised sisaldavad GPIO-sid kui n-ö lisavarustust mõnele muule esmasele funktsioonile. Varasemate näidete hulka kuuluvad Intel 8255, mis liidab 24 GPIO-d paralleelsiiniga, ja mitmesugused GPIO "laiendajad", mis liidavad GPIO-sid jadabussidega nagu jadakommunikatsiooni siin (ehk *[[I²C]]*) ja süsteemihaldussiin (ehk SMBus). Näiteks on Realtek ALC260 integreeritud vooluringis, mis pakub lisaks oma peamisele helitöötlusfunktsioonile ka kaheksat GPIO-d. Mikrokontrolleri integreeritud vooluringid sisaldavad tavaliselt GPIO-sid. Sõltuvalt rakendusest võivad mikrokontrolleri GPIO-d sisaldada selle peamist liidest välise vooluahelaga või need võivad olla lihtsalt ühte tüüpi sisend/väljund, mida kasutatakse mitme hulgas, näiteks analoog sisend/väljund, loendur/taimer ja jadaside. Mõnes suletud vooluringis, eriti mikrokontrollerites, on GPIO viik võimeline tegema vahelduvaid funktsioone. Sel juhul tuleb viik konfigureerida GPIO-na, lisaks tuleb konfigureerida GPIO juhtimist. Mõnel mikrokontrolleril on olemas sisemine signaali suunamise skeem, mis võimaldab GPIO-sid programmi töös seadme kaartidele kanda. Programmeeritavate väljadega massiivid (ehk FPGA) laiendavad seda võimalust, võimaldades GPIO viikude kaardistamist, kiirendust ja arhitektuuri programmiliselt juhtida. 
## Plaadi tasemel GPIO-d
Mitmeid trükkplaate saab viikude kaudu ühendada välisesse vooluringi. Tavaliselt pääseb igale sellisele GPIO-le spetsiaalse viiguühenduse kaudu. Mõned tahvlid sisaldavad GPIO-sid, kui mugavat lisaressurssi, mis suurendab tahvli põhifunktsiooni, samas kui teistes tahvlites on GPIO-d tahvli keskne või esmane funktsioon.
Multifunktsionaalsed sisend/väljund-plaadid on plaadid, mis omavad GPIO-sid koos muud tüüpi üldotstarbeliste sisend/väljunditega. GPIO-sid leidub ka tuntud juhtpaneelidel, näiteks Arduino, BeagleBone ja Raspberry Pi. 

Plaadi tasemel GPIO-d on sageli varustatud võimalustega, mida tavaliselt integreeritud vooluringi-põhistes GPIO-des ei leidu. GPIO-signaalide puhverdamiseks ja konditsioneerimiseks ning pardalülituse kaitsmiseks võib kasutada näiteks schmitti-päästiku sisendeid, suure voolu väljundi draiverid, optilisi isolaatoreid või nende kombinatsioone. Mõnikord rakendatakse ka kõrgema taseme funktsioone, näiteks sisendi silumine (inglise keeles ''debouncing''), sisendsignaali serva tuvastamine ja impulsi laiuse modulatsiooni (*[[PWM]]*) väljund. 

## Kasutamine
GPIO-sid kasutatakse paljudes rakendustes, neid piiravad ainult GPIO-liidese elektri- ja ajamääratlused ning tarkvara võime suhelda GPIO-dega piisavalt kiiresti.
GPIO-d tavaliselt kasutavad standard loogikatasemeid, ega saa väljundkoormustele oluliselt voolu anda. Kui sellele järgneb sobiv kõrge voolu väljund puhver, võib GPIO-d kasutada suure võimsusega seadmete, näiteks tulede, solenoidide, küttekehade ja mootorite (nt ventilaatorid ja puhurid) juhtimiseks. Samamoodi kasutatakse sisendpuhvrit, releed või optilist ühendajat (*[https://en.wikipedia.org/wiki/Opto-isolator opto-isolator]*) teisiti ühildumatu signaali (nt kõrgepinge) teisendamiseks GPIO nõutavatele loogika tasemetele.
Integreeritud GPIO-vormingus GPIO-sid kasutatakse tavaliselt muude plaadil olevate vooluringide (sealhulgas muude integreeritud vooluringide) juhtimiseks või jälgimiseks. Selle näideteks on muude vooluahelate töö lubamine ja keelamine, plaadisiseste lülitite ja konfiguratsioonihäirete oleku lugemine ning LED-oleku indikaatorite juhtimine. Viimasel juhul võib GPIO anda paljudel juhtudel piisavalt väljundvoolu, et LED-i otse toita ilma vahepuhvrit kasutamata. 
Mitmeid GPIO-sid kasutatakse mõnikord koos bittidel “põrkuva” suhtlusliidesena. 
Näiteks võib jadakommunikatsiooni siini (I²C) rakendamiseks kasutada kahte GPIO-d ja sünkroonse jadakommunikatsiooni liidese (näiteks SPI-siini) rakendamiseks saab kasutada nelja GPIO-d. Nende kasutamine hõlbustab jadaliidestega seadmeid omavahel jadamisi integreeritud vooluringis ühendada. Näiteks anduritega (temperatuuriandurid, rõhuandurid, kiirendusandurid jne) ja mootorikontrolleritega. Äärmisel juhul võib seda tehnikat kasutada terve paralleelsiini rakendamiseks, mis võimaldab suhelda siinile orienteeritud integraallülituste või trükiplaatidega. Ehkki GPIO-d on olemuselt põhimõtteliselt digitaalsed, kasutatakse neid sageli lineaarsete protsesside juhtimiseks. Näiteks GPIO-d saab kasutada mootori kiiruse, valguse intensiivsuse või temperatuuri kontrollimiseks. Tavaliselt teostatakse see impulsi laiuse modulatsiooni (PWM) kaudu, milles GPIO väljundsignaali töötsükkel määrab protsessi juhtsignaali tegeliku suuruse. Näiteks võib valguse intensiivsuse kontrollimisel vähendada GPIO töötsüklit. Mõni lineaarne protsess nõuab lineaarset juhtimispinget. Näiteks saab luua lihtsa ja odava digitaal-analoog muunduri ühendades GPIO (mida kasutatakse PWM-väljundina) RC-filtriga. 

## Rakendamine
GPIO liidesed on väga erinevad. Mõnel juhul on need lihtsad viikude rühmad, mis võivad rühmiti üle minna, kas sisendiks või väljundiks. 
Teistes saab iga viiku seadistada erinevate loogika pingete vastuvõtmiseks või hankimiseks koos tõusude/langustega. Sisend- ja väljundpinged on tavaliselt (kuid mitte alati) piiratud seadme toitepingega ja suuremad pinged võivad neid kahjustada. GPIO viikude olekutega võib kokku puutuda paljude erinevate liideste kaudu, näiteks välisseadme mälu abil, või spetsiaalse sisend/väljund-pordi juhiste kaudu. Mõnel GPIO-l on sisendiks 5V, ka sel juhul, kui seadmel on madal toitepinge (näiteks 2V) ja seade võib vastu võtta 5V ilma kahjustusteta. GPIO-port on grupp GPIO-viike (tavaliselt 8 GPIO-viiku), mis on paigutatud rühma ja mida juhitakse rühmana. 

GPIO võimalused võivad sisaldada järgmist: 

*GPIO viike saab konfigureerida sisendiks või väljundiks 
*GPIO viike saab lubada/keelata
*Sisendväärtused saab lugeda (tavaliselt kõrge või madal)
*Väljundi väärtused on kirjutatavad/loetavad
*Sisendväärtusi saab sageli kasutada vahele segajatena (tavaliselt äratussündmuste korral)

## Vaata ka
* Arduino
* Mikrokontroller
* I²C
* FPGA
* PWM
* RC-filter

## Viited