Generatare de Impulsuri cu Microcontroler. Implementarea Soft a Unei Tastaturi Matriciale

CAPITOLUL 1

Structura hard a generatorului de impulsuri

1.1 Prezentare generală

Partea principală a generatorului de impulsuri o constituie microsistemul de calcul care este dezvoltat în jurul elementului de calcul, în acest caz microcontrolerul 80c552.

Microcontroler de înaltă performanță proiectat pentru a fi utilizat în aplicații de timp real, cum ar fi: instrumentație, control industrial și control pe automobil – pentru controlul motorului și al transmisiei. Dispozitivul asigură, în plus față de funcțiile standard 80C51, un număr de funcții hardware dedicate pentru aceste aplicații.

Circuitul 80C552 folosește setul de instrucțiuni puternic al familiei 80C51 din care și face parte. Pentru controlul perifericelor on-chip sunt încorporate registre de funcții speciale suplimentare.

80C552 conține o memorie ROM nevolatilă de dimensiunea 8K×8, o memorie volatilă de 256×8 – memorie de date de tip scrie / citește, cinci porturi I / O de 8 biți, un port de intrare de 8 biți, două circuite timer / numărător de evenimente de 16 biți (identice cu timerele din 80C51), un timer suplimentar de 16 biți cuplat cu latchuri de captură și de comparare, o structură de întreruperi imbricată (nested) cu 15 surse și două nivele de prioritate, un convertor A / D de 10 biți cu 8 intrări, un convertor D / A dublu cu interfață de impulsuri modulate în durată (PWM), două interfețe seriale (UART și magistrală I2C), un timer watchdog – ”câine de pază" și oscilator și circuite de timing on-chip.

80C552 are două moduri, selectabile software, de reducere a activității pentru o diminuare mai pronunțată a consumului de putere: mers în gol și putere scăzută. Modul mers în gol "îngheață" CPU și resetează timerul T2, convertorul A / D și circuitele PWM, dar permite funcționarea celorlalte timere, a memoriei RAM, a porturilor seriale, iar sistemul de întreruperi continuă să funcționeze. Modul putere scăzută salvează conținutul memoriei RAM, dar "îngheață" oscilatorul, ceea ce inactivează toate funcțiile de pe chip.

1.1.1 Memoria program

80C552 conține 8 kocteți de memorie program on-chip ce poate fi extinsă până la 64 kocteți de memorie externă ( fig. 2.1). Când pinul este ținut la nivel HIGH, circuitul 8XC552 aduce instrucțiuni de la ROM-ul intern până când adresa depășește 1FFFH. Locațiile 2000H până la FFFFH sunt aduse din memoria program externă. Când pinul este ținut la nivel LOW, toate aducerile de instrucțiuni sunt de la memoria externă. Locațiile ROM de la 0003H până la 0073H sunt utilizate de rutinele de servire a întreruperilor.

Fig. 2.1 Harta memoriei

1.1.2 Memoria date

Memoria internă de date este divizată în 3 secțiuni: 128 octeți inferiori, 128 octeți superiori (RAM) și aria de 128 octeți a registrelor de funcții speciale. Cei 128 octeți inferiori de RAM de la 128 la 255 și aria registrelor de funcții speciale împart același spațiu de adresă, iar accesarea lor se face în moduri de adresare diferite. Locațiile RAM 128 la 255 sunt adresabile numai indirect, iar registrele de funcții speciale sunt adresabile numai direct. Toate celelalte aspecte ale memoriei interne RAM sunt identice cu 80C51.

Stiva poate fi localizată oriunde în RAM-ul intern prin încărcarea indicatorului de stivă de 8 biți. Înălțimea stivei este de maximum 256 octeți.

1.1.3 Registrele de funcții speciale

Registrele de funcții speciale (adresabile numai direct) conțin toate registrele pentru 80C552, cu excepția contorului de program (PC) și cele patru bancuri de registre. Majoritatea din cele 56 registre de funcții speciale este folosită pentru controlul perifericelor hardware on-chip. Alte registre sunt registrele aritmetice (ACC, B, PSW, indicator de stivă SP) și registrele indicatoare de date (DPH, DPL). 16 dintre registrele de funcții speciale (SFR) conțin 128 locații direct adresabile la nivel de bit. Tabelul 2.1 (Anexă) – prezintă registrele de funcții speciale pentru 80C552.

1.2 Accesarea memoriei externe

Accesul la memoria externă este de două tipuri: acces la memoria program externă și acces la memoria externă date. Accesul la memoria program externă folosește semnalul (Program Store Enable) ca strob pentru citire. Accesul la memoria date externe folosește sau (funcții alternative ale P3.7 și P3.6) pentru a stroba memoria. Aducerea de la memoria program externă folosește întotdeauna o adresă de 16 biți. Accesul la memoria de date externă poate folosi fie o adresă de 16 biți (MOVX @DPTR), fie o adresă de 8 biți (MOVX @Ri).

Ori de câte ori se folosește o adresă de 16 biți, octetul superior de adresă este transmis la ieșirea portului 2, unde este păstrat pe durata ciclului de citire sau scriere. De notat că driverele portului 2 folosesc pullup-urile puternice pe întreg intervalul de timp în care ele emit biții de adresă care au valoarea "1". Aceasta este pe durata executării unei instrucțiuni MOVX @DPTR. Pe acest interval de timp, latchul portului 2 (registrul de funcții speciale) nu trebuie să conțină valori "1", iar conținutul portului 2 SFR nu este modificat. Dacă ciclul memoriei externe nu este urmat imediat de un alt ciclu de de memorie externă, conținutul neafectat al portului 2 SFR va reapărea în codul următor.

Dacă se utilizează o adresă de 8 biți (MOVX @Ri), conținutul portului 2 SFR rămâne la pinii portului 2 pe durata ciclului memorie externă. Aceasta va facilita modul de lucru pagină.

În toate cazurile, octetul inferior al adresei este multiplexat în timp cu octetul de date din portul 0. Semnalele ADDR / DATA comandă de asemenea și FET-urile din bufferele de ieșire ale portului 0. Astfel, în această aplicație, pinii portului 0 nu sunt ieșiri cu drena în gol și nu necesită pullup extern. Semnalul ALE (Address Latch Enable) poate fi folosit pentru a captura octetul de adresă dintr-un latch extern. Octetul de adresă este valabil la tranziția pe front căzător a semnalului ALE. Apoi, în ciclul de scriere, octetul de date ce urmează a fi scris apare în portul 0 puțin înainte ca să fie activat semnalul și rămâne astfel până la dezactivarea . În ciclul de citire, octetul ce sosește este acceptat în portul 0 puțin înainte ca strobul READ să fie dezactivat.

Pe durata oricărui acces la memoria externă, CPU scrie 0FFH în latchul portului 0 (în SFR), astfel ștergându-se orice fel de informație ce ar putea fi păstrată în portul 0 SFR.

Memoria program externă este accesată în două condiții: ori de câte ori semnalul este activ sau când contorul de program (PC) conține un număr mai mare decât 0FFFH (în circuitul 80C51).

Aceasta presupune că versiunile fără ROM să aibă conectat semnalul de la nivel scăzut pentru a permite ca cei mai inferiori 4 kocteți de program să fie aduși de la memoria externă.

Atunci când CPU lucrează cu memoria program externă, toți cei 8 biți ai portului 2 sunt dedicați unei funcții de ieșire și nu pot fi utilizați în scopuri generale I / O. Pe durata aducerilor de la programul extern, ei dau la ieșire octetul superior al contorului de program (PC). Pe acest interval de timp, driverele portului 2 folosesc pullup-urile puternice pentru a emite biții din contorul de program (PC) care au valoarea 1.

1.3 Timere / numărătoare

Circuitele 80C51 au două timere / numărătoare: timerul 0 și timerul 1. Ambele pot fi configurate pentru a lucra fie ca timere, fie ca numărătoare de evenimente (vezi fig. 2.6).

Fig. 2.6 Registrul de control mod timer / numărător (TMOD)

În funcția "timer", registrul este incrementat la fiecare ciclu mașină. Astfel, s-ar putea crede că funcționează ca numărător de cicluri mașină. Întrucât un ciclu mașină constă din 12 perioade de oscilator, rata de numărare este 1 / 12 din frecvența oscilatorului.

În funcția "numărător", registrul este incrementat ca răspuns al unei tranziții 1 în 0 la pinul său de intrare corespunzător T0 sau T1. În această funcționare, intrările externe sunt eșantionate pe durata S5P2 a fiecărui ciclu mașină.

Când eșantionarea găsește un nivel "HIGH" într-un ciclu și "LOW" în ciclul următor, numărătorul este incrementat. Noua valoare a numărului apare în registru pe durata S3P1 a ciclului care urmează celui în care a fost detectată tranziția. Întrucât ia 2 cicluri mașină (24 perioade de oscilator) pentru a recunoaște o tranziție 1 la 0, viteza maximă de numărare este 1 / 24 din frecvența oscilatorului. Nu sunt restricții în privința factorului de umplere al semnalului de intrare extern, decât cel de a asigura că un nivel dat este eșantionat cel puțin o dată înainte ca el să se schimbe. El trebuie să se mențină cel puțin pentru un ciclu complet. Suplimentar selecției "timer" sau "numărător", timerul 0 și timerul 1 au patru moduri de funcționare ce pot fi selectate.

1.3.1 Timerul 0 și timerul 1

Funcția "timer" sau "numărător" poate fi selectată de către biții de control în registrul de funcție specială TMOD. Aceste două timere / numărătoare au patru moduri de funcționare, ce sunt selectate de perechea de biți (M1, M0) din TMOD. Modurile 0, 1 și 2 sunt aceleași pentru ambele circuite timer / numărărtor. Modul 3 este diferit. Cele patru moduri de funcționare sunt descrise în cele ce urmează.

Modul 0

Programarea modului 0 a oricărui timer va determina ca acesta să semene cu un timer 8048 care este un numărător de 8 biți cu un circuit de prescalare divizor prin 32. În fig. 2.7 se prezintă modul de funcționare atunci când acesta se aplică numărătorului 1.

Fig. 2.7 Timer / numărător mod 0: numărător de 13 biți

Fig. 2.8 Registrul de control timer / numărător (TCON)

În acest mod, registrul timerului este configurat ca un registru de 13 biți. Când numărătorul comută din starea toți biții "1" în starea toți biții "0", se setează flagul de întrerupere timer TF1. Intrarea timerului este activată când TR1 = 1 și fie GATE = 0, fie = 1 (setând GATE = 1 se permite timerului să fie controlat de către intrarea externă pentru a facilita măsurarea lățimii impulsurilor. TR1 este un bit de control din registrul de funcții speciale TCON (fig. 2.8). GATE se găsește în registrul de funcție specială TMOD.

Registrul de 13 biți constă din toți cei 8 biți din TH1 și cei 5 biți inferiori din TL1. Cei trei biți superiori din TL1 sunt nedeterminați și trebuie ignorați. Setarea flagului de funcționare (TR1) nu șterge registrul.

Modul 0 de funcționare este același pentru timerul 0 și pentru timerul 1. Se substituie TR0, TF0 și pentru semnalele corespunzând timerului 1. Există doi biți diferiți GATE, unul pentru timerul 1 (TMOD.7) și unul pentru timerul 0 (TMOD.3).

Modul 1

Modul 1 este asemănător cu modul 0, cu excepția faptului că registrul timerului va lucra cu toți de 16 biți.

Modul 2

Modul 2 configurează registrul timer ca un numărător de 8 biți (TL1) cu reîncărcare automată, așa cum se prezintă în fig. 2.9. Depășirea din TL1 nu numai că setează TF1, dar de asemenea reîncarcă TL1 cu conținutul TH1, care este presetat din software. Reîncărcarea lasă TH1 neschimbat.

Modul 2 este identic și pentru timerul / numărător 0.

Fig. 2.9 Timer / numărător mod 2: 8 biți cu auto-încărcare

Modul 3

Timerul 1 în mod 3 numai își păstrează conținutul. Efectul este același ca la fixarea valorii TR1=0.

Fig. 2.10 Timerul / numărător 0 în mod 3: două numărătoare de 8 biți

Timerul 0 în mod 3 stabilește TL0 și TH0 ca două numărătoare separate. Logica pentru modul 3 a timerului 0 este prezentată în fig. 2.10. TL0 folosește biții de control ai timerului 0: C/T, GATE, R0, INT0 și TF0. TH0 este blocat într-o funcție de timer (ce numără cicluri mașină) și preia pentru folosire TR1 și TF1 de la timerul 1. Astfel, TH0 controlează întreruperea "timer 1".

Modul 3 este prevăzut pentru aplicații ce necesită un timer suplimentar de 8 biți pe numărător. Cu timerul 0 în mod 3, un circuit 80C51 poate fi privit ca și cum ar avea 3 timere / numărătoare. Când timerul 0 este în mod 3, timerul 1 poate fi cuplat și decuplat, deconectându-l și conectându-l în propriul său mod 3, sau mai poate fi folosit de către portul serial ca generator dfigurează registrul timer ca un numărător de 8 biți (TL1) cu reîncărcare automată, așa cum se prezintă în fig. 2.9. Depășirea din TL1 nu numai că setează TF1, dar de asemenea reîncarcă TL1 cu conținutul TH1, care este presetat din software. Reîncărcarea lasă TH1 neschimbat.

Modul 2 este identic și pentru timerul / numărător 0.

Fig. 2.9 Timer / numărător mod 2: 8 biți cu auto-încărcare

Modul 3

Timerul 1 în mod 3 numai își păstrează conținutul. Efectul este același ca la fixarea valorii TR1=0.

Fig. 2.10 Timerul / numărător 0 în mod 3: două numărătoare de 8 biți

Timerul 0 în mod 3 stabilește TL0 și TH0 ca două numărătoare separate. Logica pentru modul 3 a timerului 0 este prezentată în fig. 2.10. TL0 folosește biții de control ai timerului 0: C/T, GATE, R0, INT0 și TF0. TH0 este blocat într-o funcție de timer (ce numără cicluri mașină) și preia pentru folosire TR1 și TF1 de la timerul 1. Astfel, TH0 controlează întreruperea "timer 1".

Modul 3 este prevăzut pentru aplicații ce necesită un timer suplimentar de 8 biți pe numărător. Cu timerul 0 în mod 3, un circuit 80C51 poate fi privit ca și cum ar avea 3 timere / numărătoare. Când timerul 0 este în mod 3, timerul 1 poate fi cuplat și decuplat, deconectându-l și conectându-l în propriul său mod 3, sau mai poate fi folosit de către portul serial ca generator de control al vitezei de transfer, sau în orice aplicație ce nu solicită o întrerupere.

1.4 Timerul T2

1.4.1 Prezentarea Timerul T2

Timerul T2 este un timer de 16 biți ce conține 2 registre TMH2 (octet superior) și TML2 (octet inferior). Timerul / numărător de 16 biți poate fi deconectat sau conectat la clock printr-un circuit de prescalare de la una din două surse: fOSC / 12 sau de la un semnal extern. Atunci când timerul T2 este configurat ca numărător, circuitul de prescalare primește clock de la un semnal extern pe intrarea T2 (P 1.4). Un front crescător la pinul T2 incrementează circuitul de prescalare, iar rata maximă de repetiție este o numărare pe ciclu mașină (1 MHz cu un oscilator de 12 MHz).

Rata maximă de repetiție pentru timerul T2 este de două ori mai mare decât cea a timerului 0 și a timerului 1. T2 (P 1.4) este eșantionat la momentul S2P1 și din nou la S5P1 (deci de două ori pe un ciclu mașină). Un front crescător este detectat când T2 este LOW pe durata unui eșantion și HIGH pe durata eșantionului următor. Pentru a asigura detecția frontului crescător, semnalul de intrare trebuie să fie LOW pentru cel puțin 1/2 ciclu și apoi HIGH pentru cel puțin 1/2 ciclu. Dacă este detectat un front crescător înaintea sfârșitului S2P1, timerul va fi incrementat pe durata următorului ciclu; în caz contrar va fi incrementat un ciclu mai târziu. Circuitul de prescalare are un factor de prescalare de 1, 2, 4 sau 8 și este șters dacă factorul său de divizare sau sursa de intrare se modifică, ori dacă timerul / numărător este resetat.

Timerul T2 poate fi citit "din zbor", dar nu posedă latchuri de citire suplimentare, iar pentru a evita interpretarea eronată a datelor în cazul unei ieșiri de la octetul inferior către octetul superior în timp ce se citește timerul T2 trebuie luate precauții software. Timerul T2 nu este încărcabil și este resetat de către semnalul RST sau de un front crescător la intrarea de semnal RT2, dacă intrarea a fost activată. RT2 este activat prin intermediul bitului T2ER (SFR – TM2CON.5).

Atunci când octetul cel mai puțin semnificativ al timerului depășește, sau atunci când are loc o depășire pe 16 biți, se poate genera o cerere de întrerupere. Una sau ambele dintre aceste depășiri pot fi programate pentru a solicita o întrerupere. Atunci când octetul inferior (TML2) depășește, se setează flagul T2BO (TM2CON), iar flagul T2OV (TM2IR) este setat când depășește octetul superior (TMH2). De notat că atunci când T2OV este setat, T2BO va fi de asemenea setat. Pentru a activa întreruperile la depășirea octetului inferior trebuie setați biții ET2 (IEN1.7 – activare întrerupere la depășire, fig. 2.2) și T2IS0 (TM2CON.6 – selecție întrerupere la depășire octet). Bitul T2BO (TM2CON.4) este flagul de depășire octet al timerului T2.

Pentru a valida întreruperea la depășirea de 16 biți, trebuie să fie setați biții ET2 (IEN1.7 – activare întrerupere la depășire) și T2IS1 (TM2CON.7 – selecție întrerupere la depășire 16 biți). Pentru a activa atât întreruperile la depășirea de octet cât și la 16 biți, trebuie setați T2IS0 și T2IS1, fiind solicitate două rutine de întrerupere. Un test al flagurilor de depășire va indica rutina care va trebui să fie executată. Pentru fiecare rutină trebuie șters numai flagul corespunzător depășirii.

Timerul T2 poate fi resetat de un front crescător la RT2 (P 1.5) dacă este setat bitul de reset extern al timerului T2 (T2ER) din TM2CON. Acest reset șterge de asemenea și circuitul de prescalare. În modul "mers în gol", timerul numărător și circuitul de prescalare sunt resetate și oprite. Timerul T2 este controlat de registrul de funcții speciale TM2CON (fig. 2.3).

Fig. 2.2 Registrul de activare a întreruperilor timerului T2 (IEN1) – adresabil la nivel de bit

Fig. 2.3 Registrul de control al timerului T2 (TM2CON)

1.4.2 Extensia timerului T2: Atunci când se folosește un oscilator de 12 MHz, o depășire la 16 biți a timerului T2 are loc la fiecare 65.5, 131, 262 sau 524 ms, funcție de factorul de divizare al circuitului de prescalare; ca urmare, valoarea maximă a ciclului de timp este de aproximativ 0.5 secunde. În aplicații în care ciclurile de timp sunt mai mari de 0.5 secunde, este necesar să se extindă timerul T2. Acest lucru este realizat prin selectarea valorii fOSC / 12 ca sursă de clock (T2MS0 = setat, T2MS1 = resetat), setând factorul de divizare al circuitului de prescalare la 1/8 (set T2P0, set T2P1), dezactivând întreruperile la depășirea de octet (reset T2IS0) și activând întreruperea la depășirea de 16 biți (set T2IS1).

1.4.3 Timerul T2. Logica de captură și de comparare. Timerul T2 este conectat la 4 registre de captură de 16 biți. Un registru de captură poate fi utilizat pentru a "captura"conținutul timerului T2, când are loc o tranziție la pinul său de intrare corespunzător. Un registru de comparare poate fi utilizat pentru a seta, reseta sau inversa prin basculare pinii de ieșire ai portului 4 la intervale de timp programabile.

Timerul T2 și logica de captură și comparare sunt prezentate în fig. 2.4.

Fig. 2.4 Schema bloc a timerului 2

1.4.4 Logica de captură. Cele patru registre de 16 biți la care este conectat timerul T2 sunt: CT0, CT1, CT2 și CT3. Aceste registre sunt încărcate cu conținutul timerului T2, iar o întrerupere este cerută la recepționarea ei la una din intrările de semnal CT0I, CT1I, CT2I, CT3I. Aceste semnale sunt partajate cu portul 1. Aceste patru flaguri de întreruperi sunt în registrul de întreruperi al timerului T2 (registrul de funcții speciale TM2IR). Dacă facilitatea de captură nu este utilizată, aceste intrări pot fi privite ca intrări suplimentare de întreruperi externe.

Folosind registrul de control al capturii CTCON (fig. 2.5), aceste intrări pot realiza captura pe un front crescător, un front căzător sau fie pe un front crescător sau căzător. Intrările sunt eșantionate pe durata S1P1 a fiecărui ciclu. Când se detectează frontul selectat, conținutul timerului T2 este capturat la sfârșitul ciclului.

1.4.5 Măsurarea intervalelor de timp folosind registrele de captură. Atunci când un eveniment extern care se repetă este reprezentat sub forma unui front crescător sau descrescător la unul din cei patru pini de captură, timpul dintre două evenimente poate fi măsurat folosind timerul T2 și un registru de captură. Când un eveniment are loc, conținutul timerului T2 este copiat în registrul de captură corespunzător și se generează o cerere de întrerupere. Rutina de servire a întreruperii poate calcula intervalul de timp dacă se cunoaște conținutul precedent al timerului T2 când a avut loc ultimul eveniment. Cu un oscilator de 12 MHz, timerul T2 poate fi programat să depășească la fiecare 524 ms. Atunci când intervalul de timp între evenimente este mai scurt decât această valoare, calcularea intervalului de timp este simplă, iar rutina de servire a întreruperii este scurtă. Pentru intervale de timp mai lungi, trebuie utilizată o rutină de extensie a timerului T2.

1.4.6 Logica de comparare. De fiecare dată când timerul T2 este incrementat, se compară conținutul celor trei registre de comparare de 16 biți cu noua valoare numărată în timerul T2. Când se constată o egalitate (o coincidență a valorilor), flagul corespunzător al întreruperii este setat în registrul TM2IR la sfârșitul ciclului următor. Când are loc o coincidență cu CM0, controlerul setează biții 0 – 5 ai portului 4, dacă biții corespunzători din registrul de activare a setării STE sunt la nivel logic "1".

Când are loc o coincidență cu registrul CM1, controlerul resetează biții 0 – 5 din portul 4 dacă biții corespunzători ai registrului de activare a resetării / basculării RTE sunt la nivel "1" logic (fig. 2.6 pentru registrul RTE). Dacă RTE este "0", atunci P4.n nu este afectat de o împerechere între registrul CM1 sau CM2 și timerul T2. Când are loc o coincidență, controlerul basculează biții 6 și 7 din portul 4 dacă biții corespunzători din RTE sunt "1" logic. Latchurile portului pentru biții 6 și 7 nu sunt basculate. Două bistabile suplimentare încarcă ultima operație și de fapt aceste bistabile vor fi basculate.

Astfel, dacă operația curentă este "set", următoarea operație va fi "reset", chiar dacă latchul portului este resetat prin software înainte ca operația "reset" să aibă loc. Prima basculare după un reset va seta latchurile portului. Conținutul acestor două bistabile poate fi citit la STE.6 și STE.7 (corespunzând la P4.6, respectiv P4.7). Biții STE.6 și STE.7 sunt numai "citire" (fig. 2.7 pentru registrul STE). Un "1" logic indică faptul că la următoarea basculare se va reseta latchul din port. CM0, CM1 și CM2 sunt resetate de semnalul RST.

Informația modificată în latchul portului apare la pinul portului pe durata S5P1 al ciclului mașină următor celui în care s-a produs coincidența. Dacă portul este modificat prin software, ieșirile se schimbă pe durata S1P1 a ciclului următor. Fiecare bit al portului 4 poate fi setat sau resetat prin software la orice moment de timp. O modificare hardware, rezultând din coincidența cu un comparator ia precedență în raport cu o modificare software în același ciclu. Când rezultatul comparării necesită un "set" și un "reset" în același timp, latchul portului va fi resetat.

Fig. 2.5 Registrul de control al capturii (CTCON)

Fig. 2.6 Registrul de activare resetare / basculare (RTE)

Fig. 2.7 Registrul de activare al setării (STE)

1.4.7 Registrul flagurilor de întreruperi ale timerului T2 (TM2IR). Opt din nouă flaguri de întreruperi ale timerului T2 sunt localizate în registrul de funcții speciale TM2IR ( fig. 2.8). Al nouălea flag este TM2CON.4. Flagurile CT0 și CT1 sunt setate pe durata S4 a ciclului în care conținutul timerului T2 este capturat. CT0I este scanat de logica de întreruperi pe durata S2, iar CT1I este scanată pe durata S3. CT2I și CT3I sunt setați pe durata S6 și sunt scanați pe intervalele S4 și S5. Cererile de întrerupere asociate sunt recunoscute pe durata ciclului următor. Dacă aceste flaguri sunt verificate, o tranziție la CT0I sau CT1I va fi recunoscută un ciclu înaintea unei tranziții la CT2I sau CT3I, întrucât registrele sunt citite pe intervalul S5. Flagurile CMI0, CMI1 și CMI2 sunt setate pe perioada S6 a ciclului ce urmează unei coincidențe. CMI0 este scanat de logica de întreruperi pe durata S2; CMI1 și CMI2 sunt scanate pe perioadele S3 și S4. O coincidență va fi recunoscută de către logica de întreruperi (sau prin verificarea flagurilor) la două cicluri mașină după ce coincidența a avut loc.

Flagul de depășire la 16 biți (T2OV) și flagul de depășire pe octet (T2BO) sunt setați pe perioada S6 a ciclului în care a avut loc depășirea. Aceste flaguri sunt recunoscute de logica de întrerupere pe durata următorului ciclu.

Registrul de funcții speciale IP1 (fig. 2.8) este utilizat pentru a determina prioritatea întreruperilor timerului T2. Setarea unui bit la nivel HIGH, dă funcției o prioritate înaltă, iar setarea bitului la nivel LOW dă funcției o prioritate scăzută. Funcțiile controlate de către diferiți biți ai registrului IP1 sunt prezentate în fig. 2.8

Registrul flagurilor de întreruperi (TM2IR) – adresabil la nivel de bit

Registrul de priorități ale întreruperilor timerului T2 (IP1) – adresabil la nivel de bit

Fig. 2.8 Registrele TM2IR și IP1

1.5 Circuitele de reset

Circuitele de reset pentru 8XC552 sunt conectate la pinul RST. Pentru rejecția zgomotului la intrare se folosește un trigger Schmitt. Ieșirea triggerului Schmitt este eșantionată de către circuitul reset la fiecare ciclu mașină.

Un reset este realizat prin menținerea pinului RST la nivel HIGH pentru cel puțin două cicluri mașină (24 perioade oscilator) în timp ce oscilatorul funcționează. Unitatea centrală răspunde prin executarea unui reset intern. Pe timpul resetului ALE și PSEN dau la ieșire un nivel HIGH. În vederea realizării unui reset corect, acest nivel de reset nu trebuie să fie afectat de elementele externe. Linia RST poate de asemenea să fie trasă HIGH în mod intern printr-un tranzistor pullup activat de timerul watchdog T3. Lungimea impulsului de ieșire de la T3 este de 3 cicluri mașină. Un impuls de o durată așa scurtă este necesar pentru a reveni dintr-o eroare de procesor sau sistem cât mai rapid posibil.

De notat că impulsul de reset scurt de la timerul T3 nu poate descărca condensatorul de reset de la punerea sub tensiune. Ca urmare, când timerul watchdog este folosit de asemenea pentru a seta dispozitive externe, această structură cu condensator nu trebuie conectată la pinul RST și trebuie folosit un circuit distinct pentru a realiza operația de reset la punerea sub tensiune. O depășire de timer T3, dacă acesta va fi activat, va forța o condiție de reset pentru 8XC552 printr-o conexiune internă, chiar dacă ieșirea RST este conectată LOW sau nu este conectată.

Resetul intern este executat pe durata celui de–al doilea ciclu în care RST este HIGH și este repetat la fiecare ciclu până când RST trece la nivel LOW. El lasă registrele interne după cum se prezintă in tabelul 2.2 (anexă)

1.6 Întreruperi

1.6.1 Descrierea întreruperilor timer T2.

8XC552 are 15 surse de întreruperi, fiecăreia putându-i fi atribuit unul din două nivele de prioritate, așa cum se prezintă în fig. 2.9 (Anexă). Cele cinci surse de întrerupere comune cu circuitul 80C51 sunt întreruperile externe ( și ), întreruperile timerului 0 și ale timerului 1 (IT0 și IT1) și întreruperea serială (RI sau TI). Întrucât subsistemul care creează aceste întreruperi este identic în ambele circuite, funcționalitatea lor este identică ca aspect. Singurele diferențe sunt locațiile pentru registrele de activare și de prioritate, configurațiile și structura priorităților. Mai jos se detaliază aceste aspecte, împreună cu caracteristicile întreruperilor unic specifice pentru 8XC552.

8 întreruperi ale timerului T2 sunt generate de flagurile CTI0 – CTI3, CMI0 – CMI2 și de logica OR a flagurilor T2OV și T2BO. Flagurile CTI0 la CTI3 sunt setate de semnalele de intrare CT0I la CT3I. Flagurile CMI0 la CMI2 sunt setate când are loc o coincidență între conținutul timerului T2 și a registrelor de comparare CM0, CM1 și CM2. Când are loc o depășire pe 8 biți sau pe 16 biți, flagurile T2BO, respectiv T2OV sunt setate. Aceste nouă flaguri nu sunt șterse prin hardware și trebuie resetate prin software pentru a permite întreruperi repetate.

1.6.2 Registre de activare a întreruperilor. Fiecare sursă de întrerupere poate fi activată în mod individual sau dezactivată prin setarea sau ștergerea unui bit în registrele de funcții speciale de activare a întreruperilor IEN0 și IEN1. Toate sursele de întrerupere pot fi de asemenea activate sau dezactivate în mod global prin setarea sau ștergerea bitului EA din IEN0. Registrele de activare a întreruperilor sunt descrise în fig. 2.11 și 2.12.

Fig. 2.11 Registrul de activare a întreruperilor (IEN0)

Fig. 2.12 Registrul de activare a întreruperilor timerului T2 (IEN1)

1.6.3 Structura de prioritate a întreruperilor. Fiecărei surse de întrerupere i se poate atribui unul din două nivele de prioritate. Nivelele de prioritate a întreruperilor sunt definite de registrele de funcții speciale a priorităților întreruperilor IP0 și IP1. IP0 și IP1 sunt prezentate în fig. 2.13 și 2.14.

Nivelele de prioritate a întreruperilor sunt după cum urmează:

"0" – prioritate scăzută

"1" – prioritate înaltă

O întrerupere cu nivel scăzut de prioritate poate fi întreruptă de o întrerupere de nivel înalt. O întrerupere de nivel înalt nu poate fi întreruptă de nici o altă sursă de întrerupere. Dacă apar simultan două cereri de întreruperi pe nivele de prioritate diferite, este servită cererea cu nivel de priorate înalt. Dacă se primesc simultan cereri pe același nivel de prioritate, o secvență de testare internă (polling) va determina care cerere va servită. Astfel, în interiorul fiecărui nivel de prioritate, există o a doua structură de prioritate, determinată de secvența de polling. Structura de priorate din interiorul nivelului de mai sus este folosită numai când există cereri simultane de același nivel de prioritate.

1.6.4 Manevrarea întreruperilor. Sursele de întrerupere sunt eșantionate la momentul S5P2 al fiecărui ciclu mașină. Eșantioanele sunt verificate pe durata următorului ciclu mașină. Dacă unul din flaguri a fost într-o condiție de stare de setare la momentul S5P2 al ciclului mașină anterior, ciclul de polling îl va identifica și sistemul de întreruperi va genera un LCALL la rutina de servire corespunzătoare, cu condiția că acest LCALL generat hardware nu este blocat de oricare din următoarele condiții:

O întrerupere de prioritate mai înaltă sau egală în desfășurare;

Ciclul mașină curent nu este ciclul final în executarea instrucțiunii în desfășurare (nici o cerere de întrerupere nu va fi servită până când instrucțiunea în curs de execuție nu este completată);

Instrucțiunea în curs este RETI sau orice acces la registrele de prioritate a întreruperilor sau de activare a întreruperilor (nu va fi servită nici o întrerupere după RETI sau după o citire sau scriere în IP0, IP1, IE0 sau IE1, până când cel puțin o altă instrucțiune ulterioară nu a fost executată).

Fig. 2.13 Registrul de prioritate a întreruperilor (IP0)

Fig. 2.14 Registrul de prioritate a întreruperilor (IP1)

Ciclul polling este repetat cu fiecare ciclu mașină, iar valorile testate sunt valorile existente la momentul S5P2 al ciclului mașină precedent. De notat faptul că un flag de întrerupere este activ, dar nu i se răspunde din cauza condițiilor de mai sus și dacă flagul este inactiv când condiția de blocare a fost îndepărtată, atunci întreruperea blocată nu va mai fi servită. Astfel, faptul că flagul de întrerupere a fost odată activ, dar nu a fost servit, nu se memorează. Fiecare ciclu polling este unul nou.

Procesorul confirmă o cerere de întrerupere prin executarea unui LCALL generat hardware la rutina de servire corespunzătoare. În unele cazuri el șterge de asemenea flagul care a generat întreruperea, iar în alte cazuri nu. El șterge flagurile pentru timerul 0, timerul 1 și întreruperi externe. Un flag de întrerupere externă (IE0 sau IE1) este șters numai dacă a fost activat pe front. Toate celelalte flaguri de întrerupere nu sunt șterse hardware și trebuie șterse software. Instrucțiunea LCALL salvează în stivă conținutul contorului de program (dar nu salvează cuvântul de stare program PSW) și reîncarcă contorul de program cu o adresă ce depinde de sursa întreruperii ce este vectorizată, așa cum se prezintă în tabelul 2.3.

Executarea programului continuă de la adresa vectorului, până când este întâlnită instrucțiunea RETI. Instrucțiunea RETI șterge bistabilul "nivel de prioritate activ" care a fost setat când această întrerupere a fost confirmată. Apoi extrage din stivă cei 2 octeți plasați cel mai sus și reîncarcă contorul de program. Executarea programului întrerupt continuă din punctul în care a fost întrerupt.

Tabelul 2.3 Adresele vectorilor de întrerupere

1.7 Structura porturilor I/O

8XC552 are șase porturi de 8 biți. Fiecare port constă dintr-un latch (registru de funcții speciale P0 la P5), un buffer de intrare și un driver de ieșire (numai porturile 0 la 4). Porturile 0 – 3 sunt aceleași ca la 80C51, cu excepția funcțiilor suplimentare ale portului 1. Funcționarea paralel a portului 4 este identică cu a porturilor 1, 2 și 3. Portul 5 poate fi numai port de intrare.

Un latch de bit corespunde unui bit din porturile registrelor de funcții speciale și este reprezentat de un bistabil tip D. Un semnal "scrie în latch" de la unitatea centrală va "zăvorî" un bit de pe magistrala internă, iar un semnal "citește latch", semnalul de la unitatea centrală plasează ieșirea Q a bistabilului pe magistrala internă. Un semnal "citește pin" de la unitatea centrală plasează nivelul prezent la pinul portului pe magistrala internă. Anumite instrucțiuni de citire în port citesc nivelele prezente la pinii portului, alte instrucțiuni citesc conținuturile latchurilor (registre de funcții speciale).

În tabelul 2.4 din anexa este prezentată structura porturilor intrare / ieșire și funcții alternative ale acestora.

1.8 Organizarea memoriei

Organizarea memoriei pentru 8XC552 este aceeași ca pentru 80C51, cu excepția faptului că 8XC552 are 8 kROM, 256 octeți RAM și registrele de funcții speciale adiționale. Modurile de adresare sunt aceleași pentru 8XC552 și 80C51. Detalii asupra diferențelor sunt date în următoarele paragrafe.

În circuitul 8XC552, partea inferioară de 8k din spațiul adresei de memorie de 64 k este ocupată de ROM-ul intern. Prin conectarea pinului la nivel HIGH, procesorul preia instrucțiuni de la memoria program ROM internă. Expansiunea magistralei pentru accesarea memoriei program de la 8 k în sus este automată, întrucât preluarea instrucțiunilor externe se desfășoară automat atunci când contorul de program depășește valoarea 8191. Dacă pinul este conectat la nivel LOW, tot programul este preluat de la memoria externă. Viteza de execuție pentru 8XC552 este aceeași indiferent dacă preluarea instrucțiunilor se face de la memoria program internă sau externă. Dacă toată stocarea este on-chip, atunci locația octetului 8191 trebuie lăsată liberă pentru a preveni un proces de pre-aducere nedorit de la adresa memoriei program externă 8192.

Câteva locații din memoria program sunt rezervate pentru operații speciale de program. Locațiile 0000H la 0002H sunt rezervate pentru programul de inițializare. După reset, unitatea centrală începe executarea programului de la locația 0000H. Locațiile 0003H la 0075H sunt rezervate pentru 15 rutine de servire a întreruperilor.

Din punct de vedere funcțional, memoria de date interne este partea cea mai flexibilă din spațiul de adresă. Spațiul intern al memoriei de date este subdivizat într-un spațiu de adresă de 256 octeți de date interne RAM și un spațiu de adresă de 128 octeți al registrelor de funcții speciale.

Spațiul de adresă al memoriei interne RAM este de la 0 la 255. Patru bancuri de registre de 8 biți ocupă locațiile 0 la 31; 128 locații de bit ale memoriei interne RAM sunt accesibile prin adresare directă. Acești biții sunt cuprinși în 16 octeți de memorie internă RAM la locațiile 20H la 2FH. Stiva poate fi localizată oriunde în spațiul de adresă al memoriei interne RAM prin încărcarea indicatorului de stivă de 8 biți. Înălțimea stivei poate fi de maximum 256 octeți.

Spațiul de adresă al registrelor de funcții speciale este 128 la 255. Toate registrele, cu excepția contorului de program și toate cele patru bancuri de registre de 8 biți sunt plasate în acest spațiu. Maparea memoriei pentru registrele de funcții speciale le permite acestora să fie accesate la fel de ușor precum RAM-ul intern și, ca și acesta, pot fi operate prin mai multe instrucțiuni. Cele 56 registre de funcții speciale în spațiul de adresă al registrelor de funcții speciale este prezentată în fig. 2.15.(anexă)

1.9 Conectarea unui modul de afișare cu cristale lichide

1.9.1. Prezentare generală.

Există mai multe tipuri de module de afișare cu cristale lichide care diferă între ele prin:

– numărul de linii pe care se face afișarea: 1 sau 2,

– numărul de caractere pe linie: 16, 20, 24, 32 sau 40,

Toate, însă, au câteva caracteristici comune:

– încorporează circuite de comandă LSI,

– au aceeași interfață cu exteriorul ceea ce înseamnă că se comandă la fel,

– au aceleași comenzi,

– au aceeași codificare pentru date, (ASCII).

Un modul de afișare cu cristale lichide poate fi conectat la o magistrală de date de 4 sau 8 biți. Dacă se folosește o magistrală de 4 biți, liniile D0-3 nu sunt folosite.

Modulul dispune de o memorie pentru afișare, DDRAM, având capacitatea de 80 octeți, corespunzător posibilităților maxime de afișare, 2 * 40 caractere, în care se memorează codurile caracterelor primite de la unitatea centrală.

Codul unui caracter este transformat într-o matrice de 5 * 7 puncte, corespunzătoare caracterului respectiv, care este afișată pe ecran. Transformarea se face prin intermediul unui generator de caractere, realizat cu o memorie ROM care conține octeții corespunzători la 160 matrici de 5 * 7 puncte.

Modulul mai conține un generator de caractere realizat cu o memorie RAM, CGRAM, având capacitatea de 64 octeți, prin intermediul căreia se pot defini 8 caractere utilizator, având dimensiunea de 5 * 8 puncte.

Pentru afișarea unui caracter este necesar ca unitatea centrală să trimită către modul adresa poziției pe care se va afișa cursorul și apoi codul caracterului. Matricea care îi corespunde, din CGRAM sau ROM, va fi afișată la adresa indicată.

Se poate comanda autoincrementarea sau autodecrementarea cursorului ceea ce înseamnă că nu mai este necesară transferarea adresei pentru fiecare caracter. De asemenea este posibilă deplasarea la dreapta sau la stânga a întregului ecran, ceea ce permite crearea efectului de rotire a informației pe ecran.

Tab. 1 prezintă comenzile unui modul de afișare cu cristale lichide:

Este necesară respectarea duratei de execuție a comenzilor.

În continuare vor fi descrise semnificațiile comenzilor. Prima semnificație corespunde valorii 1 a rangurilor iar a doua corespunde valorii 0 a rangurilor.

Ștergere ecran: are efectul de a șterge informația de pe ecran.

Inițializare: aduce cursorul în poziția inițială.

Setare mod introducere: setează modul de introducere a datelor. Semnificațiile rangurilor sunt următoarele:

I/ D: incrementare/ decrementare automată a adresei cursorului;

S: validează sau nu deplasarea ecranului.

Ecran on/ off: semnificațiile rangurilor sunt următoarele:

D: activare sau nu a ecranului;

C: activare sau nu a cursorului;

B: pâlpâire sau nu a matricei de puncte la poziția cursorului.

Deplasare ecran/ cursor: provoacă deplasarea ecranului sau a cursorului; semnificațiile rangurilor sunt:

S/ C: deplasare ecran sau cursor

R/ L: deplasare la dreapta sau la stânga.

Setare funcții: setează caracteristicile de lucru; semnificațiile rangurilor sunt următoarele:

DL: interfață pe 8 sau 4 biți;

N: număr de linii de pe ecran: 2 sau 1.

Setare adresă din CGRAM: câmpul ACG indică una din cele 64 locații din CGRAM în care se va înscrie un octet care face parte din matricea corespunzătoare unui caracter utilizator; la afișarea unui asemenea caracter, prima locație, dintr-un grup de 8, corespunde liniei de sus, următoarea locație corespunde liniei următoare.

Setare adresă din DDRAM: câmpul ADD indică adresa din DDRAM în care se va înscrie codul caracterului ce se va afișa; această adresă indică poziția cursorului; primei poziții din primul rând îi corespunde adresa 80H iar primei poziții din al doilea rând îi corespunde adresa A8H.

Citire adresă și indicator: citește adresa din numărătorul de program, care poate fi adresa unei locații din CGRAM sau din DDRAM, AC și indicatorul ce arată starea de ocupat/ liber a modulului de afișare, BF.

Scrie și afișează data: scrie data în CGRAM sau DDRAM; atunci când se scrie în CGRAM, doar celor 5 ranguri mai puțin semnificative, din fiecare octet, le vor corespunde puncte pe ecran; 1 înseamnă punct aprins iar 0 înseamnă punct stins.

Citește data: citește data din CGRAM sau DDRAM.

Tab.2 prezintă terminalele unui modul de afișare cu cristale lichide și semnificațiile lor.

Fig. 1 prezintă ciclurile de scriere, a, la modulul de afișare și de citire, b, din modulul de afișare.

Valorile tipice pentru timpii care intervin în diagrame sunt: tCYCE = min 1000 ns, tE = min 450 ns, tAS = min 140 ns, tAH = min 10 ns, tDSW = min 195 ns, tH = min 10 ns, tDDR = max 320 ns și tDHR = min 20 ns.

Fig. 1 Ciclurile de scriere, a și citire, b la/ de la un modul de afișare cu cristale lichide.

În cazul sistemului experimental cu microcontrolerul 80C552 a fost conectat un modul SHARP cu 2 linii * 24 caractere. Schema de conectare este prezentată în cadrul schemei generale a sistemului, iar în listingul sistemului sunt prezentate rutinele de comandă a modulului.

1.9.2 Descrierea sistemului de afișare tip LCD L2432

L2432 este un sistem de afișare dotat cu un afișor cu cristale lichide de tipul matricial cu puncte cu consum redus , contrast ridicat și unghi larg de vedere cu 2 x 24 caractere si un controler de comanda fabricat în tehnologie CMOS .

Fig. 2 Structura generala a sistemului L2432:

Caracteristici :

display cu cristale lichide , 2 x 24 caractere, matrice 5 x 7 puncte + cursor

factor de umplere 1/16

ROM generator de caractere pentru 192 de tipuri

RAM generator de caractere , pentru 8 tipuri de caractere speciale (scrise în program )

RAM afișare date 80 x 8 biți ( 80 de caractere maximum )

interfațare pe 4 sau 8 biți

posibilitate de citire de către sistemul cu microcontroler a RAM-ului afișare date și a RAM-ului generator de caractere

multiple funcții-instrucțiuni : ștergere afișaj, cursor la capăt, afișare ON/OFF, afișare caracter clipitor, deplasare cursor și deplasare afișaj

circuit oscilator inclus

alimentare de la o sursă +5v

circuit de reset automat la stabilirea alimentării încorporat

controler CMOS ( KS0066 )

domeniul temperaturilor de funcționare la C.

Fig. 3 Structura controlerului KS0066

1.10 Sistem de dezvoltare pentru aplicatii cu

microcontrolerul 80C552

IMC – 500 este un sistem realizat pe baza microcalculatorului CMOS 80C552 PHILIPS compatibil software cu familia de microprocesoare 8051, astfel conceput încât permite dezvoltarea rapidă a aplicațiilor in domenii diverse -automatizări industriale, aparate de măsură, industrie ușoară, medicină, automobile, domeniul casnic, etc.

Prețul de cost scăzut îl recomandă atât pentru produsele de serie cât și pentru prototipuri și unicate, în fig. l este prezentat modulul IMC – 500 iar în fig. 2 este prezentată schema bloc a modulului.

Fig. l

Utilizarea tehnologiei CMOS îl recomandă pentru aplicațiile care necesită un consum redus de energie și care necesită imunitate ridicată la perturbații.

în cazul utilizării componentelor electronice i cu gamă extinsă de temperatură modulul poate fi folosit pe echipamente care funcționează și la temperaturi negative.

IMC-500 este destinat in principal dezvoltării de programe. De regulă, adăugirile hardware necesare sânt minore (ex claviatura, afișoare LED sau LCD), ceea ce permite direcționarea efortului de elaborare indeosebi spre programe, de unde economie de bani și de timp, inclusiv prin unificarea din punct de vedere hardware a unor produse diverse.

CAPITOLUL 2

Implementarea soft a tasaturii matriciale

2.1 Descriere generala

Tastatura folosita este de tip „softkey” cu patru linii L0, L1, L2, L3si patru coloane C0, C1, C2, C3 ca in fig 1; la intersectia dintre linia Li ( i=0, 1, 2, 3) cu oricare din coloane Cj ( j=0, 1, 2, 3) se afla cate o tasta (contact normal deschis). Conectarea tastaturii la sistem se face prin intermediul a doua conectoare de la sistemul de dezvoltare: unul de intrare ( X16 ) la care sunt conectate linii L0, L1, L2, L3 si unul de iesire ( X15 ) la care sunt conectate coloanele C0, C1, C2, C3.

Fig.1

Functionarea tastaturii decurge astfel: initial se transmite nivelul 0 logic pe prima linie L0, iar pe liniile L1, L2, L3 este transmis nivelul 1 logic (linii inactive ). Daca nu este apasata nici o tasta conectata la linia L0 pe toate coloanele vom avea 1 logic , iar daca este apasata o tasta conectata la linia L0, atunci pe coloana corespunzatoare este 0 logic si 1 logic in rest. Daca este apasata o tasta conectata la linia L1, L2, sau L3 , atunci pe toate coloanele este 1 logic. In continuare se activeaza pe rand celelalte linii si se determina in mod asemanator tastele apasate, apoi procesul este reluat de la inceput.

Progamul de comanda activeaza pe rand liniile L0, L1, L2, L3 citeste valoarea numerica de pe coloanele C0, C1, C2, C3, determina codul tastei apasate si executa ramura de program corespunzatoare tastei.

2.2 Programul de inițializare

Programul începe cu includerea fișierului „REG552.INC” care conține declarații specifice microcontrolerului 80c552, referitoare la regiștri de funcții speciale, timer doi și trei, convertor analog- digital, convertor digital-analog, linii de pot cu funcții multiple, și alte diferențe față de 80C51

La începutul programului se află zona pentru inițializarea microcontrolerului. In aceasta zona se vor defini contorii care sunt pe un octet si bitii( flaguri ) care se vor folosi in program.

$ INCLUDE (REG552.INC)

CONTL EQU 62H ; CONTOR LINII

CTAS EQU 63H ; CONTOR COD TASTA

RTAS EQU 64H ; CONTOR DEPLASAE TASTA

BLIN BIT 00 ; FLAG BLOCARE BALEERE LINII

GC BIT 04 ; FLAG GENERARE COD TASTA APASTA

TA BIT 05 ; FLAG TASTA APASATA

Se declara zona de salt a programului la stabilirea alimentării sau la reset „8000H” de aici va începe să ruleze programul in memoria internă a microcontrolerului si adresa de deservire a întreruperii timerului T0.

ORG 8000H

SJMP START

ORG 8003H

JMP INTT0

In subrutina definită de eticheta „START” se incarca registrele timerului T0: TH0 si TL0 cu valoarea 03E8H, adica 1ms timp in care se interogheaza tastatura pentru a se verifica daca avem tasta apasata.Tot in aceasta subrutina se initializeaza contorii folositi in continuare in program.

In registrul de control mod timer\numarator(TMOD) se incarca valoarea 01H ceea ce inseamna ca se alege T0 ca timer si el functioneaza in modul 1(registrul timerului este configurat pe 16 biti)

ORG 8080H

START:

MOV CONTL,#03H

MOV CTAS,#00H

MOV RTAS,#00H

MOV TH0,#03H ;Incarc in timer T0 valoarea de 1ms

MOV TL0,#0E8H

MOV TMOD,#01H ;Se activeaza T0 ca timer si funcioneaza in modul 1 de

; functionare

SETB EA ;Activez intreruperile globale

2.3 Intreruperea timerului T0

In intreruperea timerului T0 se baleeaza o singura data tastatura si daca avem tasta apasata se genereaza un cod specific fiecarei taste.Acest cod generat se incarca la DPTR si programul se ramifica la o anumita rutina de unde se continua programul.

INTT0:

;se verifica daca avem setat bitul BLIN; daca acesta este setat inseamna ca la citirea tastaturii s-a gasit „tasta apasta” si programul sare la eticheta CITCOL

JB BLIN,CITCOL

MOV A,CONTL

CJNE A,#00H,SCRLIN1

MOV A,#00H

MOV CTAS,A

MOV A,#0EH

JMP SCRLIN4

;daca nu este setat bitul BLIN se verifica daca avem un 0 logic pe prima linie; daca da se incarca in CTAS valoarea 00H si in acumulator 0EH si sare la SCRLIN4 daca nu sare la urmatoarea linie avand eticheta SCRLIN1

SCRLIN1:

MOV A,CONTL

CJNE A,#01H,SCRLIN2

MOV A,#0CH

MOV CTAS,A

MOV A,#0DH

JMP SCRLIN4

; se verifica daca avem un 0 logic pe pe a doua linie; daca da se incarca in CTAS valoarea 0CH si in acumulator 0DH si sare la SCRLIN4 daca nu sare la urmatoarea linie avand eticheta SCRLIN2

SCRLIN2:

MOV A,CONTL

CJNE A,#02H,SCRLIN3

MOV A,#18H

MOV CTAS,A

MOV A,#0BH

JMP SCRLIN4

; se verifica daca avem un 0 logic pe pe a treia linie; daca da se incarca in CTAS valoarea 18H si in acumulator 0BH si sare la SCRLIN4 daca nu sare la urmatoarea linie avand eticheta SCRLIN3

SCRLIN3:

MOV A,CONTL

MOV A,#0FFH

MOV CONTL,A

MOV A,#24H

MOV CTAS,A

MOV A,#07H

JMP SCRLIN4

;la aceasta eticheta SCRLIN3 cu siguranta avem un 0 logic pe ultima linie

;se pregateste CONTL pentru o noua intergare a tastaturii incarcand-ul cu FFH si astfel la o instructiune INC el va trece in 00H

;in CTAS se incarca 24H si in acumulator 07H

SCRLIN4:

MOV DPTR,#0160H

MOVX @DPTR,A

INC CONTL

JMP CITCOL

;se incarca in DPTR valoarea 0160H care este valoarea de scriere pe linii si apoi se copie valoarea din acumulator la locatia RAM data de DPTR

CITCOL:

JNB TA,EK1

JMP EK2

;daca avem tasta apasata se sare la EK1 daca nu la EK2

EK1:

MOV DPTR,#0130H

MOVX A,@DPTR

MOV RTAS,A

ORL A,#0FH

ANL A,#0FFH

CJNE A,#0FFH,EK3

JMP SFAR

;se incarca in DPTR adresa 0130H care este adresa de citire pe coloane si valoarea gasita la aceasta adresa se incarca in acumulator

;se face operatia SAU logic cu valoarea din acumulator si 0FH iar rezultatul se salveaza in acumulator

;se efectueaza un SI logic cu valoarea FFH si acumulatorul rezultatul se salveaza in acumulator

;daca continutul din acumulator este FFH inseamna ca nu avem nici un 0 logic pe coloane, deci nici o tasta apasata si se sare la sfarsit

EK3:

SETB TA

SETB BLIN

MOV TH0,#0FFH

MOV TL0,#0FFH

JMP SFAR

;avem tasta apasata si se seteaza bitii pentru tasta apasata si blocare baleere linii

;se incarca in registrii timerului T0 valoarea maxima de 65ms pentru o intarziere suficienta executarii programului ce deserveste tastei apasate

EK2:

MOV DPTR,#0130H

MOVX A,@DPTR

MOV RTAS,A

ORL A,#0F0H

ANL A,#0FFH

CJNE A,#0FFH,EK4

JMP EK5

;se incarca in DPTR adresa 0130H care este adresa de citire pe coloane si valoarea gasita la aceasta adresa se incarca in acumulator

;se face operatia SAU logic cu valoarea din acumulator si 0FH iar rezultatul se salveaza in acumulator

;se efectueaza un SI logic cu valoarea FFH si acumulatorul rezultatul se salveaza in acumulator

;daca continutul din acumulator este FFH inseamna ca nu avem nici un 0 logic pe coloane, deci nici o tasta apasata si se sare la EK5 altfel sare la EK4

EK5:

CLR TA

MOV CC,#0AH

CLR GC

JMP SFAR

;sterge bitul TA si incarca contorul CC(contor cicluri baleere) cu 10 pentru a se verifica daca intradevar s-a apasat tasta sau a aparut un scurt contact datorita oscilatiilor mecanice

:se sare la sfarsit

EK4:

JB GC,SFAR

MOV TH0,#03H

MOV TL0,#70H

DEC CC

MOV A,CC

CJNE A,#00H,SFAR

CALL GENCOD

SETB GC

MOV CC,#0AH

JMP SFAR

;daca bitul GC (cod generat) nu este setat se se incarc iar in T0 o intarziere de 1ms

; daca au trecut 10 cicluri de testare atunci se se apeleaza rutina de generare cod tasta

SFAR:

RETI

;la eticheta SFAR se revine din intrerupere

GENCOD:

MOV A,RTAS

RRC A

JNC SFGC

MOV RTAS,A

MOV A,CTAS

ADD A,#03H

MOV CTAS,A

MOV A,RTAS

RRC A

JNC SFGC

MOV RTAS,A

MOV A,CTAS

ADD A,#03H

MOV CTAS,A

MOV A,RTAS

RRC A

JNC SFGC

MOV A,CTAS

ADD A,#03H

MOV CTAS,A

JMP SFGC

SFGC:

MOV DPTR,#TABTAS

MOV A,CTAS

JMP @A+DPTR

;se incarca in DPTR adresele din tabel si se aduna la aceste adrese saltul la fiecare fiecere din acestea prin adunarea codului tastei apasate

TABTAS:

JMP SCADFRECV

JMP CRESTFRECV

JMP CRESTDIMP

JMP SCADDIMP

JMP SCADFRECV

JMP CRESTFRECV

JMP CRESTDIMP

JMP SCADDIMP

JMP SCADFRECV

JMP CRESTFRECV

JMP CRESTDIMP

JMP SCADDIMP

JMP SCADFRECV

JMP CRESTFRECV

JMP CRESTDIMP

AJMP SCADDIMP

Anexa

Organigrama programului principal

Tabelul 2.1 Registrul de funcții speciale 8XC552

* registre de funcții speciale adresabile la nivel de bit; # registre de funcții speciale modificate față de 80C51

Tabelul 2.2 starea regiștrilor după reset.

Tabelul 2.4 Porturile intrare / ieșire

Fig. 2.9 Structura nivelurilor de prioritate.

Fig. 2.15 Maparea registrelor de funcții speciale

Tab.3 prezintă caracterele generate prin intermediul memoriei ROM.

Similar Posts