Robot Mobil Realizat CU Microcontrolerul M68hc11 Extensie Software Hardware

=== ANEXA ===

Fig.1 Cracteristica de frecvență a FTB (tipic)

Fig.2 Sensibilitatea unghiulară (direcția X)

Cracateristică (tipică) de referință

Fig.3 Sensibilitatea unghiulară (direcția Y)

Caracteristică (tipică) de referință

=== CONVER~2 ===

Măsurarea unui semnal analogic și afișarea valorii zecimale

La intrarea canalului #1 se aplică un semnal analogic care variază în timp. După ce valoarea analogică de intrare a fost convertită și memorată, aplicația poate ceredatele pentru ale procesa în unitatea de procesare centrală (CPU) și să returneze rezultatul, la monitor sau imprimantă, ca valoare zecimal.

Vom programa robotul să citească o valoare de anlogică pe care să o convertească în valoare numerică și să p afișeze zecimal pe ecran. tensiunea va fi în domeniul 0…5,12V.

Diagrama din figura X.X arată ceea ce trebuie făcut în acest caz. Se presupune ca ADCTL inițializat regiștrii de rezultat să memoreze 1logic sau FF (valoarea maximă a tensiunii de intrare). Deoarece fiecare bit are o lățime de 20mV fiecare, datele digitale de intrare vor fi multiplicate cu 14hex (20dec). punctul zecimal va fi inserat înainte ca datele să fie transmise ieșirii.

Hexazecimal Echivalent zecimal

FF Valoare de intrare 255

x14 Echivalentul lui 20dec x20

13EC Rezultatul în acumulator D 5100

În programul următor, valoarea hexazecimală $13EC (5100dec) este memorată temporar la locația $D100 și apoi convertită la o valoare zecimală pe 5 digiți. Rezultatul conversiei este memorat în memoria microprocesorului începând cu locația $DB00 ca în figura X.X (b). cum subrutinele utilitare memorate în EPROM pot fi folosite pentru a afișa rezultatele pe ecran. Punctul zecimal și abrevierea pentru volți, V, sunt parte a instrucțiunilor de afiăare, cum se arată în figura X.X (c).

programul de intrare/ieșire a datelor a fost scris folosind ansamblerul.

ORG $C500 ;

date I/O: LDAA #$21 ; cuvânt de control A/D

STAA $1030 ; inițializează registrul ADCTL

LDAB #$26 ; întârziere de citire

întârziere: DECB ; întârziere buclă

bne întârziere ; se duce dacă Acc.B<>0

LDAA $1031 ; citește registrul A/D

LDAB #$14 ; încarcă multiplicatorul $14 (20dec)

MUL ; înmulțește (data de intrare) x 14 D

STD $D100 ; memorează temporar produsul

JSR conversie ; sare la subrutina de conversie

LDAA $DB01 ; încarcă numărul cel mai semnificativ

JSR $FFB ; convertește în ASCII și afișază

LDAA #$2E ; inserează virgula zecimală

JSR $FFB8 ; afișază caracterul ASCII

LDAA $DB02 ; încarcă a doua valoare

JSR $FFBB ; convertește în ascii și afișază

LDAA $DB03 ; încarcă a treia valoare

JSR $FFB5 ; convertește în ASCII și afișază

LDAA #20 ; inserează caracterul spațiu

JSR $FFB8 ; afișază caracterul ASCII

LDAA #$56 ; inserează abrevirea V

JSR $FFB8 ; afișazăcaracterul ASCII

conversie: LDD $D100 ; încarcă numărul pe 16 biți

; pentru conversie

LDX #10000 ; încarcă divizorul 10000

; (2700hex)

IDIV ; divizare întragă

XGDX ; salvează o copie în registrul X

LDX #1000 ; încarcă divizorul 1000

; (3E8hex)

IDIV ; divizare întreagă

XGDX ; salvează o copie în registrul X

STAB $DB01 ; salvează în buffer de memorie

XGDX ; întoarce în D copia de rezervă

LDX #100 ; încarcă divizorul 100 (64hex)

IDIV ; divizare întreagă

XGDX ; salvează o copie în registrul X

STAB $DB02 ; salvează în buffer de memorie

XGDX ; întoarce în D copia de rezervă

LDX #10 ; încarcă divizorul 10 (Ahex)

IDIV ; divizare întreagă

XGDX ; salvează o copie în registrul X

STAB $DB03 ; salvează în bufer memorie

XGDX ; întoarce în D copia de rezervă

STAB $DB04 ; salvează în buffer memorie

RTS ; întoarcere din subrutină

END

=== FINAL1 ===

Cap. I INTRODUCERE

I.1. Ce este un microcontroler ?

La modul general un controler este o structură electronică destinată controlului unui proces sau caracteristici a mediului exterior, fără să fie necesară intervenția operatorului uman. Realizate inițial pe baza logicii cablate (circuite numerice SSI și MSI) și a unei electronici analogice uneori complexe, se evidențiau prin dimensiuni mari, consum energetic pe măsură și eventual o fiabilitate care lăsa de dorit.

Utilizarea microprocesoarelor de uz general a dus la o reducere consistentă a dimensiunilor, consumului și o îmbunătățire a fiabilității. Există și la ora actuală o serie de astfel de controlere de calitate, realizate în jurul unor microprocesoare de uz general cum ar fi Z80 (Zilog), 8086/8088 (Intel), 6809 (Motorola).

Pe măsură ce procesul de miniaturizare a continuat a fost posibil ca majoritatea componentelor necesare realizării unei astfel de structuri să fie încorporate la nivelul unui singur microcircuit (chip). Astfel că un microcontroler poate fi descris ca fiind o soluție a problemei controlului cu ajutorul (aproape) unui singur circuit.

Resursele integrate la nivelul microcircuitului trebuie să includă cel puțin următoarele componenete: o unitate centrală (CPU), o memorie locală tip RAM și eventual una de tip ROM/ PROM/ EPROM, I/O – intrări/ieșiri și un mecanism de prelucrare a întreruperilor rapid și eficient.

Utilizarea unui microcontroler constituie o soluție prin care se poate reduce dramatic numărul componenetelor electronice precum și costul proiectării și al dezvoltării unui produs.

I.2. Utilizări

Printre mult prea multele domenii se pot menționa: instrumentație (senzori și traductoare inteligente, aparate de măsură), industria de automobile (controlul motorului, climatizare, diagnoză, sisteme de alarmă, etc.), electronică de consum (Sisteme audio, televizoare, camere video și videocasetofoane, cuptoare cu microunde, etc.), controlul mediului (sere, locuințe, hale industriale), industria aerospațială.

O aplicație specifică, care nu ține neapărat de control, este la realizarea înregistratoarelor de date (“data loggers”). Consumul redus, dimensiunile mici și flexibilitatea permit realizarea unor sisteme pentru monitorizarea și înregistrarea unor mărimi, în cele mai diverse condiții: mobile, portabile, în locuri izolate.

Microcontrolerele sunt utilizate masiv în robotică și în general în tot ce înseamnă automatizarea procesului de fabricație, unde sarcinile specifice pot fi distribuite la un mare număr de microcontrolere integrate într-un sistem unic.

I.3. Variante constructive

Există la ora actuală un mumăr extrem de mare de de tipuri constructive de microcontrolere. Funcție de puterea de calcul și de alte caracteristici se pot alege variante având simensiunea cuvântului mașină de 4, 8, 16 sau 32 biți. Există multe variante specializate pentru comunicație, controlul tastaturilor, prelucrarea semnalului, etc.

I.4. Limbaje de programare

I.4.1. Limbajul mașină și de asamblare

Limbajul mașină (instrucțiunile mașină ) este singura formă de reprezentare a informației pe care un microcontroler o înțelege (ca de altfel orice alt sistem de calcul). Din păcate această formă de reprezentare a informației este total nelucrativă pentru un programator, care va utiliza un limbaj de asmblare în care o instrucțiune (o mnemonică cu operanzii aferenți) are drept corespondent o instrucțiune în limbaj mașină (excepție fac macroinstrucțiunile).

Un program în limbaj de asamblare este rapid și compact. Limbajul de asamblare permite înțelegerea arhitecturii microcontrolerului și utilizarea ei eficientă.

I.4.2. Interpretere

Un interpreter este o implementare a unui limbaj de nivel înalt, mai apropiat de limbajul natural. Este de fapt un program rezident care, în acest caz, rulează pe o platformă de calcul de tip microcontroler. Caracteristic pentru execuția unui program interpretat, este citirea și executarea secvențială a instrucțiunilor. De fapt fiecare instrucțiune de nivel înalt este interpretată într-o secvență de instrucțiuni mașină. Cele mai răspândite interpretere sunt cele pentru limbajele BASIC și FORTH.

I.4.3. Compilatoare

Un compilator combină ușurința în programare oferită de un interpreter (de fapt de limbajul de nivel înalt) cu o viteză mai mare de execuție a codului. Pentru aceasta programul în limbaj de nivel înalt este translatat (tradus) direct în limbaj mașină. Codul mașină rezultat este executat direct, ca un tot, de microcontroler.

Se pot enumera compilatoare pentru limbajele: C, BASIC, PL/M (Intel), Pascal, Forth. Cele mai poplare sunt cele pentru limbajul C, un limbaj universal folosit atât pentru calculatoare puternice cât și pentru microcontrolere de 4 biți. Este un limbaj puternic și flexibil, care deși de nivel înalt, poate permite și accesul direct la resursele sistemului de calcul. Un program bine scris generează un cod rapid și compact.

Există numeroase implementări, pentru diverse microcontrolere. Cu anumite limitări legate de arhitectura și mai ales resursle microcontrolerului asigură portabilitatea unei aplicații scrisă pentru un anumit tip de microcontroler pe un alt tip.

OBS1. Pentru a. și c. codul este obținut cu ajutorul unui mediu de dezvoltare a programelor care conține: asamblor/compilator, editor de legături/locator (link-editor/locater), programe de gestiune a bibliotecilor (librarians), programe de conversie a formatelor de reprezentare a codului.

OBS2.Codul astfel obținut este încărcat în memoria program a mașinii țintă, unde va rula (programat într-o memorie (EP)ROM, încărcat într-o memorie RAM, etc.).

I.5. Dezvoltarea și testarea aplicațiilor

I.5.1. Simulatoare

Un simulator este un program care rulează programul microcontrolerului – implementează un microcontroler virtual – folosind un sistem de calcul gazdă (cum ar fi un PC). Programul se poate executa pas cu pas, conținutul variabilelor și regiștrilor poate fi vizualizat și modificat. Nu permite simulare în timp real a întreruperilor și, de regulă, programul rulează mai încet decât pe mașina reală.

I.5.2. Depanatoare (debbugers) rezidente

Este un program (denumit în română și program monitor) care rulează pe mașina țintă (microcontroler) oferind facilități similare simulatorului. Interfața cu utilizatorul este realizată prin intermediul unui sistem gazdă (PC) sau a unui terminal alfanumeric. Utilizează o parte din resursele microcontrolerului : memorie pentru el însuși și pentru variabilele proprii, memorie pentru programul ce se depanează, port serial, eventual întreruperi, etc. Se utilizează de regulă cu un sistem de dezvoltare (evaluare), un sistem realizat în jurul unui microcontroler, cu resurse suficiente pentru a permite testarea și depanarea unor aplicații uzuale.

I.5.3. Emulatoare

Sunt cele mai complexe și costisitoare mijloace de testare și dezvoltare. Presupun existența unui hardware dedicat care înlocuiește practic microcontrolerul (se conectează în locul acestuia în sistemul pentru care se dezvoltă aplicația), în acleși timp fiind fiind disponibile toate facilitățile descrise anterior și altele suplimentare. Permit un control total al mașinii țintă (în timp real), fără a folosi nimic din resursele acesteia (la variantele cele mai costisitoare). Ele pot fi realizate ca un mijloc de sine stătător (cu afișare și tastatură) sau ca o interfață într-un PC.

Cap. II MICROCONTROLERE M68HC11

II.1. Introducere

Proiectarea unui produs bazat pe un microcontroler este de obicei făcută utilizând un sistem de dezvoltare cu acel microcontroler astfel încât ideile ce țin de hardware sau software pot fi testate înainte de a le implementa produsului final. După ce aplicația software este testată și depanată, ea poate fi arsă în memoria ROM a microcontrolerului pentru produsul final. Înainte de a începe descrierea proiectului trebuie cunoscută construcția (hardware) și programarea (software) microcontrolerului.

Microcontrolerul M68HC11 are două moduri de operare: single-chip și extins. Modul single-chip este utilizat în general pentru produsele finale și în particular pentru un volum mare de aplicații dedicate. În modul extins se utilizează câțiva din pinii I/O ai microcontrolerului pentru linii de adrese și date.

II.2. Familia M68HC11

Produsele M68HC11 reprezintă o familie de microcontrolere pe 8 biți disponibilă de la firma Motorola. Aceste microcontrolere sunt compatibile din punct de vedere al programării, dar anumite caracteristici ce țin de construcție diferă, așa cum este mărimea memoriei ROM și/sau RAM. Această familie de produse permite utilizatorului final să aleagă cel mai potrivit microcontroler pentru aplicația sa. Toate aceste microcontrolere sunt fabricate utilizând tehnologia HCMOS (High-density Complementary Metal-Oxide Semiconductor).Microcontrolerul de bază este MC68HC11A8.

O listă a diverselor versiuni accesibile în acest moment este cea din tabelul următor (Tabel 2.1).

Tabel 2.1

În continuare se va descrie microcontrolerul de bază, MC68HC11A8, deoarece multe din celelalte componente ale familiei sunt identice cu acesta ca structură, dar au unele resurse dezactivate. De exemplu, un MC68HC11A1 este identic cu MC68HC11A8 cu excepția memoriei ROM, care este dezactivată. Un MC68HC11A0 are dezactivate memoriile EPROM și EEPROM.

II.3. Microcontrolerul MC68HC11A8

MC68HC11A8 este un microcontroler (MCU) pe 8 biți care are capabilități periferice foarte sofisticate.

II.3.1. Caracteristici constructive

8 Kocteți memorie ROM (Read Only Memory)

512 octeți memorie EEPROM (Electrically Erasable Programmable ROM)

256 octeți memorie RAM (Random Access Memory) relocabilă în domeniul de 4K

Sistem Timer (temporizator/numărător) pe 16 biți cu:

prescaler cu patru stagii programabile

trei funcții captură-intrare

cinci funcții comparare-ieșire

circuit de numărare de pulsuri pe 8 biți

interfață serială de comunicație NRZ îmbunătățită (SCI)

interfață serială periferică (SPI)

convertor analog-numeric pe 8 biți cu opt intrări

circuit de intrerupere în timp real

sistem watchdog , COP (Computer Operating Properly)

II.3.2. Caracteristici de programare

set de instrucțiuni M6800/M6801 îmbunătățit

operații de împărțire pentru numere pe 16 biți întregi sau fracționale

manipulare la nivel de bit

mod WAIT

mod STOP

II.3.3. Descriere generală

Tehnologia high-density CMOS(HCMOS) utilizată la MC68HC11A8 îmbină mărimea mică și viteze ridicate cu micul consum și imunitatea la zgomot a circuitelor CMOS. Memoria internă include 8Kocteți ROM, 512 octeți EEPROM și 256 octeți RAM static.

O schemă bloc a microcontrolerului MC68HC11A8 este prezentată în figura Fig. 2.1.

Circuitul microcontrolerului este prevăzut cu majoritatea funcțiilor periferice. Un convertor analog-numeric (A/D) cu opt intrări și rezoluție de opt biți este inclus. O interfață serială de comunicație asincronă (SCI) și o interfață serială sincronă, separată (SPI), sunt deasemenea incluse. Sistemul temporizator/numărător (timer) are trei linii de captare, cinci linii de ieșire de comparare și funcție de întrerupere în timp real. Acumulatorul de impulsuri este pe 8 biți și poate număra evenimente sau poate măsura perioade de timp externe.

Circuitul de auto-monitorizare (COP) este folosit pentru protecție împotriva erorilor sistemului. Sistemul watchdog protejează împotriva greșelilor de programare. Sistemul de monitorizare a ceasului generează un reset al sistemului în cazul în care frecvența ceasului este pierdută sau este prea mică. Un circuit de detectare a opcod-urilor ilegale furnizează o întrerupere nemascabilă dacă este detectat un opcod ilegal.

Două moduri de operare controlate prin program, WAIT și STOP, sunt folosite pentru economisirea energiei.

Fig. 2.1 Schema bloc a microcontrolerului

II.3.4. Tipuri de capsule și funcțiile pinilor

Microcontrolerul MC68HC11A8 este accesibil sub forma unui circuit integrat cu 52 pini dispuși pe patru laturi (PLCC – plastic leaded chip carrier) sau cu 48 pini dispuși pe două laturi (DIP- dual in line package). Ambele tipuri sunt prezentate în figura Fig. 2.1 .

Diferența dintre cele două circuite este doar numărul de pini pentru intrările convertorului analog-numeric. În continuare se va face referire la varianta de integrat cu 52 pini.Microcontrolerul MC68HC11A1 utilizat în construcția robotului este în varianta cu 52 pini și are aceeași poziționare și aceleași funcții ale pinilor respectivi ca și MC68HC11A8. Diferența este că memoria internă EEPROM a lui A1 este dezactivată de un bit al unui registru nevolatil propriu microcontrolerului.

(a) 52-pini PLCC

(b) 48- pini DIP

Fig. 2.2 Tipuri de capsule

II.3.4.1. Alimentare (VDD și VSS )

Alimentarea MCU se face cu +5V pentru majoritatea aplicațiilor. Pinii 26 și 1 sunt conectați la +5V și respectiv la masă. Totuși, trebuie adăugate surse suplimentare pentru alimentarea de rezervă a memoriei RAM sau pentru tensiunea de referință a convertorului analog-numeric. Deși MC68HC11A8 este un dispozitiv CMOS, pe mulți din pinii săi se găsesc semnale cu tranziții foarte rapide. Intervale scurte de creștere sau scădere ale semnalelor sunt prezente chiar și atunci când microcontrolerul operează la valori mici ale frecvenței de ceas. O atenție deosebită trebuie avută la legarea sursei de alimentare. Se recomandă legarea unui condensator ceramic de 0.1F între pinii VDD și VSS dar foarte aproape fizic de unul din cei doi pini.

II.3.4.2. Selectare mod de lucru (MODA/ și MODB/VSTBY)

Pinii 2 și 3 sunt utilizați de MCU pentru selectarea modului de operare după condiția de reset. Există patru moduri de operare, acestea fiind prezentate în tabelul următor.

Tabel 2.2

După ce modul de operare a fost selectat, pinul furnizează o ieșire open-drain pentru a indica execuția unei instrucțiuni. Toate instrucțiunile sunt executate în timpul unei serii de cicluri ale ceasului intern, E. Semnalul trece în low în timpul primului ciclu al ceasului E corespunzător fiecărei instrucțiuni (opcode fetch). Această ieșire este folosită în depanarea programelor.

Semnalul VSTBY este utilizat ca intrare pentru alimentarea în stand by a memoriei RAM. Când tensiunea pe acest pin este mai mare decât un prag MOS ( peste 0.7V), peste tensiunea VDD, cei 256 octeți ai memoriei RAM interne și o parte a logicii de reset sunt alimentate de la acest semnal. Aceasta permite conținutului memoriei RAM să fie menținut fără alimentarea MCU de la tensiunea VDD. Semnalul de reset trebuie trecut în low înainte de deconectarea tensiunii VDD și trebuie să rămână în low până când tensiunea VDD a fost readusă la un nivel valid.

II.3.4.3. Oscilatorul cu cristal de cuarț ( EXTAL, XTAL)

Pinii 7 și 8 subt utilizați la conectarea unui circuit ce conține un cristal de cuarț, așa cum este arătat în figura Fig. 2.3 .

Fig. 2.3 Conexiune tipică pentru un MC68HC11

În interiorul microcontrolerului, circuitul oscilator este compus din două porți NAND. Una din intrări este conectată la circuitul modului STOP al microcontrolerului, care dezactivează oscilatorul pentru oprirea tuturor semnalelor de ceas ale sistemului și trecerea microcontrolerului în standby, mod în care consumul este extrem de mic. Cealaltă intrare a porții NAND este conectată la pinul 7, EXTAL. Ieșirea porții NAND este legată la pinul 8, XTAL.

Dacă semnalul de ceas al microcontrolerului este generat de sursă de ceas compatibilă CMOS și nu de un cristal de cuarț, atunci intararea de ceas este aplicată pinului EXTAL. Pinul XTAL poate rămâne neconectat sau poate fi conectat la masă printr-o rezistență de 10K-100K.

II.3.4.4. Semnalul de ceas E

Cât timp oscilatorul funcționează, semnalul de ceas E are frecvența la un sfert din frecvența semnalului de intrare de la pinii EXTAL și XTAL. E este o referință de timp și semnalul de ceas de bază pentru toate operațiile interne și externe al microcontrolerului. În modul single-chip, pinul 5, nu este utilizat și rămâne neconectat. În modul extins de operare, pinul semnalului de ceas E este conectat la memoria externă ROM sau RAM și la cipurile de I/O, pentru sincronizarea transferurilor de date intre aceste componente și CPU.

II.3.4.5. Semnalul de RESET ()

Linia conectată la pinul 7 este utilizată pentru un semnal bidirecțional de control. Ca intrare, un semnal activ în low inițializează microcontrolerul într-o stare cunoscută. Ca ieșire, este folosit pentru semnalizarea circuitelor externe la apariția unei erori interne microcontrolerului.

II.3.4.6. Întrerupereri (,)

Microcontrolerul MC68HC11 are doi pini pentru cereri de întrerupere: (pinul 19) și (pinul 18). este un pin pentru cerere de întrerupere mascabilă, adică un semnal de întrerupere poate sau nu, să fie recunoscut. Bitul de mascare a întreruperii (bitul I) din registrul CCR (Condition Code Register) poate fi setat sau șters prin program. Dacă bitul I este setat, CPU nu va recunoaște cererile de întrerupere; altfel, semnalele de întrerupere sunt recunoscute.

După o inițializare prin reset, pinul se poate folosi pentru o cerere de întrerupere nemascabilă. În timpul resetului, bitu X din CCR este setat și orice întrerupere pe pinul 18 este mascată. Prin aceasta se dă posibilitatea programatorului să scrie programe pentru a inițializa sistemul fără ca microcontrolerul să recepționeze întrerupere pe pinul . După ce procedura de inițializare software este terminată, bitul X poate fi șters printr-o instrucțiune TAP dar nu poate fi setat printr-o instrucțiune; de aici pinul devine nemascabil.

Pe lângă și , MC68HC11A8 mai are alți cinci pini capabili să genereze cereri de întrerupere.

II.3.4.7. Tensiuni de referință pentru convertorul A/D (VRL, VRH)

Pinii 51 (VRL) și 52 (VRH) sunt intrări pentru tensiunile de referință pentru circuitul convertorului analog-numeric.

II.3.4.8. Portul A/Timer

Pinii portului A/Timer (pinii 27-34) pot fi utlizați atât ca linii I/O pentru aplicații cu scop general, cât și ca linii pentru aplicații specifice funcției numărător/temporizator (timer). În ambele situații, cei opt pini sunt configurați astfel: trei pini pentru intrări, patru pini pentru ieșiri și un pin care poate fi programat ca intrare sau ieșire. Ca linii cu scop general, pinii sunt atribuiți portului A (PA0-PA7). PA0-PA2 sunt cei trei pini de intrare, PA3-PA6 sunt cei patru pini de ieșire și PA7 poate fi programat și ca intrare, și ca ieșire.

Pentru aplicațiile numărător/temporizator, cei trei pini de intrare (32-34) sunt atribuiți pinilor de captură-intrare (input-capture) (IC1-IC3). Cei patru pini de ieșire (28-31) sunt referiți ca pini de comparare-ieșire (output-compare) (OC2-OC5). Circuitul microcontrolerului permite ieșirii de comparare 1 (OC1) să controleze orice combinație a pinilor PA7-PA3.

Pinul 27 (PA7/PAI/OC1) este de asemenea utilizat ca intrare a acumulatorului de pulsuri, care poate fi utilizat ca un numărător de evenimente sau pentru măsurarea intervalelor de timp.

Funcțiile acestor pini sunt discutate detaliat în capitolul referitor la TIMER (Cap. III.1).

II.3.4.9. Portul B, portul C, STRA și STRB

Cei 18 pini, 35-42, 9-16, 4 și 6, au diferite funcții care depind de modul de operare al microcontrolerului. În modul single-chip, portul B este un port de ieșire pe 8 biți fiind folosit în aplicațiile cu scop general. Liniile portului C pot fi configurate atât ca intrări cât și ca ieșiri. Notă: unele linii ale portului C pot fi programate ca ieșiri, iar altele rămân intrări.

Funcția primară a semnalelor STRA și STRB, în modul single-chip, este aceea de control și conlucrare cu circuitele periferice.

În modul extins (expanded), acești 18 pini sunt utilizați ca magistrală multiplexată de adrese/date, linie de citire/scriere (R/) și linie de control adresă (adress strobe = AS). Cele 16 linii de adresă permit microprocesorului să acceseze 64Kocteți (216=64K) de memorie și spațiu I/O. Multiplexarea în timp este utilizată la pinii de adresă de ordin inferior (AD0-AD7) pentru a furniza adresa pe 8 biți sau data. Când linia AS (pinul 4) est în high, unitatea centrală de prelucrare (CPU) pune la ieșire adresa și circuitul extern folosește semnalul liniei AS ca validare. Când linia AS este în low, informația de adresă trebuie memorată într-un dispozitiv extern cum ar fi un latch octal cu bistabile D.

Linia R/ este utilizată pentru controlul direcției datelor. CPU citește date când această linie este în high și scrie date când linia este în low.

II.3.4.10. Portul D

Cei șase pini ai portului D pot fi configurați ca linii bidirecționale I/O sau ca linii pentru comunicație serială. Unele linii I/O pot fi programate ca ieșiri și cele rămase, ca intrări. Această posibilitate este similară cu cea a portului C, dar portul D are asociate doar 6 linii. O altă posibilitate de configurare a liniilor portului D este aceea de al le folosi pentru comunicația serială, sincronă si asincronă.

Pentru comunicația asincronă, pinul 20, PD0/RxD, este utilizat pentru a recepționa data serială, iar pinul 21, PD1/TxD, este folosit pentru transmiterea datelor. Cei doi pini sunt asociați unui bloc al microcontrolerului denumit SCI (Serial Communication Interface), care este circuitul de interfață pentru comunicația serială asincronă. El îndeplinește funcția unui modul UART (universal asynchronus reciver / transmiter).

Celelalte patru linii ale portului D pot fi de asemenea configurate pentru comunicație serială. Aceste linii sunt asociate blocului SPI (Serial Peripheral Intarface). Ele pot fi utilizate pentru comunicația sincronă sau pentru transferul de date la echipament periferic, cum ar fi un afișaj cu cristale lichide, sau pentru a recepționa date de la un convertor analog-numeric (A/D) serial. Microcontrolerul poate fi folosit într-un sistem cu mai multe procesoare master, utilizând aceste linii. Când MCU este master, linia de intrare este pinul 22 (MISO) și linia de ieșire este pinul 23 (MOSI). Ca slave, pinul 22 este ieșire și pinul 23 este intrare.

Pinul 24, SCK, este linia pentru semnalul de ceas (clock). Este utilizat ca semnal de ceas de ieșire pentru sincronizarea transferului de date atunci când MCU este configurat ca master. Când MCU este utilizat ca slave, pinul 24 poate fi utilizat ca intrare a semnalului de ceas. În unele aplicații unitatea slave nu necesită semnal de ceas astfel că semnalul SCK este ignorat.

Pinul 25, , este pinul de selectare a modulului slave. Este utilizat pentru a permite unității SPI transferul datelor. Unitatea master ține pinul în high ( stare inactivă).

II.3.4.11. Portul E

Pinii portului E (43-50) pot fi programați ca opt intrări generale (PE0 – PE7) sau ca opt canale de intrare ale convertorului analog-numeric (AN0 – AN7).

II.3.5. MODURI DE OPERARE

MC68HC11A8 poate fi configurat pentru unul din cele patru moduri de operare: single-chip, multiplexat extins, special bootstrap și special test.

II.3.5.1. Modul de operare single-chip

În modul de operare single-chip, MC68HC11A8 funcționează ca un microcontroler monolitic fără magistrale externe de adrese sau date. Portul B, portul C, strobe A și strobe B funcționează ca semnale generale de I/O sau conlucrare (handshake).

II.3.5.2. Modul de operare multiplexat extins (extended multiplexed)

În modul de operare multiplexat extins, MC68HC11A8 poate accesa 64Kocteți de spațiu de adrese. Acest spațiu include aceleași adrese ale memoriei interne utilizate pentru modul single-chip plus adresele perifericelor și memoriei externe. Magistrala extinsă este realizată de portul B și portul C plus semnalele de control AS și R/.

Fig. 2.4 Demultiplexare adresa/data

În figura Fig. 2.4 se prezintă modul de demultiplexare a adreselor de ordin inferior față de data, la portul C. Adresa, semnalele R/ și AS sunt active și valide pentru toți ciclii de bus, inclusiv cei de accesare a locațiilor memoriei interne.

II.3.5.3. Modul de operare special bootstrap

Modul special bootstrap este un mod de operare foarte versatil, în care practic nu există limitări în ce privește programele cu scop special care pot fi încărcate în RAM-ul intern. Programul boot loader (încărcător la boot-are) este stocat în memoria de 192 octeți boostrap ROM. Această memorie ROM este activată doar dacă MCU este resetat în modul de operare special boostrap, și apare ca un spațiu de memorie internă la locațiile $BF40-$BFFF. Programul boot loader va utiliza interfața SCI pentru a citi și memora un program de 256 octeți în memoria RAM internă la locațiile $0000-$00FF. După ce caracterul pentru adresa $00FF este recepționat, controlul este automat trecut programului încărcat de la adresa $0000.

MC68HC11A8 comunică prin intermediul portului SCI. După resetul în modul de operare special boostrap, interfața SCI funcționează la E clock/16 (7812 baud pentru E clock = 2MHz). Dacă, caracteristica de siguranță a fost specificată și bitul de siguranță a fost setat, este transmis la ieșirea SCI $FF. Astfel este ștearsă memoria EEPROM. Dacă ștergerea nu este realizată, este retransmis $FF și se reia tentativa de ștergere. În timp ce operația este realizată, RAM-ul intern este scris cu $FF. Registrul CONFIG este atunci șters. Acum programul boot loader se execută deși microcontrolerul nu este într-un mod sigur. Dacă piesa nu este în modul de siguranță (sau a completat secvența de ștergere de mai sus), transmițătorul SCI trimite un caracter de întrerupere (break) la ieșire. Pentru folosirea normală a programului boot loader, utilizatorul trimite $FF la receptorul SCI cu una din vitezele E clock/16 (7812 baud pentru E clock = 2 MHz) sau E clock/104 (1200 baud pentru E clock = 2MHz).

Notă. Acest $FF nu are ecou la blocul de transmisie al SCI.

Acum utilizatorul poate trimite (download) cei 256 Kocteți de program pentru a fi memorați în memoria RAM, începând cu locația $0000. Aceste caractere prezintă ecou la transmițător. Când încărcarea este completă, începe execuția programului de la locația $0000.

Tabel 2.3

În modul de operare special boostrap vectorii de întrerupere sunt transmiși în RAM, așa cum se observă în tabelul Tabel. 3.2. Aceasta permite utilizatorului să folosească întreruperile prin intermediul unei tabele de vectori de salt.

Opțiuni adiționale ale programului boot loader

Utilizatorul poate transmite $55 (doar la E clock/16) ca prim caracter înainte de $FF. Această operație determină saltul direct la locația $0000, sărind peste download.

Dacă se leagă pinul de recepție la cel de transmisie (prin intermediul unei rezistențe la VDD) execuția programului va sări direct la începutul memoriei EEPROM ($B600). O altă cale de a determina saltul la memoria EEPROM este de a transmite un break sau $00 ca prim caracter înainte de $FF.

II.3.5.4. Modul de operare special test

Modul test este un mod special de operare prin care se intenționa, în principal, realizarea testelor de fabricare. Acest mod este foarte apropiat de modul de operare multiplexat extins. În modul de operare special test, resetul și vectorii de întrerupere sunt luați de la locațiile memoriei externe $BFC0-$BFFF, nu de la $FFC0-$FFFF. Nu există limite de timp pentru protecția regiștrilor TMSK1, OPTION și INIT, deci acești regiștri pot fi scriși repetat. De asemenea un registru special, TEST1 este activat, permițând invocarea câtorva funcții de test realizate de fabricant.

Modul de operare special test nu este recomandat pentru utilizatorii finali pentru că securității reduse a sistemului; totuși, un utilizator final își poate dori dipă reset funcționarea în modul special test. Apoi, după unele inițializări, biții SMOD și MDA pot fi rescriși pentru a selecta un mod de operare normal și pentru a reactiva caracteristicile de protecție.

II.3.6. MEMORIA

Această secțiune descrie memoriile ROM, RAM și EEPROM. De asemenea este arătată alocarea memoriei pentru fiecare mod de operare, precum și descrierea registrului de mapare (INIT) a RAM-ului și spațiului I/O. Registrul INIT permite mutarea RAM-ului intern și a celor 64 de regiștri după necesitățile unei aplicații particulare.

II.3.6.1. Mapările (alocările) memoriei

În modurile de operare single-chip nu se se generează adrese externe. În modurile de operare extinse, locațiile memoriei sunt , în esență, aceleași ca în modurile single-chip; totuși, locațiile dintre ariile hașurate ( denumite EXT) sunt pentru memoria externă și spațiul I/O. Dacă o memorie externă sau o componentă I/O este alocată peste anumite resurse interne active, atunci resursele interne vor avea prioritate.

Alocările memoriei pentru fiecare mod de operare sunt prezentate în figura Fig. 2.5 .

Fig. 2.5 Mapările memoriei

Locațiile memoriei în modul special bootstrap sunt similare cu cele ale modului single-chip cu excepția că un program bootstrap este activat de la locația $BF40 până la $BFFF. Resetul și vectorii de întrerupere sunt adresați la $BFC0-$BFFF în timpul modului de operare special bootstrap. Aceste adrese ale vectorilor sunt cuprinse în 192 octeți de memorie utilizată pentru programul bootstrap.Alocarea memorie în modul de operare special test este la fel ca în modul multiplexat extins cu excepția că resetul și vectorii de întrerupere sunt localizați în memoria externă, la locațiile $BFCO-$BFFF.

II.3.6.2. Registrul de mapare a memoriei RAM și a spațiului I/O (INIT)

Există 64 de regiștri interni care sunt utilizați pentru a controla funcționarea microcontrolerului. Acești regiștri pot fi realocați în spațiul memoriei, utilizând registrul INIT. În Tabelul 2.4 se prezintă o listă completă a regiștrilor.

INIT este un registru special pe 8 biți care poate fi utilizat în timpul ințializării la schimbarea locațiilor standard ale memoriei RAM și regiștrilor de control în spațiul de memorie a microcontrolerului. Registrul INIT poate fi scris doar o dată în timpul primilor 64 cicli de ceas E, după reset, după care devine un registru care nu poate fi șters (read-only).

În mod normal, adresa de start a memoriei RAM interne este $0000, iar pentru cei 64 regiștri de control este $1000 (registrul INIT este setat cu $01 la reset). Cei mai semnificativi patru biți ai registrului INIT specifică adresa de start pentru cei 256 octeți ai memorie RAM, iar cei mai puțini semnificativi specifică adresa de start a celor 64 regiștri de control.

Tabel 2.4 Regiștrii de control (pag.1 din 2)

II.3.6.3. Memoria ROM

Memoria ROM internă ocupă cei mai superiori 8Kocteți ai spațiului de memorie ($E000-$FFFF). Această memorie este dezactivată atunci când bitul ROMON din registrul CONFIG este șters. Bitul ROMON este constituit dintr-o celulă EEPROM și este programat utilizând aceleași proceduri ca la programarea memoriei EEPROM interne.

De asemenea mai există 192 octeți de memorie ROM programată, boot ROM. Această memorie conține programul boot loader, program care controlează funcționarea microcontrolerului în modul de operare special bootstrap și este accesat în timpul reset-ului.

II.3.6.4. Memoria RAM

Cei 256 octeți de memorie RAM internă pot fi realocați în timpul ințializării prin scrierea registrului INIT. Poziția standard după reset este $0000-$00FF. Acest RAM este compus din celule statice (static RAM) și își menține conținutul în timpul modurilor WAIT și STOP.

II.3.6.5.Memoria EEPROM

Cei 512 octeți de memorie EEPROM sunt localizați de la $B600 la $B7FF și au aceiași cicli de citire ca și memoria ROM internă. Modul de scriere (programare) a memoriei EEPROM este controlat de registrul PPROG. EEPROM-ul este dezactivat atunci când bitul EEON din registrul CONFIG este zero.

II.4. MODURI DE ADRESARE ȘI SETUL DE INSTRUCȚIUNI

Această secțiune are scopul de a descrie regiștrii unității centrale de prelucrare (CPU), de a prezenta modurile de adresare precum și un rezumat al setul de instrucțiuni.

II.4.1. Regiștrii unității CPU

Pentru programatori sunt disponibili 7 regiștri care vor fi descriși în paragrafele următoare.

Fig. 2.6 Resurse de programare

II.4.1.1. Acumulatorii A și B

Acumulatorul A și acumulatorul B sunt regiștri de uz general pe 8 biți folosiți să memoreze operanzi și rezultate ale operațiilor aritmetice, sau în manipulări de date. Acești doi regiștrii pot fi compactați într-un singur acumulator pe 16 biți numit acumulatorul D.

II.4.1.2. Registrul de index X (IX)

Registrul pe 16 biți IX este folosit pentru modul de adresare indexat. Permite o indexare pe 16 biți care este adunată la un offset de 8 biți prevăzut în instrucțiune pentru a crea o adresă efectivă. Registrul IX poate fi de asemenea folosit ca numărător sau ca registru de memorare temporar.

II.4.1.3. Registrul de index Y (IY)

Registrul pe 16 biți IY este de asemenea folosit pentru modul de adresare indexat similar cu registrul IX; cu toate acestea, toate instrucțiunile care folosesc registrul IY cer un octet suplimentar în codul mașină și un ciclu mașină în plus la execuție.

II.4.1.4. Pointer-ul de stivă (Stack Pointer- SP)

Pointer-ul de stivă (SP) este un registru pe 16 biți care conține adresa următoarei locații libere din stivă. Stiva este configurată ca un registru ultimul intrat-primul ieșit (FIFO) citit/scris ceea ce permite ca date importante să fie memorate în timpul întreruperilor și apelurilor de subrutină. De fiecare dată când un octet este adăugat stivei (instrucțiune push), SP este decrementat; când un octet este mutat din stivă (instrucțiune pull), SP este incrementat.

II.4.1.5. Numărătorul program (Program Counter-PC)

Numărătorul de program este un registru pe 16 biți care conține adresele următoarei instrucțiuni care trebuie executată.

II.4.1.6. Registrul de condiții de cod (Cod Condidition Register- CCR)

Registrul de condiție de cod este un registru pe 8 biți în care fiecare bit dă relații despre rezultatul instrucțiunii executate. Acești biți pot fi testați individual de către program și acțiuni specifice pot fi începute în funcție de aceste rezultate ale testului. Fiecare bit de condiție de cod este explicat mai jos.

a. Transport/împrumut (Carry/Borrow- C)

Bitul C este setat dacă a existat transport sau împrumut în timpul ultimei operații aritmetice. Bitul C este de asemenea afectat în timpul operațiilor de deplasare și rotire.

b. Depășire (Overflow- V)

Bitul de depășire este setat dacă a rezultat depășire ca rezultat al unei operații aritmetice; altfel bitul V este șters.

c. Zero (Z)

Bitul zero este setat dacă rezultatul ultimei operații aritmetice, logice, sau operațiilor de manipulare a fost zero; altfel, bitul zero este șters.

d. Negativ (N)

Bitul negativ este setat dacă rezultatul ultimei operații aritmetice, logice, sau operații de manipulare a fost negativ; altfel bitul N este șters. Un rezultat se spune că este negativ dacă bitul cel mai semmnificativ este în unu.

e. Masca de întreruperi (I)

Bitul de întrerupere I este setat hardware sau de o instrucțiune program pentru a dezactiva (masca) toate sursele de întrerupere mascabile (atât interne cât și externe).

f. Transport la jumătate (H)

Bitul transport la jumătate este setat când apare transport între biții 3 și 4 ai unității aritmetice și logice în timpul unei instrucțiuni de tipul ADD, ABA sau ADC; altfel bitul H este șters.

g. Masca de întreruperi X (X)

Bitul mască de întreruperi X este setat numai hardware (sau confirmare ); și este șters doar prin instrucțiune program (TAP sau RTI).

h. Dezactivare STOP (S)

Bitul de dezactivare STOP este setat pentru a dezactiva instrucțiunea STOP, și este șters pentru a activa instrucțiunea STOP. Bitul S este controlat prin program. Instrucțiunea STOP este tratată ca instrucțiunea NOP, dacă bitul este setat.

II.4.2. MODURI DE ADRESARE

Se pot folosi șase moduri de adresare pentru a apela memoria; acestea includ: adresare imediată, directă, extinsă, indexată (cu oricare din cele două registre de adresare indexată pe 16 biți și un offset pe 8 biți), intrinsecă și relativă. Unele instrucțiuni cer un octet adițional înaintea opcode-ului pentru a pregăti zona de opcode multipagină; acest octet este numit prebyte.

Paragrafele următoare descriu fiecare mod de adresare plus o discuție despre prebyte. În aceste descrieri termenul de adresă efectivă este folosit să indice adresa din memorie unde argumentul este memorat sau de unde este extras, sau de la care începe o execuție.

II.4.2.1. Adresare imediată

În modul de adresare imediată, argumentul actual este conținut în octetul(octeții) care urmează imediat instrucțiunea, unde numărul de octeți trebuie să fie egal cu dimensiunea registrului. Acestea sunt instrucțiuni pe doi, trei, sau patru (dacă este cerut un prebyte) octeți.

II.4.2.2. Adresare directă

În modul de adresare directă (câteodată numit adresare zero-paginată), cel mai puțin semnificativ octet al operandului adresă este conținut într-un singur octet care urmează opcode-ul și cel mai semnificativ octet se presupune a fi $00. Adresarea directă permite utilizatorului să acceseze de la $0000 până la $00FF folosind instrucțiuni pe doi octeți și timpul de execuție este redus prin eliminarea accesului la memoria adițională. În marea majoritate a aplicațiilor, această zonă de 256 de octeți este rezervată pentru date accesate în mod frecvent. La MC68HC11A8 programul poate configura memoria astfel încât RAM-ul intern și/sau regiștrii interni, sau memoria externă să ocupe aceste adrese.

II.4.2.3. Adresarea extinsă

În modul de adresare extins, octeții doi și trei (ce urmează opcodul) conțin adresa absolută a operandului. În acest caz se folosesc instrucțiuni de trei sau patru (dacă este necesar prebyte) octeți: unul sau doi pentru opcode, și doi pentru adresa efectivă.

II.4.2.4. Adresare indexată

În modul de adresare indexat, unul din indicii de index (X sau Y) este folosit în calculul adresei efective. În acest caz, adresa efectivă este variabilă și depinde de doi factori: 1) conținutul curent al registrului de index (X sau Y) este folosit, și 2) offsetul fără semn pe 8 biți conținut în instrucțiune. Acest mod de adresare permite apelarea oricărei locații din spațiul de 64 Kocteți. Sunt folosite instrucțiuni pe doi sau trei (dacă este cerut prebyte) octeți, opcode plus offset pe 8 biți.

II.4.2.5. Adresare intrinsecă

În modul de adresare intrinsecă, toată informația este conținută în opcode. Operanzii (dacă există) sunt regiștrii, nefiind necesară accesarea memoriei. Instrucțiunile de acest tip sunt de obicei pe unu sau doi octeți.

II.4.2.6. Adresare relativă

Modul de adresare relativ este folosit pentru instrucțiunile de salt (ramificări ale programului). Dacă condiția de salt este adevărată atunci conținutul octetului cu semn ce urmează opcode-ul (offset-ul) este adăugat la conținutul numărătorului program (PC) pentru a forma adresa efectivă de salt; altfel, controlul este dat instrucțiunii următoare. Instrucțiunile ce folosesc adresarea relativă sunt de obicei pe doi octeți.

II.4.2.7. Prebyte

Pentru a extinde numărul instrucțiunilor utilizate de MC68HC11A8 a fost adăugată o instrucțiune prebyte. Instrucțiunile afectate sunt de obicei asociate cu registrul index Y. Opcode-urile care nu necesită un prebyte pot fi considerate ca “pagina” 1 din întregul lanț de opcode-uri. Opcode-urile rămase pot fi considerate ca “paginile” 2, 3 și 4 ale lanțului, un prebyte fiind solicitat; $18 pentru pagina 2, $1A pentru pagina 3 și $CD pentru pagina 4.

II.4.3. SETUL DE INSTRUCȚIUNI

Unitatea centrală de procesare (CPU) a microcontrolerului MC68HC11A8 este în estență o extensie a unității CPU a microprocesorului MC6801. În plus MC68HC11A8 are codul operațiilor (opcode) paginat și prezintă 91 de noi opcode-uri. Cele mai importante adaosuri includ un al doilea registru index (registrul Y), două tipuri de instrucțiuni de împărțire pe 16 biți, instrucțiuni STOP și WAIT și instrucțiuni de manipulare la nivel de bit.

După funcțiile pe care le îndeplinesc, instrucțiunile se pot împărți în mai multe grupuri. Astfel există instrucțiuni:

de lucru cu date

aritmetice

de înmulțire și împărțire

pentru operații logice

de testare a datei și de manipulare la nivel de bit

de deplasare și rotație

pentru registrul codurilor de condiții (CCR)

de ramificare

de salt

pentru apelări de subrutine și de revenire din subrutine

de lucru cu pointerul de stivă și regiștri index

de manipulare a întreruperilor

În Tabelul A (de la sfârșitul documentului) se găsesc toate instrucțiunile microcontrolerului MC68HC11A8, în toate modurile de adresare posibile. Pentru fiecare instrucțiune este arătată forma operandului precum și numărul total de octeți de cod mașină și timpul total de execuție, în cicli ai ceasului E al CPU.

Cap.III Interfațe seriale

III.1 Interfața de comunicație serială

III.1.1 Privire de ansamblu și trăsături

Este prevăzută o interfață serială sincronă full-duplex (SCI), cu standardul NRZ (un bit de start, opt sau nouă biți de date, un bit de stop) și o varietate de rate baud. Emițătorul și receptorul SCI funcționează independent, dar folosesc același format de date și rată de bit. ”Baud” și “rată de bit” vor fi folosite simultan în continuare.

III.1.1.1 Trăsăturile pe două fire ale SCI

format standard NRZ (semn/spațiu);

metodă avansată de detecție a erorilor incluzând detecție de zgomot

pentru zgomot cu durată mai mare de 1/16 timp de bit;

operare full-duplex;

programare soft pentru una din cele 32 rate baud diferite;

selectare soft a lungimii cuvântului (opt sau nouă biți);

biți separați de activare pentru emisie și recepție;

capacitate de întrerupere a transferului;

patru biți separați de activare disponibili pentru controlul întreruperilor.

III.1.1.2 Trăsăturile recepție SCI

funcție wake-up pentru recepție (idle sau bit de adrese);

detector pentru idle pe linie;

detecție de eroare în construcție;

detecție de zgomot;

detecție de depășire de funcționare (overrun);

flag de umplere a registrului de recepție.

III.1.1.3 Trăsăturile transmisiei SCI

flag de registru de transmisie gol;

flag de transmisie competată;

oprire de transmisie.

III.1.2 Formatul de date

Transmisia de date sau recepția de date sunt datele seriale care sunt transferate pe magistrala de date internă de la pinul de intrare a datelor (RxD), sau de la magistrala internă de datela pinul de transmitere a datelor (TxD).

Formatul no-return-to zero (NRZ) este ilustrat înb figura 3.1 și trebuie să întrunească următoarele criterii:

linia idle este adusă la starea 1 anterior transmisiei/recepției unui caracter;

un bit de start (zero logic) este folosit să indice startul unui cadru;

cel mai puțin semnificativ bit al datelor ese transmis și recepționat primul;

bit de stop (unu logic) este folosit pentru a indica sfârșitul unui cadru. Un cadru constă într-un bit de start, un caracter de opt sau nouă biți de date și un bit de stop;

o pauză este definită ca o transmisie sau recepție a unui low (zero logic) pe durata a cel puțin unui cadru complet.

*Bitul de control M selectează de asemenea datele pe 8 sau 9 biți

Fig. 3.1 Formatul de date

III.1.3 Formatul Wake-Up

Wake-up al receptorului permite reducerea aglomerării cu servicii a SCI în sistemele de recepție multiplă. Softul în fiecare receptor evaluează primul (primele) caractere ale fiecărui mesaj. Dacă mesajul este adresat altui receptor, SCI poate fi trecut în modul SLEEP (ADORMIT) asfel că restul mesajului nu va genera cerere pentru serviciu. De câte ori un mesaj este început, logica receptoarelor adormite le vor trezi astfel că ele pot evalua caracterul (caracterele) de început ale unui nou mesaj.

Un receptor SCI adormit poate fi configurat (folosind bitul de control WAKE registrul 1 de control al comunicațiilor seriale (SCCR1) pentru a se trezi folosind oricare din metodele: trezirea liniei idle, sau trezirea adresei marcate.

În trezirea liniei idle, un receptor adormit se trezește imediat ce linia RxD devine idle. Idle este definit ca un nivel permanent sus logic pe linia RxD pentru zece (sau unsprezece)timpi de bit. Sistemele care folosesc acest mod de trezire trebuie să permită cel puțin timp de caracter de idle între mesaje pentru a se trezi receptoarele adormite, dar să nu permitănici un timp de idle între caracterele din mesaj.

În trezirea aresei marcate, cel mai semnificativ bit (MSB) într-un caracter este folosit să indice dacă caracterul este un caracter de adresă (1) sau un caracter de dată (0). Receptoarele adormite se vor trezi de câte ori un caracter de adresă este recepționat. Sistemele folosind această metodă pentru trezire trebuie să seteze MSB primului caracter din fiiecare mesaj și să îl lase nesetat pentru toate toate celălalte caractere din mesaj. Perioadele de idlepot fi prezente în mesaje și timpi de idle nu sunt ceruți întremesaje pentru această metodă de trezire.

III.1.4 Recepția datelor (TxD)

Recepția datelor este reprezentată de de datele care sunt aplicateprin linia de intrare și interfața de comunicație serială magistralei interne. Circuitul de recepție permite primirea datelor cu o rată egală cu 16 ori rata baud și acest timp ne este referit ca rata RT.

Odată ce un bit valid de start este detectat, bitul de start, fiecare bit de date, și bitul de stop sunt eșantionați de trei ori la intervale RT 8RT, 9RT, 10RT, (1RT este poziția unde este așteptat ca bitul să înceapă), așa cum este arătat în figura 3.2.

Fig.3.2 Tehnica de eșantionare folosită la toți biții

III.1.5 Detecția bitului de start

Când RxD este detectat jos logic, este testat încă trei eșantiaone (referind începutul operioadei de eșantionare în figura 3.3). Dacă cel puțin două din cele trei verificări ale eșantioanelor sunt detectate ca zero logic, un bit de start valid a fost detectat, în alt caz linia este presupusă a fi idle. Un indicator de zgomot este setat dacă toate cele trei verificări nu sunt detectate zero logic. Un bit de start poate fi preluatcu indicatorul de zgomot setat.

Dacă a fost o eroare de încadrare fără detectare sau pauză (10 zero pentru un format de 8 biți sau 11 zero pentru un format de 9 biți), circuitul continuă să opereze ca și când acolo a fost efectiv un bit de stop și perioada de început va fi aplicată artificial. Ultimul bit recepționat în registrul de deplasare este convertit în unu logic, iar cei trei biți unu care sunt de start (arătați în figura 3.3) sunt forțați în registrul cu deplasare în intervalul de timp când detectarea bitului de start este anticipată (figura 3.4); cu toate acestea bitul de start nu va fi acceptat mai devreme decât este anticipat.

Fig.3.3 Exemplu de începere a eșantionării

Dacă receptorul detectează acest lucru pauza va produce o eroare de încadrare, bitul de start nu va fi inclus artificial și receptorul trebuie să detecteze efectivun unu logic înainte ca bitul de start să fie recunoscut. Vezi figura 3.5.

(a) Cazul 1, linie de recepție low în timpul unui front artificial

(b) Cazul 2, linie de recepție high în timpul unui front de start așteptat

Fig.3.4 Start artificial al SCI în urma unei erori de cadrare

Fig.3.5 Bit de start urmând unei pauze

III.1.6 Transmisia de date (TxD)

Transmisia de date este reprezentată de de datele seriale de la magistrala de date internă care sunt aplicate prin interfața de comunicație serială la liniile de ieșire. Emițătorul generează un timp de bit folosind derivata cesului RT, producând o rată de transmisie egală cu 1/16 din ceasul de eșantionare al receptorului.

III.1.7 Descrierea funcționării

O diagramă bloc este arătată în figura 3.6. Utilizatorul are biți de opțiuni în registrul 1 de control al comunicației seriale (SCCR1) pentru a determina metoda de trezire (bitul WAKE) și lungimea cuvântului de date (bitul M) al SCI. Registrul 2 de control al comunicației seriale (SCCR2) furnizează biți de control care individual activează/dezactivează emițătorul sau receptorul (TE sau RE respectiv), activează sistemul de întreruperi (TIE,TCIE, ILIE) și furnizează bitul care activează trezirea (RWU) și bitul transmitere a codului întreruptă (SBK). Biții registrul de rată baud (BAUD) permit utilizatorului să selecteze diferite rate baud care pot fi folosite ca rate de control pentru emițător și receptor.

Transmiterea de date este inițiată de o scriere în registrul de comunicație serială (SCDR). Emițătorul fiind activat, datele memorate în SCDR este transferat registrului cu deplasare de emisie. Tansferul de date setează bitul TRDE al registrului de stare (SCCR) al interfeței de comunicație serială și poate genera o întrerupere dacă întreruperea emisiei este activată. Transferul de date către registul cu deplasare de emisie este sincronizat cu ceasul de rată de bit. Toatele datele sunt transmise cu LSB primul. Până la completarea transmisiei, bitul de transmisie completă (TC) din SCSR este setat ( provided no pending data, preamble, or break is to be sent), și o întrerupere poate fi generată dacă întreruperea de transmisie completă este activată. Dacă emițătorul este activat, și datele, preambulul sau pauza (în registrul cu deplasare de emisie) au fost transmise, bitul TC va fi de ațsemenea setat. Acest lucru va genera de asemenea o întrerupere dacă bitul TCIE este setat. Dacă emițătorul este activat în timpull unei transmisii, acel caracter va fi completat înainte ca emițătorul să predea controlul pinului TxD.

Când SCDR este citit, va conține ultimul octet recepționat, dacă receptorul este activat. Bitul RDRF din SCSR este setat să indice dacă octetul de date a fost transferat de la registrul serial cu deplasare de intrare la SCDR, ceea ce poate cauza, de asemenea, o întrerupere dacă întreruperea de recepție este activată. Transferul de date de la registrul serial cu deplasare de intrare la SCDR este sincronizat de ceasul de rată de bit a receptorului. Biții de eroare OR(Over-Run), NF (zgomot), FE (cadrare) din SCSR pot fi setați dacă sunt detectate erori în recepție.

O întrerupere de linie idle este generată dacă întreruperea de idle este activată și bitul IDLE (care detectează linie idle în transmisie) din SCSR este setat. Acest lucru permite receptorului, care nu este în modul trezire, să detecteze sfârșitul unui mesaj, începutul unui mesaj nou, sau să se resincronizeze cu emițătorul. Un caracter valid trebuie să fie recepționat înainte de condițiile de linie idle, sau ca bitul IDLE nu este setat și întreruperea de linie idle nu este generată.

III.1.8 Regiștrii interfeței de comunicație serială

Sunt disponibili cinci regiștrii folosiți în comunicațiile prin interfața serială, iar operarea cu acești regiștrii este discutată în paragrafele următoare. Referirile se fac la diagrama bloc din figura 3.6.

III.1.7.1 Registrul de comunicație seriala (SCDR)

Acest registru de comunicație serială realizează două funcții: acționează ca un rregistru de recepție de date când este citit, și ca registru de transmisie de date când este scris. Figura 3.6 prezintă acest registru ca două registre separate, numite registrul receptor de date, și registrul d transmisie de date.

Fig.3.6 Diagrama bloc a interfeței de comunicație serială

III.1.7.2Registrul 1 de control a comunicației seriale (SCCR1)

R8 -Recepționat 8 biți de date

Dacă bitul M este setat, acest bit furnizeză o locație de memorare pentru al nouălea caracter la recepția caracterului de date.

T8- Transmis 8 biți de date

Dacă bitul M este setat, acest bit furnizeză o locație dfe memorare pentru al noălea bit în caracterul de date transmis. Nu este necesar să se scrie în acest bit pentru fiecare caracter transmis, ci doar atunci când sensul trebuie să fie de cael al caracterului precedent.

Bitul 5- neimplementat

Acest bit este întotdeauna zero.

M- lungimea caracterului interfeței de comunicație serială

0= 1 bit de start, 8 biți de date, 1 bit de stop;

1= 1 bit de start, 9 biți de date, 1 bit de stop

WAKE-metoda de trezire

0= linie idle;

1= adresă marcată

Biții 2-0- neimplementați

Acești biți sunt citiți întotdeauna zero.

III.1.7.3 Registrul 2 de control al comunicației seriale (SCCR2)

Registrul 2 de control al comunicațieie seriale (SCCR2) furnizeză biți de control care activează/dezactivează funcții individuale ale interfeței de comunicație serială.

TCIE- întreruperea de transmisie completă activată

0= întreruperea transmisie completă dezactivată

1= întreruperea interfeței de comunicație serială dacă TC=1

RIE- activare întrerupere de recepție

0= întrruperile RDRF și OR dzactivate;

1= 2ntrruperea SCI dacă RDRF și OR=1

ILIE- activare întrrupere linie idle

0= întreruperea idle dezactivată;

1= întreruperea SCI dacă IDLE=1

TE- transmisie activată

Când bitul de activare a transmisiei este setat, registrul cu deplasare de ieșire este aplicat liniei TxD. Depinzând de starea bitului de control M (SCCR1), un preambul de 10 (M=0) sau 11 (M=1) este transmis când programul setează bitul TE din starea șters. După ce s-a încărcat ultimul octet în registrul de comunicație serială și s-a recepționat flagul TDRE, utilizatorul poate șterge TE. Transmisia ultimului octet va fi atunci completată înainte ca emițătorul să predea controlul pinului TxD. Cât timp emițătorul este activ, bitul 1 al registrul de control a direcției de date pentru portul D este overridden și ieșirea este forțată să fie ieșire.

RE- activare recepție

Când bitul de activare a recepției este setat, receptorul este activat. Când RE este nesetat, receptorul este dezactivat și toți biții de stare asociați receptorului (RDRF, IDLE, OR, NF și FE) sunt inhibați. Cât timp receptorul este activat, bitul 0 al registrului de control a direcției de date pentru portul D este overridden și linia este forțată să fie intrare.

RWU- trezirea receptorului

Când bitul de trezire a receptorului de programul utilizatorului, adoarme receptorul și activează funcția de trezire. Dacă bitul de trezire este nesetat, RWU este șters de logica SCI după recepția 10 (M=0) sau 11 (M=1). Dacă bitul WAKE este setat, RWU este șters de logica SCI după recepția unui cuvânt de date al cărui MSB este setat.

SBK- trimite pauză

Dacă bitul de transmisie de pauză este toggled setat și resetat, emițătorul transmite 10 (M=0) sau 11 (M=1) zeros și apoi revine la idle sau transmitere de date. Dacă bitul SBK rămâne setat, emițătorul va continua să transmită blocuri întregi de zero (setați de 10 sau 11) până când este resetat. La completarea codului de pauză, emițătorul transmite cel puțin un bit 1 să garanteze recunoașterea unui bit valid de start. Dacă emițătorul este în gol și idle, setând și resetând SBK este ca și când s-ar înșira două caractere de pauză deoarece prima pauză transferă aproape imediat către registrul cu deplasare și al doilea este atunci înlănțuit bufferului emițătorului paralel.

III.1.3.4 Registrul de stare al comunicației seriale (SCSR)

Rewgistrul de stare al comunicației seriale (SCSR) furnizează intrări la întreruperile circuitelor logice pentru generarea sistemului de întreruperi al SCI.

TDRE- Registrul dfe transmitere de date gol

Bitul registru de transmitere de date gol este setat să indice că conținutul registrului serial cu deplasare de emisie a fost transferatregistrului serial cu deplasare. Acest bit este resetat citind SCSR (cu TDRE=1) urmat de o scriere în SCDR.

TC- transmisie completă

Bitul de transmisie completă este setat la sfârșitul unui cadru de date, început, sau condiții de pauză dacă:

1.- TE=1, TDRE=1, și date în așteptare , început, sau pauză trebuie să fie transmis; sau

2.- TE=0, și datele, începutul, sau pauza în registrului cu deplasare de emisie a fost transmis.

Bitul TC este un flag de stare care indică faptul că una din condițiile menționate este îndeplinită.

Bitul TC este șters prin citirea SCSR (cu TC setat) urmată de de o scriere în SCDR.

RDRF- Registru de recepție de date plin

Bitul registru de recepție de date plin este setat când registrul serial cu deplasare de recepție este transferat către SCDR. Bitul RDRF este resetat când SCSR este citit (cu RDRF setat) urmat de o citire a SCDR.

IDLE- Linie idle detectată

Bitul linie idle detectată, când este setat, indică faptul că receptorul a detectat linie idle. Bitul IDLE este resetat prinn citirea lui SCSR cu IDLE setat urmată de o citire a SCDR. Odată ce flagul de stare IDLE este resetat, nu va fi setat din nou până când linia RxD a fost activată și dvine idle din nou.

OR- overrun

Bitul ovverrun este setat când octetul următor este gata să fie transferat de la registrul cu deplasare de recepție la SCDR care este deja plin (bitul RDRF setat). Când survine o eroare depășire datele care cauzează overrun sunt pierdute și datele care deja existau în SCDR nu sunt afectate. OR este șters când SCSR este citit (cu OR setat), urmat de de o citire a SCDR.

NF- flagul de zgomot

Flagul de zgomot este setat dacă se detectează zgomot în oricare din biții recepționați, inclusiv biții de start și de stop. Bitul NF nu este setat până când RDRF este setat. Bitul NF este resetat când SCSR este citit (cu NF setat), urmat de de citire a SCDR.

FR- Eroare de cadrare (Frame error)

Bitul eroare de cadrare este setat când nu a fost detectat bit de stop în caracterul dfe date recepționat. Bitul FE este setat în același timp cu RDRF. Dacă octetul recepționat cauzează eraoare de cadrare și eroare de overrun, procesorul va recunoaște doar eroarea de overrun. Falgul de eroare de cadrare inhibă transferuri de date viitoare în SCDR până când nu este resetat. Bitul FE este rsetat xând SCSR este citi ( cu FE în 1) urmat de o citire a SCDR.

Bit 0- neimplementat

Acest bit este întotdeauna citit zero.

III.1.3.5 Registrul de rată baud (BAUD)

Registrul de rată baud selectează diferite rate baud care pot fi folosite ca rate de control pentru emițător și receptor. Biții SCPă0:1ș funcționează ca un prescalar pentru biții SCRă0:2ș. Împreună, acești cinci biți furnizează multiple combinații de rate baud pentru o frecvență dată a cristalului.

TCLR- Șterge numărător de rată baud (test)

Acest bit este folosit să șteargă lanțul de numărare a ratei baud în timpul testelor de uzină. TCLR este zero și nu poate fi setat cât timp operează modul normal.

SCP1 și SCP0- Prescalar de selecție a ratei baud a SCI

Ceasul E este pilotat de factorii indicați în tabelul 3.1. Această ieșire prescalată furnizeză o intrare la un divizor care este controlat de biții SCR2-SCR0.

Tabelul 3.1 Prima etapă de prescalare

SCR2, SCR1, SCR0- Selectoare de rate baud

Acești trei biți selectează ratele baud atât pentru emițător cât și pentru receptor. Prescalarul de ieșire descris mai sus este divizat mai departe așa cum este arătat în tabelul 3.2.

Tabelul 3.2 A doua etapă de prescalare

RCKB- Control ceas de rată baud a SCI (test)

Acest bit este folosit în timpul testelor de uzină pentru a activa Sau-Exclusiv al ceasului de recepție și a ceasului de emisie pentru a fi pilotat pinul de ieșire TxD. RCKB este zero și nu poate fi setat în operarea modului normal.

Diagrama indicată în figura 3.7 și datele furnizate de tabelul 3.3 și tabelul 3.4 arată lanțul de divizare folosit pentru a obține ceasul de rată baud. De notat că este o rată fixată de divizare cu 16 între cesul de recepție (RT) și ceasul de emisie (Tx). Lanțul de divizare actual este controlat de combinația biților SCPă1:0ș și SCRă2:0ș în registrul de artă baud așa cum s-a ilustrat.

Fig.3.7 Divizarea generatorului de rate

* Ceasul din coloana “cesul divizat cu” este cesul inttern al procesorului

Tabelul 3.3 Prescalarul de cea mai înaltă rată baud de ieșire

Notă: Frecvențele divizate în tabelul 3.3 reprezintă ratele baud cele mai mari pentru transmisie, (Tx), care pot fi obținute dintr-o frecvență a cristalului și folosind doar divizarea prescalară.

Tabelul 3.4 Rata baud de ieșire pentru un prescalar de ieșire dat

Notă:Tabelul 3.4 ilustrază cum biții de selecție ai SCI pot fi folosiți pentru a furniza rate baud de transmitere mici prin divizarea ulterioară a frecvenței prescalarului de ieșire. Cele cinci exemple sunt doar exemple reprezentative. În toate cazurile, ratele baud indicate, sunt rate de transmisie (ceasul de emisie), cesul de recepție fiind de 16 ori mai mare în frecvență decât rata baud actuală.

III.2 Interfață serială periferică (SPI)

III.2.1 Privire de ansamblu și caracteristici

Interfața serială periferică (SPI) este o interfață sincronizată care permite interconectarea a câteva microcontrolere sau a diferite tipuri de periferice. La o interfață serială periferică sunt cerute fire (semnale) separate pentru date și pentru ceas. În formatul SPI, ceasul nu este inclus în șirul de date și trebuie furnizat ca un semnal separat. Sistemul lui MC68HC11A8 poate fi configurat atât ca master (stăpân) cât și ca slave (sclav).

SPI are următoarele caracteristici:

transfer full-duplex sincronizat, pe trei fire;

operare master sau slave;

frecvență de bit maximă pentru master de 1,5 MHz;

frecveă de bit maximă pentru slave de 3 MHz;

patru rate d bit programabile;

flag de întrerupere pentru sfârșit de transmisie;

flag pentru protecție la coliziune;

protecție la modul master-master;

interfațare ușoară pentru module de expansiune simple (PLL-uri,

convertoare analog-numerice, drivere de display).

I11.2.2 Descrierea semnalor pentru SPI

Cele patru semnale de bazăale SPI (MISO, MOSI, SCH și ) sunt discuatate în paragrafele următoare. Fiecare semnal este descris atât pentru modul master, cât și pentru modul slave.

Fiecare linie de ieșire a SPI trebuie să aibe bitul corespunzător din registrul de direcționare setat. Dacă acest bit nu este setat, linia este deconectată de logica SPI și devine linie de intrare de interes general. Orice linie de intare a SPI este forțată să acționeze ca intrare indiferent de bitul corespunzător din registrul de direcționare de date.

III.2.2.1 Intrare master ieșire slave (MISO)

Linia MISO este configurată ca intrare pentru dispozitivul master și ca ieșire pentru dispozitivul slave. Este una din cele două linii care transferă seroal date într-o direcție, cu cel mai semnificativ bit transmis primul. Linia MISO a unui dispozitiv slave este plasată în starea de înaltă impedanță dacă dispozitivul slave nu este selectat.

III.2.2.2 Ieșire master intrare slave (MOSI)

Linia MOSI este configurată ca ieșire a unui dispozitiv master și ca intare pentru un dispozitiv slave. Este un adin cele două linii care transferă serial datele într-un sens., cu cel mai semnificativ bit transmis primul.

III.2.2.3Ceasul serial (SCK)

Ceasul serial este folosit să sincronizeze transferurile de date între dispozitivile de intrare și ieșire prin liniile MOSI și MISO. Dispozitivele master și slave sunt capabile să schimbe un octet de informații în timpul unei secvențe de 8 cicli de ceas. De când SCK este generat de dispozitivul master, acestă linie devine intrare pentru dispozitivul slave.

Așa cum este arătat în figura 3.8 sunt posibile patru relații de temporizare folosind biții de control CPOL și CPHA din registrul de control al serialei periferice (SPCR). Atât dispozitivul master cât și dispozitivul slave trebuie să opereze cu aceiași temporizare. Dispozitivul master plasează întotdeauna datele pe linia MOSI la jumătatea ciclului, înaintea frontulu cesului (SCK), astfel încât dispozitivul slave să rețină datele.

Doi biți (SPR0 și SPR1) din SPCR al dispozitivului master selectează rata de ceas. În dispozitivul slave biții SPR0 și SPR1 nu au nici un efect în operarea SPI.

III.2.2.4 Selecție slave ()

Linia de intrare de selecție de slave ()este folosită pentru a selecta un dispozitv slave. Aceasta trebuie să fie low înainte de a apare datele pe linie și terbuie să rămână low în timpul transferului de date. Linia la master trebuie să fie high. Dacă trece în low un flag de eroare (MODF) este setat în registrul de stare al serialei periferice (SPSR). Pinul poate fiselectat pentru a fi o ieșire de interes generalscriind 1 în bitul 5 al registrului de direcționare a datelor al portului D, acesta dezactivând circuitul moduluilui greșală. Celelalte trei linii SPI sunt dedicate SPI când acesta este activat.

Când CPHA=0 ceasul de deplasare este OR al cu SCK. În această fază de lucru trebuie să treacă în high între caractere succesive ale unui mesaj SPI. Când CPHA=1, trebuie lăsat low pentru câteva caractere SPI. În cazul în care nu avem decât un microcontroler slave linia poate fi legată la VSS cât timp modul CPH=1 al ceasului este folosit.

Fig.3.8 Diagrama de temporizare a datelor

III.2.3 Descriere funcțională

Figura 3.9 arată diagrama bloc a circuitului de interfață serială periferică.. Când un dispozitiv master transmite date prin linia MOSI, dipozitivul slave răspunde trimițând date dispozitivului master prin linia MISO. Acest lucru înseamnă transmisie full-duplex atât cu datele de intrare cât și cu cele de ieșire sincronizate cu același semnal de ceas. Astfel, octetul transmis este înlocuit de octetul recepționatși elimină necesitatea pentru biți de stare pentru transmitere goală și receptor plin. Un singur bit de stare (SPIF) este folosit pentru a semnala că operația de intrare/ieșire (I/O) a fost completată.

SPI este bufferat de două ori la citire, dar nu și la scriere. Dacă o scriere este realizată în timpulunui transfer de date,transferul se realizeză neântrerupt, iar scrierea nu va fi făcută cu succes. Această condiție va cauza conflict de scriere (WCOL), iar bitul de stare din SPSR va fi setat. După ce un octet de date este deplasat, flagul SPIF este setat.

Fig.3.9 Diagrama bloc a interfeței seriale periferice

În modul master, pinul SCK este ieșire. Acesta rămâne high sau low, depinzând de de bitul CPOL din SPCR, până când datele sunt scrise înregistrul cu deplasare, moment în care sunt generate opt pulsuri de ceas pentru a deplasa cei opt biți de date și care SCK trece idle din nou.

În modul slave, logica de start a dispozitivul slave recepționează un low logic la pinul și ceasul la pinul SCK. Astfel, dispozitivul slave este sincronizat cu dispozitivul master. Datele de la dispozitivul master sunt recepționate serial pe MOSIși încărcate în registrul cu deplasare pe 8 biți. După ce registrul cu deolasare este încărcat, datele sunt transferate paralel bufferului de citire. În timpul unui ciclu de scriere, datele sunt scrise într-un registru cu deplasare, și atunci dispozitivul slave așteaptă un tren de semnale de ceas de la dispozitivul master pentru a deplasa datele la ieșirea liniei MISO a dispozitivului slave.

Fiugura 3.10 ilustrază MOSI, MISO, SCK și interconexiunile master-slave.

Datorită registrului de control a ieșirilor SPI și a bitului DWOM, sistemul SPI poate fi fi configurat în mai multe moduri de funcționare. Sisteme cu o singură cale bidirecțională ca și cum căile separate MISO și MOSI ar fi unite. De când dispozitivele slave ale lui MC68HC11 pot dezactiva ieșirile lor MISO. transmiterea unui mesaj de protocol este de asemenea posibil.

Fig.3.9 Conectarea master-slave a serialei periferice

III.2.4 Regiștrii SPI

Sunt trei regiștri în interfața serială periferică care furnizează funcțiile de control, de stare, și memorare a datelor. Acești regiștri sunt registrul de control al serialei periferice (SPCR), registrul de stare al serialei periferice (SPSR) și registrul de date de intrare/ieșire a serialei periferice (SPDR), și sunt descrise în paragrafele următoare.

III.2.4.1 Registrul de control al serialei periferice (SPCR)

SPIE- Activarea întreruperii serialei periferice

0= dezactivarea întreruperii SPIF;

1= întreruperea SPI dacă SPIF=1

SPE- Activarea sistemului serialperiferic

0= sistemui SPI este oprit;

1= sistemul SPI este pornit

DWOM- Opțiunea circuitului SAU al portului D

DWOM afectează toți cei șase pini la un loc ai portului D

0= ieșirile portului D sunt ieșiri normale CMOS;

1= ieșirile portului D acționează ca ieșiri drena în gol

MSTR- Selecția modului master

0= modul slave;

1= modul master

CPOL- Polaritatea ceasului

Când bitul poalritatea ceasului este resetat și datele nu sunt transferate, o stare stabilă low este produsă la pinul SCK al dispozitivului master. Invers, dacă bitul este setat, pinul SCK va fi idle high. Acest bit este de asemenea folosit împreună cu bitul de control a fazeiceasului pentru a prduce relația date-ceas dorită, ntre master și slave.

CPHA- Faza ceasului

Bitul faza ceasului, împreună cu bitul CPOL, controlează relația dintre dispozitivul master și cel slave. Bitul CPOL poate fi imaginat ca un inversor înseriat cu linia SCK. Bitul CPHA selectează unul din cele două protocoale de temporizare fundamental diferite. Când CPHA=0, ceasul de deplasare este OR al lui SCK cu . Cum trece în low transferul începe și primul front al SCK determină primul eșantion al datelor. Când CPHA=1, pinul poate fi imaginat ca un control de cativare a ieșirii. Referirile se fac la figura X.X.

SPR1 și SPR0- Selector al ratei ceasului SPI

Acești biți de selecție a ratei serialei periferice, selectează una din cele patru rate baud (Tabelul 3.5) pentru a fi folosiți ca SCK dacă dispozitivul este master; cu toate acestea ei nu au efect în modul slave.

Tabelul 3.5 Selecția ratelor serialei periferice

III.2.4.2 Registrul de stare al serialei periferice (SPSR)

SPIF- Flag de transfer complet

Flagul de transfer de date complet este setat la completarea transferului de date între procesor și dispozitivul extern. Dacă SPIF trece în high, și SPIE este setat, o întrerupere de serială periferică este generat. Resetarea bitul SPIF este însoțită de citirea lui SPSR (cu SPIF setst) urmată de un acces al SPDR. Numai dacă SPSR este citit mai întâi (cu SPIF setat), încercarea de scriere în SPDR este inhibată.

WCOL- Conflict de scriere

Bitul conflict de scriere este setat la încercarea de scriere în registrul de date al serialei periferice când un transfer este în curs. Dacă CPHA este zero un transher se spune că începe când trece în low și transferul se termină când trece în high după opt cicli de ceas ai SCK. Când CPHA este unu se spune că un transfer începe prima dată când SCK devine activ cât timp este low și transferul se termină când flagul SPIF este setat. Resetarea bitul WCOL este însoțită de citirea lui SPSR (cu WCOL setat) urmată de un acces la SPDR.

Biul 5- neimplementat

Acest bit este citit întotdeauna ca zero.

MODF- Modul conflict

Flagul mod conflict indică că este posibil să fie un conflict multi-master pentru sistemul de control și să permită o ieșire potrivită a sistemului de operare către reset sau stare de sistem lipsă. Bitul MODF este în mod normal nesetat, și este setat doar când un dispozitiv master a trecut pinul în low. Setarea bitului MODF afectează sistemul interfeței seriale periferice interne în felurile următoare:

O întrerupere SPI este generată dacă SPIE=1;

Bitul SPE este resetat. Aceasta va dezactiva SPI;

Bitul MSTRB este resetat, astfel fortând dispozitivul în modul slave;

Biții DDRD pentru cei patru pini ai SPI sunt forțați în zero

Resetarea bitului MODF este însoțită de o citire a SPSR (cu MODF setat), urmată de o scriere în SPCR. Biții de control SPE și MSTR pot fi refăcuți de programul utilizatorului după ce bitul MODF a fost resetat. Este de asemenea necesar să se refacă DDRD după modul conflict.

Biții 3-0- Neimplementați

Acești biți sunt citiți întotdeauna zero.

III.2.4.3 Registrul de date de intrare/ieșire al serialei periferice (SPDR)

Registrul de date de intrare/ieșire al serialei periferice este folosit pentru transmiterea și recepția datelor pe magistrala serială. Doar o scriere în acest registru va iniția o transmisie/recepție a altui octet, și acest lucru se întâmplă doar în dispozitivul master. La completarea transmisiei unui octet de date, bitul de stare SPIF este setat atât de dispozitivul master cât și de cel slave.

Când utilizatorul citește registrul de date de intrare/ieșire al serialei periferice, de fapt un buffer este citit atunci. Primul SPIf trebuie resetat înainte ca un al doilea transfer de date de la registrul cu deplasare către bufferul de citire este început sau condiția de overrun va exista. În cazul unui overrun, octetul care a generat overrun este perdut.

O scriere în registrul de date de intare/ieșire al serialei periferice nu este bufferată și plasează datele direct în registrul cu deplasare pentru transmitere.

Cap. IV Convertorul analog-digital

MC68HC11A8 include un convertor analog-numeric cu aproximare succesivă, de intrare, pe 8 canale, cu eșantionare și memorare, pentru a minimiza erorile de conversie cauzate de schimbările rapide ale semnalului de intrare. Două liniii dedicate (VRL,VRH) sunt folosite ca intrări de tensiune de referință. Acești pini pot fi conectați la o sursă de alimentare separată sau izolată pentru a asigura o deplină acuratețe a conversiei. Convertorul analog-numeric pe 8 biți are o eroare totală de 1 LSB, care include eroarea de cuantizare de ½ LSB, și acceptă intrări analogice în domeniul de la VRL la VRH. Domenii de intrare mai mici se pot obține ajustând VRL și VRH la valorile mari și mici dorite. Conversia este specificată și testată pentru VRL=0V și VRH=5V +/- 10%; cu toate acestea, încercări de laborator pe toată plaja de valori indică o mică sau nici o degradare cu VRH-VRL aproximativ 2,5 la 3V. Sistemul analog-numeric poate fi operațional cu VRL sub VDD și/sau VRH peste VSS atâta timp cât VRH este peste VRL cu destul ca să suporte conversii (2,5 la 5,0V). Aceste tensiuni sunt aplicate la pinul 51, VRL, și pinul 52, VRH. Firma recomandă ca acești pini să fie conectați la VDD și VSS prin intermediul unor filtre trece jos. Fiecare conversie este realizată în 32 de cicli de ceas ai portului E al microcontrolerului, atunci când rata ceasului extern este mai mare de 750 kHz. Pentru sisteme care operează la rate ale ceasului sub 750 kHz, un oscilator intern R-C trebuie folosit pentru a temporiza sistemul analog-numeric. Oscilatorul intern R-C este selectat setând bitul CSEL din registrul OPTION.

Portul E este un port de intrare de 8 biți și poate fi folosit în scopuri generale ca linii de intrare pentru nivele logice și/sau pentru semnale analogice. Acest port a fost proiectat pentru a putea fi folosit ca intrare digitală, sau ca intrare analogică, sau pentru a fi folosit o parte pentru intrări numerice și restul pentru intrări analogice.În cazul nostru, portul E va fi folosit ca intrare analogică pentru convertorul analog-numeric.

V.1 Procesul de conversie

Convertorul A/D este proporțional. O tensiune de intrare egală cu VRL se convertește la $00 și o tensiune de intrare egală cu VRH este convertită la $FF (maxim de scală, fără semnalizare a depășirii). Pentru conversii proporționale, sursa fiecărei intrări analogice trebuie să folosească VRH ca tensiune de alimentare și să fie referită la VRL.

Figura următoare prezintă detaliat secvența pentru un set de patru conversii. Această secvență începe un ciclu de ceas extern după o scriere în registrul de control/stare a lui A/D (ADCTL).

Figura 5.1 Secvență de conversie analog-numerică

Figura 5.2 pre zintă un model de port al canalelor de intrare A/D. Aest model este folositor pentru a înțelege efectele circuitelor externe asupra acurateții conversiei A/D.

* Acest comutator analogic este închis doar pe periada de 12 cicli de eșantionare

Fig.5.2 Modelul de intrare al unui pin A-N

V.2 Asignarea canalelor

Un multiplexor permite unui singur convertor A/D să selecteze unul din cele șaisprezece semnale analogice. Opt din aceste canale corespund liniilor de intrare ale portului E, iar patru vor fi rezervate pentru foilosiri ulterioare.

V.3 Operație pe un singur canal

Sunt posibile două variante de operații pe un singur canal. În prima variantă (SCAN=0 ), semnalul de pe canalul selectat este convertit de patru ori consecutiv cu primul rezultat memorat în registrul 1 de rezultat A./D (ADR1) și al patrulea rezultat memorat în registrul 4. După ce a patra conversie a fost realizată, toate activitățile de conversie sunt oprite până când o nouă comandă de conversie este scrisă în registrul ADCTL. În a doua variantă (SCAN=1), conversiile continuă, pe canalul selectat, cu a cincea conversie memorată în registrul ADR1 (scriind peste rezultatul primei conversii), a șasea scrisă peste ADR2, și așa mai departe.

V.4Operație multicanal

Și aici sunt două variante de operații multicanal. În prima variantă (SCAN=0), grupul de patru canale selectat este convertit, o singură dată fiecare, cu primul rezultat memorat în registrul ADR1 și al patrulea rezultat memorat în registrul ADR4. După ce a patra conversie a fost făcută, toate activitățile de conversie sunt oprite pâna când o nouă comandă de conversie este scrisă în registrul ADCTL. În a doua variantă (SCAN=1), conversia grupului de patru canale continuă să fie realizată cu a cincea conversie memorată în registrul ADR1 (înlocuind rezultatul conversiei anterioare pentru primul canal din grup), a șasea conversie rescriind ADR2, și așa mai departe.

V.5 Operarea în modurile STOP și WAIT

Dacă o secvență de conversie este încă în desfășurare când modul de STOP sau WAIT este de asemenea apelat, conversia canalului curent este suspendată. Când microprocesorul reîncepe operarea normală, canalul va fi eșantionat din nou și secvența de conversie va continua. Când microprocesorul iese din modul WAIT, circuitul A/N este stabil și rezultate valide pot fi obținute la prima conversie. Totuși, în modul STOP, toți curenții bias analogici sunt dezactivați și este necesar să se permită o perioadă de stabilizare când se părăsește acest modul. Dacă modul STOP există cu o întârziere, atunci va fi suficient timp pentru circuite să se stabilizeze înainte de prima conversie. Dacă modul STOP este fără întârziere (bitul DLY în registrul OBTION este zero), atunci trebuie să se lase suficient timp pentru ca circuitele de conversie A/N să se stabilizeze pentru a se evita rezultate invalide.

V.6 Registrul de control/stare A/N (ADCTL)

Toții biții acestui registru pot fi citiți sau scriși, cu excepția bitul 7 care este un bit care poate fi doar citit, și a bitului 6 care este citit întotdeauna ca zero. Acest registru arată astfel:

CCF-Conversion Complete Flag (flag de conversie terminată) este un indicator care se poate citi doar și este setat când toate cele patru registre de rezultat conțin rezultate valide ale conversiei. De câte ori registrul ADCTL este scris, acest bit este automat setat în zero și o secvență de conversie este începută. În modul continuu, conversia se face în continuare și regiștrii de rezultate continuă să fie actualizați cu datele curente chiar și atunci când bitul CCF rămâne setat.

Notă: Utilzatorul trebuie să scrie în registrul ADCTL pentru a începe conversia. Pentru a abandona conversia care se execută, se scrie în registrul ADCTL și o nouă conversie va începe imediat.

Bit 6- este neimplementat. Acest bit este tot timpul zero.

SCAN- Continuous Scan Control. Când acest bit este zero, cele patru conversii cerute sunt realizate odată pentru a încăpea în cei patru regiștri de rezultate. Când acest bit este setat, conversia continuă în mod continuu cu regiștrii de date fiind actualizați de cum datele sunt disponibile.

MULT- Multiple-Chanel/Single Chanel Control. Când acest bit este zero, sistemul A/N este configurat să realizeze patru conversii consecutive a unui singur canal specificat prin intermediul biților de selecție de canal CD până la CA (biții 3..0 din registrul ADCTL). Când acest bit este setat, sistemul A/N este configurat să realizeze conversie a fiecărui canal din cele patru unde fiecare registru rezultat corespunde unui canal.

Atenție: Când modul continuu canal multiplu este folosit, o atenție deosebită trebuie avută la proiectarea circuitelor de intrare A/N.

CD- Canal D selectat

CD- Canal C selectat

CB- Canal B selectat

CA- Canal A selectat

Acești patru biți sunt folosiți pentru a selecta unul din cele 16 canale A/N (conform tabelei). Când modul canal multiplu este selectat (MULT=1), biții de selecție cei mai puțin semnificativi (CA și CB) nu au nici o semnificație, iar biții CD și CA arată care grup de patru canale este selectatpentru a fi convertit. Canalele selectate de cei patru biți de control sunt arătate în tabelul următor:

Tabelul de asignare a canalelor convertorului anlog-numeric

Regiștrii de rezultat 1, 2, 3 și 4 al conversiei A/N (ADR1, ADR2, ADR3 și ADR4)

Regiștrii de rezultat suntregiștrii doar de citire folosiți pentru a ține rezultatul conversiei pe 8 biți. Scrierea în acești regiștri nu are efect. Datele din aceste registre sunt valide când bitul CCF din registrul ADCTL este setat, indicând că secvența de conversie s-a încheiat.

V.7 Alimentarea circuitului A/N și selecția ceasului

Alimentarea circuitului A/N este controlată de bitul 7 (ADPU) al registrului OPTION. Când ADPU este resetat, alimentarea sistemului A/N este dezactivată. O întârziere de aproximativ 100 microsecunde este necesară după ce s-a pornit convertorul A/N , pentru a permite tensiunilor bias să se stabilizeze.

Selectarea ceasului este controlată de bitul 6 (CSEL) al registrului OPTION. Când CSEL este resetat, sistemul A/N folosește ceasul portiului E. Când CSEL este setat, sistemul A/N folosește o sursă de ceas internă, R-C, care funcționează la aproximativ 1,5 MHz. Ceasul E al microcontrolerului nu este potrivit să conducă sistemul A/N dacă operează sub 750MHz, caz în care ceasul intern R-C trebuie selectat. O întârziere de 10ms este cerută după schimbarea lui CSEL din zero în 1 pentru a permite oscilatorului R-C să pornească și tensiunii bias interne să se stabilizeze. De notat că bitul de control CSEL activează de asemenea un oscilator care controlează încărcarea pompei EEPROM-ului.

Când sistemul A/N folosește ceasul E al microcontrolerului, toate comutările și operațiile de comparare sunt sincronizate cu ceasul microcontrolerului. Acest lucru permite comparatoarelor să să fie menținute în același timp pentru a minimiza eroarea. Oscilatorul R-C intern este nesincronizat cu ceasul microcontrolerului deci zgomotul va afecta mai mult rezultatul conversiei A/N atunci când CSEL=1.

V.8 Limitarea curentului de intrare A/N

Dacă pinii portului E sunt folosiți ca intrări de semnale analogice, trebuie luate câteva măsuri de prevedere pentru ca intrările convertorului A/N să fie afectate iremediabil. Un model de inteare A/N este dată în figura 5.3.

Fig.5.3 Model de protec\ie a intr[rii

Modelul arată un dispozitiv de protecție echivalent cu o diodă zener, și deci când intrarea analogică depășește valoarea de prag, dioda conduce în avalanșă. Dacă acest lucru se întâmplă, curentul de intrare trebuie limitat de un circuit extern. Fără circuit extern de protecție intrările A/N pot fi de asemenea compromise aplicând o tensiune naegativă mai ales de la o sursă de joasă impedanță. Ca în exemplu, dacă o tensiune de -1V este alpicată de la o sursă de tensiune de joasă impedanță, dioda va conduce în sens invers, iar aici nu avem o rrezistență de limitare a curentului; de aici intrarea poate fi foarte ușor distrusă.

De aceea fabricantul recomandă limita de 25mA pentru curentul de intrare, ca o măsură de prevedere.

Cap.V ROBOTUL Rug Warrior Pro™

“Rug Warrior Pro” este un mic robot autonom proiectat pentru a fi folosit în laboratoare al universităților, în centre de cercetare etc.

Robotul este oferit sub formă de kit în trei forme:

“Brains Kit” – conține placa de bază și toți senzorii și componentele electronice necesare

“Brawn Kit” – motoarele și componentele mecanice

“Expanded Kit” – este format din cele două kit-uri de mai sus.

Suplimentar este oferit mediul de programare Interactive C.

Pentru prezentul proiect am beneficiat de un kit complet, asamblat parțial (doar circuitele logice principale, memoria și componentele de interfață sunt instalate din fabrică). Senzorii și circuitele auxiliare au fost montate separat urmând instrucțiunile din ghidul de asamblare ce a însoțit kit-ul.

V.1. SUBSISTEME

Robotul Rug Warrior ProTM este compus din câteva subsisteme funcționale. Schema bloc (Fig. 5.1) arată cum sunt conectate aceste părți.

Fig. 5.1 Schema bloc a robotului Rug Warrior ProTM

Fiecare sistem este descris pe scurt în continuare.

V.1.1. Controler

Este inima logică a robotului Rug Warrior ProTM. Controlerul execută programul utilizatorului, realizează operații temporale și conversii analog-numerice.

V.1.2. Bus

Este o magistrală de adrese/date care permite controlerului să trasmită informație spre/de la memoria externă sau periferice.

V.1.3. Memoria externă

reprezintă spațiul unde sunt memorate sistemul de operare și programele. Un circuit de alimentare de rezervă protejează conținutul memoriei atunci când alimentarea este oprită.

V.1.4. Circuit de expansiune

Oferă posibilitatea conectării la magistrala controlerului a unor module de expansiune. Prin aceasta este posibilă citirea unor date de la sisteme periferice sau trimiterea de date spre acestea. Acest circuit face posibilă mărirea numărului de senzori și module de conducere.

V.1.5. Interfață serială

Permite comunicația cu un calculator.

V.1.6. Afișaj cu cristale lichide(LCD)

Afișează în timp real informații pentru utilizator.

V.1.7. Alimentarea

Include bateriile, stabilizatorul de tensiune și un circuit de alimentare de rezervă pentru memoria externă.

V.1.8. Senzor de ciocnire

Permite robotului Rug Warrior ProTM să rezolve coliziunile cu obstacole prin modificarea direcției de deplasare.

V.1.9. Senzori de lumină

Sunt doi senzori care măsoară intensitatea luminoasă în spațiul unde se află robotul.

V.1.10. Detector de obstacole în infraroșu(IR)

Este un sistem de detecție a obstacolelor care utilizează două emițătoare în infraroșu și un detector în infraroșu.

V.1.11. Detector de sunet

Este compus dintr-un microfon și un circuit de amplificare permițând robotului să monitorizeze sunete.

V.1.12. Sonerie piezo

Acest dispozitiv de ieșire permite robotului să producă tonuri într-o gamă largă de frecvențe.

V.1.13. Codificatoare poziție ax(shaft encoders)

Îi spun robotului cât de mult se rotește fiecare roată. Aceasta face posibilă menținerea robotului pe o direcție prestabilită.

V.1.14. Driver pentru motoare

Preia semnalele de nivel logic produse de controler și le amplifică pentru a produce curenți mai mari necesari motoarelor.

V.1.15. Motoare

Cu ajutorul lor se deplasează robotul.

V.2. FUNCȚIONAREA SISTEMULUI

Aspectele cheie ale modulelor sunt explicate în continuare. Denumirile semnalelor, de exemplu BAT-UNREG, sunt indentificate în scheme.

V.2.1. Sistemul de alimentare (Fig. 5.2)

Fig. 5.2 Sistemul de alimentare

Tensiunea de la baterii, BUT-UNREG, ocupă două extremități ale comutatorului 4P3T (SW2). Aceasta conectare este realizată pentru a asigura curentul maxim specificat pentru comutator. Tensiunea BUT-UNREG este folosită pentru alimentarea motoarelor.

Tensiunea BUT-REG reprezintă alimentarea pentru partea logică. Această tensiune trece în 0V doar atunci când bateriile sunt deconectate de la placă.

Jumperul J8 (împreună cu conectorul opțional J7) face posibilă utilizarea unor surse de alimentare separate: una pentru motoare, alta pentru partea logică.

V.2.2. Comunicarea serială (Fig. 5.3)

Fig. 5.3 Circuitul conexiunii seriale

Intrarea interfeței seriale RS-232 este în mod normal în “high” și trece în “low” pentru a indica un bit 1. LED-ul de stare pentru interfața serială, LED3, este conectat prin intermediul unui buffer inversor al circuitului U4 astfel încât el este normal stins, dar se aprinde atunci când PC-ul la care este legat montajul transmite pe serială un bit 1.

Semnalul, PA4, care controlează soneria piezo este dirijat printr-un altfel de canal neutilizat al convertorului serial. Acesta schimbă ieșirea de la 05V la -1010V făcând astfel ca soneria piezo să fie mai puternică. (Tensiunea nu trebuie să depășescă specificațiile pentru sonerie).

Jumperul J1 permite utilizatorului să limiteze nivelul semnalului pentru soneria piezo. Jumperul J14 permite deconectarea sau conectarea soneriei.

V.2.3. Resetul (Fig. 5.4)

Fig. 5.4 Circuitul RESET-ului

Când semnalul de RESET, /RESET, are nivel scăzut determină controlerul să nu funcționeze; acest lucru este necesar în timpul pornirii și opririi. Când nivelul semnalul de reset revine la un nivel înalt controlerul se reinițializează și începe execuția codului sistem. Utilizatorul poate comanda resetul controlerului apăsând pe butonul de RESET (SW1). Cipul LVI, U11, inițiază o condiție de reset atunci când sesizează că tensiunea bateriilor este prea scăzută. De asemenea, dacă oscilatorul nu funcționează, controlerul va aduce semnalul de reset la un nivel scăzut. (Placa nu este funcțională în acest caz.) Neluând în seamă sursa, LED-ul Bat Low, LED2, va clipi și controlerul nu va executa nici un cod în timpul condiției de reset.

V.2.4. Microcontrolerul (Fig. 5.5)

Fig. 5.5 Microcontrolerul și pinii săi

Jumperul de selectare a modului de lucru, J3, îi permite utilizatorului să folosească microcontrolerul în oricare din modurile de lucru: ”special bootstrap” și extins sau ”special boostrap” și ”special test”. (Detalii despre aceste moduri se găsesc în descrierea microcontrolerului.) Robotul Rug Warrior ProTM folosește una din caracteristicile modului ”special test” (setare normală) pentru a controla afișajul cu cristale lichide. Utilizatorii care aleg să schimbe poziția jumperului J3 trebuie să știe că prin aceasta afișajul LCD nu va putea fi folosit.

V.2.5. Circuitul IR (Fig. 5.6)

Jumperul J12, OSC out, pemite un reglaj pentru oscilatorul de 38KHz. Această ieșire trebuie conectată doar la o intrare de impedanță foarte mare.

Detectorul infraroșu (Fig. 5.6 (a)) – este proiectat să răspundă unei raze IR (infraroșu).

(a) Detector IR

(b) Circuit de emisie IR

Fig. 5.6 Circuitul IR

Ieșirea detectorului, în mod normal în stare high, trece în starea low câteva cicluri după ce a fost expusă unei surse IR de suficientă intensitate, modulată cu aproximativ 38KHz. Ieșirea revine în starea high câteva cicluri după încetarea expunerii.

Circuitul de emisie (Fig. 5.6 (b)) este compus din două LED-uri în infraroșu (IR LED) și un oscilator trigger-Schmitt a cărui frecvență poate fi ajustată. IR LED-urile fac parte dintr-un circuit care efectiv este un AND logic. Când un semnal de control, PD2 sau PD3, de la microprocesor este în starea high, IR LED-ul asociat se aprinde și se stinge cu o frecvență dată de oscilator. Când semnalul de control este în starea low, IR LED-ul este întotdeauna stins.

Programul de testare face următoarele. Mai întâi, cu ambele emițătoare oprite, valoarea ieșirii detectorului IR este eșantionată și memorată. După aceea emițătorul IR din stânga este pornit în timp ce emițătorul IR din dreapta rămâne oprit. Prin program se lasă detectorului un timp de o milisecundă pentru a răspunde, după care valoarea de la ieșirea detectorului IR este eșantionată și memorată. În final, emițătorul din stânga este oprit și cel din dreapta este pornit. Ca și în cazul precedent, după o întârziere de o milisecundă ieșirea detectorului IR este eșantionată și memorată. Programul folosește aceste trei valori pentru a hotărî dacă a fost detectată o reflexie.

Deoarece detectorul IR poate răspunde uneori la zgomote ale mediului (luminile fluorecente sunt acuzate frecvent), programul trebuie să fie sigur că emițătorul propiu este sursa semnalului detectat. Acest lucru se face prin verificarea ieșirii detectorului IR atunci când emițătoarele sunt oprite (prima valoare memorată) caz în care detectorul nu trebuie să raporteze prezența unei raze IR, dar această prezență trebuie să existe în cazul în care un emițător este pornit. Doar când ambele condiții sunt valabile rutina de detectie IR declară prezența unui obstacol.

V.2.6. Circuitul de detecție a ciocnirilor

Cel mai primitiv senzor, dar foarte util, este un dispozitiv cu contact. Astfel de dispozitive le-am denumit bumperi (din engleză) și ele sunt de fapt contacte normal deschise montate pe robot și care, atunci când robotul se lovește de un obstacol, se închid. Prin această metodă robotul poate detecta facă s-a produs o ciocnire cu un obiect. În cazul robotului Rug Warrior Pro se folosesc trei astfel de contacte.

Cei trei bumperi (contacte)prezentați în figura Fig. 5.7 b) sunt conectați la o singură intrare analogică a procesorului (un canal al convertorului analog-numeric) prin intermediul unei rețele de rezistențe (Fig 5.7 a)). Bazându-se pe pe valoarea rezultatului conversiei analog-numerice, microcontrolerul decide care dintre contacte sau combinații ale acestora au fost închise.

(a) Rețeaua de rezistențe

(b) Conexiunile bumperilor

Fig. 5.7 Sistemul de contacte

V.2.7. Sistemul traductoarelor de poziție-ax (shaft encoders)

Acest sistem folosește senzori de reflexie în infraroșu, care sunt mici dispozitive dreptunghiulare ce conțin un fototranzistor (sensibil la lumină în infraroșu) și un emițător în infraroșu. Cantitatea de lumină provenită de la emițător și reflectată spre fototranzistor prin intermediul unei suprafețe este o măsură a reflectanței suprafeței respective (dacă anumiți factori, cum este distanța între senzor și suprafață, rămân constanți).

Prin determinarea segmentelor luminoase și întunecate ale unui disc special (shaft encoder pattern – Fig. 5.9) atașat roților robotului se poate măsura deplasarea unghiulară sau viteza.

În cazul robotului Rug Warrior Pro se folosesc două circuite specializate (P5587) pentru realizarea traductoarelor de poziție-ax (shaft encoders) (Fig. 5.8).

Fig. 5.8 Circuitul traductoarelor

Fig. 5.9 Forma discurilor pentru traductoare

V.2.8. Circuitul microfonului (Fig. 5.10)

Un microfon cu electret este conectat la un amplificator (LM386).

Fig. 5.10 Circuitul microfonului

Câștigul acestui tip de amplificator este setat la 200 cu ajutorul condensatorului C13 (10F). Fără sunet la intrarea microfonului, ieșirea amplificatorului este stabilită la aproximativ 2.5V, jumătate din tensiunea de alimentare. Atunci când sunetul este prezent valoarea ieșirii amplificatorului crește și urmărește intrarea, balansând deasupra și dedesubtul valorii de 2.5V. Ieșirea trece printr-un filtru terce jos compus din R1(1K) și C22(0.1F). Filtrul îndepărtează zgomotul electric de frecvență înaltă produs de celelalte componente ale circuitului.

În final, ieșirea amplificatorului este eșantionată de microprocesor prin utilizarea unui canal al convertorului analog-numeric. Microprocesorul poate determina nivelul sunetului comparând diferența dintre tensiunea măsurată și tensiunea de 2.5V. Cu cât diferența este mai mare, cu atât sunetul este mai puternic.

V.2.9. Circuitul fotorezistențelor (Fig. 5.11)

Fac parte dintr-un divizor de tensiune. Tensiunea care cade pe o fotorezistență (fotocelulă) este convertită într-o valoare numerică.

Microprocesorul robotului compară tensiunea de intrare cu valoarea de referință 5V a tensiunii de alimentare și convertește valoarea analogică la ovaloare numerică pe 8 biți. Astfel, tensiuni în domeniul 0 5 V sunt reprezentate ca numere de la 0 la 255.

Valoarea rezistenței fotocelulei descrește când primește mai multă lumină și crește atunci când primește mai puțină. În divizorul rezistiv din schemă aceasta înseamnă că mai puțină lumină determină numere mai mari, iar lumină mai multă, numere mai mici. Trebuie să se observe schimbarea independentă a numerelor corespunzătoare părții stângi ( “L” ) sau drepte (“R” ) atunci când se orientează placa spre diferite direcții sau se acoperă una din fotocelule cu mâna.

Fig. 5.11 Circuitul fotorezistențelor

Fotocelulele din aceeași serie de fabricație nu au aceeași sensibilitate. Din această cauză ele nu vor avea aceleași valori ale rezistențelor deși sunt supuse unei intensități luminoase egale. Există o metodă mecanică simplă de a echilibra fotocelulele, atunci când aplicația o cere. Pentru realizarea echilibrării se indreaptă fotocelulele spre o sursă de lumină uniform difuză (chiar și un perete vopsit în alb și iluminat), se acoperă o parte a suprafeței fotocelulei mai sensibile cu o bucată de bandă neagră. Se ajustează poziția și mărimea acestei benzi până când se obține echilibrarea fotocelulelor.

V.2.10. Interfața serială pentru periferice SPI (Fig. 5.12)

Fig. 5.12 Conector SPI

Conectorul J9 permite utilizatorului să acceseze interfața SPI a microcontrolerului MC68HC11, care este o magistrală sincronă de mare viteză. Această magistrală admite interconectarea a două sau mai multe sisteme ce folosesc microcontrolerul MC68HC11. Totuși, pentru a folosi această magistrală, liniile de intrare/ieșire (I/O) care o compun (PD2, PD3, PD4 și PD5) trebuie să fie deconectate de la funcțiile lor standard, ceea ce înseamnă dezactivarea controlului IR și a driver-ului pentru motoare.

V.2.11. Memoria externă și afișajul LCD (Fig. 5.13)

Modulul care conține afișajul cu cristale lichide este conectat la placa de bază prin intermediul unui conector (J2). Afișajul are două rânduri de câte 16 caractere. Pentru afișarea datelor este necesar un circuit care memorează data care trebuie afișată (circuit latch). În cazul robotului circuitul folosit este 74573, U3.

Memoria externă (U2) este de tip RAM și are capacitatea de 32Kocteți. Conținutul acestei memorii este menținut printr-un circuit de alimentare care este tot timpul activ chiar dacă comutatorul de oprire este trecut pe poziția Off.

Fig. 5.13 Circuitul pentru memoria externă și afișajul LCD

V.2.12. Circuitul de expansiune

Circuitul de expansiune este conectat la magistrala de date a controlerului. Operațiile de citire a datelor de pe magistrală sau de scriere a datelor pe magistrală sunt responsabilități ale circuitului de expansiune. Aceasta se întâmplă doar atunci când una din diferitele adrese preselectate este referită și în momentul ciclului de ceas când controlerul este gata să trimită sau să recepționeze datele.

Pentru a mapa un octet extern într-o anume zonă din spațiul total de 65536 octeți de memorie a controlerului trebuie specificată o adresă de 16 biți. Pentru ca un circuit să realizeze acest lucru, trebuie comparate două adrese de câte 16 biți ( implică două cipuri cu cel puțin 18 sau 20 de pini). Însă, se poate folosi un circuit cu un cip, mult mai simplu, dacă se specifică parțial adresa. Astfel, acest circuit va examina (decoda) doar câțiva di biții de adresă și îi va ignora pe ceilalți.

Decodarea adresei circuitului de expansiune este relizată cu circuitul integrat 74HC138, U7 în schemă. Acest cip este denumit decodor unu din opt pentru că un cod binar de trei biți trimis pe intrările A, B și C ale acestui cip va selecta exact una din cele opt ieșiri (o va aduce în low). De exemplu, dacă intrările ABC sunt 000, atunci ieșirea Y0 va trece în low, iar celelalte vor fi în high. Pentru intrare 001, ieșrea Y1 este în low și celelalte în high, șamd.

Alte trei semnale de control sunt necesare pentru a activa ieșirile circuitului U7. Intrarea G1 trebuie să fie în “high“, iar G2A și G2B în “low“. Dacă se conectează linia de adresă A15 la G2B atunci, de câte ori A15 este în high, ieșirile circuitului HC138 vor fi dezactivate. Acest lucru este necesar pentru că atunci când A15 este în high controlerul adresează memoria superioară (adrese peste $8000 – numerele hexa sunt specificate pentru asamblor utilizând prefixul $ ). Începând de la adresa $8000 se găsește memoria externă și dispozitivele periferice nu trebuie să răspundă la adresele din această zonă .

De asemenea, nu trebuie ca dispozitivele periferice să se suprapună peste octeții din partea inferioară a memoriei, $0000 la $00FF sau $1000 la $103F, pentru că sunt adrese ale memoriei RAM internă a microcontrolerului respectiv ale regiștrilor de control și stare. Făcând ca linia de adresă A14 să fie în high se va evita această parte a memoriei. Realizarea acestui lucru se face prin inversarea semnalului A14 și conectarea lui la G2A. Doar în timpul când ciclul de ceas este în high ar trebui ca perifericele să citescă sau să scrie pe magistrală – aceasta se poate garanta prin conectarea semnalului de ceas, E, la intrarea G1.

A12, A13 și R/W se pot folosi mai departe pentru a selecta un dispozitiv periferic. Utilizând semnalul R/W este sigur că nu vor fi conflicte de bus (două dispozitive încearcă să acceseze magistrala în același timp) între dispozitivele de intrare și cele de ieșire. Patru din ieșirile circuitului 74HC138 selectează dispozitive de ieșire iar celelalte patru vor selecta dispozitive de intrare.

După relizarea celor de mai sus, dacă valoarea binară a liniei A13 este A, iar a liniei A12 este B, o ieșire a circuitului 74HC138 va fi activă de câte ori controlerul selectează o adresă de forma 01ABxxxxxxxxxxxx, unde x nu contează ce valoare are (0 sau 1).

De exemplu, dacă controlerul scrie o valoare la adresa exprimată în binar: 0100000000000000 ($4000 în hexa) atunci semnalul Osel0 va deveni activ pentru o porțiune a ciclului de bus. Data ( un octet) pe care controlerul o scrie poate fi citită de un dispozitiv periferic dacă acel dispozitiv încarcă și salvează data prezentă pe magistrala de date în momentul respectiv. Sau, dacă controlerul citește de la adresa $4000, un dispozitiv periferic trebuie sa transfere data pe magistrala de date cât timp semnalul Isel0 este în low. De fapt, Isel0 și Osel0 vor deveni active pentru orice adresă în domeniul $4000 $4FFF atunci când cei mai semnificativi patru biți ai adresei sunt decodificați.

Orice dispozitiv de intrare trebuie să-și plaseze data pe bus atunci când unul din semnalele Isel0Isel3 este în low (dispozitivul trebuie să aleagă unul din semnale). Orice dispozitiv de ieșire trebuie să încarce și să salveze data de pe bus doar când unul din semnalele Osel0Osel3 este în low (din nou dispozitivul trebuie să aleagă unul din semnale).

O hartă a memoriei robotului Rug Warrior ProTM este prezentată în figura Fig. 5.14 .

Fig. 5.14 Configurația memoriei

V.3. ÎNCĂRCAREA PROGRAMELOR

Când se trece comutatorul de alimentare pe poziția Download și LED-ul Bat low se stinge, microcontrolerul începe să execute un mic program care a fost memorat de producător într-o memorie ROM internă. Acest program se numește încărcător bootstrap (boostrap loader) și funcția lui este de a încărca programul utilizatorului (IC în cazul de față).

IC (Interactive C) trimite programul de încarcare pe linia serială spre microcontroler. Acest program, care trebuie trimis cu rată de 1200 baud, trebuie să aibă exact 256 octeți astfel încât să ocupe cei 256 octeți ce formează memoria RAM internă a microcontrolerului. LED-ul de culoare galbenă, COM, pâlpâie într-un anumit fel în timpul acestei operații. Când IC a terminat de trimis și ultimul octet al programului de încărcare, microcontrolerul sare la începutul acestuia și începe să-l execute.

Programul de încărcare, rezident în memoria RAM internă, știe cum să încarce sistemul de operare pentru IC, pcode-ul, în memoria externă.

Rata baud este ridicată la 9600 și PC-ul începe să trimită sistemul de operare. LED-ul COM va pâlpâi în acest caz într-un mod diferit. Când încărcarea s-a terminat sistemul de operare este gata să interacționeze cu PC-ul și să execute programele utilizatorului.

Acum se poate muta comutatorul de alimentare pe una din pozițiile “Off “ sau “Run“. În poziția “Off“, circuitul de alimentare de rezervă poate menține sistemul de operare în memoria RAM externă timp de câteva luni. Dacă se mută comutatorul pe poziția “Run“, microcontrolerul va începe execuția codului sistemului de operare.

Orice cod care se încarcă în memoria controlerului după această operație (download) va fi salvat în memoria RAM, așa cum este sistemul de operare. În plus, dacă s-a definit o rutină numită main(), rutina va fi executată în clipa în care robotul este alimentat sau când butonul de RESET este apăsat.

V.4. PROGRAME DEMONSTRATIVE

Programarea roboților înseamnă conectarea senzorilor pentru a conduce robotul într-un mod inteligent. Folosind cele șapte intrări standard ale lui Rug Warrior Pro ( două fotocelule, un detector IR, un microfon, două codoare de ax, un bumper) și șase ieșiri (două motoare, două emițătoare IR, o sirenă piezo și un ecran LCD) sunt o mulțime de varietăți de a conecta senzorii.

Marea parte a programelor sunt formate din două fișiere. Dacă numele fișierului este "examp", atunci fișierele vor fi denumite examp.c și examp.lis (programe utilitare ajutătoare pot fi de asemenea chemate; acestea sunt automat încărcate de fișierul examp.lis). Pentru a încărca un program se scrie în fereastra de lucru a lui IC: load examp.lis. Este o practică bună să se descarce exemplul care se rulează înainte de a se încărca exemplul următor. Acest lucru se poate realiza scriind în aceeași fereastră prin: unload examp.c.

Comportamentele demonstrative sunt descrise în continuare. Comentariile incluse explică modul de funcționare al programelor. Pentru a înțelege mai bine, trebuie să se modifice programele exemplu pentru a le face să lucreze după cum se dorește. Se începe prin modificarea valorilor parametrilor cheie și se observă rezultatele. După cum îndemânarea crește, se încearcă rescrierea unor porțiuni de cod sau se unesc două sau mai multe programe pentru a se crea comportamente mai complexe.

Bugle

Se încarcă bugle.lis. Când operația s-a sfârșit se scrie start_bugle();. Acum se poate apăsa fusta în diferite locuri astfel încât butoanele să fie activate singure sau în pereche.

Bugle demonstrează una din modalitățile simple de conectare a senzorilor pentru a conduce. Butoanele sunt folosite pentru a controla frecvența tonului emis de soneria piezo. Funcția intitulată bugle face doar două lucruri: scrie "Bugle" pe ecran când începe și când realizează bucla din select_bumper.

De asemenea funcția select_bumper este foarte simplă. Ea verifică pentru a vedea care buton este apăsat. Dacă butonul este apăsat (bpr<>0), atunci select_bumper pornește tonul; dacă butonul nu este apăsat , select_bumper oprește tonul. Mai departe funcția select_bumper setează frecvența sirenei piezo în funcție de locul unde s-a apăsat butonul. Notele posibile sunt C, F și A; C, F și A în octava de deasupra mijlocului C, și C două octave deasupra mijlocului C.

Theremin

Se încarcă fișierul theremin.lis. Se scrie start_theremin(); când s-a terminat. Se apropie mâinile de cele două fotocelule ale lui Rug Warrior Pro. Theremin (numit după inventatorul rus Theremin) este un instrument muzical al cărui ton și volum sunt controlate de capacități de cuplaj dintre cele două antene ale instrumenrului și mâinile cântărețului. Rug Warrior Pro simulează acest control folosind cantitatea de lumină ce cade pe fotocelule, mai curând, decât cuplajul capacitiv. De asemenea, decât să controlăm volumul, noi selectăm cât de des un ton este emis.

Yo – Yo

Se încarcă yo-yo.lis. Se așează robotul pe podea care are cel puțin 2 metri suprafață fară obstacole în fața robotului. Se scrie start_yoyo(); și se deconectează linia serială de la robot. Se împinge robotul din spate forțâmd fusta. Programul Yo-Yo antrenează butoanele și codoarele de ax ale robotului, ca intrări, și motoarele ca ieșiri. Când se apasă fusta în spate Yo-Yo direcționează robotul înainte pe o distanță presetată după care îl oprește și îl dă înapoi până când robotul ajunge în punctul inițial.

Wimp

Se încarcă fișierul wimp.lis. Se așază robotul pe podea într-o zonă fără obstacole. Se scrie start_wimp(); și se deconectează linia serială de la robot. Se apasă fusta în orice punct. Robotul va emite un sunet și încearcă să se depărteze de punctul unde a fost lovit.

Follow

Se încarcă fișierul follow.lis. Se așază robotul pe podea într-o zonă fără obstacole. Se scrie start_follow(); și se deconectează linia serială de la robot. Dacă se pun mâinile în fața robotului acesta se va deplasa spre mână și se va opri când se va lovi de aceasta. Follow folosește senzorii IR să găsească și să urmeze cel mai apropiat obiect. O lovire de acel obiect duce la oprirea motoarelor robotului.

Dacă avem doi roboți, un interesant comportament coperativ poate firealizat încărcând Wimp într-un robot și Follow în celălalt. Robotul care execută Follow se va mișca spre robotul care are încărcat Wimp până când îl lovește. Robotul Wimp se va depărta atunci, Follow mișcându-se din nou spre acesta. Roboții se mișcă astfel de-a lungul podelei într-un dans aparent.

Moth

Se încarcă fișierul moth.lis și se plasează robotul pe podea. Pentru a se începe programul se scrie start_moth(1); și se deconectează linia serială de la robot. Robotul va urmări lumina cea mai putenică. Dacă se îndreaptă o sursă de lumină spre robot, îl putem face să vină spre noi din altă parte a camerei. Când butonul îi spune robotului că s-a lovit de un obstacol, robotul oprește se mișcarea înainte.

O simplă modificare va face ca robotul să aibă un comportament diferit. Dacă se apelează start_moth(-1); robotul va fugi de lumină și se va ascunde în cel mai întunecat colț al camerei.

Echo

Se încarcă fișierul echo.lis și se scrie start_echo();. Se țipă sau se bate tare de câteva ori, rapid, din palme. Robotul va repeta numărul de sunete pe care le percepe, emițând sunete și mergând înainte și înapoi. Dacă robotul operează într-un mediu zgomotos, trebuie schimbată valoarea sound_delta.

Echo este un comportament interesant pentru doi roboți care execută instantaneu acest program. Avem un robot care începe să emită un număr de sunete. Al doilea robot va fi ecoul primului, iar primul va fi ecoul ecoului, și așa mai departe.

Sonic Comander

Se încarcă fișierul soniccmd.lis. Se așază robotul pe podea și se scrie start_sonic(); și se deconectează linia serială de la robot. Trei zgomote puternice în succesiune rapidă vor face ca robotul să se rotească pe loc. Două sunete îl vor face să meargă înainte , iar un sunet să se oprească. Sonic Comander ne dă voie să conducem robotul bătând din palme, fluierând sau chiar vorbind tare. De exemlpu, va părea că robotul înțelege vorbirea dacă se comandă rapid "Stop!", "Întoarce acum!" sau "Mergi înainte acum!".

Behave

Fișierul behave.lis permite un mod convenabil pentru a demonstra toate comportamentele descrise până acum. După ce s-a încărcat behave.lis, se poate trece prin diferitele comportamente apăsând reset.

V.5. BIBLIOTECA DE FUNCȚII A LUI RUG WARRIOR PRO

V.5.1. Comenzi de timp

Sistemul poate ține evidența timpului scurs în milisecunde. Variabile timp sunt implementate folosind tipul de date long integer. Funcțiile standard permit folosirea variabilelor în virgulă mobilă când se folosesc funcții de temporale (de timp).

void reset_system_time()

Resetează contorul timp al sistemului la 0 milisecunde.

long mseconds()

Returnează valoarea contorului timp al sistemului, în milisecunde. Contorul timp este resetat printr-un reset hard (prin apăsarea butonului RESET de pe placă) sau prin prin funcția reset_system_time(). Funcția mseconds() este implementată ca o primitivă a C-ului (nu ca o funcție de bibliotecă).

float seconds()

Returnează valoarea contorului timp în secunde, ca un număr cu virgulă mobilă. Rezoluția (precizia) este de 1ms.

void sleep(float sec)

Se așteaptă un interval de timp egal sau puțin mai mare decât sec secunde. Variabila sec este un număr în virgulă mobilă. Spre exemplu: /*așteaptă 1,5 secunde*/

sleep(1.5).

void msleep(long msec)

Se așteaptă un interval de timp egal sau mai mare decât msec milisecunde. Variabila msec este un număr long int. Spre exemplu:

/*așteaptă 1,5 secunde*/

msleep(1500L).

V.5.2. Funcții sonore

Câteva comenzi controlează producerea de sunete prin utilizarea unei memvrane piezo.

void beep()

Produce un sunet cu frecvența de 500 Hz pe o perioadă de 0,3 secunde.

void(float frequency, float length)

Produce un sunet cu frecvența frequency Hz și lungimea length secunde. Atât frequency cât și length sunt de tip real.

void set_beeper_pitch(float frequency)

Setează tonul sunetului la valolarea frequency Hz. Funcția beeper_on() se poate folosi acum să pornească difuzorul. Schimbarea frecvenței când difuzorul funcționează, va duce la crearea de note.

void beeper_on()

Pornește difuzorul la frecvența ultimului set_beeper_pitch selectat.

void beeper_off()

oprește difuzorul.

V.5.3. Funcții pentru senzori

int digital(int nth)

Returnează starea bitului de intrare nth a portului digital de intrare/ieșire (I/O), A. Biții 1 și 2 sunt intrări neasignate. Biții 0 și 7 sunt intrări conectate la coderul de poziție stâng, respectiv drept.

int analog(int p)

Returnează valoarea detectată în portul p. Rezultatul este un întreg între 0 și 255.

Porturile analogice sunt mapate la pinii portului E. Analog(0) corespunde lui PE(0), analog(1) lui PE(1), și așa mai departe. Liniile PE5, PE6, și PE7 sunt disponibile în circuitul de expansiune, pentru a fi folosite de proiectant.

De notat , pentru maximă siguranță toate apelurile analog(p) se realizează într-un singur proces.

int analog (photo_right photo_left)

Returnează valoarea fotocelulei drepte sau stângi. Număr mai mic înseamnă lumină mai puternnică.

int analog(microphon)

Returnează valoarea instantanee a intrării A/D conectate la microfon. Când sunetul nu este prezent analog(microphon) returnează o valoare de aproximativ 128. Când sunetul este detectat de microfon, valoarea poate fi mai mică sau mai mare de 128. Pentru a avea sens valoarea nivelului sunetului, semnalul de la microfon trebuie citit și mediat frecvent.

int bumper()

Returnează o valoare pe trei biți corespunzând contactului închis. Dacă butoanele de contact sunt numite Dreapta, Stânga și Spate atunci bitul 0 setat corespunde lui Dreapta închis, bitul 1 setat corespunde lui Stânga închis, iar bitul 2 setat corespunde lui Spate închis. Spre exemplu, dacă bumper() returnează 3, acest lucru înseamnă că Dreapta și Stânga sunt închise.

int ir_detect()

Returnează o valoare pe doi biți cu următoarea semnificție: 0-nu s-a detectat nici un obstacol, 1-obstacol detectat în partea dreaptă, 2- obstacol detectat în partea stângă, și 3- obstacol detectat în ambele părți. Acest test necesită cel puțin două milisecunde pentru a fi realizat.

V.5.4. Funcții pentru motoare

Driver-ele pentru motor ale lui Rug Warrior Pro sunt controlate proporțional. Acest lucru înseamnă că este posibil să se specifice viteza fiecăruia atunci când sunt pornite, mai exact dacă sunt doar pornite și apoi oprite.

Primitivele descrise mai jos permit doar un control în buclă deschisă. Cu toate acestea, folosind aceste primitive se poate realiza un sistem de control al vitezei în buclă închisă.

int init_motors()

Această funcție inițializează câțiva regiștri care permit controlul vitezei motoarelor. Este apelată automat la reset dar trebuie apelată din nou dacă regiștrii OC1M, TCTL1, TOC1, sau DDRD ai lui MC68HC11 sunt alterați;

void motor(int index, int speed)

Această funcție este o primitivă pentru a controla viteza motorului. Index=0 permite accesul la lotorul stâng; index=1 permite accesul la motorul stâng. Viteza este un număr întreg între -100 și +100. Viteza reprezintă procentajul din viteza maximă la care operează motorul;

void drive(int trans_vel, int rot_vel)

Această funcție este folosită pentru controlul vitezei și direcției robotului. Trans_vel este un număr întreg între -100 și 100 specificând viteza robotului ca procentaj al vitezei maxime(numere negative fac robotul să meargă înapoi). Variabila rot_vel, este un număr între -100 și 100 specificând viteza de rotație a robotului ca procent al vitezei maxime. Numerele pozitive corespund numărătorului de ceas. Drive-ul specifică doar viteza în buclă deschisă.

V.5.5. Funcții pentru shaft encoders

Funcțiile shaft encoders sunt implementate de fișierul speed.icb și shaft.c. Primul fișier activează rutinele de întrerupere care moniorizează shaft encoder-ele conectate la linia PA0. Ultimul fișier permite o interfață-utilizator low level cu ajutorul funcțiilor get_left_cvlicks() și get_right_clicks(). De fiecare dată când rutina este apelată returnează numărul de tranziții (cllicuri) realizate de la ultima apelare. Acest număr este proporțional cu distanța pe care roata s-a învârtit în acest timp.

Pentru a măsura viteza robotului se aranjează pentru a apela la intervale regulate funcția get_clicks. De exemplu, acest aranjament poate fi însoțit de setarea unui proces care să apeleze funcția get_clicks, scriind valoarea într-o variabilă, și apoi se dă o pauză pentru un anumit interval de timp. Cât de des procesul apelează get_clicks depinde de numărul de fâșii de tranziție alb-negru. (16 pentru Brawn Kit) de pe roată și precizia vitezei pe care o dorim. De notat că shaft encoderul ignoră direcția de rotație- funcția get_clicks numără cât timp activează ceasul sau numărătorul de ceas.

void init_velocity()

Inițializează rutina care activează monitorizarea vitezei. Această funcție trebuie trebuie apelată înainte pentru ca funcțiile get_left_clicks() și get_right_clicks() să devină operaționale;

int get_left_clicks()

Accesează o variabilă menținută de o rutină de întrerupere low level (definită în speed.asm). Rutina de întrerupere este asociată cu pinul PA0 al lui 6811. Valoarea returnată este numărul de clicuri făcute de la ultima apelare a lui get_left_clicks;

int get_right_clicks()

Accesează registrul de numărare asociat cu pinul PA7 al lui 6811. Valoarea returnată este numărul de clicuri făcute de la ultima apelare a funcției get_right_clicks.

Pentru o programare convenabilă sunt prezente următoarele funcții în librăria lui Rug Warrior Pro.

left_shaft()

Returnează starea shaft encoder-ului stâng; 1 dacă o frâșie albă este detectată, 0 altfel;

right_shaft()

Returnează starea shaft encoder-ului drept; 1 dacă o fâșie albă este detectată , 0 în caz contrar.

Cap. VI Sistemul de recepție în infraroșu și controlul deplasării cu ajutorul telecomezii

VI.1 Sistemul de recepție în infraroșu

Sistemul de recepție în infraroșu folosește un receptor Sharp modelul IS1U60/IS1U60L. Acest receptor are următoarele performanțe:

volum compact;

filtru trece bandă (tipic 38 KHz);

lentilă nesferică.

Aplicațiile acesteui receptor sunt:

echipamente audio;

camere T.V.

Parametrii receptorului sunt descriși în tabelul VI.1

*1Nu este pemisă condensare

*îPentru 5 secunde

Tabelul IV.1 Parametrii receptorului la Ta=25oC

Este recomandată alimentarea la o tensine cuprinsă între 4,7 și 5,3V.

Caracteristicile electrice ale receptorului IR sunt descrise în tabelul VI.2.

*3 Forma de undă transmisă este reprezentată în figura următoare;

*4 Rezistența ridicătoare: 3,3K;

*5 A emițătorului SHARP.

Tabelul IV.2 Caracteristicile electrice ale receptorului IR

Forma de undă transmisă și care este recepționată este ilustrată în figura IV.1.

Fig IV.1 Semnalul transmis și recepționat

Diagrama bloc internă a receptorului este ilustrată în figura IV.2.

BPF=Filtru trece bandă

Fig.IV.2 Diagrama bloc internă a receptorului

După cum se observă, receptorul prezintă un filtru trece bandă cu frecvența centrală de 38KHz, deci acesta nu va lucra decât cu semnale în jurul acestei valori.

Performanțe:

Folosind emițătorul din figura VI.3 , semnalul de ieșire al detectorului IR întrunește următoarele calități în sistemul optic standard din figura VI.4:

Caraacteristicile liniare de distanță ale recepției:

Când L este cuprins între 0,3 și 5m, Ee<10lx, (*4),și =0o (în fig.VI.4), semnalul de ieșire ar trebui să întrunească caracteristicile indicate în figurile atașate.

Caracteristica de sensibilitate unghiulară și de distanță a recepției

Când L este cuprins între 0,3 și 3m, Ee<10lx (*4) și <=30o în direcția X și =0o în direcția Y (fig.VI.4), receptorul va întruni caracteristicile electrice prezentate în figurile atașate. De asemenea aceste caracteristici vor fi întrunite și când L este cuprins între 0,3 și 5m, Ee<10lx, (*4),și =0o în direcția X și <=15o în direcția Y.

*4 se referă la fața iluminată a detectorului.

Fig.VI.3 Emițătorul

Fig.VI.4 Sistemul optic standard

Precauții ce trebuiesc luate la folosirea dispozitivului:

se va folosi o sursă de lumină (telecomandă) luând în considerare perfornțele, caracteristicile, condițiile de lucru ale emițătorului și caracteristicile detectorului de IR.

Atenție la funcționările anormale ale detectorului IR când suprafața este acoperită cu praf sau reziduri. O atenție deosebită trebuie luată pentru a nu se atinge suprafața detectorului.

Pentru a se evita defectarea prin descărcare electrostaticăâ, se va lucra cu dispozitivul îndeplinind condițiile de împământare atât pentru corpul operatorului cât și pentru ciocanul de lipit.

Nu trebuie aplicată o forță mai mare decât este necesar asupra terminalelor.

Este prezentat un exemplu de circuit extern de protecție (se va monta cât mai aproape de receptorul IR).

Fig.VI.5 Circuit de protecție a receptorului

VI.2 Controlul deplasării

O aplicație interesantă pentru receptorul IR este comanda deplasării robotului cu ajutorul unei telecomenzi, iar coroborat cu sistemul de emisie IR un model de cooperare între cei doi roboți.

Pentru controlul deplasării se poate folosi aproape orice tip de telecomandă în infraroșu pentru televizoare sau aparate video.

În general, la apăsarea unui buton al unei telecomenzi ea va emite un semnal format dintr-un “leader”, o parte de informație și un “trailer” (terminator). Informația este formată din două părți: adresa și data. Adresa este comună tuturor butoanelor și este folosită la selectarea echipamentului comandat de telecomandă, iar data codifică butonul apăsat. Informația constă din biți 0 și 1, fiecare dintre ei fiind format dintr-un puls și un spațiu.

Telecomanda folosită în cazul de față are biții 0 și 1 de forma arătată în figura VI.6.

Fig.VI.6 Forma de undă a biților emiși de telecomandă

Cu ajutorul unui osciloscop electronic cu memorie am constatat că diferențele între semnalele recepționate la apăsarea anumitor butoane, apar la primele 11 fronturi căzătoare ale semnalului. Astfel am format o tabelă de 12 elemente întregi în care primul element nu este luat în considerare deoarece nu dă informație utilă, următoarele 10 elemente conțin diferențele de timp utile, între fronturile căzătoare, iar ultimul element este un terminator al tabelei.

Din cele zece diferențe de timp care codifică operația cinci sunt comune tuturor butoanelor, astfel că acestea sunt folosite pentru recunoașterea unei comenzi bune. Următoarele cinci codifică butonul apăsat.

Pentru comanda deplasării robotului am folosit doar 9 din cele 16 butoane ale telecomenzii. Forma semnalelor recepționate de receptorul IR al robotului la apăsarea butoanelor folosite este prezentată în figura VI.7.

Fig. 6.7 Forma semnalelor recepționate

OBS. La apăsarea unui buton telecomanda emite un semnal care are mai multe fronturi căzătoare decât cele luate în seamă de sistemul de întrerupere al robotului. Semnalul complet este format din două părți: se emite un cod direct după care unul complementat. Această tehnică este folosită la majoritatea telecomenzilor.

Deoarece am luat în considerație numai o parte a semnalului recepționat pot apare comenzi și de la butoanele neutilizate, al căror cod comlementat este același cu codul direct al unui buton folosit. De exemplu pentru butoanele COLOR+ și CONTR- :

cod normal COLOR+ = cod complementat CONTR-

cod complementat COLOR+ = cod normal CONTR-.

Cu ajutorul acestui mod de comunicare s+s încercat și realizarea schimbului de informații (cooperării) între cei doi roboți. Acest lucru nu a fost posibil datorită limitărilor constructive ale emițătoarelor cât și a receptoarelor roboților. Din diagramele de catalog ale receptorului se observă că receptorul nu este foarte sensibil la emisii din spate sau din laterală. Cu toate reflexiile care au loc datorită “fustei” robotolui la emisii de la același nivel nu se poate realiza o legătură permanentă sigură. Deci cooperarea folosind acest sistem nu dă rezultate sigure și deci este abandonată.

Cap. VII CONCLUZII

Din practica proprie, dar și din cea a altor utilizatori, s-au desprins unele concluzii:

– sistemul de comunicare prin semnale (microfon și sirena piezo) nu este lucrativ din cauza ambelor dispozitive. Microfonul nu are o sensibilitate bună datorită impedanței mari, iar sirena piezo emite un semnal acustic destul de slab. Un remediu ar consta în schimbarea atât a microfonului cu unul cu o impedanță mai mică (electrodinamic), cât și/sau a sirenei piezo cu un difuzor.

– o atenție deosebită trebuie acordată montării emițătoarelor IR pentru a nu determina apariția reflexiilor nedorite datorate “fustei” robotolui. Pentru eliminarea acestor reflexii emițătoarele IR trebuiesc montate centrat în cei doi “ochi” ai robotolui, iar dacă reflexiile sunt încă mari, se poate înveli receptorul cu o “glugă” de polietilenă. Acest lucru trebuie pe cât posibil evitat datorită faptolui că reduce foarte mult eficacitatea sistemului de recepție.

– datorită limitărilor sistemului de recepție al robotolui, cât și a sistemului de recepție (se observă din foile de catalog), nici acest sistem de cooperare nu este lucrativ. În momentul în care cei doi roboți au pierut legătura, resincronizarea lor neputându-se realiza într-o manieră fiabilă. Un mod de amenține această legătură este acela de a monta repetoare IR astfel încât să se acopere întreaga suprafață pe care se poate deplasa robotul. O manieră mult mai fiabilă de realizare a cooperării este aceea de a folosi emițătoare și receptoare radio.

– se observă o influențare a codoarelor incrementale de ax de către motoare. Datotită acestor influențe pot apare erori în determinarea vitezei și a distanței parcurse de robot. O modalitate de eliminare a acestui efect este acela de adespărți firele de alimentare ale motorului de cele alocate codorului de ax.

– o altă restricționare este reprezentată de consumul mare al motoarelor. Acest lucru face ca timpul de utilizare al robotului cu un set de baterii să fie relativ mic. Neajunsul se elimină prin construirea unui alimentator cu fir, dar acum apare problema cablului de legătură care poate împiedica mișcările robotului.

– datorită porturilor nefolosite ale microcontrolerului M68HC11 cât și a pinilor de expansiune montați deja pe placa robotului Rug Warrior Pro, se poate realiza o îmbunătățire kitului prin adăugarea de noi senzori.

Deși acest chit nu are o funcționalitate practică imediată, este deosebit de util pentru înțelegerea funcționării microcontrolerului M68HC11, a modului de lucru și calibrării senzoristicii în funcție de influențele mediului. De asemenea se dezvoltă abilitățile de programere atât în C cât și în limbaj de ansamblare. Deci se poate concluziona că acest chit este un excelent material didactic destinat celor care doresc să pătrundă în tainele microcontrolerelor.

Bibliografie

S. Nicola Note de curs

Microcontrolerul M68HC11- date de catalog

Robotul Rug Warrior Pro-date de catalog

Receptorul infraroșu IS1U60- date de catalog

Similar Posts