230 likes | 547 Views
Loeng 3: IO seadmed. Artur Abels. Peamised IO seadmed. Timer/counters SPI – serial peripheral interface USART – universal synchronous/asynchronous receiver/transmitter ADC – analogue to digital converter Pordid (Port A..G). ADC.
E N D
Loeng 3: IO seadmed ArturAbels
Peamised IO seadmed • Timer/counters • SPI – serial peripheral interface • USART – universal synchronous/asynchronous receiver/transmitter • ADC – analogue to digital converter • Pordid (Port A..G)
ADC • ADC on seade mõeldud pinge mõõtmiseks väljaviikude peal. Kui digitaalsisendil on 2 võimaliku seisundit – “0” ja “1”, siis ADC paneb vastavusse igale pingele vahemikus 0…Reference arvu vahemikus 0..1023. • S.t. kui me ühendame Reference 5 voldiga, ja anname jala peale näiteks 2 volti siis mõõtmise tulemuseks saame 2V*1024/5V = 409. • Kui mõõtmistulemuseks saime näiteks 100, ja Vreference on 5V siis tegelik pinge jala peal oli 100/1024*5V = 0.488V
ADC kasutus • ADCl on olemas omad IO registrid, mis seadistavad selle tööd, ja on olemus tulemuste IO registrid, kuhu sattub mõõtmise tulemus. • ADC abil on võimalik mõõta pinget 8 mikroskeemi jala peal. Selleks et valida mis jala peal pinget me tahame mõõta tuleb vastavalt seadistada ADC kirjutades selleks ettenähtud IO registritesse vastavad väärtused. Selleks et saada mõõtmistulemus kätte tuleb lugeda vastava IO registri väärtus.
ADC IO registrid • Lk 205-209 atmega169 datasheedis
ADC kasutusmall • Seadistame ADCd kirjutades vastavad väärtused IO registritesse ADMUX, ADCSRA ja ADCSRB. See mis väärtused tuleb kirjutada sõltub konkreetsest olukorrast, ja mikrokontrolleri ühendusskeemist. ILMA DATASHEEDITA JA MIKROKONTROLLERI ÜHENDUSSKEEMITA ÕIGEID VÄÄRTUSI TEADA EI SAA!! • Valime õige kanali, mille pinget me tahame teada, kirjutades õige väärtus ADMUX IO registrisse. Kirjutame ADSC (ADc Start Convertion) biti üheks ADCSRA registris. • Ootame kuni mõõtmine on valmis (sellest annab märku ADIF bit ADCSRA sees) • Loeme väärtust IO registritest ADCH ja ADCL.
USART • Serial liides. On võimeline saatma baite kas sünkroonses režiimis või asünkroonses režiimis (nagu arvuti COM port). Seda seadet kasutategi plaadi programmeerimiseks. • Tavaliselt seda kasutatakse asünkroonselt (COM port) • Edasi me vaatleme ainult asünkroonset režiimi ja USARTi nimetame UARTiks (ilma Sta) et rõhutada et me räägime just asünkroonsest andmevahetusest.
Sync vs Async • Sünkroonses režiimis on kasutusel veel CLOCK signaal, ja bitide saatmine/vastuvõtmine toimub just selle signaali järgi. • See tähendab et on olemas osapool mis genereerib clocki – MASTER. • Ja teine osapool mis peab tegema andmevahetust masteri poolt genereeritud clocki järgi – SLAVE.
Sync vs Async • Asünkroonses režiimis clocki pole ja pole ma masterit ega slavi. Andmevahetus käib ette teatud kiirusega (BAUD RATE), mida saab valida. • Mõlemad andmevahetuse osapooled peavad seadistama samasuguse baudrate’i. • Selleks et aru saada millal tuleb esimene bitt, on olemas stop ja start bitid.
UART (Async) • Suhtlus käib läbi 2 juhtme, Tx (transmit) ja Rx (receive). Arvuti Tx ühendatakse plaadi Rxga ja vastupidi. • Igal andmepaketil on järgmine struktuur
UART registrid • Lk 170-174
UART kaudu saatmine • Initsialiseerime UARTi kirjutades vastavad väärtused IO registritesse UCSRA, UCSRB, UCSRC ja UBRR. See mis väärtused te peate kirjutama sõltub tahetud BAUD rate’st, prose taktsagedusest ja tahetud paketiformaadist. • Kirjutame UDR (UsartData Register) sisse väärtuse mida me tahame saata, ja UART saadab selle. ME EI PEA KÄSITSI ANDMEPAKETI KOKKU PANEMA EGA PROGRAMMIST MUUTMA Tx JALA SEISUNDIT… UART SAADAB ISE. • Sellest et bait on saadetud annab märku TXC (TransmitComplete) või UDRE (UDR Empty) bitt vastavas IO registris.
UART kaudu vastuvõtmine • Initsialiseerime UARTi kirjutades vastavad väärtused IO registritesse UCSRA, UCSRB, UCSRC ja UBRR. See mis väärtused te peate kirjutama sõltub tahetud BAUD rate’st, prose taktsagedusest ja tahetud paketiformaadist. • Oodata kuni tuleb andmepakett. Sellest annab märku bit RXC (ReceiveComplete) UCSRA IO registris. • Loeme tulnud väärtuse UDR registrist ja ootame järgmist paketti.
UDR register • UDR (USART Data Register) on tegelikult 2 erinevat registrit. Üks kasutatakse lugemiseks (et lugeda vastuvõetud andmed) ja teist kirjutamiseks (et kirjutada saadetavaid andmeid). Nad mõlemad ON SAMA AADRESSIGA. • See on tehtud mugavuse pärast. Nii on võimalik andmed saata ja vastu võtta samal ajal. • Kuid nii saatmiseks kui ka vastuvõtmiseks kasutatakse sama IO registri aadress.
Timer/Counter • Loendur. Suurendaboma ühe registri väärtust ühe võrra mingi teatud intervalli tagant. • Selle abil saab: • Lugeda palju aega on möödas mingist ajahetkest • Genereerida kindlate ajavahemikude tagant mingi sündmuse • Teha PWM • Jne.
Timer/Counter’id • Lugemise kiirus (prescaler) on seadistatav ka IO registrite kaudu. • T/C’d ei suuda lugeda suvalise sagedusega, vaid suudavad lugeda prose sagedusega jagatud mingi PRESCALER väärtusega. • Kui taimer loeb maksimaalse väärtuseni siis alustab jälle nullist.
Timer/Counter’id • Atmega169’l on 3 T/C’d -Timer/Counter0, Timer/Counter1 ja Timer/Counter2. • Timer/Counter0 ja Timer/Counter2 on 8bitilised, kuid Timer/Counter1 on 16 bitiline.
T/C’de lisafunktsionaalsus • On võimalik seadistada T/C nii et see annaks märku mingi etteantud väärtuseni jõudes (Comparematch), või siis kui ta suureneb maksimumist ühe, ja seega saab nulliks (overflow) • Veel on võimalik seadistada T/C nii et eeltoodud sündmuste puhul muudaks see kindla mikrokontrolleri jala seisundit (kas paneks üheks, nulliks või muudaks jala seisundit, see on konfitav) • Pini muutmise funktsioonaalsuse abil on võimalik teha PWM.
T/C’de registrid • Lk 89-92, 117-123, 135-142