====== Digitaalsed sisendid-väljundid ====== Kõik AVR siinid on loetavad ja kirjutatavad, kui neid kasutada tavalises loogilises sisend-väljundrežiimis (inglise keeles //input/output//, ehk //I/O//). AVR siinid on nimetatud suurte ladina tähestiku algustähtedega A, B, C, jne. Mõnel AVR-il võib aga siin A puududa, kuigi siin B on olemas. Iga siin on 8-bitine ja iga biti jaoks on enamasti kontrolleri kestast välja toodud eraldi viik. Viikusid loendatakse arvudega alates nullist. Siini mõlema kasutussuuna jaoks on olemas kaks eraldi registrit. Lisaks on olemas iga siini kohta register siini reaalse toimimissuuna määramiseks, milles biti väärtus 1 näitab viigu kasutamist väljundina ja 0 sisendina. Kokku on iga siini kohta kolm registrit: * PORT - siini füüsilise väljundoleku määramiseks. * PIN - siini füüsilise sisendoleku lugemiseks. * DDR - siini füüsilise suuna määramiseks. Xmega kontrollerite puhul on registrite nimedeks (x on pordi täht): * PORTx.OUT - siini füüsilise väljundoleku määramiseks. * PORTx.IN - siini füüsilise sisendoleku lugemiseks. * PORTx.DIR - siini füüsilise suuna määramiseks Vaja on siini B viigud 0-3 teha sisenditeks, viigud 4-7 väljunditeks, seada 5. viik kõrgeks ja lugeda 0-3 viigu väärtus muutujasse. C-keele programmi kood on järgnev: unsigned char x; // Viigud 0-3 sisendiks, 4-7 väljundiks DDRB = 0xF0; // Viienda viigu kõrgeks seadmine PORTB |= (1 << PIN5); // 0-3 sisendviigu väärtuse lugemine x = PINB & 0x0F; Xmega puhul järgnev: unsigned char x; // Viigud 0-3 sisendiks, 4-7 väljundiks PORTB.DIR = 0xF0; // Viienda viigu kõrgeks seadmine PORTB.OUT |= (1 << PIN5_bp); // 0-3 sisendviigu väärtuse lugemine x = PORTB.IN & 0x0F; Toodud näites on sisendeid kasutatud Hi-Z ehk kõrge impedantsiga (inglise keeles //high impedance//) režiimis. Põhimõtteliselt on tegemist sisendiga, mis ei koorma peaaegu üldse signaaliallikat. Seda režiimi võib vaja minna, kui viiku kasutatakse andmesiinina. Kui viik on kasutusel nupu, lüliti või muu maad ning sisendit kokku ühendavas lahenduses, siis tasub sisendis kasutada //pull-up// takistit. Selleks tuleb AVRil sisendrežiimis seada kõrgeks vastava viigu väljundbitt - tulemusena lülitub toitepinge ja sisendi vahele takisti, mis hoiab sisendi pingenivood kõrgel, kui miski seda just alla ei tõmba. Xmega seeria kontrolleritel on võimalik pordi igat viiku seadistada tema vastavast registrist (PORTx.PINnCTRL), kust on võimalik määrata muuseas kas viigule on ühendatud //pull-up// või //pull-down// takisti. Täpsema kirjelduse leiab vastava kontrolleri andmelehest. //Pull-up// ja //pull-down// takisti eesmärk on ära hoida sisendi "ujumine" (inglise keeles //floating//) staatilise elektri ja muude häirete tõttu tõmmates viigu vastavalt kas kõrgeks või madalaks. Pärast kontrolleri käivitumist on kõik IO siinid vaikimisi kõrge impedantsiga sisendrežiimis. Enamasti on IO siinil olevaid viike peale loogiliste ühenduste kasutatud ka muu perifeeria tarbeks. Kui on soov kasutada viigu alternatiivfunktsiooni, tuleks tutvuda AVR-i andmelehega, kus on öeldud, mis režiimis peab IO viik olema. Näiteks ADC kanali sisendina kasutamiseks peaks viik olema sisendrežiimis ja PWM signaali genereerimiseks väljundrežiimis. Mõned perifeeriamoodulid määravad aga ise IO viigu režiimi.