Both sides previous revisionPrevious revisionNext revision | Previous revision |
et:avr:io [2010/01/25 07:43] – toimetaja | et:avr:io [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
====== Digitaalsed sisendid-väljundid ====== | ====== Digitaalsed sisendid-väljundid ====== |
| |
Kõik AVR-i siinid on loetavad ja kirjutatavad, kui neid kasutada tavalises loogilises sisend-väljund- (inglise keeles //input/output//, ehk IO) režiimis. AVR-i siinid on nimetatud suurte ladina-tähestiku algustähtedega A, B, C, jne. Mõnel AVR-il võib aga siin A puududa, kuigi 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: | 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. | * PORT - siini füüsilise väljundoleku määramiseks. |
* PIN - Siini füüsilise sisendoleku lugemiseks. | * PIN - siini füüsilise sisendoleku lugemiseks. |
* DDR - Siini füüsilise suuna määramiseks. | * DDR - siini füüsilise suuna määramiseks. |
| |
===== Näide ===== | 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 |
| |
| <box 100% round #EEEEEE|Näide> |
| |
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: | 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: |
| |
<code c> | <code c> |
#include <avr/io.h> | unsigned char x; |
| |
int main() | // Viigud 0-3 sisendiks, 4-7 väljundiks |
{ | DDRB = 0xF0; |
unsigned char x; | |
| |
// Siini B suunaregistri määramine | // Viienda viigu kõrgeks seadmine |
DDRB = 0xF0; | PORTB |= (1 << PIN5); |
| |
// Viienda viigu kõrgeks seadmine | // 0-3 sisendviigu väärtuse lugemine |
PORTB |= (1 << PIN5); | x = PINB & 0x0F; |
| </code> |
| |
// Sisendviikude väärtuse lugemine muutujasse x | Xmega puhul järgnev: |
x = PINB & 0x0F; | |
} | <code c> |
| 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; |
</code> | </code> |
| |
* Esimesena määratakse siini B viigud 0-3 sisendiks ja 4-7 väljundiks. | </box> |
* Teise etapina toimub siini väljundregistri väärtuse loogiline liitmine arvuga, mille tulemusena muutub siini B viies bitt (viik) üheks. | |
* Kolmandana toimub muutujale x siini B bittide 0-3 väärtuse omistamine. | 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. |
| |
Toodud näites on sisendeid kasutatud Hi-Z, ehk kõrge impendatsiga (inglise keeles //high impedance//) režiimis. Põhimõtteliselt on tegemist sisendiga, mis ei koorma peaaaegu üldse signaaliallikat. Seda režiimi võib vaja minna, kui viiku kasutatakse andmesiinina. Kui viik on kasutusel nupuga, lülilitiga või muus maad ning sisendit kokku ühendavas lahenduses, siis tasub sisendis kasutada //pull-up// takistit. Selleks tuleb 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. //Pull-up//-takisti eesmärk on ära hoida sisendi "ujumine" (inglise keeles //floating//) staatilise elektri ja muude häirete tõttu. Pärast kontrolleri käivitumist on kõik IO siinid vaikimisi kõrge impedantsiga sisend-režiimis. | //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 perifeeria-moodulid määravad aga ise IO viigu režiimi. | 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. |