SCI
vmesnik v mikrokontrolerju MC6803 omogoča serijski prenos podatkov, za katerega
je značilno odpošiljanje posameznih
bitov sporočila drugega za drugim med oddajnikom in sprejemnikom.
V
osnovi ločimo dva tipa prenosov podatkov: sinhroni in asinhroni serijski
prenos.
SCI
vmesnik je asinhroni serijski vmesnik.
Za
asinhroni način prenosa je značilno, da se sprejemnik in oddajnik uskladita - sinhronizirata
na začetku prenosa vsakega znaka (10 bitov), zato so med posameznimi znaki
lahko poljubno dolgi časovni presledki.
Dve
enoti (asinhrona vmesnika), ki komunicirata na ta način, sta med seboj
neposredno povezani s tremi linijami: dvema za prenos signalov in tretjo za
izenačitev potencialov (povezava negativnih polov obeh enot).
Vedno
je izhod, ki oddaja signal - Tx, vezan na vhod druge enote, ki sprejema signal -
Rx.
Enota
sporočila pri
SCI asinhronem serijskem prenosu je znak,
ki ga sestavljajo:
start bit označuje začetek prenosa in služi za sinhronizacijo pri prenosu znaka
8 podatkovnih bitov predstavlja koristno informacijo, ki jo prenašamo,
en
stop bit
zaključuje informacijo in predstavlja ločitev od naslednjega znaka.
Vsak
znak je neodvisen od drugega znaka.
V
mirovnem stanju
komunikacijski vmesnik oddaja visoko logično
stanje "1" (v bistvu oddaja stop bite).
Start
bit pomeni skok
v logično "0", ki traja
eno časovno enoto, določeno s frekvenco prenosa. Hitrost prenosa podajamo z
baudi (baud rate), to je številom
bitov, ki se prenesejo v eni sekundi. Tako npr. hitrost 4800 baudov pomeni, da
se bo v eni sekundi preneslo maksimalno 4800 bitov, oziroma, da prenos enega
bita traja 1/4800 sekunde. Temu času tudi pravimo bitni
interval in mora biti enak za oddajnik in sprejemnik.
Start
bitu sledijo podatkovni biti v
zaporedju od bita z najmanjšo težo (LSB) do najbolj vrednega bita (MSB).
Stop
bit predstavlja
logično stanje "1"
(neaktivno stanje oddajnega signala) in zaključuje prenos vsakega znaka,
oziroma loči znak od naslednjega odposlanega.
Naslednji
znak sledi v poljubnem času, zato
pravimo prenosu asinhroni prenos. Pri naslednjem znaku zagotovi start bit
ponovno sinhronizacijo med sprejemnikom in oddajnikom.
Sprejem
in oddaja znaka v serijskem komunikacijskem vmesniku (adapterju) potekata avtomatsko.
Lahko tečeta hkrati (istočasno).
Hitrost prenosa je običajno določena kar s
frekvenco večkratnika urinega signala procesorja, lahko pa uporablja
komunikacijski vmesnik zunanji urin
generator.
Hitrosti
prenosov so pri skrbni izbiri frekvence kvarčnega kristala standardne in so: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400
baudov (bitov/s).
Možne
so tudi nestandardne hitrosti prenosov, vendar le med napravami, ki so uglašene
na te hitrosti.
Uporaba
SCI vmesnika v mikrokontrolerju MC6803
Programski
model SCI vmesnika predstavljajo štirje programsko dostopni registri,
ki imajo naslove nespremenljive:
register | naslov registra |
krmilni register | $0010 |
krmilno/statusni register | $0011 |
sprejemni register | $0012 |
oddajni register | $0013 |
Hitrost
prenosa je enaka za sprejemnik in za
oddajnik.
Kot
osnovo za določitev hitrosti prenosa lahko vzamemo mikroprocesorjev E
signal ali pripeljemo zunanji urin signal (določitev programsko v krmilnem
registru). Hitrost prenosa izbiramo med štirimi možnostmi z nastavitvijo v
krmilnem registru, ki je le vpisovalni register:
krmilni register
CONTR1:
naslov registra: $0010
b7
b6
b5
b4
b3
b2
b1
b0
-
-
-
-
CC1
CC0
SS1
SS0
Za
nastavitev hitrosti prenosa sta namenjena bita b0 in b1:
b1 (SS1) in b0 (SS0) ... bita za
nastavitev delilnega razmerja signala
0
0
E/16 Þ
38.400 bitov/s (baudov) pri Q = 2,4576 MHz
0
1
E/128 Þ
4.800
"
1
0
E/1024 Þ
600 "
1
1
E/4096 Þ
150 "
Te
vrednosti so navedene za kvarčni kristal, ki niha s frekvenco 2,4576 Mhz. Če
bi vgradili drugačnega, bi se hitrosti prenosov seveda spremenile.
Z
drugima dvema bitoma b2 in b3 v tem krmilnem registru določimo izvor urinega
signala, ki določa hitrost prenosa. Kot smo že omenili, lahko uporabimo uro
procesorja E ali pa zunanji signal, ki ga serijski vmesnik lahko dobi le preko
nožice P22.
b3 (CC1) in b2 (CC0)
... bita za določitev izvora urinega signala
0
0
neuporabljeno
0
1
uporaba notranjega E signala, nožica P22 prazna
1
0
"
,izh
SCI ur. signala na nožici P22
1
1
uporaba zunanjega ur. signala preko nožice P22- vhod
Oddaja
pri asinhronem serijskem prenosu preko SCI v MC6803
Znak,
ki ga želimo oddati, enostavno vpišemo
v oddajni register Tx (naslov: $0013).
Avtomatsko
se znaku dodata start bit in stop bit, nakar se vsebina pomakne v oddajni
pomikalni register.
Iz
oddajnega pomikalnega registra izstopajo posamezni biti v določenih časovnih
razmakih na nožici Tx.
V
oddajni register lahko nov znak vpišemo
šele, ko je le-ta prazen, kar razberemo iz stanja bita TDRE (Transmit Data Register Empty) v krmilno/statusnem registru.
Oddajni register je prazen, ko ima ta bit vrednost "1".
Poskrbljeno
je tudi za avtomatizem pri oddaji znakov
z uporabo prekinitev:
Če
postavimo bit TIE (Transmit Interrupt
Enable) v logično stanje "1", bo prišlo do prekinitve vselej, ko se
bo izpraznil oddajni register (TDRE se bo postavil v "1") in v oddajni
register bomo vpisali nov znak.
TDRE
se briše na "0", ko preberemo
statusni register in vpišemo novo vrednost v oddajni register. Takrat SCI
enota tudi umakne prekinitveno zahtevo.
Ker si
mikrokontrolerjevo nožico P24 deli več enot, jo moramo že ob začetni določitvi
delovanja enot (initializaciji) dodeliti oddajni liniji Tx (sicer jo uporablja
Port2 kot I/O nožico). To storimo s postavitvijo bita TE (Transmit Enable) v krmilnem registru v logično stanje
"1".
V
kratkem bi pri serijskem prenosu postopek
za oddajo sporočila (brez uporabe prekinitev) povzeli takole :
* initializacija
določi izvor ure v krmilnem registru (bita CC0 in CC1)
določi delilno razmerje v krmilnem registru (bita SS0 in SS1)
določi nožico P24 kot Tx oddajno nožico (TE bit)
* oddaja znaka
ponavljaj, dokler nameravaš odpošiljati znake:
{
čakaj,
da bo oddajni register prazen (TDRE bit = 1)
vpiši
nov znak v oddajni register
}
Predstavitev
vsebine krmilno/statusnega registra:
Krmilni
in statusni register imata isti naslov, vendar v krmilni register lahko vsebino
le vpisujemo, iz statusnega registra pa vsebino lahko le beremo. Kar vpisujemo
na naslov $0011, se vpiše v krmilni register, kar pa preberemo
na naslovu $0011, je vsebina statusnega registra.
krmilno/statusni register :
naslov registra:
$0011
statusni register STATR
naslov registra:
$0011
b7
(RDRF) b6 (ORFE) Receive Data Register Full in OverRun Framing Error
0
0
sprejemni register je prazen (ni sprejetega znaka)
0
1
sprejeti znak ima napačen format (framing error)
1
0
znak, ki je v sprejemnem registru, je pravilno sprejet
1
1
sprejemnik je sprejel več kot en znak (overrun error)
b5
(TDRE) ...
Transmit Data Register
Empty
krmilni register CONTR2
naslov registra:
$0011
b4
(RIE) ...
Receive Interrupt Enable
b3
(RE) ... Receive Enable
b2
(TIE) ...
Transmit Interrupt Enable
b1
(TE) ...
Transmit Enable
b0
(WU) ... Wake Up enable
(Bit
WU (Wake Up) uporabljamo pri povezavah več procesorjev med seboj. Gre zato, da
s postavitvijo WU=1 omogočimo mikrokontrolerju, da se aktivira pri sprejemu
določenega zaporedja bitov -10 enic)
Sprejem
pri asinhronem serijskem prenosu preko SCI v MC6803
Tudi
pri sprejemu je treba, tako kot pri oddaji, določiti izvor ure in delilno
razmerje.
Sprejem
omogočimo s postavitvijo bita RE
(Receive enable) v krmilnem registru v stanje "1".
Čim
se na nožici Rx pojavi logično
stanje "0", sprejemnik predpostavi, da se je pojavil start bit. Počaka
polovico bitnega intervala in ponovno prebere stanje na tej liniji. Če je nivo
še vedno nizek, dokončno sprejme ta bit kot start bit in s tem je opravljena
sinhronizacija za sprejem. Naslednjih devet bitov sprejemnik sprejema v
sprejemni pomikalni register, vsak bit na
sredi bitnega intervala.
Ko je
sprejet znak v celoti (vseh 10 bitov), se vsebina iz sprejemnega pomikalnega
registra avtomatsko prepiše v sprejemni register, sprejem pa zaznamuje tudi
postavitev bita RDRF (Receive Data
Register Full) v statusnem registru.
Če
pri initializaciji postavimo bit RIE
(Receive Interrupt Enable) v krmilnem registru na "1", omogočimo
oddajo zahteve za prekinitev pri sprejemu vsakega novega znaka (tudi v primeru
napake pri sprejemu!).
Uporaba
prekinitve je ugodna zato, ker se prekinitev izvede avtomatsko ob sprejemu
vsakega znaka.
Če se
ne odločimo za sprejem znaka z uporabo prekinitev, moramo zelo pogosto
preverjati stanje RDRF bita. Čim ta bit zavzame vrednost "1", vemo,
da je prišlo do sprejema znaka in ga preberemo iz sprejemnega registra (naslov:
$0012).
Vrednost
tega bita se avtomatsko briše na "0", ko zaporedoma preberemo stanje statusnega registra in sprejet znak iz
sprejemnega podatkovnega registra Rx.
Pri sprejemu znaka pa lahko pride tudi do napake. Možno je, da:
so podatkovni biti na poti spremenili svoje vrednosti, česar ne moremo enostavno ugotoviti
zaključek prenosa znaka ni zaznamoval stop bit s stanjem "1", kar imenujemo napaka formata (framing error),
prej sprejetega znaka iz sprejemnega registra nismo pravočasno prevzeli, zato ga je prekril nov sprejet znak. Govorimo o napaki prekrivanja (overrun error).
Vrsto
napake ugotovimo iz kombinacije stanj bitov RDRF (Receive Data Register Full) in ORFE (OverRun Framing Error) pri branju statusnega registra, kar je
razvidno iz zgornje tabele.
Program
za sprejem pri serijskem prenosu
(brez uporabe prekinitev!) bi predstavili takole:
* initializacija
določi izvor ure v krmilnem registru (CC0 in CC1 bita)
določi delilno razmerje v krmilnem registru (SS0 in SS1 bita)
določi nožico P23 za sprejemno nožico
v krmilnem registru (RE bit)
* sprejem znaka
ponavljaj, dokler nameravaš sprejemati znake:
{
čakaj,
da bo sprejemni register poln (RDRF bit = 1))
preveri,
če ni napake pri sprejemu (ORFE bit)
preberi
znak iz sprejemnega registra
}