Sisend-väljundviigud
Viikude teek on ette nähtud AVR digitaalsete sisend- ja väljundviikudega opereerimiseks. Teegi eesmärk on lihtsustada AVR viikude kasutamist. Kasutaja saab programmis luua soovitud viigu kohta käiva muutuja, millele ta omistab spetsiaalse makrofunktsiooniga füüsilise viigu aadressi. Seejärel saab muutuja abil välja kutsuda erinevaid funktsioone viigu suuna ja olekute muutmiseks ning nende lugemiseks.
Määrates viigu füüsilise siini (pordi) ja indeksi ära ainult ühe korra ja ühes kohas, on füüsiliste muudatuste korral lihtne programmi muuta. Näiteks, kui algul kasutatakse indikaatorina ühte LED-i, võib lihtsa tarkvara muudatusega teist LED kasutama hakata. Viigu muutujatest võib luua ka massiive, näiteks siinide koostamiseks.
Andmetüübid
pin
Viigu registrite ja bitimaski hoidmise struktuurne andmetüüp. pin-tüüpi muutujad on konstantsed ja need tuleb väärtustada kohe programmi alguses. Väärtustamise lihtsustamiseks on makrofunktsioon PIN, mille esimene parameeter on siini tähis (suur ladina täht A, B, C, jne) ja teine viigu number (0-7).
Konstandid
led_debug, led_green, led_yellow, led_red - Kodulabori kasutajaliidese plaadi LEDid värvide järgi ning debug LED kontrollerplaadil
LED0, LED1, LED2, LED3 - Kodulabori kasutajaliidese plaadi LEDid numbrite järgi
S0, S1, S2, S3 - Kodulabori kasutajaliidese plaadi nupud ning S0 nupp kontrollerplaadil
Funktsioonid
void pin_setup_output(pin pin)
Viigu väljundiks määramine. Parameetrid:
void pin_setup_input(pin pin)
Viigu sisendiks määramine ilma pull-up takistita. Parameetrid:
void pin_setup_input_with_pullup(pin pin)
Viigu sisendiks määramine koos pull-up-takistiga. Parameetrid:
void pin_set(pin pin)
Viigu väljundi kõrgeks määramine. Parameetrid:
void pin_clear(pin pin)
Viigu väljundi madalaks määramine. Parameetrid:
void pin_toggle(pin pin)
Viigu väljundi oleku pööramine. Madal olek muutub kõrgeks ja vastupidi. Parameetrid:
void pin_set_to(pin pin, bool value)
Viigu väljundi parameetriga määratud olekusse viimine. Parameetrid:
bool pin_get_value(pin pin)
Viigu sisendi oleku lugemine ja funktsiooniga tagastamine. Parameetrid:
pin - Viigu muutuja.
Tagastab tõeväärtuse.
bool pin_get_debounced_value(pin pin)
Viigu sisendi oleku lugemine läbi lüliti väreluse filtri ja selle tagastamine. Filtreerimine toimub minimaalselt 8 ms ja maksimaalselt 100 ms jooksul - olenevalt sellest, kui kiiresti lüliti värelemine lõppeb. Kui värelemine 100 ms jooksul ei lõpe, siis funktsioon tagastab false. Funktsioon kasutab tarkvaralist pausi funktsiooni viite teegist. Parameetrid:
pin - Viigu muutuja.
Tagastab tõeväärtuse.
bool button_read(pin pin)
Viigu sisendi oleku lugemine läbi lüliti väreluse filtri ja selle tagastamine. Filtreerimine toimub minimaalselt 8 ms ja maksimaalselt 100 ms jooksul - olenevalt sellest, kui kiiresti lüliti värelemine lõppeb. Kui värelemine 100 ms jooksul ei lõpe, siis funktsioon tagastab false. Funktsioon kasutab tarkvaralist pausi funktsiooni viite teegist. Parameetrid:
void led_on(pin pin)
Süütab valgusdioodi väljundis. Parameetrid:
void led_off(pin pin)
Kustutab valgusdioodi väljundis. Parameetrid:
Näide
Näide sellest, kuidas ühe viigu väärtus teha sõltuvaks teisest. Programmis omandab viik PC3 viigule PC0 vastupidise väärtuse:
#include <homelab/pin.h>
pin output_pin = PIN(C, 3);
pin input_pin = PIN(C, 0);
int main(void)
{
bool value;
// Viigu väljundiks seadistamine
pin_setup_output(output_pin);
// Viigu pull-up takistiga sisendiks seadistamine
pin_setup_input_with_pullup(input_pin);
// Lõputu tsükkel
while (true)
{
// Sisendviigu väärtuse lugemine
value = pin_get_value(input_pin);
// Väljundviigule vastupidise väärtuse omistamine
pin_set_to(output_pin, !value);
}
}
led_on, led_off, button_read käskude kasutamise näide.
#include <homelab/pin.h>
// Kodulabori nupud ja LEDid on teegis eeldefineeritud
// ja neid pole vaja uuesti defineerida
int main(void)
{
// Viigu väljundiks seadistamine
pin_setup_output(led_green);
// Viigu pull-up takistiga sisendiks seadistamine
pin_setup_input_with_pullup(S1);
// Lõputu tsükkel
while (true)
{
// Kui nupp on vajutatud, süüta LED, vastasel juhul kustuta
if(button_read(S1) == true)
led_on(led_green);
else
led_off(led_green);
}
}