Tallinna
Polütehnikum
AVR
mikroprotsessor Referaat
Koostja
Deniss Skrabutenass
AA-12
Tallinn
2014
Sisukord
Analoog komparaator 3
CPU 4
EEPROM 4
Välised
katkestused 5
Portid (B , C ,D ) 6
SPI 7
Timer Counter (0, 1 ja 2) erinevused 7
TWI 7
Watchdog 8
Kasutatud
lingid 9
Analoog- digitaal konverter
Analoog-digitaal
muundur (ADC) muundab analoogpinge väärtuse digitaalseks
väärtuseks. AVR-i ADC analoogpinge
sisend on lubatud 0-5.5V piires.
Digitaalne väärtus on 10-
bitine , kuid selle täpsus on ±2 ühikut.
Viga võib veelgi kasvada kui
kiibi toitepinget häirete eest ei
kaitsta. ADC jaoks on AVR-il eraldi toite ja võrdluspinge viik.
Eraldi toide on mürakindluse pärast ja see ei tohi kiibi
toitepingest (üle 0.3V) erineda. Võrdluspinge määrab maksimaalse
digitaalse väärtuse. Ehk kui võrdluspinge on 3V siis sama pingega
sisend annab väärtuseks 2 astmes 10
miinus 1 ehk
1023 .
AVR-i
ADC töötab võrdlusmeetodil (Successive Approximation ADC).
Lühidalt öeldes toimub mõõdetava pinge võrdlemine kindlate
nivoopingetega ja tulemuste esitamine tõeväärtuste-, ehk
bitijadana. See meetod võtab aga aega - iga biti leidmine
lõppväärtuses toimub eraldi. AVR-il kulub töö ajal 13
takti ühe
mõõtmise tegemiseks ja 25 takti kõige esimesel mõõtmisel
(käivitusel). Need
taktid pole aga kontrolleri töötaktid vaid
spetsiaalselt ADC üksuse jaoks sagedusjaguriga saadud. Maksimaalse
täpsuse saamiseks peaks ADC
takt olema 50-200 kHz. Kõrgemal taktil
kaob täpsus, kuid vahel on ka mõõtmiste suur arv olulisem kui
täpsus. Ühele mõõtmisele kuluvaks ajaks on AVR-i
dokumentatsioonis
antud 13-260 µs.
Mõõtetulemust
saab kasutaja lugeda 8- ja 10- bitisena. Kuna AVR on 8-bitine, siis
ADC mõõteväärtuste jaoks on sel kaks 8-bitist
registrit .
Seadistustes saab määrata kas 10 bitisest väärtusest 2 esimest
või 2 viimast
bitti lähevad eraldi
registrisse . Kui eraldatakse 2
noorimat, ehk tulemust vähem iseloomustavat bitti, saab
mõõtetulemuse 8-bitisena lugeda - sellist kombinatsiooni
nimetatakse vasak-asetusega mõõtetulemuseks (
Left align).
Testpidist kombinatsiooni, kus kaht tulemusregistrit
lugedes tekib
10-bitine arv, nimetatakse parem-asetusega mõõtetulemuseks (Right
align).
Analoog komparaator
AVR-i
komparaator võrdleb kahe analoogpinge väärtust 0-5.5 voldi
ulatuses. Tulemusena saadakse tõeväärtus selle kohta, kas esimene
pinge on teisest kõrgem või mitte. Üheks võrdlusnivooks on
olenevalt kontrollerist võimalik võtta ka kontrolleri-siseselt
fikseeritud pinge. Komparaatori saab panna katkestust tekitama kas
võrdluse tulemusena saadud tõeväärtuse suvalise muutumise,
tõeseks muutumise või vääraks muutumise peale.
Kui
kasutada AVR-i millel on analoog-digitaal muundur saab tõenäoliselt
kasutada ka võimalust ühe võrdluspinge valimist mõnest muunduri
sisendist.
CPU
Arhitektuur Välkmälu,
EEPROM ja
SRAM on integreeritud ühele kiibile, mis kõrvaldab
üldjuhul vajaduse välise mälu jaoks. Mõnedel kiipidel on
paralleelühenduse võimalus, mille läbi on võimalik külge
ühendada lisamälu. Peaaegu kõigil (välja arvatud kõige
väiksematel TinyAVR
seeria mikrokontrolleritel) on jadaühenduse
võimalus, mille abil saab ühendada suurema EEPROMi või välkmälu.
Programmimälu
Programmi
käsustik paikneb muutumatus välkmälus. Kuigi tegemist on 8-bitiste
mikrokontrolleritega, on iga käsk üks või kaks 16-bitist
andmesõna.
Programmimälu
suurus on üldjuhul ära märgitud ka nimetuses (näiteks ATmega64x
seerial on 64 kB välkmälu, ning ATmega32x seerial 32 kB).
AVRi
kiipidel pole tuge toetamaks programmi paiknemist välisel mälul,
ehk kogu töötav kood peab
paiknema sisemisel välkmälul. Ainsaks
erandiks sellele on AT94 FPSLIC AVR/
FPGA kiibid.
Sisemine
andmemälu
Aadressiruum
koosneb protsessori registritest, sisend-väljund registritest ja
SRAMist.
Sisemised
registrid AVRidel
on 32 ühebaidist protsessori registrit ja neid klassifitseeritakse
8-bitisteks RISC seadmeteks.
Enamikul
juhtudest on protsessori kasutuses olevad registrid esimesel 32-l
mäluaadressil (000016-001F16),
millele järgnevad 64 sisend-väljund registrit (002016-005F16).
SRAM
algab pärast ülalmainitud registreid (aadress 006016).
Sisend-väljund registrid võivad mõnel juhul olla suuremad olla,
mis juhul võtavad nad osa SRAMi aadressiruumist.
Kuigi
on olemas eraldi aadresserimissüsteemid protsessori ja
sisend-väljund registritele ligipääsuks, saab kõiki käsitleda
sarnaselt SRAMiga.
EEPROM
Peaaegu
kõigil AVR mikrokontrolleritel on sisemine EEPROM andmete püsivamaks
salvestamiseks. Sarnaselt välkmäluga suudab EEPROM andmed säilitada
ka siis, kui vool välja lülitada.
Enamikes
AVR arhitektuuri versioonides pole EEPROM otseselt aadresseeritav ja
seega pääseb sellele ligi sarnaselt väliste seadmetega. Kuna
kasutada tuleb spetsiaalseid registreid ning lugemis- ja
kirjutamiskäske, on suhtlus EEPROMiga tunduvalt aeglasem kui näiteks
SRAMiga.
Kuna
kirjutamisoperatsioonide arv EEPROMil on piiratud (Atmeli
andmelehtede järgi umbes 100 000 kirjutamiskorda), peab hästi
disainitud EEPROMi kirjutamisprotseduur võrdlema hetkel EEPROMis
olevaid andmeid sinna kirjutatavaga ning ainult erinevuste korral
sinna päriselt andmeid kirjutama, vähendades seeläbi kirjutamiste
arvu.
Välised katkestused
Välised
katkestused (
External Interrupt)
on ühed lihtsaimad perifeeria funktsioonid. AVR-idel on tavaliselt 1
kuni 8 spetsiaalset viiku mille loogilise väärtuse muutumisel või
kindlal
olekul tekitatakse
programmis katkestus. Kuna enamasti
kasutatakse seda funktsiooni kontrolleriväliste loogikasignaalide
jälgimiseks siis nimetataksegi vastavaid viike välise
katkestuse viikudeks.
Välise
katkestuse kasutamiseks tuleb viiku kasutada
tavalises IO
sisend-režiimis (võib ka väljund-režiimis kasutada aga siis saab
katkestust tekitada vaid kontroller ise). Välise katkestuse
seadistusregistrites tuleb ära märkida kas lubada katkestuste
tekitamine ja mille peale seda teha. Võimalikke tekitajaid on neli:
- Loogiline null (pinge on 0V)
- Loogilise väärtuse muutus
- Langev front - loogiline muutus ühest nulli.
- Tõusev front - loogiline muutus nullist ühte.
Loogilise
nulli valimisel katkestuse tekitamiseks, tekitatakse katkestust
järjest
senikaua kuni viigu väärtus on null ja samal ajal
põhiprogrammil töötada ei lasta.
Väliseid
katkestusi on tööpõhimõttelt kahte liiki: kontrolleri taktiga
sünkroniseeritud ja asünkroonsed. Sünkroniseeritud katkestused
toimivad sisendite väärtuse meelespidamise teel - see tähendab, et
loogilised muutused leitakse kahel
erineval taktil saadud väärtuste
võrdlemise teel. Kui välise signaali loogilised muutused toimuvad
kiiremini kui käib töötakt, siis katkestused ei teki õigesti või
ei teki üldse. Asünkroonsed katkestused ei sõltu kontrolleri
taktist ja võimaldavad natuke kiiremini muutuvat välist signaali -
loogilist nivood peab signaal hoidma vähemalt 50ns. ATmega8-l on
ainult 2 sünkroniseeritud välist katkestust.
Portid (B , C ,D
)
Atmeli
mikrokontrolleril mega88 on kolm sisend-väljundporti: port B (PB),
port C (PC) ja port D (PD). PORT B (samamoodi nagu PORT C ja D ) on
IO seade määratud väljaviikude seisundi manipuleerimiseks ja
lugemiseks. Iga AVR mikrokontrollerite port käsitleb kuni 8
mikroskeemi jalga. AVR arhitektuuris pordi tööd määravad 3 IO
registrit. Alustades mikroprotsessori programmeerimist, on portide
konfigureerimine esimene ülesanne, sest enne kui mikrokontroller
hakkab väliste seadmetega „
suhtlema “, peab olema ära määratud
milliste väljaviikude kaudu liiguvad andmed mikrokontrollerisse
sisse ja milliste väljaviikude kaudu liiguvad andmed
mikrokontrollerist välja.
Võtame
näiteks pordi B, mis koosneb kolmest registrist PORTB,
DDRB ja PINB.
PORTB
– B pordi väljundregister.
Kõik andmed mida tahetakse
mikrokontrollerist välja saata, tuleb saata siia registrisse. Number
0x05 on registri PORTB nimi mikrokontrolleris. Selleks, et saata
andmeid registrile PORTB, tuleb saata andmed
aadressile 0x05.
Väljundregistrisse
saadetud andmed jõuavad väljundisse loomulikult
ainult siis kui antud väljaviik on määratud väljundiks.
DDRB
– B pordi suunaregister.
Selle registriga määratakse ära
milline väljaviik on sisend ja milline väljund. Need väljaviigud
mille kohapeal on DDRB registris „0“, on määratud
sisenditeks ja need väljaviigud mille kohapeal on DDRB registris „1“, on
määratud väljunditeks. Kui DDRB registris on antud väljaviigu
kohapeal „1“, siis määrab selle väljaviigu oleku PORTB
register . Kui DDRB registris on antud väljaviigu kohapeal „0“,
siis määrab väljaviigu oleku sisendseade, mis on ühendatud antud
väljaviiguga. DDRB register ise väljaviigu olekut ei määra, ta
määrab ainult andmete liikumise suuna. . Selleks, et saata andmeid
registrile DDRB, tuleb saata andmed aadressile 0x04.
PinB
– B pordi sisendregister.
PinB register „kuulab“ pidevalt
millises olekus („0“ või „1“) on mikrokontrolleri
väljaviigud ja jälgides PinB registri sisu saab teada millises
olekus väljaviik on. Kui väljaviik on määratud väljundiks ja
väljaviigu oleku määrab PORTB register, siis pole PinB registri
oleku jälgimisel mõtet, sest PORTB määrab väljaviikude oleku ja
PinB järgib seda. Kui väljaviik on määratud sisendiks ja
väljaviigu oleku määrab
sisendis olev seade, siis saab PinB
registrilt teada, millises olekus väljaviik parajasti on.
Selleks,
et porte konfigureerida on vaja teada, et registri vanem järk on PB7
ja noorem järk PB0. Seega tuleb
porti B vaadata: PB7, PB6, PB5, PB4,
PB3, PB2, PB1, PB0.
SPI
SPI
(ingl serial peripheral interface) on jada välisliidese ja
välisseadmete vaheline
andmevahetuse standard. SPI töötab
täisdupleksi režiimis (
saatmise ajal toimub ka vastuvõtt). Seda
tüüpi andmevahetust kasutatakse mikroprotsessorite vahel, et
„suhelda“ sensorite, mälu, LCD kontrolleritega. Seadmed
vahetavad omavahel andmeid ülem-alluv (ingl master/slave) režiimis,
kus ülemseade (ingl master) lähtestab andmekaadri (ehk alustab
suhtlemist). Korraga on lubatud kasutada mitut alluvseadet, mis on
juhtmete abil ülemseadmega seotud. Mõnikord nimetatakse SPI-d ka
neljajuhtmeliseks jadasiiniks, eristamaks seda kolmejuhtmelisest
jadasiinist ning kahe- ja ühejuhtmelist siinist. SPI-d kutsutakse
tihti sünkrooniliseks jadaliideseks.
Timer Counter
(0, 1 ja 2) erinevused
Taimer0
normaalrežiimi seadistamine. Selles režiimis
loendab taimer 255-ni
(8 bitine loendur) , R/W , 8 bitine programmeeritav sageduse jagaja
(prescaler). Sisemine/välimine signaali allikas. Katkestus
üleminekul FFh->00h. Signaali frondi valik
Timer1
16-bitine loendur – st. Suurendatakse arvu, mis asub kahes 8bitises
registris, mis käitub kui üks 16bitine register. Kolm võimalust :
Sünkroonne taimer , Sünkroonne loendur , Asünkroonne loendur
Taimer2 normaalrežiimi seadistamine. Selles režiimis loendab taimer 255-ni
(8 bitine). pre ja postscaler ja perioodi register.
TWI
TWI
(Two
Wire Interface) on järjestikuline andmesideliides, mis on
levinuma nime all I2C (
Inter -Integrated
Circuit ). Andmesideliides on
ettenähtud kiipide ühendamiseks ühele andmesideliinile, kus on
tavaliselt üks siinihaldur (master) ja üks või rohkem
alluvat (slave). Side on pakettidena realiseeritud juba füüsilises kihis,
kus
paketi algus ja lõpp on eristuvad bittide edastamisest
teistsuguste pinge tasemeta ja
muutustega . Sidet alustab alati
haldur . Pakett algab 7-bitise alluva aadressiga ning andmete
liikumise suunda tähistava bitiga (lugemine või kirjutamine).
Usart 0USART
on universaalne sünkroonne jadaliides,
UART aga selle lihtsustatud
variant - universaalne asünkroonne jadaliides. Vahe seisneb selles,
et USART kasutab peale andmeliinide ka taktsignaali liini, millega
andmeid sünkroniseeritakse, UART aga mitte. AVR-i USART võimaldab
täisduplekssidet, 5- kuni 9-bitiseid andmesõnu (8 biti puhul sõna
=
bait ), 1 või 2 stoppbitti, kolme paarsuse režiimi ja laia
boodikiiruste valikut. AVR mikrokontrolleritel on üldiselt kuni 2
USART liidest, kuid mõnel puudub USART üldse. Andmete
edastamine toimub sõna kaupa, ehk AVR teeb riistvara tasandil kasutaja
edastatud sõna bittideks ja edastab selle iseseisvalt ning
vastupidi. Kasutaja juhib USART tööd seade-, oleku- ja
andmeregistreid kirjutades ning lugedes.
Kõikide
seadistuste jaoks on olemas vastavad registrid, mida on üsna lihtne
andmelehe abil
seadistada . Natuke keerulisem on boodikiiruse
seadmine. Taktsignaal andmete edastamiseks genereeritakse töötaktist
ja kasutaja saab valida teguri 1-st 4096-ni, millega töötakt läbi
jagatakse. Täiendavalt jagatakse saadud taktisignaali olenevalt
režiimist veel 2, 8 või 16-ga. Probleem on selles, et kõiki
taktsagedusi ei saa jagada nii, et tekiks standardne boodikiirus.
Mõnede mikrokontrolleri taktsageduste puhul on boodikiiruse erinevus
soovitust ligikaudu 10%. AVR andmelehtedes on toodud
tabelid tüüpilistest taktsagedustest, boodikiirustest ja nende saamiseks
vajalikust jagamistegurist ning tekkida võivast veast.
Kuna
andmete
edastus toimub protsessorist sõltumata ja oluliselt
aeglasemalt, tuleb enne saatmist veenduda, et
liides on valmis uut
sõna
edastama . Selleks tuleb jälgida saatepuhvri valmisoleku
olekubitti, mis näitab, kas sinna võib saatmiseks uue sõna
kirjutada või mitte. Kui mikrokontroller käivitada, on see luba
vaikimisi kohe olemas. Niipea kui sõna on saadetud ja puhvrisse pole
uut sõna saatmiseks kirjutatud, muudetakse saatmise õnnestumise
olekubitt kõrgeks.
Watchdog
Watchdog
on mikrokontrollerites levinud lahendus. Igasugustes väikestes
kivides, pultides jms kohtades.
Andes nii neile suure töökindluse.
Paljud
emaplaadid on varustatud spetsiaalse kiibiga mida saab seadistada
tegema masinale restardi kui OS pole talle endast mõni aeg märka
andnud. Täpsemalt toimib see nõnda, et kiibis pannakse tiksuma
countdown - ehk mahalugemine, mille lõppedes tehakse restart. Kuni
süsteemis töötab teatud deemon (watchdogd) siis lükkab see iga
sekundi järel
emaplaadil asuva mahalugemise/countdowni uuesti tagasi
algusesse . Kui aga masin on kinni kiilunud siis
jookseb countdown
takistuseta lõpuni ja emaplaadi kontroller teeb arvutile restardi.
Kasutatud lingid
http://kuutorvaja.eenet.ee/wiki/FreeBSD_Watchdog http://www.robotiklubi.ee/juhendid/avr http://opiobjektid.tptlive.ee/Oppemaketi_tutvustus/ATmega88.pdf http://opiobjektid.tptlive.ee/Pordid/index.html http://digi.physic.ut.ee/mw/images/9/99/AVR_mikrokontrollerid1.pdf http://et.wikipedia.org/wiki/Atmel_AVR http://et.wikipedia.org/wiki/Kasutaja:Z3n/SPI http://home.roboticlab.eu/et/avr
Kõik kommentaarid