Documente Academic
Documente Profesional
Documente Cultură
DUKA Adrian-Vasile
JOVREA Titus
Sisteme cu microprocesoare.
Microcontrolerul PIC18F4455
ndrumtor de laborator
2010
DUKA Adrian-Vasile
JOVREA Titus
Sisteme cu microprocesoare.
Microcontrolerul PIC18F4455
ndrumtor de laborator
2010
Cuprins
Prefa
Lucrarea 1
Lucrarea 2
19
Lucrarea 3
26
Lucrarea 4
Structuri de program
30
Lucrarea 5
Porturi de intrare-ieire
37
Lucrarea 6
Temporizri software
47
Lucrarea 7
Temporizri hardware
52
Lucrarea 8
PWM
61
Lucrarea 9
Convertorul analog-digital
68
Lucrarea 10
ntreruperi
79
Lucrarea 11
84
Lucrarea 12
Captura
97
Lucrarea 13
104
Anexa 1
111
Anexa 2
124
Anexa 3
127
laboratorului
Anexa 4
128
Anexa 5
131
limbajul de programare C
Anexa 6
18f4455.lkr
135
Anexa 7
136
Bibliografie
138
Prefa
MPLAB IDE este disponibil gratuit pentru descrcare pe pagina de web a productorului www.microchip.com
rspunsului aplicaiei la semnale externe, care ar putea proveni din arhitectura hardware a
sistemului final.
3. Dezvoltarea aplicaiilor
n MPLAB, manager-ul de proiecte controleaz ntregul proces de dezvoltare al
aplicaiilor. Pentru a crea cod executabil pe microcontrolere PIC, diferitele fiiere de tip cod
surs trebuie adugate unui proiect. Codul executabil va fi obinut utiliznd diferitele unelte
de limbaj disponibile n mediul de dezvoltare (assemblere, compilatoare, linkere etc.).
n general, toate proiectele vor parcurge urmtorii pai:
1. Selectarea dispozitivului utilizat.
Capacitile oferite de mediul MPLAB variaz n funcie de dispozitivul selectat.
Selectarea dispozitivului pentru care va fi dezvoltat aplicaia ar trebui realizat nainte
de nceperea proiectului.
2. Crearea proiectului.
Un utilitar denumit Project Wizard va coordona crearea proiectului.
3. Selectarea uneltelor de limbaj utilizate.
Project Wizard intervine i n procesul de selecie al uneltelor de limbaj. Pentru acest
tutorial se va considera assambler-ul i linker-ul integrat n mediul de dezvoltare. n
cazul altor proiecte se pot utiliza diferite compilatoare Microchip sau alte unelte
produse de teri.
4. Adugarea fiierelor n proiect.
Dou fiiere vor fi adugate n proiect: un fiier ablon (template) i un unificator
(linker script). Ambele fiiere exist ntr-un sub-director din cadrul directorului
MPLAB.
5. Crearea i editarea codului surs folosind editorul integrat.
6. Construirea proiectului. (build)
Prin asamblarea i linkeditarea fiierelor surs, proiectul va fi transformat n cod
main care va rula ulterior pe microcontrolerul selectat.
7. Testarea codului cu ajutorul unui simulator.
Utilitarul Project Wizard intervine n parcurgerea acestor pai.
Not:
Anumite aspecte ale interfeei utilizator se pot schimba ca urmare a lansrii de noi
versiuni ale acestui produs. Astfel unele capturi de ecran care apar n aceast lucrare
s-ar putea s nu fie identice n cazul noilor versiuni ale mediului de dezvoltare
MPLAB. Noi faciliti vor fi adugate pe msur ce componente adiionale vor fi
lansate pe pia, dar niciunul din aspectele descrise n aceast lucrare nu vor fi
nlturate. Asistena on-line este cea mai actualizat referin pentru versiunea
curent de MPLAB IDE
Dup apsarea butonului Finish, fereastra proiectului este vizibil n spaiul de lucru al
mediului MPLAB IDE. Dac fereastra care conine structura proiectului nu este deschis,
selectai afiarea acesteia din bara de meniu View>Project.
11
13
Uneltele de debug precum MPLAB ICE sau MPLAB ICD 2 permit executarea codului pe dispozitive reale.
Aceste unelte hardware folosite la testarea codului ofer aceleai faciliti cu ale simulatorului MPLAB SIM, dar
permit rularea aplicaiilor la viteza lor real, lucru care nu este posibil n cazul simulatorului acesta fiind
dependent de: viteza procesorului, sistemul de operare, complexitatea codului, numarul de procese active etc.
14
Poziionai cursorul deasupra butoanelor pentru a vedea o scurt descriere a funciilor acestora.
15
16
17
rulrii. De asemenea, se poate observa programul, dar i linia curent unde s-a ajuns cu
execuia.
Pentru vizualizarea stivei se poate folosi opiunea View>Hardware Stack.
4.5 Monitorizarea timpului de execuie
O alt facilitate de care dispune simulatorul MPLAB SIM permite monitorizarea
timpului de execuie al unei instruciuni, a timpului de execuie necesar execuiei unei rutine
sau chiar al programului. Debuggerul din MPLAB pune la dispoziie un modul denumit Stop
Watch (Figura 1.19) care se poate selecta din meniul Debugger>StopWatch.
18
19
Instruciunea MOVFF are ca operanzi dou adrese de 12 bii. La execuia acestei instruciuni se ignor registrul
BSR.
3
Este vorba mai ales despre instruciunile scurte (reprezentate pe 16 bii)
20
Register). Acest registru conine biii cei mai semnificativi ai adresei de 12 bii (BSR<3:0>),
ceilali 8 bii ai adresei fiind specificai n cadrul instruciunii.
Utilizarea registrului BSR mpreun cu adresa de 8 bii specificat prin intermediul
instruciunilor permite adresarea ntregii memorii, dar ridic i anumite inconveniente pe care
utilizatorul trebuie s le ia n considerare. Acesta trebuie s se asigure ntotdeauna c este
selectat bank-ul de lucru corect, pentru a se accesa datele din zona dorit de memorie. Aceste
inconveniente sunt mai evidente atunci cnd se dorete accesul la regitri speciali (care se
gsesc n Bank 15) pentru anumite configurri, lucru care presupune schimbarea bank-ului de
lucru, iar apoi revenirea la bank-ul curent de lucru n vederea utilizrii regitrilor de uz
general. Astfel, verificarea i/sau modificarea coninutului registrului BSR pentru fiecare
operaie de scriere sau citire a memoriei poate deveni foarte ineficient din cauza creterii
numrului de instruciuni i implicit al timpului de execuie al programului.
Aceast problem a fost rezolvat prin introducerea unei zone virtuale de memorie
denumit Access Bank, accesibil fr modificarea bank-ului. Aceast zon de memorie
mapeaz primii 96 de regitri GPR (din Bank 0) i cei 160 de regitri SFR (din Bank 15).
Accesarea memoriei RAM prin Bank-uri
Selectarea unui anumit bank se face utiliznd registrul special BSR. Pentru
modificarea coninutului acestui registru este disponibil o instruciune special: MOVLB (en.
Move Literal to BSR).
De exemplu, selectarea bank-ului 2 se poate realiza cu urmtoarea instruciune:
MOVLB
0x02
sau, lund n considerare c BSR este un simplu registru ca oricare altul, valoarea sa se poate
modifica i pe baza urmtoarei secvene de instruciuni:
MOVLW
0x02
MOVWF
BSR
Trebuie menionat faptul c toate instruciunile de lucru cu regitrii se aplic i asupra
registrului BSR.
Pentru a modifica valoarea primului registru din bank-ul 2 se poate utiliza urmtoarea
secven de cod:
;selectare Bank 2 (BSR = 2)
MOVLB
0x02
;accesare registrul 0x00 din Bank 2. Se utilizeaz BSR
CLRF
0x00, BANKED
BSF
0x00, 1, BANKED
Dup cum se poate observa din secvena anterioar de instruciuni, pentru a avea acces
la un registru din bank-ul 2, mai nti se ncarc BSR cu valoarea 2. Urmtoarele instruciuni
includ ca valoare a parametrului a4 flag-ul BANKED (a=1) care specific utilizarea adresrii
prin bank-uri a memoriei RAM i implicit formarea adresei locaiei accesate folosind cei 4
bii din BSR mpreun cu cei 8 bii din instruciune. n exemplul de mai sus 0x00 reprezint
adresa primului registru din bank-ul selectat.
Exemplu: instruciunea MOVWF h21,BANKED unde valoarea h21 reprezint cei 8 bii inferiori ai
adresei complete, ceilali 4 bii fiind specificai prin intermediul registrului BSR
4
RAM access bit. Bit din codul instruciunii cu urmtoarea funcionalitate
a = 0 (ACCESS): locaia de memorie RAM accesat se gsete n Access Bank (registrul BSR este
ignorat)
a = 1 (BANKED): se acceseaz o locaie de memorie din bank-ul specificat prin intermediul registrului BSR
21
acest parametru, varianta implicit este reprezentat de utilizarea Access Bank-ului. Astfel,
instruciunile anterioare scrise n forma urmtoare au acelai efect.
CLRF
TRISA
BSF
TRISA, 4
Utilizarea numelor simbolice
Noiunea de variabil de program presupune n varianta cea mai simpl o zon de
memorie care i poate modifica valoarea pe parcursul execuiei programului. Spre deosebire
de limbajele de nivel superior (cum ar fi limbajul C), unde localizarea exact n memorie nu
era cunoscut, n domeniul microcontrolerelor, utilizatorul are control total asupra
implementrii noiunii de variabil.
Astfel, manipularea variabilei se poate realiza fie utiliznd adresa ei fizic, fie prin
ataarea unui nume simbolic5 adresei respective. De exemplu, dac se consider o variabil
aflat n bank-ul 0, la adresa 2, pentru a iniializa variabila, se va utiliza secvena urmtoare
de program:
MOVLW
b10001100
MOVWF
0x02
Ataarea unui nume simbolic unei valori se face utiliznd cuvntul cheie EQU.
Valoarea respectiv reprezint doar un numr, care poate fi interpretat ca o variabil sau ca o
constant. De fapt, acest EQU este asemntor directivei #define din limbajul de
programare C, ceea ce nseamn c la compilare numele simbolice sunt nlocuite cu valorile
efective. n aceste condiii se recomand o atenie deosebit n utilizarea numelor simbolice
pentru a nu se face ncurcturi ntre numele simbolice care denot constante i cele care
denot variabile.
Prin introducerea numelor simbolice CONST i VAR, exemplul anterior devine:
; seciune constante
CONST
EQU
b10001100
; seciune variabile
VAR
EQU
0x02
; iniializare
MOVLW
CONST
MOVWF
VAR
; CONST WREG
; WREG VAR
De multe ori, apar situaii n care se dorete alocarea unui numr mare de variabile sau
utilizarea unor nume simbolice care au ataate o serie de valori n ordine cresctoare. n acest
context se poate utiliza un bloc de nume simbolice (constante), astfel:
CBLOCK 0x00
VAR1
VAR2
VAR3
VAR4
VAR5
ENDC
;valoare de start
;VAR1=0
;VAR2=1
;VAR3=2
;VAR4=3
;VAR5=4
Regitrii speciali au nume simbolice predefinite (WREG, PORTA etc.). Acestea sunt recunoscute n cadrul
proiectului, dac se include biblioteca asocit dispozitivului utilizat. n cazul microcontrolerului PIC18F4455,
codul surs va conine directiva #include P18F4455.inc
23
Utilizarea unui bloc de simboluri este echivalent cu utilizarea directivei EQU pentru
fiecare nume simbolic n parte.
3. Probleme propuse
P1. S se stocheze n registrul de lucru (WREG) valoarea zecimal 250. S se
decrementeze aceast valoare folosind o instruciune de decrementare. S se seteze bitul 3 i
s se reseteze bitul 5. S se roteasc la stnga de 3 ori biii registrului de lucru, iar apoi s se
incrementeze de o sut de ori rezultatul obinut. S se deplaseze la dreapta de 2 ori valoarea
rezultat, iar rezultatul final s se salveze n memorie la adresa 223h.
P2. S se declare 10 variabile, 5 n bank-ul 0, accesibile prin Access Bank i 5 n
bank-ul 1, accesibile prin BSR. Variabilele vor fi notate cu V0, V1, ..., V9. S se
stocheze n fiecare variabil cte o valoare la alegere. S se implementeze urmtoarele
operaii (n ordinea dat):
V0+V1+V5+V6 V6
V2-(V3+V4)+V7-V8 V8
(V8 XOR V9)* V6 V9
(( V9 >>> 3 ) XOR V0 ) << 2 V7
unde >>> reprezint rotire la dreapta, << reprezint deplasare la stnga, iar
reprezint destinaia rezultatului operaiei.
Indicaii
Pentru crearea proiectului asociat acestor aplicaii, precum i pentru realizarea
depanrii se va consulta Lucrarea 1;
Pentru identificarea instruciunilor necesare la realizarea aplicaiilor propuse se va
consulta Anexa 1 sau documentaia tehnic6 a microcontrolerului PIC18F4455;
n vederea testrii aplicaiilor i pentru a urmri corectitudinea operaiilor se va utiliza
simulatorul MPLAB SIM mpreun cu uneltele / ferestrele de vizualizare a regitrilor
speciali i a regitrilor de uz general. Aceste ferestre pot fi accesate selectnd
View>Special Function Registers, respectiv View>File Registers;
Se va acorda o atenie deosebit implementrii operaiilor de deplasare la stnga i la
dreapta, avnd n vedere faptul c instruciunile disponibile permit rotirea cu sau fr
bit de transport (en. carry), operaii al cror rezultat difer de cel al deplasrii;
Se va identifica rolul bitul de destinaiei al rezultatului (bitul d din codul instruciunii)
i se va folosi ca atare pentru implementarea corect a operaiilor;
Avnd n vedere c numele simbolice caracterizeaz doar nite valori numerice,
programul se va organiza astfel nct s se fac distincia clar ntre variabilele i
constantele utilizate.
24
0x00
FSR0L
0x02
FSR0H
Prin accesarea locaiilor de memorie se nelege realizarea unei operaii de scriere sau citire, n funcie de
instruciunea utilizat, asupra coninutului locaiei de memorie respective
25
0
Coninutul adresei stocate in FSR0H:FSR0L
INDF0
Figura 3.2. Structura registrului INDF0 corespunztor FSR0(FSR0H:FSR0L)
Regitrii INDFn sunt utilizai n instruciunile uzuale de manipulare a regitrilor, dup
cum se poate vedea i n Figura 3.3.
Utilizarea unei instruciuni avnd
registrul INDF1 ca operand.
Coninutul locaiei ECCh se va
aduna la registrul de lucru, iar
rezultatul va fi stocat la adresa
ECCh
Registrul FSR1 stocheaz adresa de
12 biti ECCh
27
Indicaii
Pentru calculul amprentei tabloului considerat se va realiza un program C, iar valoarea
obinut se va compara cu cea obinut prin intermediul aplicaiei cu microcontroler.
Cele dou valori trebuie s coincid;
Se va testa dac modificarea unui singur bit al Bank-ului 3 va determina modificarea
valorii hash-ului5;
n vederea testrii aplicaiilor i pentru a urmri corectitudinea operaiilor se va utiliza
simulatorul MPLAB SIM mpreun cu uneltele / ferestrele de vizualizare a regitrilor
speciali i a regitrilor de uz general. Aceste ferestre pot fi accesate selectnd
View>Special Function Registers, respectiv View>File Registers.
4
5
28
0x25, d128
29
Main:
CALL
Main
0x0F
TRISB
Setare_directie
;apelul subrutinei
30
2.3 Tablouri
Pentru gruparea datelor n structuri denumite tablouri, se poate folosi una din metodele
urmtoare: instruciuni microprocesor, adresarea indirect, instruciuni tabelare.
2.3.1 Implementarea tablourilor folosind instruciuni microprocesor
Aceast metod presupune stocarea valorilor tabloului n memoria program, i se
utilizeaz atunci cnd valorile respective nu se modific (tablou de constante). Metoda are
avantajul c permite stocarea unui numr mult mai mare de valori dect ar fi posibil prin
folosirea RAM-ului.
Dei exist mai multe variante de implementare, o metod foarte popular care poate fi
folosit n cazul microcontrolerelor din seria PIC18F, presupune instruciuni de manipulare a
numrtorului de program i instruciunea RETLW.
n continuare se prezint o subrutin care simuleaz un tablou cu 8 elemente. Accesul
la elementele tabloului se va realiza indexat, folosind ca variabil index registrul de lucru
WREG. Instruciunea RETLW face ca elementele tabloului s fie disponibile ulterior tot n
registrul de lucru.
INDEX
Tabel:
MULLW
MOVF
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
EQU
0x00
D2
PRODL, W
PCL, F
D101
D115
D90
D83
D85
D99
D150
D149
;variabila INDEX
;PRODH:PRODL 2*INDEX
;WREG PRODL
;PCL PCLinstr cur + WREG
;WREG D83
31
Astfel, pentru a returna valoarea corespunztoare unui anumit index, mai nti trebuie
nmulit index-ul respectiv cu 22 (rezultatul fiind stocat n PRODH:PRODL) dup care
rezultatul este adunat la numrtorul de program.
Instruciunea care va fi executat dup ADDWF PCL, F va avea adresa:
Adres_Instr_Urmtoare = $ + INDEX * 2,
unde $ reprezint adresa instruciunii curente (ADDWF PCL, F).
2.3.2 Implementarea tablourilor folosind instruciuni dedicate
O alt variant de implementare a tablourilor n memoria program o reprezint
folosirea instruciunilor tabelare. Astfel, pentru a citi i scrie memoria program sunt prevzute
dou operaii care permit procesorului s mute octei ntre memoria program i memoria de
date RAM:
Citirea tabelar: TBLRD
Scrierea tabelar: TBLWT
Operaiile de scriere i citire mut datele ntre cele dou spaii de memorie la nivel de
octet prin intermediul unui registru de 8 bii (TABLAT).
Registrul folosit pentru adresarea octeilor din memoria program este TBLPTR (en.
Table Pointer register). ntruct capacitatea de adresare a memoriei program este de pn la
2MByte pentru a putea forma adresa de 21 de bii necesar adresrii fiecrui octet, TBLPTR
este format din trei regitri speciali: Table Pointer Upper Byte, Table Pointer High Byte,
Table Pointer Low Byte (TBLPTRU:TBLPTRH:TBLPTRL)
Aceti regitri sunt utilizai de instruciunile TBLRD i TBLWT pentru accesarea
datelor din memoria program. Operaiile de citire tabelar extrag datele din memoria program
i le plaseaz n memoria de date RAM (Figura 4.1). n registrul special de 8 bii TABLAT se
transfer un octet din memoria program la execuia unei instruciuni de citire tabelar. Adresa
octetului citit trebuie introdus n prealabil n TBLPTR prin intermediul celor 3 regitri de
adres.
Prezena instruciunii de multiplicare cu 2 (MULLW D2) este justificat de faptul c instruciunea RETLW
este reprezentat n memoria program prin 2 octei.
32
low Tablou_valori
TBLPTRL
high Tablou_valori
TBLPTRH
upper Tablou_valori
TBLPTRU
Init_Adresa
TABLAT, W
33
Indicaii
Sugestie privind implementarea macroului de la problema P1
; zona de definire a constantelor care identific operaiile
SI
SAU_EXC
ADUNARE
SCADERE
EQU
EQU
EQU
EQU
D1
D2
D3
D4
; definitia macroului
dac
dac
dac
dac
operatie
operatie
operatie
operatie
=
=
=
=
SI
SAU_EXC
ADUNARE
SCADERE
Mem[203]
Mem[203]
Mem[203]
Mem[203]
=
=
=
=
Tablou[index1]
Tablou[index1]
Tablou[index1]
Tablou[index1]
&
^
+
-
Tablou[index2]
Tablou[index2]
Tablou[index2]
Tablou[index2]
endm
Dac se modific manual valorile din regitrii de adres trebuie avut grij la depirea valorii 255, cnd
trebuie modificat i registrul imediat superior
34
35
Nu toate porturile au dimensiunea de 8 bii (vezi Figura 5.1). De exemplu, portul E utilizeaz doar 3 bii
corespunztori pinilor RE0-RE2.
2
De exemplu, pinul 2 (RA0/AN0), care aparine portului A, poate funciona att ca pin digital de intrare / ieire
de uz general (RA0) sau ca pin de intrare analogic (AN0). Prin configurarea / iniializarea adecvat se va alege
funcionalitate potrivit aplicaiei realizate.
36
PORTA
CLRF
LATA
MOVLW
MOVWF
0x0F
ADCON1
MOVLW
MOVWF
07h
CMCON
;Oprire comparatoare
MOVLW
MOVWF
B11111100
TRISA
37
LIST P=18F4455
#include <P18F4455.INC>
;Adresa de reset
ORG 0x800
;Programul principal
Initializare_port:
CLRF
PORTD
CLRF
LATD
MOVLW
MOVWF
b'00000011'
TRISD
;tergere buffere
;configurare direcie pini
;RD0, RD1 intrri
;RD2, RD3 ieiri
Test_buton1:
BTFSS
GOTO
GOTO
PORTD, 0
;test buton legat pe pinul RD04
Buton1_apasat
Buton1_eliberat
Test_buton2:
BTFSS
GOTO
GOTO
PORTD, 1
;test buton legat pe pinul RD1
Buton2_apasat
Buton2_eliberat
Buton1_apasat:
BSF
LATD, 2
GOTO
Test_buton2
;aprinde LED15
Buton1_eliberat:
BCF
LATD, 2
GOTO
Test_buton2
;stinge LED1
Buton2_apasat:
BSF
LATD, 3
GOTO
Test_buton1
;aprinde LED2
Buton2_eliberat:
BCF
LATD, 3
GOTO
Test_buton1
;stinge LED2
;sfritul programului
END
Conform montajului din Figura 5.2, la apsarea unui buton se va citi valorea 0, iar atunci cnd butonul este
eliberat se citete valoarea 1
5
LED-urile se vor aprinde prin setarea (punerea pe 1) a bitului corespunztor
38
Se poate utiliza un timer pentru generarea acestui eveniment sau se pot utiliza temporizri software cuprinse n
cadrul unor bucle de tip for, caz n care listingul de mai sus poate suferi mici modificri.
39
40
41
Figura 5.11. Conectarea unui afiaj multiplexat de 7 segmente cu catod comun de 4 digii
LED-urile acestui tip de afisaj cu 7 segmente sunt active pe 1 logic. Catodul se va conecta la mas.
LED-urile acestui tip de afisaj cu 7 segmente sunt active pe 0 logic. Anodul se va conecta la o surs de
tensiune.
9
42
Figura 5.12. Conectarea unui afiaj multiplexat de 7 segmente cu anod comun de 4 digii
2.4 Simularea aplicaiilor utiliznd modulul Stimulus Controller
Debuggerul din MPLAB IDE permite nu numai simularea comportamentului
programului implementat, ci i simularea modificrii strii pinilor microcontrolerului n care
va rula programul. Acest lucru se realizeaz cu ajutorul modulului integrat din cadrul
debuggerului MPLAB SIM, denumit Stimulus Controller.
Acest modul permite simulatorului s aplice diveri stimuli n timp ce se realizeaz
depanarea codului (debugging). Se permite punerea pinilor pe nivel logic 1 sau 0 i se pot
modifica direct valorile din regitri pentru a putea simula ct mai bine comportamentul real al
sistemului.
Pentru a putea avea acces la modulul Stimulus Controller se alege mai nti din meniu:
Debugger>Select Tool>MPLAB SIM. Dup alegerea simulatorului, n meniul Debugger va
aprea opiunea Stimulus, iar pentru a crea un nou scenariu de simulare se va accesa
Debugger>Stimulus>New Workbook.
Fereastra deschis la selectarea acestei opiuni se prezint n Figura 5.13 i permite
configurarea strii porturilor microcontrolerului cu ajutorul stimulilor.
Stimulii asociai pinilor sunt definii de utilizator i se pot ncadra n dou categorii:
Asincroni10 Vor fi declanai de utilizator prin apsarea butonului Fire
Sincroni Pot aprea la intervale regulate de timp, constnd din succesiuni de
nivele de tensiuni nalte i joase (1, respectiv 0 logic) cu factor de umplere
configurabil
Pentru configurarea diverselor aciuni care pot fi asociate pinilor i nu numai, vor
trebui completate celulele corespunztoare coloanelor ferestrei. Acestea au urmtoarele
funcionaliti:
Fire: apsarea liniei din coloana Fire va duce la execuia aciunii configurate;
Pin/SFR: selectarea pinului sau bitului SFR a crui stare se va modifica;
Action: selectarea aciunii executate asupra pinului selectat:
10
Stimulii asincroni se folosesc de obicei la testarea aplicaiilor care utilizeaz butoane, deoarece apsarea unui
buton poate surveni oricnd n timpul execuiei unui program, fiind astfel un eveniment asincron.
43
44
Indicaii
Pentru implementarea pe microcontroler a aplicaiilor se va consulta Anexa 4.
Se va testa funcionarea corect a aplicaiilor folosind modulul Stimulus Controller.
n cazul problemelor P2 i P3 se vor realiza diagramele de activitate.
Se recomand ca iniializarea porturilor s fie cuprins n cadrul unei subrutine.
45
(6.1)
FOSC
unde: cu Ti s-a notat timpul de execuie al unui ciclu de instruciune, TOSC reprezint durata
unui microciclu instruciune, iar FOSC reprezint frecvena de lucru.
Indiferent de valoarea frecvenei de lucru, se observ c tactul este divizat cu 4 pentru
asigurarea celor 4 microcicluri necesari prelucrrii instruciunilor2.
Majoritatea instruciunilor sunt executate ntr-un ciclu de instruciune cu durata Ti . Acestea
sunt de regul instruciunile scurte (reprezentate n memoria program prin 2 octei = 16bii)
sau instruciunile care nu modific numrtorul de program (nu efectueaz salturi).
Instruciunile lungi (32 de bii) sau cele care modific numrtorul de program vor necesita
pentru execuie 2 sau chiar 3 cicluri de instruciune, n funcie de context3.
De exemplu, instruciuni precum MOVLW, BSF sau CLRF se execut ntr-un timp Ti ,
pe cnd instruciuni cum ar fi CALL sau GOTO se execut ntr-un timp 2 Ti . Pe de alt parte,
o serie de instruciuni de salt condiionat cum ar fi BTFSC, INCFSZ pot ajunge s se execute
chiar i n 3 cicluri de instruciune ( 3 Ti ), dac instruciunea respectiv va realiza salt peste o
instruciune lung.
Avnd n vedere c microcontrolerele suport foarte multe frecvene de lucru, iar
durata unui ciclu de instruciune este strict corelat cu aceast frecven, conform relaiei
(6.1), n continuare se va considera pentru frecvena de lucru o valoare des ntlnit n practic
FOSC = 20MHz.
Astfel, durata unui ciclu de instruciune Ti va fi:
Ti = 4 TOSC =
4
= 0.2 s
20 MHz
(6.2)
Frecvena de lucru poate fi generat fie de un oscilator extern (cristal de cuar) sau de o rezisten i un
condensator, fie de oscilatorul intern.
2
Sunt necesare 4 microcicluri att pentru faza de extracie ct i pentru cea de execuie a instruciunilor.
Arhitectura microcontrolerului bazata pe un pipeline pe 2 nivele pentru execuia instruciunilor asigur c la
fiecare 4 microcicluri se termin de executat o instruciune scurt.
3
Pentru detalii privind timpul de execuie al instruciunilor, recomandm cititorului s consulte documentaia
tehnic a microcontrolerului PIC18F4455, seciunea Instruction Set Summary sau Anexa 1 a acestei lucrri
46
2.1 Temporizare de 1s
Un exemplu de rutin care produce o ntrziere de 1 microsecund este urmtorul:
Delay1us:
NOP
RETURN
...
CALL
;0.2us
;0.4us
Delay1us
;0.4us
D'217'
V_DELAY
;0.2us
;0.2us
Delay1us
Delay1us
Delay1us
Delay1us
contor,F
Loop
;1us
;1us
;1us
;1us
;0.2us far salt/0.6us daca salt
;0.4us
;0.2us
;0.2us
;0.2us
;0.4us
Delay1ms
;0.4us
47
Delay10TCYx
ntrziere egal cu durata a 10 cicluri instruciune argument funcie
Funcia:
delays.h
Include:
void Delay10TCYx (unsigned char unit);
Prototip:
Argumente: unit
Valoare pe 8 bii. O valoare din domeniul [1,255] va determina o ntrziere
egal cu (unit*10)cicluri de instruciune (Ti). Valoarea 0 va determina o
ntrziere egal cu 2560Ti
Aceast funcie implementeaz ntrzieri cu durata egal cu multiplii de 10 a
Detalii:
timpului alocat unui ciclu instruciune.
Delay100TCYx
ntrziere egal cu durata a 100 cicluri instruciune argument funcie
Funcia:
delays.h
Include:
void Delay100TCYx (unsigned char unit);
Prototip:
Argumente: unit
Valoare pe 8 bii. O valoare din domeniul [1,255] va determina o ntrziere
egal cu (unit*100)cicluri de instruciune (Ti). Valoarea 0 va determina o
ntrziere egal cu 25600Ti
Aceast funcie implementeaz ntrzieri cu durata egal cu multiplii de 100 a
Detalii:
timpului alocat unui ciclu instruciune. Funcia se folosete de o variabil
global DelayCounter1. Astfel, dac funcia se utilizeaz att n programul
principal, ct i n rutine de tratare a ntreruperilor se recomand salvarea
variabilei la intrarea n rutina i refacerea ei la revenirea din rutin. Trebuie
48
// 5*1000*0.2us = 1ms
//50*100*0.2us = 1ms
49
3. Probleme propuse
P1. S se implementeze o rutin de temporizare care s genereze o ntrziere de 250
milisecunde. Se consider dou butoane legate pe PORTD<0:1>, dou LED-uri legate pe
PORTD<2:3> i 8 LED-uri legate pe PORTB. S se implementeze un program cu
urmtoarele funcionaliti:
ct timp nu este apsat nici un buton sau sunt apsate ambele butoane, LEDurile s plpie la intervale de 250 milisecunde;
ct timp butonul D0 este apsat, LED-urile s rmn aprinse;
ct timp butonul D1 este apsat, LED-urile s rmn stinse.
P2. S se implementeze o lumin dinamic (aprinderea succesiv a LED-urilor
conform unei secvene predefinite) pe cele 8 LED-uri conectate la PORTB. Se vor considera
dou temporizri selectabile prin butonul D0 i dou secvene diferite de aprindere a LEDurilor selectabile prin butonul D1.
P3. Folosind o rutin de temporizare care asigur o ntrziere de 250ms s se
incrementeze periodic valoarea afiat (0,1,2...9,0,...) pe un afisaj cu apte segmente conectat
la PORTB.
Indicaii
Pentru implementarea pe microcontroler a aplicaiilor se va consulta Anexa 4.
Temporizrile necesare vor fi realizate folosind rutinele de temporizare de 1s i 1ms
prezentate n cadrul acestei lucrri
n modul de simulare al aplicaiei (MPLAB SIM) se va utiliza unealta Stopwatch
pentru a vizualiza timpul de execuie al rutinelor de ntrziere astfel nct s se asigure
temporizri ct mai precise. Pentru detalii privind utilizarea modulului Stopwatch se
va consulta lucrarea nr. 1.
Se recomand ca n timpul simulrii s se fac apel i la modulul Stimulus Controller
pentru a se asigura o simulare ct mai complet nainte de implementarea pe
microcontroler.
nainte de implementare se va realiza diagrama de stare i de activitate a funcionrii
LED-urilor
Se recomand ca iniializarea porturilor s fie cuprins n cadrul unei subrutine.
n cazul problemei P3 s se identifice codurile corespunztoare cifrelor afiate pe cele
apte segemente.
50
T08BIT
T0CS
T0SE
PSA
T0PS2
T0PS1
Figura 7.1. Registrul T0CON: Timer0 Control Register
bit 0
T0PS0
n unele situaii este util ca timerul s nu se incrementeze la fiecare tact, ci doar la fiecare 2, 4, 16, ... 256,
tacturi recepionate. Situaia aceasta apare frecvent la necesitatea implementrii unor temporizri la nivel de
secund.
2
Cnd se face trecerea de la valoarea maxim (65535 cnd este numrtor de 16 bii, respectiv 255 cnd este
numrtor de 8 bii) la 0
51
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Biii 2-0
Accesarea valorii numrtorului se poate face prin instruciuni obinuite att pentru
scriere, ct i pentru citire, prin intermediul regitrilor TMR0L i TMR0H. Accesul la aceti
regitri se face n felul urmtor:
- Cnd Timer0 funcioneaz ca numrtor de 8 bii (T08BIT = 1), valoarea
numrtorului este accesibil n mod direct prin registrul TMR0L. n acest situaie
TMR0H nu se utilizeaz;
- Cnd Timer0 funcioneaz ca numrtor de 16 bii (T08BIT = 0), valoarea
numrtorului este accesibil prin cei doi regitri menionai anterior3. Astfel, TMR0H
va conine octetul superior al valorii, iar TMR0L va conine octetul inferior. La citirea
TMR0L, valoarea octetului superior se transfer n registrul TMR0H. Acest registru este
accesibil direct prin operaii normale de citire/scriere. La scrierea registrului TMR0L,
valoarea stocat n TMR0H se va transfera n octetul superior al timerului. Prin aceast
arhitectur, timerul permite un acces atomic la valoarea numrtorului pe 16 bii pe o
magistral de 8 bii4.
Timerul0 va genera o ntrerupere la depirea capacitii de numrare, atunci cnd
valoarea numrtorului trece de la FFh la 00h, n mod de lucru de 8 bii, sau de la FFFFh la
0000h n mod de lucru de 16 bii. Acest depire va fi semnalat prin setarea bitului
TMR0IF din registrul INTCON. Pentru a putea detecta o nou depire flag-ul de semnalizare
TMR0IF trebuie ters din program.
Accesarea valorii numrtorului se face prin 2 regitrii ntruct instruciunile microcontrolerului permit doar
citirea unor date de 8 bii. Astfel, cei 16 bii se vor accesa pe rnd n 2 etape.
4
ATENIE operaiile de scriere / citire trebuie s respecte ordinea menionat
52
4
FOSC
(7.1)
unde:
- Tdorita este durata temporizrii dorite
- NrIncr este numrul total de impulsuri care trebuie numrate pentru obinerea
temporizrii dorite
- Predivizor este valoarea predivizorului (se vor considera valorile predefinite posibile
Pr edivizor {1,2,4,8,16,32,64,128,256} )
-
Ti =
4
FOSC
53
;Oprirea timerului
;Tact intern
;utilizare predivizor
;predivizare 1:256
;numrtor 16bii
;init. Timer0 cu val 46004
;Stergerea flag-ului
;Pornirea timerului
LOOP_TESTARE:
BTFSS
INTCON, TMR0IF
GOTO LOOP_TESTARE
;Cnd se ajunge n acest punct, temporizarea s-a terminat
Bineneles, configurarea timerului se poate realiza i ntr-un singur pas, prin
specificarea valorii octetului care va trebui nscris n registrul T0CON.
n continuare, se prezint acelai exemplu de configurare, dar utiliznd limbajul de
programare C7.
T0CONbits.TMR0ON = 0;
T0CONbits.T0CS = 0;
T0CONbits.PSA = 0;
T0CONbits.TOPS2 = 1;
T0CONbits.TOPS1 = 1;
T0CONbits.TOPS0 = 1;
T0CONbits.T08BIT = 0
TMR0H = 0xB3;
TMR0L = 0xB4;
INTCONbits.TMR0IF = 0;
T0CONbits.TMR0ON = 0;
//Oprirea timerului
//Tact intern
//utilizare predivizor
//predivizare 1:256
//numrtor 16bii
//init. Timer0 cu val 46004
//Stergerea flag-ului
//Pornirea timerului
Pentru detalii privind dezvoltarea aplicaiilor pentru microcontroler folosind limbajul de programare C se
recomand consultarea Anexei 5.
54
Argumente:
config
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n usart.h
Activarea ntreruperii Timerului0:
Activarea ntreruperii
Dezactivarea ntreruperii
TIMER_INT_ON
TIMER_INT_OFF
Numrtor pe 8 bii
Numrtor pe 16 bii
Valoare predivizor:
T0_PS_1_1
T0_PS_1_2
T0_PS_1_4
T0_PS_1_8
T0_PS_1_16
T0_PS_1_32
T0_PS_1_64
55
T0_PS_1_128
T0_PS_1_256
Detalii:
Exemplu:
ReadTimerx
Citire valoare din Timerx
Funcia:
timers.h
Include:
unsigned int ReadTimer0 (void);
Prototip:
unsigned int ReadTimer1 (void);
unsigned char ReadTimer2 (void);
unsigned int ReadTimer3 (void);
Returneaz: Valoarea curent a timerului
Aceaste funcii citesc valorea curent din regitrii timerelor, dup cum
Detalii:
urmeaz:
Timer0: TMR0H:TMR0L
Timer1: TMR1H:TMR1L
Timer29: TMR2
Timer3: TMR3H:TMR3L
/*
exemplu
de citire a valorii pe 16 bii a
Exemplu:
timerului0 funcionnd ca numrtor pe 8 bii10 */
unsigned int rezultat;
rezultat = (unsigned char) ReadTimer0();
WriteTimerx
nscriere valoare n Timerx
Funcia:
timers.h
Include:
void WriteTimer0 (unsigned int timer);
Prototip:
void WriteTimer1 (unsigned int timer);
void WriteTimer2 (unsigned char timer);
void WriteTimer3 (unsigned int timer);
Argumente: timer
Valoarea care va fi ncrcat n regitrii timerului specificat.
Aceaste funcii nscriu o valoare n regitrii Timerelor, dup cum urmeaz:
Detalii:
Timer0: TMR0H:TMR0L
Timer1: TMR1H:TMR1L
Timer211: TMR2
Timer3: TMR3H:TMR3L
WriteTimer0(10000);
Exemplu:
Timerul2 este un timer pe 8 bii, deci valoarea returnat de funcia ReadTimer2() este de tip unsigned
char.
10
La utilizarea timerului0 ca numrtor de 8 bii nu se poate ti exact dac octetul superior este zero. Astfel,
pentru obinerea unor rezultate corecte se recomand cast spre char.
11
Timerul2 este un timer pe 8 bii, deci argumentul funciei WriteTimer2() este de tip unsigned char.
56
SetTmrCCPSrc
Configurare timer ca surs de tact pentru modulul CCP
Funcia:
timers.h
Include:
void SetTmrCCPSrc (unsigned char config);
Prototip:
Argumente: config
Octet ce poate lua una din valorile urmtoare definte n timers.h
T3_SOURCE_CCP
T1_CCP1_T3_CCP2
T1_SOURCE_CCP
Detalii:
Exemplu:
57
Indicaii
nainte de implementare se vor realiza diagramele de stare i de activitate asociate
aplicaiilor
Se recomand dezvoltarea aplicaiilor folosind limbajul de programare C. n acest
sens, pentru detalii, se va consulta Anexa 5.
n cazul problemei P2 se va elimina prel-ul prezent la apsarea butonului. Se va
considera un prel cu durata P=10ms. Pentru detalii se va consulta Lucrarea 5.
Se recomand structurarea codului pe subrutine / funcii.
Rezolvarea problemei P4 se poate face innd cont de diagrama de evoluie a strilor
prezentat n Figura 7.2 i de indicaiile asociate.
58
59
Lucrarea 8. PWM
1. Scopul lucrrii
Obiectivul acestei lucrri este de a familiariza cititorul cu modulul de generare a
semnalelor modulate n laime (PWM Pulse Width Modulation), n vederea generrii unor
trenuri de impulsuri cu factor de umplere i perioad configurabile.
2. Consideraii teoretice
Un semnal PWM este n esen un semnal periodic dreputunghiular, a crui lime
(factor de umplere) poate fi modificat.
Factorul de umplere ( FU ) reprezint intervalul de timp dintr-o perioad ( TPWM ) ct
semnalul este n starea 1.
Cei doi parametrii ai semnalului PWM, factorul de umplere FU i perioada TPWM se
pot vedea n Figura 8.1.
60
bit 0
T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0
TMR2ON
T2CKPS1
T2CKPS0
Neimplementat
T2OUTPS3:T2OUTPS0 Biii de selecie pentru postdivizor
Nu se utilizeaz la funcionarea n regim PWM
TMR2ON Bit de Pornire / Oprire Timer2
1 = Pornire Timer2
0 = Oprire Timer2
T2CKPS1:T2CKPS0 Bii de selecie a valorii de predivizare pentru tactul
de incrementare
00 = Predivizor 1
01 = Predivizor 4
1x = Predivizor 16
DCxB1
DCxB0
CCPxM3 CCPxM2 CCPxM1
Figura 8.4. Regitrii CCPxCON: CCPx Control Register
bit 0
CCPxM0
Neimplementai
DCxB1:DCxB0 Utilizai la specificarea factorului de umplere al semnalului
PWM produs de modulul CCPx
CCPxM3:CCPxM0 Selectarea regimului de lucru pentru modulul CCPx
11xx = Regim de lucru PWM
restul combinaiilor se aleg pentru modurile Captur sau Comparare
4
FOSC
61
TOSC =
FOSC
4 16
(CCPRxL : CCPxCON 5 : 4 ) =
FU FOSC
50 s 20 MHz
=
= 62.5 63
PredivizorTMR 2
16
(8.4)
62
; predivizor 16
; pornire Timer2
; configurare mod PWM
;
;
;
;
; predivizor 16
Pinii CCP1 i CCP2, asociai celor dou module CCP sunt multiplexai cu pinii RC2, respectiv RC1 i trebuie
configurai ca pini de ieire cu ajutorul registrului TRISC
3
Pentru detalii privind dezvoltarea aplicaiilor pentru microcontroler folosind limbajul de programare C se
recomand consultarea Anexei 5.
63
T2CONbits.TMR2ON =
CCP1CONbits.CCP1M3
CCP1CONbits.CCP1M2
CCP1CONbits.CCP1M1
CCP1CONbits.CCP1M0
1;
= 1;
= 1;
= 1;
= 1;
; pornire Timer2
; configurare mod PWM
Descrierea funciilor
ClosePWM1, ClosePWM2
Dezactivare canal PWM
Funcia:
pwm.h
Include:
void ClosePWM1 (void);
Prototip:
void ClosePWM2 (void);
Aceast funcie nchide canalul PWM specificat
Detalii:
OpenPWM1,
Funcia:
Include:
Prototip:
OpenPWM2
Configurare canal PWM
pwm.h
void OpenPWM1 (char perioada);
void OpenPWM2 (char perioada);
Argumente: perioada
Valoare cuprins ntre 00h i FFh. Aceast valoare determin frecvena
semnalului PWM, n baza formulei (8.1)
Aceast funcie configureaz canalul PWM specificat n vederea generrii unui
Detalii:
semnal PWM cu perioada specificat.
Pe lng deschiderea canalului PWM, trebuie configurat Timerul2, prin
specificarea predivizorului i deschiderea acestuia.
SetDCPWM1, SetDCPWM2
nscrierea factorului de umplere n regitrii corespunztori
Funcia:
pwm.h
Include:
void SetDCPWM1 (unsigned int factor_umplere);
Prototip:
void SetDCPWM2 (unsigned int factor_umplere);
Argumente: factor_umplere
Valoarea argumentului factor_umplere poate fi orice numr reprezentat
pe 10 bii. Doar cei 10 bii mai nesemnificativi ai acestui argument vor fi luai
n considerare i vor fi nscrii n perechea CCPRxL:CCPxCON<5:4>.
Factorul de umplere se determin n baza formulei (8.2)
Funcia nscrie valoarea factorului de umplere n regitrii corespunztori.
Detalii:
64
3. Probleme propuse
P1. Se consider dou butoane legate pe PORTD<0:1>, 8 LED-uri legate pe PORTB
i un speaker conectat pe pinul CCP1. Utiliznd modulul PWM1 s se redea cu ajutorul
speakerului un fragment din Oda bucuriei, de Ludwig van Beethoven.
n teoria muzicii, o melodie descris prin notele muzicale componente i timpii
corespunztori fiecrei note reprezint o partitur. n Figura 8.5 se prezint partitura acestui
fragment.
Notele de dou ptrimi trebuie susinute un timp de dou ori mai lung dect notele
de o ptrime.
Timpul ct trebuie susinut o not de o ptrime depinde de la o partitur la alta, acesta
fiind de regul specificat printr-o meniune de nceput (Allegro, Allegretto, Moderato,
Piano).La apsarea unui buton se va schimba viteza de redare a melodiei, prin modificarea
timpilor de susinere a notelor muzicale. Se vor considera 3 viteze de redare diferite.
LED-urile de pe PORTB vor implementa funcionalitatea unui vu-metru, astfel nct la
redarea fiecrei note muzicale se vor aprinde LED-urile conform secvenei urmtoare:
Nota muzical DO_JOS LED1 aprins, restul LED-urilor stinse
Nota muzical RE LED1, LED2 aprinse, restul LED-urilor stinse
Nota muzical MI LED1, LED2, LED3 aprinse, restul LED-urilor stinse
Nota muzical DO_SUS toate LED-urile aprinse
Indicaii
nainte de implementare trebuie fcut urmtoarea observaie. Pornind de la ecuaia
(8.1) se poate determina valoarea minim a frecvenei semnalului PWM care poate fi
generat utiliznd un oscilator cu FOSC = 20MHz. Aceast frecven se determin dup
cum urmeaz:
TPWM = [(PR2)+1]4TOSC PredivizorTMR2
(TPWM )max
(FPWM )min
= [(255) + 1]
=
(TPWM )max
4
16
20 MHz
(8.7)
1220 Hz
(TPWM )nota
(8.8)
Fnota
(FU )nota
(TPWM )nota
(8.9)
66
Biii 7-6
Biii 5-2
Bit 1
Bit 0
CHS3
CHS2
CHS1
CHS0
GO/ DONE
Figura 9.1. Registrul ADCON0: A/D Control Register 0
bit 0
ADON
Neutilizai
CHS3:CHS0 Bii de selecie ai canalului de intrare A/D utilizat la conversie
0000 = Canal 0 (pin AN0)
0001 = Canal 1 (pin AN1)
...
1100 = Canal 12 (pin AN12)
1101 = Neimplementai
1110 = Neimplementai
1111 = Neimplementai
GO/DONE Bit status conversie A/D
cnd ADON = 1 (convertor A/D activat)
1 = start conversie / conversie A/D n desfurare
0 = conversie A/D finalizat
ADON Activare / Dezactivare convertor A/D
1 = activare convertor A/D
0 = dezactivare convertor A/D
Din aceast cauz, utilizarea unui canal este condiionat de setarea pinului respectiv ca intrare analogic (vezi
Figura 9.2)
67
bit 7
Biii 7-6
Biii 5-4
Biii 3-0
VCFG1
VCFG0
PCFG3
PCFG2
PCFG1
Figura 9.2. Registrul ADCON1: A/D Control Register 1
Neutilizai
VCFG1:VCFG0 Bii de configurare pentru tensiunile de referin
00 : VREF+ = Vdd = 5V, VREF- = Vss = 0V
01 : VREF+ = extern (pin AN3), VREF- = Vss = 0V
10 : VREF+ = Vdd = 5V, VREF- = extern (pin AN2)
11 : VREF+ = extern (pin AN3), VREF- = extern (pin AN2)
PCFG3:PCFG0 Bii de configurare a funcionalitii porturilor
PCFG3:
PCFG0
AN12
AN11
0000 A
A
0001 A
A
0010 A
A
0011 D
A
0100 D
D
0101 D
D
0110 D
D
0111 D
D
1000 D
D
1001 D
D
1010 D
D
1011 D
D
1100 D
D
1101 D
D
1110 D
D
1111 D
D
A = intrare analogic
bit 7
ADFM
Bit 7
Bit 6
Biii 5-3
bit 0
PCFG0
AN10
AN9
AN8
A
A
A
A
A
D
D
D
D
D
D
D
D
D
D
D
A
A
A
A
A
A
D
D
D
D
D
D
D
D
D
D
A
A
A
A
A
A
A
D
D
D
D
D
D
D
D
D
AN7
AN6
AN5
AN4
AN3
AN2
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
A A A A A A
D A A A A A
D D A A A A
D D D A A A
D D D D A A
D D D D D A
D D D D D D
D D D D D D
D D D D D D
D = intrare / ieire digital
ACQT2 ACQT1
ACQT0
ADCS2
ADCS1
Figura 9.3. Registrul ADCON2: A/D Control Register 2
68
AN1
AN0
A
A
A
A
A
A
A
A
A
A
A
A
A
A
D
D
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
D
bit 0
ADCS0
Biii 2-0
TAD reprezint timpul alocat conversiei unui bit i este dependent de frecvena de lucru
69
Dup activarea modulului i selectarea canalului dorit, utilizatorul va trebui s implementeze n program
ntrzierea respectiv, nainte de a realiza conversia.
4
n aceast situaie nu se poate spune exact cnd s-a terminat achiziia i cnd a nceput conversia, timpul de
achiziie fiind inut n interiorul modulului.
5
Aceste cazuri sunt prevzute pentru funcionarea n regim SLEEP (cu consum redus de energie), tactul de
conversie provenind de la oscilatorul intern.
70
16
= 0.8s
FOSC
(9.3)
(9.4)
(9.5)
ADRESH
Rez. conv.
A/D MSb
ADRESL
a)
Rez. conv.
A/D LSb
ADRESH
ADRESL
b)
Figura 9.6. Rezultatul conversiei A/D
a) aliniere la dreapta ADFM = 1 b) aliniere la stnga ADFM = 0
Cunoscnd codul de 10 bii obinut n urma conversiei A/D se poate determina
valoarea efectiv a tensiunii analogice de intrare pe baza formulei urmtoare:
Vin =
VREF + VREF
(rezultatConversie )
1024
(9.7)
LOOP_TESTARE:
BTFSS
PIR1, ADIF
;sau
BTFSC
ADCON0, GO
GOTO LOOP_TESTARE
;Cnd se ajunge n acest punct, conversia s-a terminat
;se citete rezultatul
;se resteaz flagul de ntrerupere
;se ateapt minim 3TAD=2.4s pn la urmtoarea conversie
ATENIE se recomand ca bitul GO/ DONE s nu fie setat n aceeai instruciune n care se pornete modulul
de conversie A/D
7
vezi relaia (9.6)
8
vezi relaia (9.6)
72
if(ADCON0bits.GO == 0)
//configurare ADCON2
//pornire modul
//start conversie
73
ConvertADC
Start conversie A/D
Funcia:
adc.h
Include:
void ConvertADC (void);
Prototip:
Aceast funcie pornete o nou conversie A/D. Pentru detectarea terminrii
Detalii:
conversiei se poate utiliza funcia BusyADC() sau ntreruperea generat.
Configurare modul de conversie A/D
Funcia:
adc.h
Include:
void OpenADC (unsigned char config,
Prototip:
unsigned char config2,
unsigned char portconfig);
Argumente: config
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n adc.h
Surs tact conversie A/D:
ADC_FOSC_2
ADC_FOSC_4
ADC_FOSC_8
ADC_FOSC_16
ADC_FOSC_32
ADC_FOSC_64
FOSC
FOSC
FOSC
FOSC
FOSC
FOSC
/
/
/
/
/
/
2
4
8
16
32
64
ADC_FOSC_RC
Oscilator intern
Aliniere la dreapta
ADC_LEFT_JUST
Aliniere la stnga
Timp de achiziie:
ADC_0_TAD
ADC_2_TAD
ADC_4_TAD
ADC_6_TAD
ADC_8_TAD
ADC_12_TAD
ADC_16_TAD
ADC_20_TAD
0
2
4
6
8
12
16
20
TAD
TAD
TAD
TAD
TAD
TAD
TAD
TAD
config2
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n adc.h
Canalul anlogic:
ADC_CH0
Canalul 0
ADC_CH1
...
Canalul 1
ADC_CH11
Canalul 11
ADC_CH12
Canalul 12
ntreruperi A/D:
ADC_INT_ON
ntreruperi activate
74
Tensiuni de referin:
ADC_REF_VDD_VREFMINUS
ADC_REF_VREFPLUS_VREFMINUS
ADC_REF_VREFPLUS_VSS
ADC_REF_VDD_VSS
portconfig
Octet care permite configurarea funcionalitii porturilor. Pot fi utilizate
urmtoarele valori definite n adc.h
Detalii:
Exemplu:
ReadADC
Funcia:
Include:
Prototip:
Detalii:
Returneaz:
ADC_0ANA
ADC_1ANA
pini analogici:AN0
pini digital:AN1-AN15
ADC_2ANA
pini analogici:AN0-AN1
pini digitali:AN2-AN15
ADC_3ANA
pini analogici:AN0-AN2
pini digitali:AN3-AN15
ADC_4ANA
pini analogici:AN0-AN3
pini digitali:AN4-AN15
ADC_5ANA
pini analogici:AN0-AN4
pini digitali:AN5-AN15
ADC_6ANA
pini analogici:AN0-AN5
pini digitali:AN6-AN15
ADC_7ANA
pini analogici:AN0-AN6
pini digitali:AN7-AN15
ADC_8ANA
pini analogici:AN0-AN7
pini digitali:AN8-AN15
ADC_9ANA
pini analogici:AN0-AN8
pini digitali:AN9-AN15
ADC_10ANA
pini analogici:AN0-AN9
pini digitali:AN10-AN15
ADC_11ANA
pini analogici:AN0-AN10
pini digitali:AN11-AN15
ADC_12ANA
pini analogici:AN0-AN11
pini digitali:AN12-AN15
ADC_13ANA
pini analogici:AN0-AN12
pini digitali:AN13-AN15
ADC_14ANA
pini analogici:AN0-AN13
pini digitali:AN14-AN15
ADC_15ANA
75
SetChanADC
Selectare canal analogic
Funcia:
adc.h
Include:
void SetChanADC (unsigned char canal);
Prototip:
Argumente: canal
Una din urmtoarele valori (definite n adc.h):
ADC_CH0
Canalul 0
ADC_CH1
...
Canalul 1
ADC_CH11
Canalul 11
ADC_CH12
Canalul 12
Detalii:
Exemplu:
Funcia:
Include:
Prototip:
Argumente:
Detalii:
Exemplu:
ADC_CH0
Canalul 0
ADC_CH1
...
Canalul 1
ADC_CH11
Canalul 11
ADC_CH12
Canalul 12
//
//
//
//
//
Delay 50TCY
Start conversie
Ateptare sfrit conversie
Citire rezultat
Dezactivare convertor A/D
}
76
3. Probleme propuse
P1. Se consider dou LED-uri legate pe PORTD<2:3>, 8 LED-uri legate pe
PORTB i un poteniometru alimentat de la Vdd i Vss, iar cursorul conectat la canalul
analogic 0. S se implementeze un program care citete periodic, la fiecare 100ms, tensiunea
analogic de intrare, obinut de pe poteniometru, i afieaz rezultatul conversiei pe cele 10
LED-uri disponibile.
P2. Folosind perifericele disponibile s se implementeze un sistem de reglare automat
a temperaturii. Se va utiliza un termistor (sau un poteniometru pentru simulare) pe post de
traductor, comanda implementat va fi o comand bipoziional (de tip pornit/oprit), iar
elementul comandat va fi un ventilator. Mrimea de referina poate fi specificat direct din
program. LED-urile disponibile pot fi utilizate pentru afiarea valorii convertite.
P3. Folosind un senzor de temperatur conectat la canalul analogic 0 i un speaker
conectat pe pinul CCP1, s se realizeze un sistem de alarm care monitorizeaz temperatura.
P4. Folosind un senzor de lumin i un speaker, s se realizeze un sistem de alarm
bazat pe detectarea micrii.
Indicaii
Se recomand dezvoltarea aplicaiilor folosind att limbajul de asamblare ct i
limbajul de programare C cu sau fr funciile definite n adc.h.
77
78
PEIE
x
1/0
79
80
INTCON, TMR0IF
RCON, IPEN
INTCON, TMR0IE
INTCON, GIE
n cazul utilizrii prioritilor de ntrerupere, o rutin de tratare a nteruperii high trebuie s ncap n zona de
memorie program cuprins ntre adresele 0x08 i 0x18. Prin realizarea unui apel de subrutin sau salt la alt
adres se evit constrngerea existent referitoare la dimensiunea rutinei de tratare a ntreruperii..
81
#pragma code
#pragma interrupt Interrupt_Service_Routine
void main()
{
INTCONbits.TMR0IF = 0;
RCONbits.IPEN = 0;
INTCONbits.TMR0IE = 1;
INTCONbits.GIE = 1;
}
//
//
//
//
. . .
Indicaii
Pentru realizarea ntrzierilor cerute se va realiza cu ajutorul Timerului0 o singur
temporizare de baz de 100ms care va genera o ntrerupere. n rutina de tratare a
ntreruperii se vor folosi contoare pentru a obine celelalte ntrzieri pornind de la
aceast temporizare de baz.
n vederea aprofundrii cunotinelor referitoare la sistemul de ntreruperi se
recomand refacerea unor aplicaii din capitolele anterioare folosind ntreruperile.
Se recomand dezvoltarea aplicaiilor folosind att limbajul de asamblare ct i
limbajul de programare C.
82
83
TX9
TXEN
SYNC
SENDB
BRGH
TRMT
Figura 11.1. Registrul TXSTA: Transmit Status and Control
bit 0
TX9D
Indic apariia unor erori sau a unor evenimente caracteristice comunicaiei seriale.
Registrul de serializare TSR este un registru intern care nu poate fi accesat prin program. Are rol de buffer de
transmisie. Exist un registru asemntor i la partea de recepie serial.
4
84
bit 7
SPEN
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
RX9
SREN
CREN
ADDEN
FERR
OERR
Figura 11.2. Registrul RCSTA: Transmit Status and Control
bit 0
RX9D
85
bit 7
ABDOVF
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
RCIDL
RXDTP
TXCKP
BRG16
WUE
Figura 11.3. Registrul BAUDCON: Baud Rate Control
bit 0
ABDEN
Viteza
dorit
[bps]
300
1200
2400
9600
19200
57600
115200
Pentru detalii referitoare la rolul biilor ABDOVF, WUE, ABDEN se recomand consultarea documentaiei
tehnice a microcontrolerului PIC18F4455. n cadrul acestui capitol aceti bii nu vor fi utilizai.
86
Viteza
dorit
[bps]
300
1200
2400
9600
19200
57600
115200
Se consider erori acceptabile pentru viteza de comunicaie erorile mai mici de 2%.
Pentru calcularea valorii de iniializare a regitrilor SPBRGH:SPBRG la alte frecvene
de lucru, cititorul este rugat s consulte documentaia7 ataat microcontrolerului.
2.2 Realizarea comunicaiei
2.2.1 Transmisia serial asincron
Paii care tebuie urmai pentru configurarea modulului de transmisie sunt urmtorii:
iniializarea vitezei de transmisie dorite (regitrii SPBRGH:SPBRG, bitul BRG16
din registrul BAUDCON, bitul BRGH din registrul TXSTA)
activarea comunicaiei seriale asincrone (bitul SYNC, registrul TXSTA);
activarea modulului EUSART prin (bitul SPEN, registrul RCSTA);
configurarea pinilor RC6/TX/CK i RC7/RX/DT pentru funcionare serial prin
setarea biior TRISC<6,7>;
dac e cazul: inversarea polaritii semnalului de transmisie (bitul TXCKP,
registrul BAUDCON);
dac e cazul: activarea ntreruperii de transmisie (bitul TXIE, registrul PIE1) i
setarea biilor GIE i PEIE (registrul INTCON)8;
dac e cazul: configurarea transmisiei pe 9 bii (bitul TX9, registrul TXSTA);
activarea modulului de transmisie (bitul TXEN, registrul TXSTA);
dac s-a selectat transmisa pe 9 bii, bitul 9 trebuie stocat n TX9D (registrul
TXSTA);
stocarea datelor n registrul TXREG, pas care pornete procesul de transmisie;
testarea flag-ului indicator de ntrerupere TXIF=1 (registrul PIR1) n vederea
realizrii unei noi transmisii, numai dup cel puin doi ciclii instruciune de la
pasul anterior;
sau
testarea bitului TRMT=1 (registrul TXSTA) pentru a determina dac datele au fost
transmise fizic.
Pentru a transmite date, utilizatorul le va scrie n registrul TXREG. Ulterior, datele sunt
transferate unui registru de serializare TSR, care se ocup cu transmisia lor efectiv. Acest
7
Fia tehnic a microcontrolerului PIC18F4455 cuprinde informaii (formule) referitoare la modul n care se
calculeaz valorile de iniializare ale regitrilor SPBRGH:SPBRG sau tabele cu valori predefinite pentru diferite
valori ale FOSC
8
Pentru detalii privind sistemul de ntreruperi vezi Lucrarea 10
87
registru conine datele n curs de transmitere i nu este accesibil direct din programele
utilizator. Datele sunt transmise pe pinul TX al microcontrolerului.
La terminarea transferului din registrul de date TXREG n registrul de serializare TSR
se seteaz bitul indicator de ntrerupere TXIF (registrul PIR1). Prin testarea acestui bit,
utilizatorul poate determina dac se pot trimite date noi. Flag-ul TXIF este ters de system
dup dou cicluri instruciune de la o nou ncrcare a registrului TXREG de ctre utilizator.
Din acest motiv nu este indicat testarea bitul TXIF imediat dup ncrcarea unei valori n
TXREG.
Pentru a determina dac datele au fost transmise, se recomand testarea unui alt bit,
TRMT (registrul TXSTA). Bitul acesta indic starea registrului TSR. La ncrcarea registrului
TSR, bitul TRMT este ters automat, iar la terminarea unei transmisii, bitul TRMT este setat.
La fel ca i flag-ul TXIF, bitul TRMT nu poate fi ters de utilizator.
Dac se dorete semnalarea sfritului transferului printr-o ntrerupere9, se poate activa
ntreruperea de transmisie prin setarea bitului TXIE (registrul PIE1).
2.2.2 Recepia serial asincron
Paii care tebuie urmai pentru configurarea modulului de recepie sunt urmtorii:
iniializarea vitezei de transmisie dorite (regitrii SPBRGH:SPBRG, bitul BRG16
din registrul BAUDCON, bitul BRGH din registrul TXSTA)
activarea comunicaiei seriale asincrone (bitul SYNC, registrul TXSTA);
activarea modulului EUSART prin (bitul SPEN, registrul RCSTA);
configurarea pinilor RC6/TX/CK i RC7/RX/DT pentru funcionare serial prin
setarea biior TRISC<6,7>;
dac e cazul: inversarea polaritii semnalului de transmisie (bitul RXDTP,
registrul BAUDCON);
dac e cazul: activarea ntreruperii de recepie (bitul RCIE, registrul PIE1) i
setarea biilor GIE i PEIE (registrul INTCON)10;
dac e cazul: configurarea recepiei pe 9 bii (bitul RX9, registrul RCSTA);
activarea modulului de recepie (bitul CREN, registrul RCSTA);
la recepionarea datelor, flag-ul indicator al ntreruperii de recepie este setat
RCIF=1 (registrul PIR1);
dac s-a selectat recepia pe 9 bii, bitul 9 este RX9D (registrul RCSTA);
datele recepionate sunt disponibile n registrul RCREG;
erorile sunt semnalate de biii FERR11 i OERR12 (registrul RCSTA);
dac a avut loc o eroare, biii de eroare se terg prin tergerea bitului CREN,
(registrul RCSTA);
La fel ca i n cazul transmisiei, inima modulului de recepie este un registru de
serializare (deplasare) RSR n care se construieste octetul n curs de recepionare. Acest
registru nu este accesibil direct din programele utilizator. Datele se recepioneaz pe pinul RX
al microcontrolerului.
La terminarea asamblrii unui octet, datele sunt transferate n registrul RCREG i n
bitul RX9D (doar pentru cazul recepionrii pe 9 bii), de unde pot fi accesate de utilizator.
9
La activarea modului de transmisie, prin setarea bitului TXEN (registrul TXSTA), flag-ul TXIF este setat
automat.
10
Pentru detalii privind sistemul de ntreruperi vezi Lucrarea 10
11
FERR eroare de recpeionare a datelor
12
OERR eroare de suprasciere. Apare atunci cnd, dup recepie, programul utilizator nu citete datele din
registrul RCREG suficient de repede i se recepioneaz date noi care le suprascriu pe cele vechi.
88
Dup transfer, flag-ul indicator al ntreruperii de recepie RCIF (registrul PIR1) este setat
pentru a semnala utilizatorului terminarea recepionrii.
2.2.3 Exemplu de utilizare
n continuare se va exemplifica modalitatea de utilizare a modului EUSART n
vederea trasnmisiei i a recepionrii de date. Se vor prezenta poriuni de cod att n limbaj de
asamblare, ct i n limbaj de programare C.
Exemplele urmtoare vor realiza transmisia i recepia serial asincron cu viteza de
trnsfer de 9600bps a unui caracter (8 bii de date). Se va considera cazul unui microcontroler
cu o frecven de lucru FOSC=20MHz.
; iniializare
; configurare viteza de transmisie 9600bps13
BSF
TXSTA, BRGH
; BRGH=1
BCF
BAUDCON, BRG16
; BRG16=0
MOVLW
d'129'
; SPBRG=129 ;
MOVWF
SPBRG
; activare comunicaie serial asincron
BCF
TXSTA, SYNC
; SYNC=0
; activare modul EUSART
BSF
RCSTA, SPEN
; SPEN=1
; configurare pini
BSF
TRISC, 6
BSF
TRISC, 7
; date cu polaritate neinversat
BCF
BAUDCON, RXDTP
BCF
BAUDCON, TXCKP
; pornire transmisie i recepie
BSF
TXSTA, TXEN
; pornire transmisie
BSF
RCSTA, CREN
; pornire recepie
...
; transmisia
MOVLW
A
;se transmite caracterul A
MOVWF
TXREG
TEST_TX
BTFSS
TXSTA, TRMT
;test sfrit de transmisie
GOTO
TEST_TX
;transmisie n desfurare
; cnd se ajunge n acest punct transmisia s-a realizat
...
; recepia
TEST_RX
BTFSS
PIR1, RCIF
;test recepie
GOTO
TEST_RX
; cnd se ajunge n acest punct s-au primit date
BCF
PIR1, RCIF
;tergere flag
MOVF
RCREG, W
;copiere date n WREG
...
Acelai exemplu, scris n limbajul de programare C devine:
13
89
char data;
// iniializare
// configurare viteza de transmisie 9600bps
TXSTAbits.BRGH = 1;
BAUDCONbits.BRG16 = 0;
SPBRG = 129;
// activare comunicaie serial asincron
TXSTAbits.SYNC=0;
// activare modul EUSART
RCSTAbits.SPEN=1;
// configurare pini
TRISCbits.TRISC6 = 1;
TRISCbits.TRISC7 = 1;
// date cu polaritate neinversat
BAUDCONbits.RXDTP = 0;
BAUDCONbits.TXCKP = 0;
// pornire transmisie i recepie
TXSTAbits.TXEN = 1;
RCSTAbits.CREN = 1;
...
// transmisia
TXREG = A;
// se transmite caracterul A
while (TXSTAbits.TRMT==0);
//test sfrit de transmisie
// cnd se ajunge n acest punct transmisia s-a realizat
...
; recepia
while(PIR1bits.RCIF==0);
// test recepie
; cnd se ajunge n acest punct s-au primit date
PIR1bits.RCIF = 1;
// tergere flag
data = RCREG;
...
2.3 Funcii C pentru realizarea comunicaiei seriale
O alt abordare, dac se dorete utilizarea limbajului de programare C pentru
realizarea comunicaiilor seriale presupune utilizarea funciilor definite n librria
usart.h disponibil atunci cnd se instaleaz compilatorul MPLAB C18 n mediul
MPLAB IDE. Funciile disponibile se prezint n Tabelul 11.3.
Tabelul 11.3. Funcii C predefinite n biblioteca usart.h
Funcia
Descriere
BusyUSART
Indic status transmisie
DataRdyUSART
Indic status recepie
baudUSART
Configureaz rata de transfer pentru portul serial
OpenUSART
Configureaz portul serial
CloseUSART
Dezactivare modul EUSART
ReadUSART
Citete octet de la portul serial
WriteUSART
Scrie octet pe portul serial
getsUSART
Citete ir de caractere de la portul serial
putsUSART
Scrie un ir de caractere din memoria de date pe portul serial
putrsUSART
Scrie un ir de caractere din memoria de program pe portul serial
90
Descrierea funciilor
BusyUSART
Funcia:
Include:
Prototip:
Detalii:
DataRdyUSART
Indic status recepie
Funcia:
usart.h
Include:
char DataRdyUSART (void);
Prototip:
Detalii:
Aceast funcie ntoarce valoarea flag-ului indicator de ntrerupere RCIF din
registrul PIR1.
Returneaz: 1 sunt date disponibile
0 nu sunt date disponibile
while(!DataRdyUSART());
Exemplu:
baudUSART
Funcia:
Include:
Prototip:
Argumente:
Exemplu:
91
OpenUSART
Configureaz portul serial
Funcia:
usart.h
Include:
void OpenUSART (unsigned char config,
Prototip:
unsigned int spbrg);
config
Argumente:
Octet creat prin realizarea unor operaii logice I (&) cu valorile din categoriile
urmtoare. Aceste valori sunt definite n usart.h
Activare ntrerupere la transmisie:
Activarea ntreruperii de transmisie
Dezactivarea ntreruperii de transmisie
USART_TX_INT_ON
USART_TX_INT_OFF
USART_RX_INT_ON
USART_RX_INT_OFF
Mod asincron
Mod sincron
Mrime pachete:
USART_EIGHT_BIT
USART_NINE_BIT
comunicaie pe 8 bii
comunicaie pe 9 bii
Selectare Slava/Master:
Comunicaie sincron, mod slave
Comunicaie sincron, mod master
USART_SYNC_SLAVE
USART_SYNC_MASTER
Mod recepie:
USART_SINGLE_RX
USART_CONT_RX
Rat de transfer:
Vitez de comunicare mare (bit BRGH = 1)
Vitez de comunicare mic (bit BRGH = 0)
USART_BRGH_HIGH
USART_BRGH_LOW
Detalii:
Exemplu:
spbrg
Valoarea nscris n regitrii generatorului de rat de transfer
(SPBRGH:SPBRG) care determin viteza de comunicaie dorit (valoarea se
poate lua din Tabel 11.1 i Tabel 11.2)
Aceast funcie configureaz modulul EUSART conform specificaiilor date
prin intermediul parametrilor funciei.
OpenUSART (USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_BRGH_HIGH,
129);
CloseUSART
Dezactivare modul EUSART
Funcia:
usart.h
Include:
void CloseUSART (void);
Prototip:
Aceast dezactiveaz ntreruperile, modulul de transmisie i recepie al
Detalii:
portului serial.
92
ReadUSART
Funcia:
Include:
Prototip:
Detalii:
Exemplu:
WriteUSART
Scrie octet pe portul serial
Funcia:
usart.h
Include:
void WriteUSART (char data);
Prototip:
Argumente: data
Valoarea scris pe portul serial
Aceast funcie transmit un octet (caracter) pe portul serial. Pentru detalii
Detalii:
privind scrierea celui de-al 9-lea bit de date recomandm consultarea
documentaiei asociate funciilor din biblioteca usart.h
char data=A;
Exemplu:
WriteUSART(data);
getsUSART
Citete ir de caractere de la portul serial
Funcia:
usart.h
Include:
void getsUSART (char *buffer,
Prototip:
unsigned char len);
buffer
Argumente:
Pointer ctre locaia unde vor fi salvate datele recepionate
len
Numrul de caractere care vor fi citite de la portul serial
Aceast funcie citete un ir de dimensiune fix de la portul serial. Funcia se
Detalii:
utilizeaz doar pentru transmisia / recepia de pachete de 8bii. Aceast funcie
ateapt i citete numrul de caractere specificat prin parametrul len.
char inputstr[10];
Exemplu:
getsUSART(inputstr, 5);
putsUSART, putrsUSART
Scrie un ir de caractere pe portul serial
Funcia:
usart.h
Include:
void putsUSART (char *data);
Prototip:
void putrsUSART (const rom char *data);
Argumente: data
Pointer ctre un string de date
len
Numrul de caractere care vor fi citite de la portul serial
Funcia se utilizeaz doar pentru transmisia / recepia de pachete de 8bii.
Detalii:
Aceast funcie scrie un ir de caractere (incluznd caracterul de sfrit de ir)
pe portul serial.
Transmiterea irurilor stocate n memoria de date se va face utiliznd funcia
putsUSART.
Transmiterea irurilor stocate n memoria program se va face utiliznd funcia
93
Exemplu:
putrsUSART.
putrsUSART(Hello World!);
94
Indicaii
Pentru implementarea mesajelor care vor fi transmise, n limbaj de asamblare, se
recomand utilizarea tablourilor. Pentru detalii privind implementarea tablourilor se
poate consulta lucrarea 4.
n cazul problemei P2 trebuie rezolvat problema detectrii fronturilor prin eliminarea
prel-ului. n acest scop se poate consulta lucrarea 5.
Aplicaiile de pe PC necesare realizrii comunicaiilor dintre microcontroler i PC pot
fi aplicaii de sine sttoare realizate de utilizator, poate fi utilizat aplicaia Hyper
Terminal14 disponibil cu sistemul de operare Windows sau alte aplicaii asemntoare
care permit monitorizarea i comunicaia prin port serial.
La implementarea aplicaiilor se recomand utilizarea, pe ct posibil, a ntreruperilor
Pentru conectarea echipamentelor se utilizeaz un cablu de date serial de tip Null
Modem, cu structura din Figura 11.4
14
Pentru detalii referitorare la utilizarea aplicaiei Hyper Terminal se poate consulta Anexa 7
95
DCxB1
DCxB0
CCPxM3 CCPxM2 CCPxM1
Figura 12.1. Regitrii CCPxCON: CCPx Control Register
bit 0
CCPxM0
Neimplementai
DCxB1:DCxB0 Utilizai la regimul de lucru PWM (vezi Lucrarea 8 - PWM)
CCPxM3:CCPxM0 Selectarea regimului de lucru pentru modulul CCPx
0000 = modu CCPx dezactivat
0100 = Captur la fiecare front cresctor pe pinul CCPx
0101 = Captur la fiecare front descresctor pe pinul CCPx
0110 = Captur la fiecare al 4-lea front cresctor pe pinul CCPx
0111 = Captur la fiecare al 16-lea front cresctor pe pinul CCPx
96
Bit 3
Bit 2
Bit 1
Bit 0
bit 0
TMR1ON
Accesarea valorii Timerului1 se face prin instruciuni obinuite att pentru scriere, ct
i pentru citire, prin intermediul regitrilor TMR1L i TMR1H. Accesul la valoarea timerului se
face fie: prin dou operaii distincte (RD16=0) cnd se acceseaz pe rnd fiecare octet prin
intermediul regitrilor TMR1L i TMR1H sau dac RD16 =1 coninutul celor 2 regitri se
actualizeaz atomic cu toi cei 16 bii ai valorii Timerului la accesarea registrului TMR1L2.
1
Timerul1 dispune de trei surse distincte de incrementare (selectabile prin biii: T1CS i T1OSCEN): tact intern
(FOSC/4), tact extern, tact provenind de la oscilatorul intern.
2
La citirea TMR1L, valoarea octetului superior se transfer n registrul TMR1H. Acest registru este accesibil
direct prin operaii normale de citire/scriere. La scrierea registrului TMR1L, valoarea stocat n prealabil n
TMR0H se transfer automat n octetul superior al timerului. Prin aceast arhitectur, timerul permite un acces
atomic la valoarea numrtorului pe 16 bii pe o magistral de 8 bii
97
bit 7
RD16
Bit 7
Biii 6,3
Biii 5:4
Bit 2
Bit 1
Bit 0
bit 0
TMR3ON
Asemenea Timerului1, i Timerul3 dispune de trei surse distincte de incrementare (selectabile prin biii: T3CS
i T1OSCEN): tact intern (FOSC/4), tact extern, tact provenind de la oscilatorul intern al Timerului1.
4
Pinii CCP1 i CCP2, asociai celor dou module CCP sunt multiplexai cu pinii RC2, respectiv RC1 i trebuie
configurai ca pini de ieire cu ajutorul registrului TRISC
98
;pornire Timer1
LOOP_TESTARE:
BTFSS
PIR1, CCP1IF
GOTO LOOP_TESTARE
;Cnd se ajunge n acest punct, captura s-a terminat
;se citete rezultatul din CCPR1H:CCPR1L
;se resteaz flagul de ntrerupere
n continuare se prezint codul echivalent n limbajul de programare C.
TRISCbits.TRISC2 = 1;
//pin CCP1 de intrare
T3CONbits.T3CCP2 = 0;
//utiliz. Timer1 cu CCP1 i CCP2
T3CONbits.T3CCP1 = 0;
T1CON = 0xA0;
//configurare Timer15
CCP1CONbits.CCP1M3 = 0; //captura la fiecare front cresc.
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
T1CONbits.TMR1ON = 1;
//pornire Timer1
if (PIR1bits.CCP1IF ==1) //s-a realizat captura
5
exist posibilitatea de a specifica toi biii registrului T1CON printr-o singur operaie
99
CAPTURE_INT_OFF
Configurare captur:
CAP_EVERY_FALL_EDGE
CAP_EVERY_RISE_EDGE
CAP_EVERY_4_RISE_EDGE
Detalii:
Exemplu:
100
ReadCapturex
Citire valoare capturat de modulul specificat
Funcia:
capture.h
Include:
unsigned int ReadCapture1 (void);
Prototip:
unsigned int ReadCapture2 (void);
Returneaz: Rezultatul capturii
Aceast funcie citete valoarea stocat n regitrii de captur
Detalii:
CCPRxH:CCPRxL asociai modulului specificat prin antetul funciei.
Utiliznd funciile definite n biblioteca capture.h, exemplul prezentat n seciunea
anterioar poate fi scris n felul urmtor:
#include <p18f4455.h>
#include <capture.h>
#include <timers.h>
void main ()
{
unsigned int result;
// Configurare modul CCP1 pentru captur
OpenCapture1(CAPTURE_INT_OFF & CAP_EVERY_RISE_EDGE);
// Configurare Timer1 pentru a fi utilizat cu modulul CCP1
SetTmrCCPSrc(T1_SOURCE_CCP);
// Configurare Timer1
OpenTimer1 (TIMER_INT_OFF &
T1_16BIT_RW &
T1_SOURCE_INT &
T1_PS_1_4 &
T1_OSC1EN_OFF &
T1_SYNC_EXT_OFF);
while(!PIR1bits.CCP1IF);
Figura 12.4. Determinarea perioadei i a factorului de umplere pentru un semnal (P1, P2)
Indicaii
Pentru determinarea perioadei se recomand citirea regitrilor de captur la fiecare
front cresctor. Perioada semnalului se obine ca diferen a dou valori capturate
succesive. Dac dup fiecare captur se reseteaz valoarea timerului utilizat atunci
valoarea capturat indic direct perioada.
Pentru determinarea factorului de umplere se poate configura modulul de captur
pentru a realiza captura succesiv pe front cresctor, apoi pe front descresctor.
Factorul de umplere se obine ca diferen a celor dou valori.
O alt abordare pentru msurarea factorului de umplere presupune utilizarea ambelor
module de captur cu aceai baz de timp. Unul dintre module va fi configurat pentru
a realiza captura pe frontul cresctor al semnalului, iar cellalt modul pe frontul
descresctor al semnalului. n acest caz, se va conecta acelai semnal la cei doi pini de
intrare ai modulelor: pinii CCP1 i CCP2.
Afiarea valorii recepionate de PC se poate realiza utiliznd o aplicaie special creat
pentru acest lucru sau prin intermediul aplicaiei HyperTerminal sau a altor aplicaii
similare.
ntruct funcionarea modulului de captur poate fi implementat i n lipsa acestui
periferic se recomand implementarea celor dou probleme fcnd abstracie de
existena modulelor CCP
102
a)
b)
Figura 13.1. Comparaie ntre comunicaiile prin port serial real (a)
i cele prin port serial virtual (b)
Printre avantajele folosirii portului serial virtual se pot aminti:
- aplicaiile ce ruleaz pe PC nu trebuie modificate;
- timp scurt de implementare a softului;
- nu este necesar dezvoltarea de drivere speciale pentru sistemul de operare;
- reducerea numrului de componente electronice
- migrarea de la microcontrolerele fr port USB se poate face uor;
103
104
Exemplul 2:
putsUSBUSART
Transmite un ir de caractere aflat n memoria de date
Funcia:
void putsUSBUSART(char *data);
Prototip:
Detalii:
Aceast funcie transmite un sir de caractere terminat cu caracterul NULL aflat
n memoria de date, la portul USB.
nainte de a transmite irul trebuie verificat dac driverul este gata pentru
recepia de date noi. Acest lucru se face cu ajutorul funciei
mUSBUSARTIsTxTrfReady .
Lungimea maxim a irului inclusiv caracterul NULL este de 255. Dac nu
este gsit caracterul NULL atunci vor fi transmii primele 255 de caractere.
char example_string[4];
Exemplu:
void example_1(void)
{
example_string[0]=U;
example_string[1]=S;
example_string[2]=B;
example_string[3]=0x00; // NULL chr
if(mUSBUSARTIsTxTrfReady())
putsUSBUSART(example_string);
}
Macro mUSBUSARTTxRom
Transmite un ir de caractere de lungime cunoscut aflat n memoria program
Macro:
mUSBUSARTTxRom(rom byte *pData, byte len);
Prototip:
Argumente: *pData - pointer catre sirul de caractere
len - numrul de octei transmii
Aceast macroinstruciune transmite un sir de caractere de lungime cunoscut
Detalii:
aflat n memoria program, la portul USB.
nainte de a transmite irul trebuie verificat dac driverul este gata pentru
recepia de date noi. Acest lucru se face cu ajutorul funciei
mUSBUSARTIsTxTrfReady .
rom char example_string[] = {0x31,0x32,0x33};
Exemplu:
void example_1(void)
{
if(mUSBUSARTIsTxTrfReady())
mUSBUSARTTxRom((rom byte*)example_string,3);
}
Macro mUSBUSARTTxRam
Transmite un ir de caractere de lungime cunoscut aflat n memoria de date
Macro:
mUSBUSARTTxRam(byte *pData, byte len);
Prototip:
Argumente: *pData - pointer catre sirul de caractere
len - numrul de octei transmii. Numrul de octei transmii (len) trebuie
s fie mai mic sau egal cu 255.
105
Detalii:
Exemplu:
Macro mUSBUSARTIsTxTrfReady
Testare disponibilitate USB
Macro:
BOOL mUSBUSARTIsTxTrfReady(void);
Prototip:
Aceast macroinstruciune returneaz 1 dac driverul este gata s
Detalii:
recepioneze date i returneaz 0 n caz contrar. Macroinstruciunea trebuie
apelat nainte de transmiterea datelor la USB.
Apelarea acestei macroinstruciuni nu trebuie s se fac n funcii cu blocare,
de exemplu: while(!mUSBUSARTIsTxTrfReady()).
void example_1(void)
Exemplu:
{
if(mUSBUSARTIsTxTrfReady()){
putrsUSBUSART(Microchip);
}
}
getsUSBUSART
Copiaz datele recepionate de la USB n memoria de date
Funcia:
byte getsUSBUSART(char *buffer, byte len);
Prototip:
Argumente: *buffer este un pointer ctre irul de caractere unde vor fi copiate datele.
len este numrul de octei ce se dorete a fi recepionai.
byte este numrul de octei copiai n memorie
Funcia copiaz datele recepionate de la USB n memoria de date.
Detalii:
Funcia este fr blocare.
Dac nu exist datre recepionate ea returneaz zero.
Dac numrul de octei recepionai este mai mare dect lungimea len, n
memorie vor fi copiai doar numrul de octei specificai prin parametrul
len. Lungimea irului buffer trebuie s fie mai mare sau egal cu
numrul de octei specificat in len.
char input_buffer[64];
Exemplu:
void example_1(void)
{
byte index, count, total_sum;
if(getsUSBUSART(input_buffer, 8)
{
count = mCDCGetRxLength();
106
total_sum = 0;
for(index = 0; index < count; index++)
{
total_sum += input_buffer[index];
}
}
mCDCGetRxLength
Returneaz numrul de octei copiai n memorie
Funcia:
byte mCDCGetRxLength(void)
Prototip:
Returneaz: byte este numrul de octei copiai n memorie la ultimul apel a funciei
getsUSBUSART
Aceast funcie returneaz numrul de octei copiai n memorie la ultimul
Detalii:
apel al funciei getsUSBUSART.
char input_buffer[64];
Exemplu:
void example_1(void)
{
if(getsUSBUSART(input_buffer, 2)
{
// Do something with input_buffer[0]
if(mCDCGetRxLength() == 2)
// Do something with input_buffer[1]
}
}
2.3 Specificaii privind implementarea portului serial virtual
n codul implementat de utilizator nu trebuie folosite funcii cu blocare, de exemplu :
while(a==1) { ... }
Nu folosii urmtoarea secven de cod: while(!mUSBUSARTIsTxTrfReady())
Trebuie avut n vedere tipul de pointer pe care l ateapt funciile
mUSBUSARTTxRom i mUSBUSARTTxRam. Este posibil ca s fie nevoie de o
schimbare a tipului de pointer (casting).
nainte de a transmite date la USB trebuie verificat dac driverul este pregatit s
primeasc respectivele date. Acest lucru se face prin apelarea funciei
mUSBUSARTIsTxTrfReady.
Funciile
putrsUSBUSART, putsUSBUSART
mUSBUSARTTxRom
i
mUSBUSARTTxRam sunt funcii fr blocare, ele nu transmit imediat datele la portul
USB i nu ateapt ca datele s fie trimise. Funcia care trimite de fapt datele este
CDCTxService i ea este apelat prin intermediul funciei USBTasks. Funcia
USBTasks trebuie apelat n bucla principal a programului ca n exemplul de mai
jos.
107
pt. o ntrziere de
1 sec
// Bucla infinit
//funcia USB Tasks trebuie sa fie apelat la fiecare ciclu din bucla while
USBTasks();
if(mUSBUSARTIsTxTrfReady())
// Test dac se pot transmite date
{
if(INTCONbits.T0IF==1)
// a trecut 1 sec?
{
INTCONbits.T0IF = 0;
// se terge bitul T0IF
WriteTimer0(delay_val); // se nscrie valoarea dorit a ntrzierii
trans_buffer[0] = '-';
// se scriu datele n buffer
trans_buffer[1] = 't';
trans_buffer[2] = '-';
trans_buffer[3] = ' '
// spaiu
trans_buffer[4] = 0;
// caracterul NULL
putsUSBUSART(trans_buffer); // se transmit datele la PC
}
}
if(getsUSBUSART(rec_buffer,2)) //recepie date
{
if (rec_buffer[0]=='a')
{
LATD = 0x04;
//un led aprins
}
if (rec_buffer[0]=='s')
{
LATD = 0x08;
}
} //end while
} //end main
108
3. Probleme propuse
P1. S se realizeze un program de tip cheie electronic. Microcontrolerul va atepta
transmiterea unui ir de caractere de la computer, acest ir va fi comparat cu un ir de
caractere aflat n memoria program a microcontrolerului. Dac cele dou iruri sunt
echivalente acest lucru va fi semnalizat prin aprinderea unui LED de pe placa de dezvoltare.
P2. S se realizeze un program ce face achiziie de semnale analogice de la
convertorul analogic digital i transmite datele n format ASCII ctre portul serial virtual.
Indicaii
Pentru crearea proiectului va fi utilizat proiectul cadru ce se gsete pe serverul
facultii.
Pentru testarea aplicaiei se poate folosi aplicaia HyperTerminal. Modul de lucru i
setarea programului de mai sus este prezentat n Anexa 7.
109
Excepie:
MOVFF
MOVFF
fs,fd
REG_s, REG_d
Registrul f poate fi specificat fie prin numele su simbolic (dac are) fie prin adresa sa de 8 bii
110
Excepie:
LFSR
LFSR
f,k
FSR0, h100
Excepie:
RETLW
k=constant pe 8 bii
RETLW
111
0x15
2. Setul de instruciuni
Majoritatea instruciunilor sunt reprezentate n memoria program prin cuvinte cu
lungimea de 16 bii (2 octei), cu excepia a patru instruciuni (lungi) reprezentate prin 32 de
bii (2 cuvinte = 4 octei).
Toate instruciunile scurte se execut ntr-un singur ciclu instruciune. Excepie fac
instruciunile de comparaie pentru care condiia e evaluat ca adevrat sau instruciunile
care modifc numrtorul de program. n aceste cazuri instruciunile respective se execut n
2 sau 3 cicluri instruciune.
Toate instruciunile lungi se execut n 2 cicluri instruciune.
Un ciclu instruciune const din patru perioade de oscilaie. Astfel, n cazul unei
frecevene de lucru FOSC=20MHz, timpul de execuie al unei instruciuni este
Ti=4/FOSC=0.2s.
Tabelul A1.5 cuprinde setul de instruciuni recunoscute de compilatorul Microchip
MPASM pentru microcontrolerul PIC18F4455. n acest tabel se utilizeaz urmtoarele
notaii:
a
b
BSR
d
f
fs
fd
FSR
k
n
PC
PRODH
PRODL
s
WREG
{}
Metoda de acces
a=0 (a=ACCESS): locaia de memorie RAM (registrul) se gsete n Access
Bank (BSR se ingnor)
a=1 (a=BANKED): locaia de memorie RAM (registrul) se gsete n Bankuri. Bank-ul utilizat este specificat de registrul BSR
Poziia bitului n cadrul unui registru (0-7)
Bank Select Register. Registru utilizat pentru selectarea bank-ului curent de lucru
Destinaia rezultatului
d=0 (d=W): rezultatul este stocat n WREG
d=1 (d=F): rezultatul este stocat n registrul f
Adresa de 8 bii a unui registru (00h - FFh) sau identificatorul de 2 bii al
regitrilor FSR (0h 3h)
Adresa de 12 bii a unui registru (000h - FFFh). Adresa registrului surs
Adresa de 12 bii a unui registru (000h - FFFh). Adresa registrului destinaie
File Select Register
Constant (valoare efectiv reprezentat pe 8 sau 12 bii n funcie instruciune)
Etichet sau adres efectiv din memoria program
Numrtorul de program
Registru care conine octetul superior al operaiei de nmulire
Registru care conine octetul inferior al operaiei de nmulire
Utilizarea stivei rapide
s=0: nu se utilizeaz stiva rapid pentru salvarea / refacerea regitrilor
STATUS, WREG, BSR
s=1 (s=FAST): se utilizeaz stiva rapid pentru salvarea / refacerea regitrilor
STATUS, WREG, BSR
Registrul de lucru
Argument opional al instruciunii
112
Instr. de
mutare
Instruciuni de
comparaie
Instruciuni logice
Instruciuni aritmetice
Instr.
comp
Instr.
logice
Descriere
Reseteaz bitul b din registrul f
Seteaz bitul b din registrul f
Schimb starea bitului b din registrul f
Testeaz bitul b din reg. f, salt dac este 0
Testeaz bitul b din reg. f, salt dac este 1
113
Cicluri instr.
1
1
1
1 (2 sau 3)
1 (2 sau 3)
Descriere
Adun WREG cu literal
Scade WREG din literal
nmulete WREG cu literal
I logic ntre WREG i literal
SAU logic ntre WREG i literal
SAU-EXCLUSIV ntre WREG i literal
Mut literal n WREG
Mut literal n BSR<3:0>
Mut literal (12 bii) n FSR(f)
Revenire din subrutin cu literal n WREG3
Cicluri instr.
1
1
1
1
1
1
1
1
2
2
Instruciuni de control
Cat.
Instruciuni
BC
n
BN
n
BOV
n
BZ
n
BNC
n
BNN
n
BNOV
n
BNZ
n
BRA
n
GOTO
n
PUSH
POP
CALL
n,s
RETURN
s
RETLW
k
RETFIE
s
RCALL
n
NOP
RESET
CLRWDT
SLEEP
DAW
Descriere
Salt dac bitul de transport (carry) este 1
Salt dac bitul negativ este 1
Salt dac bitul de overflow este 1
Salt dac bitul zero este 1
Salt dac bitul de transport (carry) este 0
Salt dac bitul negativ este 0
Salt dac bitul de overflow este 0
Salt dac bitul zero este 0
Salt necondiionat
Salt la adresa / etichet
Pune n stiv (Salveaz PC n stiv)
Scoate din stiv (Reface PC)
Apel de subrutin
Revenire din subrutin
Revenire din subrutin cu literal n WREG
Revenire din rutina de tratare a ntreruperii
Apel relativ
Nici o operaie
Resetare soft a controlerului
tergere Watch Dog Timer
Intrare n mod Stand-By
Ajusteaz zecimal WREG
Cicluri instr.
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
1 (2)
2
2
1
1
2
2
2
2
2
1
1
1
1
1
Instr. de
mutare
Instr. aritmetice
i logice
Instruciuni cu constante
Cat.
Instruciuni
ADDLW
k
SUBLW
k
MULLW
k
ANDLW
k
IORLW
k
XORLW
k
MOVLW
k
MOVLB
k
LFSR
f,k
RETLW
k
Instr. de
scriere
Instr. de
citire
114
3. Exemple
n continuare, sunt explicate mai detaliat cteva din instruciunile disponibile. Acestea
sunt prezentate n ordine alfabetic. S-a ncercat selectarea unei instruciuni din fiecare
categorie n parte. Pentru detalii referitoare la instruciunile care nu au fost acoperite n
aceast lucrare se poate consulta documentaia tehnic a microcontrolerului PIC18F4455.
Atenie o serie de instruciuni afecteaz o serie de bii din registrul STATUS4.
ANDWF - I logic ntre WREG i f
ANDWF f{,d{,a}}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
d[0,1] destinaia rezultatului
a[0,1] metoda de acces
Descriere:
(WREG) I (f) destinaie
Detalii:
Instruciunea realizeaz operaia I-LOGIC ntre coninutul registrului de
lucru WREG i coninutul registrului f. Dac operandul d=0 (W) rezultatul se
stocheaz n registrul WREG. Dac operandul d=1 (F) rezultatul se stocheaz
n registrul f.
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
ANDWF
REG,0,0
Exemplu:
naintea instruciunii:
WREG = 17h
REG = C2h
Dup instruciune:
WREG = 02h
REG = C2h
BCF - Reseteaz bitul b din registrul f
BCF f,b{,a}
Sintaxa:
Operanzi:
0f255 valoare pe 8 bii care specific adresa unui registru din memorie
0b7 poziia bitului n registru
a[0,1] metoda de acces
Descriere:
0f<b>
Instruciunea terge bitul b din registrul f.
Detalii:
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu
Cicluri:
BCF
REG,7,0
Exemplu:
naintea instruciunii:
REG = C7h
Dup instruciune:
REG = 47h
Detalii privind biii din registrul STATUS afectai de instruciuni se gsesc n documentaia tehnic.
115
116
Cicluri:
Exemplu:
(W) rezultatul este plasat n registrul WREG. Dac operandul d=1 (F)
rezultatul este plasat napoi n registrul f. Dac rezultatul este 0 se execut salt
peste instruciunea urmtoare
Dac operandul a=0 (ACCESS) este selectat Access Bank-ul.
Dac operandul a=1 (BANKED) se folosete registrul BSR pentru a selecta
bank-ul de lucru.
1 ciclu dac nu se execut salt
2 cicluri dac se execut salt peste o instruciune scurt
3 cicluri dac se execut salt peste o instruciune lung
AICI:
DECFSZ CONTOR,1,1
GOTO LOOP
CONTINUA:
nainte de instruciune:
PC = Adresa(AICI)
Dup instruciune:
CONTOR = CONTOR-1
Dac CONTOR = 0
PC = Adresa(CONTINUA)
Dac CONTOR 0
PC = Adresa(AICI+2)
(PC = Adresa (GOTO))
Cicluri:
Exemplu:
1 ciclu
INCF
CONTOR,1,0
naintea instruciunii:
CONTOR = 12h
Dup instruciune:
CONTOR = 13h
Descriere:
Detalii:
Cicluri:
Exemplu:
(fs)(fd)
Instruciunea mut coninutul registrului surs fs n registrul destinaie fd.
Locaia regitrilor fs i fd se poate afla oriunde n spaiul de adrese al
memoriei de date RAM (000h-FFFh)
2 cicluri instruciune
MOVFF
REG1,REG2
naintea instruciunii:
REG1 = 22h
REG2 = FFh
Dup instruciune:
REG1 = 22h
REG2 = 22h
120
Cicluri:
Exemplu:
1 ciclu
RLCF
REG,W,ACCESS
naintea instruciunii:
REG = 1110 0110
C
= 0
Dup instruciune:
REG = 11100110
WREG = 11001100
C
= 1
Anumite instruciuni afecteaz unii bii din registrul STATUS. De exemplu, instruciunea RLCF afecteaz bitul
de transport C (Carry) din registrul STATUS.
121
122
LIST P=18F4455
#include <P18F4455.INC>
;***************************************************************************
; Declaraie variabile
;
urmtoare
sunt
folosite
doar
n
cazul
utilizrii
; Variabilele
; ntreruperilor de prioritate mic (low) pentru salvarea contextului
; (WREG, BSR, STATUS)
CBLOCK
WREG_TEMP
STATUS_TEMP
BSR_TEMP
ENDC
0x080
;variabil utilizat pentru salvarea contextului
;variabil utilizat pentru salvarea contextului
;variabil utilizat pentru salvarea contextului
CBLOCK
VAR
ENDC
0x000
;examplu de variabil declarat n access RAM
123
;***************************************************************************
; EEPROM data
;
; Datele nscrise n EEPROM se definesc aici
ORG
0xf00000
DE
"Test Data",0,1,2,3,4,5
;***************************************************************************
; Adresa de reset
;
; Acest cod se va executa la resetarea microcontrolerului
ORG
0x0000
GOTO
Main
;***************************************************************************
; Vectorul nteruperii cu prioritate mare
;
; Acest cod se va executa la apariia unei nteruperi de prioritate mare
; (high) sau la apariia oricrei nteruperi dac nu se utilizeaz
; prioritile de nterupere.
ORG
0x0008
BRA
HighInt
;***************************************************************************
; Vectorul i rutina de tratare a nteruperii cu prioritate mic
;
; Acest cod se va executa la apariia unei nteruperi de prioritate mic
; (low). Aceast poriune de cod poate fi scoas din program dac nu se
; utilizeaz prioritile de nterupere.
ORG
0x0018
movff WREG,WREG_TEMP
movff BSR,BSR_TEMP
movff STATUS,STATUS_TEMP
;
retfie
;***************************************************************************
; Rutina de tratare a ntreruperii de prioritate mare
;
; Codul rutinei de tratare a nteruperii de prioritate mare este plasat n
; acest loc pentru a evita un eventual conflict (din cauza dimensiunii
; rutinei) cu rutina de tratare a nteruperii cu prioritate mic
HighInt:
;
FAST
124
;***************************************************************************
; nceputul programului principal
;
; Corpul principal al programului este plasat aici
Main:
*** codul programului principal ***
;
END
;sfritul programului
125
126
4.
5.
6.
Observaii
Programul trebuie compilat de la adresa 0x800 (ORG 0x800). Cu alte cuvinte,
programul realizat trebuie s se plaseze n memoria program ncepnd cu adresa 0x800.
Spaiul de memorie program cuprins ntre adresa 0x000 i 0x800 este rezervat Boot
Loaderului.
Pentru a identifica dac programul realizat a fost compilat de la adresa corect se poate
urmri listarea programului n cod main n partea inferioar a ferestrei aplicaiei de
ncrcare. n Figura A4.4 se prezint cazul unui program compilat de la adresa corect, iar n
Figura A4.5 se prezint cazul unui program compilat de la adresa incorect (0x000000)
128
129
130
131
n acest figur se exemplific situaia n care pachetul MPLAB C18 nu a fost instalat n directorul implicit. n
aceast situaie cile spre componente vor trebui selectate manual
2
Aceste fiiere vor fi puse la dispoziie n cadrul laboratorului. Codul surs al 18f4455.lkr este disponibil n
Anexa 6, iar fiierul c018i.o este disponibil n C:\mcc18\lib.
132
133
Anexa 6 18f4455.lkr
Codul surs de mai jos poate fi copiat i salvat ntr-un fiier cu denumirea
18f4455.lkr. Acest fiier se va copia n directorul care conine proiectul pentru aplicaia
dezvoltat folosind limbajul de programare C i compilatorul MPLAB C18, iar apoi se va
aduga la proiect.
// $Id: 18f4455.lkr,v 1.3 2004/08/23 18:08:22 curtiss Exp $
// File: 18f4455.lkr
// Sample linker script for the PIC18F4455 processor
LIBPATH .
FILES c018i.o
FILES clib.lib
FILES p18f4455.lib
CODEPAGE
PROTECTED
CODEPAGE
CODEPAGE
PROTECTED
CODEPAGE
PROTECTED
CODEPAGE
PROTECTED
CODEPAGE
PROTECTED
NAME=vectors
START=0x0
END=0x29
NAME=page
NAME=idlocs
START=0x800
START=0x200000
END=0x5FFF
END=0x200007
NAME=config
START=0x300000
END=0x30000D
NAME=devid
START=0x3FFFFE
END=0x3FFFFF
NAME=eedata
START=0xF00000
END=0xF000FF
ACCESSBANK
DATABANK
DATABANK
DATABANK
DATABANK
DATABANK
PROTECTED
DATABANK
PROTECTED
DATABANK
PROTECTED
DATABANK
PROTECTED
ACCESSBANK
PROTECTED
NAME=accessram
NAME=gpr0
NAME=gpr1
NAME=gpr2
NAME=gpr3
NAME=usb4
START=0x0
START=0x60
START=0x100
START=0x200
START=0x300
START=0x400
END=0x5F
END=0xFF
END=0x1FF
END=0x2FF
END=0x3FF
END=0x4FF
NAME=usb5
START=0x500
END=0x5FF
NAME=usb6
START=0x600
END=0x6FF
NAME=usb7
START=0x700
END=0x7FF
NAME=accesssfr
START=0xF60
END=0xFFF
SECTION
NAME=CONFIG
ROM=config
134
135
Urmtorul pas este alegerea vitezei de comunicare, numrul de bii al datelor, paritii,
numrul biilor de stop i al controlului fluxului de date (Flow control). n Figura A7.3 a fost
aleas urmtoarea configuraie: viteza de comunicaie de 9600 bii pe secund, 8biti de date,
fara paritate, un bit de stop i fr controlul fluxului de date.
136
Bibliografie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
137