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:

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:

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

                        }

Nazaj