|
Macrouri folosite in programe
Exemplele din sectiunile urmatoare ale acestui capitol utilizeaza deseori WAIT, WAITx si PRINT, de aceea ele vor fi explicate in detaliu. Macrourile WAIT, WAITx Fisierul Wait.inc contine doua macrouri: WAIT si WAITx. Prin intermediul acestor macrouri este posibil sa repartizam intarzieri de timp in intervale variate. Amandoua macrouri folosesc depasirea contorului TMR0 ca un interval de timp de baza. Prin schimbarea prescaler-ului putem schimba lungimea intervalului depasirii contorului TMR0.
Daca folosim un oscilator (rezonator) de 4MHz, pentru valorile prescaler-ului 0,1 si 7 care divid ceasul de baza al oscilatorului, intervalul urmat de o depasire a contorului TMR0 va fi 0.512, 1.02 si 65.3ms. Practic, aceasta inseamna ca cea mai mare intarziere va fi 256x65.3ms care este egala cu 16.72 secunde.
Pentru a utiliza macrouri in programul principal este necesar sa declaram variabilele wcycle si prescWAIT dupa cum vom vedea in exemplele ce vor urma acestui capitol. Macroul WAIT are un singur argument. Valoarea standard atribuita prescaler-ului acestui macro este 1 (1.02ms), si nu poate fi schimbata.
WAIT timeconst_1
timeconst_1 este un numar de la 0 la 255. Prin multiplicarea acestui numar cu perioada de timp de depasire (overflow) vom obtine durata totala a intarzierii: TIME = timeconst_1 x 1.02ms.
Exemplu: WAIT .100
Exemplul arata cum sa obtinem o intarziere de 100x1.02ms, sau durata totala de 102ms.
Spre deosebire de macroul WAIT, macroul WAITX mai are un argument care poate atribui o valoare prescaler-ului. Macroul WAITX are doua argumente:
timeconst_2 este un numar de la 0 la 255. Prin multiplicarea acestui numar cu perioada de timp de depasire (overflow) vom obtine durata totala a intarzierii: TIME = timeconst_1 x 1.02ms x PRESCext.
PRESCext este un numar de la 0 la 7 care seteaza relatia dintre tact si timer-ul TMR0.
Exemplu: WAITX .100,7
Exemplul arata cum sa obtinem o intarziere de 100x65.3ms, sau durata totala de 653ms.
Macroul PRINT
Macroul PRINT este localizat in fisierul Print.inc. El usureaza lucrul pentru trimiterea unui sir de date la unul dintre dispozitivele de iesire, cum ar fi: LCD, RS232, imprimanta matricialaetc. Cea mai usoara cale pentru a forma o serie este prin folosirea unei directive dt (define table). Aceasta instructiune memoreaza o serie de date in cadrul memoriei programului ca un grup de instructiuni retlw al carui operand este data din sir.
Modalitatea prin care o astfel de secventa este formata folosind instructiunea dt este aratata in urmatorul exemplu:
org 0x00
goto Main
String movwf PCL
String1 dt 'acesta este un sir 'ASCII'
String2 dt 'al doilea sir'
End
Main
movlw .5
call String
:
Prima instructiune dupa eticheta Main scrie pozitia unui membru al sirului in registrul W. Executam un salt cu instructiunea call la eticheta sirului unde pozitia membrului sirului este adunata la valoarea PC (Program Counter): PCL = PCL + W. In continuare avem in program counter o adresa a instructiunii retlw cu membrul dorit al sirului. In momentul in care aceasta instructiune este executata, membrul sirului va fi in registrul W, si adresa instructiunii care va fi executata dupa instructiunea call va fi in program counter. Eticheta end este o metoda eleganta de a marca adresa la care sirul se termina.
Macroul PRINT are cinci argumente:
PRINT macro Addr, Start, End, Var, Out
Addr este o adresa unde unul sau mai multe siruri (situate unul dupa altul) incep. Start este o adresa a primului membru al sirului. End este o adresa unde sirul se termina. Var este variabila care are rolul de a arata (pointa) membrii sirului. Out este un argument pe care il folosim pentru a trimite adresa rutinelor existente atribuite dispozitivelor de iesire cum ar fi: LCD, RS-232, etc.
Macroul PRINT scrie la iesire un sir "mikroElektronika" format
din caractere ASCII la un dispozitiv de afisare LCD. Sirul takes one part of program memory
incepand cu adresa 0x03.