Both sides previous revisionPrevious revisionNext revision | Previous revision |
en:avr:io [2010/02/28 14:33] – mikk.leini | en:avr:io [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
====== Digital inputs/outputs ====== | ====== Digital Inputs/Outputs ====== |
| |
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: | All the buses on an AVR are both readable and writable, if they are used in the default logical input/output (I/O) mode. AVR buses are named as letters from the beginning of the Latin alphabet: A, B, C etc. Some AVRs might not have bus A, though, if bus B exists. Each bus is 8-bit and each bit usually has its own pin on the controller. Pins are counted with numbers starting from zero. For both directions on the bus, there are two separate registers. In addition, there is a register to decide the real direction of the bus, where a bit value of 1 marks the bus as output and 0 as input. Altogether, each bus has three registers: |
| |
* PORT - siini füüsilise väljundoleku määramiseks. | * PORT - for setting the output value of the bus. |
* PIN - siini füüsilise sisendoleku lugemiseks. | * PIN - for reading the input on the bus. |
* DDR - siini füüsilise suuna määramiseks. | * DDR - for setting the direction of the bus. |
| |
<box 100% round #EEEEEE|Näide> | <box 100% round #EEEEEE|Example> |
| |
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: | Task: make pins 0-3 on bus B inputs, pins 4-7 outputs, set pin 5 high and read the values of pins 0-3 to a variable. The C code for it looks like this: |
| |
<code c> | <code c> |
unsigned char x; | unsigned char x; |
| |
// Viigud 0-3 sisendiks, 4-7 väljundiks | // Pins 0-3 as inputs, 4-7 as outputs |
DDRB = 0xF0; | DDRB = 0xF0; |
| |
// Viienda viigu kõrgeks seadmine | // Set pin five as high |
PORTB |= (1 << PIN5); | PORTB |= (1 << PIN5); |
| |
// 0-3 sisendviigu väärtuse lugemine | // Read the values from inputs 0-3 |
x = PINB & 0x0F; | x = PINB & 0x0F; |
} | } |
</box> | </box> |
| |
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 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 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 sisendrežiimis. | In this example, the inputs are used in Hi-Z (high impedance) mode. In essence, the input does not put virtually any load on the source of the signal. This mode might be necessary, if the pin is used as a data bus. It is wise to use a pull-up resistor on the input, if the pin is used for a button, a switch or any other solution, where the input is connected to ground. For that, the output bit of the corresponding pin must be set high in the input mode - as a result, a resistor is placed between the supply voltage and the input, which keeps the input voltage high unless it is being pulled down by something. The goal of a pull-up resistor is to prevent floating of the input due to static electricity and other interferences. After booting the controller, all IO buses are in the high impedance input mode by default. |
| |
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. | Usually, the pins on the IO bus are also used for other peripherals, aside from the logical connections. If there is a need to use the alternate function of the pin, the appropriate IO pin mode can be found in the AVR's datasheet. For example to use an ADC channel as an input, the pin should be in input mode and to generate PWM signal, it should be in output mode. On the other hand, some peripheral modules select the IO pin mode by themselves. |