Documente Academic
Documente Profesional
Documente Cultură
OBIECTIVE
Lucrarea prezinta echipamentele utilizate n cadrul laboratorului:
1.2
Doua surse de tensiune de ieire reglabil ntre 0 i 20V/0.5A i o surs fixa 5V/1A;
Rezoluie afiat 0.1V/1mA;
Posibilitate de conectare n paralel sau serie;
Buton pentru activarea/dezactivarea simultan a tuturor canalelor;
Limitare ajustabil pentru curent i siguran electronic.
Butoanele rotative pentru ajustarea tensiunii sunt folosite pentru varierea tensiunii n domeniul
0-20V. Butonul rotativ (8) din stnga seteaz sursa din stnga, iar butonul rotativ (12) din dreapta
seteaz sursa din dreapta.
(9) & (13) - Ieire 0-20V
Terminalele de ieire pentru sursele 0-20V constau din dou mufe banan mam la care se pot
conecta fire sau mufe banan tat. Circuitul electronic asigur protecia mpotriva scurtcircuitului.
(10) & (14) Ajustare limit curent
Butoanele rotative pentru ajustarea limitrii de curent pentru ieirea din partea stng (10) i ieirea
din partea dreapt (14). Domeniul de reglare este ntre 0-0.5A.
(11) - Ieire 5V
Terminalele de ieire pentru sursa de tensiune de +5V constau din dou mufe banan mam de
4mm la care se pot conecta fire sau mufe banan tat. Circuitul electronic asigur protecie
mpotriva scurtcircuitului. Un orificiu de acces (aflat deasupra, ntre cele dou terminale de 5V)
permite un reglaj fin ntre 4.5V - 5.5V.
1.4
un buton pentru selectarea formei semnalului de ieire (FUNCTION (6)) indicat de LEDurile (5);
dou ieiri de semnal: una pentru semnalul dorit de utilizator (10), avnd forma de und i
valorile reglate pentru frecven i amplitudine (de ex. un semnal sinusoidal cu frecvena
20Hz i amplitudinea 4V) i o ieire pentru semnal de sincronizare TTL (7).
1.5
Un multimetru este un instrument de msurare electronic care combin mai multe funcii
de msurare ntr-o singur unitate. Un multimetru include caracteristici de baz, cum ar fi:
capacitatea de a msura tensiunea, curentul i rezistena. Multimetrele digitale (DMM, DVOM)
afieaz valoarea msurat n cifre.
Caracteristici ale HAMEG HM8012:
42 domenii de msurare;
Precizie de 0.05%;
(1) - Afiaj
Afiajul digital indic valoarea de msurare cu o rezoluie de 4 cifre, unde cea mai mare cifr
folosit este "5". Acesta va afia, de asemenea, diverse mesaje de avertizare. Valoarea de msurare
va fi afiat cu puncte zecimale i polaritate.
(2) Martor continuitate
(3) - Activare/dezactivare martor pentru continuitate
Activeaz/dezactiveaz semnalul acustic pentru funcia de continuitate.
(4) & (5) & (7) & (9) - Conectori de 4mm
4 conector pentru msurarea a maximum 10 A n conjuncie cu intrarea COM (7);
5 - conector pentru msurarea a maximum 500 mA n conjuncie cu intrarea COM (7);
7 conector comun pentru toate msurtorile ce are potenial apropriat cu masa (0V) cantitii
msurate.
9 conector pentru msurarea voltajelor, rezistenelor, temperaturilor i jonciunilor de diode n
conjuncie cu intrarea COM (7).
(6) HOLD (LED)
LED ce indic faptul c valoarea indicat de afiaj este blocat. Aceast funcie este activat de
butonul (10).
(8) OFFSET (LED)
LED ce indic faptul c afiajul arat o msurtoare relativ. Valoarea indicat reprezint diferena
ntre valoarea de la intrare i cea prezent la activarea modului OFFSET. Activarea acestei funcii
se face prin apsarea butonului (10).
(11) & (12) - Domeniu
Butoane pentru schimbarea domeniului de msurare.
(15) - Auto-Range
Buton pentru activarea/dezactivarea funciei de auto-range.
(16) - Unitatea de msurare
Aceast zon afieaz unitatea de msur pentru funcia de msurare selectat.
(17) - AC/DC
Selectare pentru msurare n DC sau AC.
(18) & (19) - Funcie msurare
Selectarea funciei de msurare.
1.6
Domeniu de pn la 1.6GHz;
Senzitivitate 20 mV;
Funcii de msurare;
Trei perioade de eantionare;
Auto-trigger.
(1) - OF (LED)
LED-ul este aprins cnd apare o depire (overflow). Aceasta depinde de perioada de eantionare.
(2) - GT (GATE OPEN, LED)
Indicatorul GT este aprins atunci cnd intrarea este deschis pentru msurtori.
(3) - Gate Time
Selecteaz perioada de eantionare (0.1s, 1s, 10s).
(4) - Hold
Pe afiaj rmne ultima valoare msurat pn la apsarea butonului RESET.
8
(5) - Function
Martorii LED indic funcia de msurare selectat cu ajutorul butoanelor.
(6) - Offset
La apsarea butonului, valoarea afiat de display devine noua valoare de referin.
(7) - Reset
Buton RESET. Resetul este activ atta timp ct butonul este apsat.
(8) - Input C
Gama de frecvene: 100 MHz - 1,6 GHz.
Impedana de intrare: 50.
(9) - DC
Selectarea semnalului de intrare.
(10) - 1:20
Selecteaz atenuarea semnalului de intrare. Semnalul de intrare este atenuat cu 26 dB.
(11) - Auto
Declaneaz semnalul de intrare.
(12) - Input A
Sensibilitate semnal de intrare: 20mV - 80 MHz i 60mV - 150MHz.
(13) - Trigger Level
Poteniometru de ajustare a trigger-ului. LED-ul martor clipete atunci cnd trigger-ul este corect.
(14) - Afiaj 8 digii
(15) - Hz (LED): unitatea de msur a frecvenei;
Sec(LED): unitatea de msur a timpului.
1.7
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
2.2
AVR JTAG ICE este un emulator puternic pentru toate microcontroler-ele AVR de 8
bii cu interfa JTAG IEEE 1149.1, cu suport de emulare inclus n cip (on-chip debugging).
Practic, aceast facilitate este disponibil pe noile ATmega (ATmega128, ATmega8,
ATmega16, etc.). JTAG ICE i depanatorul software AVR Studio ofer utilizatorului control
asupra resurselor interne ale microcontroler-ului, ajutnd la reducerea timpului de dezvoltare i
fcnd depanarea mai uoar. JTAG ICE realizeaz emularea microcontroler-ului n timp real,
n timp ce se ruleaz aplicaia n sistemul int. JTAG ICE ofer posibilitatea de emulare la o
jumtate de cost n comparaie cu emulatoarele tradiionale.
11
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Caracteristici:
Atmega323;
Atmega16;
Atmega32 (disponibil n Q2 2002);
Atmega162 (disponibil n Q1 2001).
JTAG ICE va fi actualizat automat prin versiuni viitoare ale AVR Studio pentru a
susine viitoarele dispozitive cu suport JTAG pe msur ce acestea vor fi scoase pe pia.
Interfaa JTAG este integrat n AVR Studio. Toate fazele dezvoltrii AVR pot fi fcute n
acest mediu de dezvoltare integrat.
12
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
2.3
registrele generale;
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
puternic ce ofer o soluie extrem de flexibil i cu un cost redus n comparaie cu multe altele
de pe pia. ATmega16 AVR este susinut de o serie complet de instrumente de program i de
dezvoltare a sistemului, care include: compilatoare C, macroasambloare, programe
depanare/simulare etc.
Diagrama bloc :
PA0 PA7
PC0 PC7
VCC
PORTA Buffers/Drivers
PORTC Buffers/Drivers
GND
AVCC
Mux i
ADC
Interfa
ADC
TWI
Program
Counter
Pointer
Stiv
Timer-e/
Counters
Program
Flash
SRAM
Oscilator
Intern
AREF
Registru
Instruciun
i
Decodor
Instruciun
i
Regitri de
uz general
X
Y
Z
Linii de
control
ALU
AVR CPU
Registru
de stare
Logica de
programare
SPI
+
-
Watchdog
Timer
Oscilator
Oscilator
MCU Control
& Timing
Unitate
ntreruperi
RESET
Oscilator
intern calibrat
EEPROM
USART
Interfa
comparator
PORTA Buffers/Drivers
PORTC Buffers/Drivers
PB0 PB7
PD0 PD7
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
2.4
2.4.1
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Fiecare din cele dou limbaje de programare suportate pot fi folosite fie ntr-un mod
strict, fie n unul relaxat, fie n unul relaxat cu extensiile IAR activate. Modul strict ader la
standard, pe cnd modul relaxat permite anumite deviaii de la acest standard. Este de
asemenea posibil ca anumite pri ale aplicaiei s fie implementate n limbaj de asamblare.
16
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Program surs
Textul este preluat sub forma unor
secvene de caractere crora li se
atribuie coduri lexicale
Analiza lexical
ir de atomi ->Structuri
sintactice(instruciuni,expresii)
Analiza sintatic
Arbore sintactic; compatibilitate
tipuri de date
Analiza semantic
Informaii
despre nume
Recunoatere+emitere
mesaje
Gestionare T.S.
Tratarea erorilor
Similar limbajului de
asamblare,doar c nu se
specific registrele utilizate
Optimizare cod
Faz opional;
Timp de execuie/ spaiu de
memorie
Program obiect
Figura 2.4 Etapele realizrii unei aplicaii
o
o
o
o
o
a.
Configurarea procesorului: Pentru un cod optim generat de compilator, setrile
trebuie realizate pentru microcontroler-ul folosit.
Exist dou opiuni ale procesorului care pot fi folosite pentru configurarea suportului
procesorului: --cpu=derivative i vn.
17
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Ambele opiuni seteaz comportamentul implicit dar opiunea --cpu este mai precis
deoarece conine mai multe informaii despre target, dect mult mai generala opiune v.
Urmtorul tabel arat maparea opiunilor procesor i ce microcontroler AVR suport:
Variant procesor
--cpu=1200
--cpu=2313
--cpu=2323
--cpu=2333
--cpu=2343
--cpu=4414
--cpu=4433
--cpu=4434
--cpu=8515
--cpu=8534
--cpu=8535
--cpu=at43usb320a
Opiune generic
-v0
-v0
-v0
-v0
-v0
-v1
-v0
-v1
-v1
-v1
-v1
-v3
--cpu=at43usb325
-v3
--cpu=at43usb326
--cpu=at43usb351m
-v3
-v3
AT43USB325
AT43USB326
AT43USB351m
--cpu=at43usb353m
-v3
AT43USB353m
--cpu=at43usb355
--cpu=at94k
-v3
-v3
AT43USB355
FpSLic
--cpu=at86rf401
--cpu=can128
--cpu=m8
-v0
AT86RF401
-v3
AT90CAN128
ATmega8
--cpu=m16
--cpu=m32
--cpu=m48
-v1
-v3
ATmega16
-v3
-v1
ATmega32
ATmega48
--cpu=m64
-v3
ATmega64
--cpu=m88
--cpu=m103
-v1
-v3
ATmega88
ATmega103
--cpu=m128
-v3
ATmega128
--cpu=m161
--cpu=m162
-v3
-v3
ATmega161
ATmega162
--cpu=m163
-v3
ATmega163
--cpu=m165
--cpu=m168
-v3
-v3
ATmega165
ATmega168
--cpu=m169
-v3
ATmega169
18
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
--cpu=m2560
--cpu=m2561
-v5
-v5
ATmega2560
ATmega2561
--cpu=m323
-v3
ATmega323
--cpu=m325
-v3
ATmega325
--cpu=m3250
-v3
ATmega3250
--cpu=m329
-v3
ATmega329
--cpu=m3290
-v3
ATmega3290
--cpu=m406
--cpu=m645
-v3
-v3
ATmega406
--cpu=m6450
-v3
--cpu=m649
--cpu=m6490
-v3
-v3
--cpu=m8515
-v1
ATmega6490
ATmega8515
--cpu=m8535
--cpu=tiny10
-v1
-v0
ATmega8535
ATtiny10
--cpu=tiny11
-v0
ATtiny11
--cpu=tiny12
--cpu=tiny13
-v0
-v0
ATtiny12
ATtiny13
--cpu=tiny15
-v0
ATtiny15
--cpu=tiny25
--cpu=tiny26
-v0
-v0
ATtiny25
ATtiny26
--cpu=tiny28
-v0
ATtiny28
--cpu=tiny45
--cpu=tiny85
-v1
-v1
ATtiny45
ATtiny85
--cpu=tiny2313
-v0
ATtiny2313
ATmega645
ATmega6450
ATmega649
19
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Urmtorul tabel rezum caracteristicile memoriei pentru fiecare opiune v:
Opiune generic
procesor
-v0
-v1
-v2
-v3
-v4
-v5
-v6
Modele
memorie
Tiny
Tiny, Small
Tiny
Tiny, Small
Small, Large
Tiny, Small
Small, Large
Atribut
Data max.
__nearfunc
__nearfunc
__nearfunc
__nearfunc
__nearfunc
__farfunc*
__farfunc*
256 octei
64 octei
256 octei
64 koctei
16 Mo
64 koctei
16 Mo
v4
ori
v6
b.
Modelul de memorie: Una dintre caracteristicile microcontroler-ului AVR este c
exist un compromis privind modul de accesare a memoriei variind ntre acces puin costisitor,
limitat la zone mici de memorie i metode de acces costisitor prin care este accesat orice
locaie de memorie. n compilatorul C/C++ AVRIAR putei seta o metod implicit de acces
la memorie selectnd un anumit model de memorie. Exist trei modele de memorie : Tiny,
Small i Large. Alegerea opiunii de procesor determin ce modele de memorie sunt
disponibile. Dac nu se specific opiunea pentru modelul de memorie, modelul Tiny va fi cel
selectat n mod implicit pentru toate opiunile procesorului cu excepie n cazul v4 i v6,
unde se va folosi modelul Small. Programul poate folosi doar un singur model de memorie i
acelai model trebuie folosit n toate modulele utilizatorului i n toate modulele librrie.
Urmtorul tabel rezum caracteristicile fiecrui model de memorie:
Modelul de
memorie
Tiny
Small
Large
Opiunea
generic
procesor
-v0, -v1, -v2, -v3,
-v5
-v1, -v3, -v4, -v5,
-v6
-v4, -v6
Atribut de
memorie implicit
Pointer
implicit
Dimensiunea
maxim a stivei
__tiny
__tiny
256 o
__near
__near
64 ko
__far
__far
16 Mo
20
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
c.
d.
e.
Mediul de rulare
Pentru crearea mediului de rulare necesar va trebui s alegei o librrie de
rulare i s setai opiunile de librrie. Ai putea de asemenea sa dorii s
trecei peste modulele de librrii folosind versiunile personalizate proprii de
librrii.
IAR DLIB Library, care suport ISO/ANSI C i C++. Aceast librrie suport de
asemenea numere n virgul mobil n format IEEE 754 i poate fi configurat pentru a include
diferite nivele de suport pentru locale, descriptori de fiier, caractere multibyte, etc.
IAR CLIB Library, este o librrie din categoria uoar, care nu este compilat n
totalitate cu ISO/ANSI C. De asemenea nu ofer suport deplin pentru numere n virgul mobil
n format IEEE 754 sau suport pentru Embedded C++(aceast librrie este folosit implicit).
Librria de rulare pe care o alegei poate fi una dintre librrie pre-built, sau o librrie
pe care ai customizat-o sau ai construit-o. IAR Embedded Workbench IDE ofer template-uri
pentru librriile de proiect pentru ambele librrii, care le putei folosi pentru construirea
propriilor tipuri de librrii. Acest lucru v ofer control deplin asupra mediului de rulare. Dac
proiectul conine doar cod surs n assembler nu este nevoie alegerea unei librrii de rulare.
Pentru alegerea unei librrii, se alege Project>Options i se d click pe tab-ul Library
Configuration din categoria General Options. Se alege tipul de librrie adecvat din meniul
drop-down.
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Linia de comand
-I\avr\inc
I\avr\inc\{clib|dlib}
libraryfile.r90
--dlib_config
C:\...\configfile.h
Descriere
Specific calea pentru includere
Specific calea pentru fiiere librrie specifice. Utilizai
clib/dlib depinznd de ce librrie folosii.
Specific fiierul obiect.
Specific fiierul de configurare pentru librrie (doar pentru
biblioteca DLIB).
Tabel 2.4 Opiuni ale liniei de comand pentru specificarea bibliotecii i a fiierelor dependente
Tabelul arat de asemenea cum fiierul obiect corespunde opiunilor dependente de proiect.
2.4.2
#pragma include_alias
#pragma inline
#pragma language
#pragma location
#pragma message
Afieaz un mesaj
#pragma ablon_de_baz
#pragma bitfields
#pragma constseg
#pragma data_alignment
#pragma dataseg
#pragma diag_default
#pragma diag_error
#pragma diag_remark
#pragma diag_suppress
#pragma diag_warning
22
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
#pragma
object_attribute
#pragma optimize
#pragma pack
#pragma required
#pragma rtmodel
#pragma segment
#pragma type_attribute
#pragma vector
Simbolul predefinit
__ALIGNOF__()
__BASE_FILE__
__CORE__
__CPU__
__cplusplus
__DATE__
__derivative__
__embedded_cplusplus
__FILE__
__func__
__FUNCTION__
__HAS_EEPROM__
__IAR_SYSTEMS_ICC__
__ICCAVR__
__LINE__
__MEMORY_MODEL__
NDEBUG
_Pragma()
Identificri
Acceseaz alinierea unui obiect
Identific numele fiierului s fie compilat. Dac fiierul este
un fiier antet, numele de fiier care include fiierul header este
identificat.
Identific varianta procesorului n uz
Identific varianta procesorului n uz
Stabilete dac se execut n compilator modul C + +
Determin data de compilare
Corespunde procesorul specificat cu opiunea compilatorului
cpu
Stabilete dac se execut n compilator modul C + +
Identific numele fiierului fiind compilat
Se extinde intr-un string cu numele funciei i contextul
Se extinde intr-un string cu numele funciei i contextul
Determin dac exist un EEPROM disponibil
Identific platforma compilatorului IAR
Identific compilatorul AVR IAR C / C + +
Determin numrul liniei sursei de curent
Identific modelul de memorie n uz
Determin dac afirmaiile trebuie s fie incluse sau nu n
cererea construit
Poate fi utilizat n preprocesor, definete i are efect echivalent
23
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
__PRETTY_FUNCTION__
__STDC__
__STDC_VERSION__
__TID__
__TIME__
__VER__
__VERSION_1_CALLS__
cu directiva Pragma
Se extinde ntr-un string cu numele funciei, inclusiv tipuri de
parametru i de tip ntoarcere, ca context
Identific ISO / standardului ANSI C
Identific versiunea standardului ISO / ANSI standardului C n
uz
Identific procesor int al IAR compilator n uz
Determin timpul de compilare
Identific procesor int al IAR compilator n uz
Identific convenia de apelare n uz
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
PORTE = 0x12;
/* Bitfield accesses */
PORTE.PORTE_Bit0 = 1
2.5
2.5.1
Figura 2.5
1.
2.
25
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.6
se indic fiierul spaiului de lucru (cu extensia .eww) din directorul corespunztor
proiectului
3.
Configurarea proiectului n IAR 5.51
menu=Project menu=Options...
n fereastra ce se va deschide vor fi alese urmtoarele opiuni:
Figura 2.7
26
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.8
Figura 2.9
27
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.10
C/C++ Compiler List Output list file = enabled (pentru a obine fiierul lst)
Figura 2.11
Linker List Generate linker listing = enabled, Segment Map = enabled, Module
map = enabled (pentru a vedea fiierul map)
28
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.12
nainte de a compila proiectul, se va defini spaiul de lucru astfel:
menu=Project menu=Make
se va indica locaia fiierului cu informaii despre spaiul de lucru.
2.5.2
De fapt proiectul specific mediului AVR se va construi peste proiectul creat mai devreme n
IAR, urmnd paii:
29
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.13
button=Save
va aprea o fereastr n care se va cere s se aleag platforma pe care va rula codul
executabil
Figura 2.14
button=Finish
Not: codul surs vizibil n AVR poate fi doar citit.
1.
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
2.
3.
Execuia programului
click-dreapta
Figura 2.15
Se poate studia coninutul memoriei de la o adres oarecare:
menu=View menu=Memory
31
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.16
5.
Figura 2.17
n fila Main > Device and Signature Bytes ->Se alege Atmega16 din lista de modele
AVR
32
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figur 2.18
Pentru a testa conexiunea la Atmega16 : Main -> Read Signature. Astfel se trimite o
comand la Atmega16 care cere semntura dispozitivului. Dac totul e conectat corect
va apare: Signature matches selected device(Semntura se potrivete cu dispozitivul
ales)
Figura 2.19
Pentru a programa dispozitivul int: fila Program Seciunea Flash- n Input HEX
File se pune fiierul hex generat la construirea proiectului(fiierul se afl n
default\<numele_proiectului.hex>). Se apas butonul Program din seciunea Flash.
33
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figur 2.20
6.
Figura 2.21
34
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Apsnd fila LockBits se citesc automat biii de blocare a dispozitivului AVR. Dac
dispozitivul nu e conectat atunci se va afia un mesaj de eroare. Aceti bii permit
securizarea dispozitivului prevenind citirea sau scrierea ulterioar de pe flash. Biii de
blocare pot fi resetai la o stare neblocant prin tergerea chip-ului(fila Main butonul
Erase Device). Biii de blocare sunt importani atunci cnd se dorete cedarea
produsului altor persoane fr a le da acces la program sau dac se dorete
mpiedicarea rescrierii accidentale a chip-ului programat.
Figura 2.22
2.5.3
35
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.23
1.
2.
Configurarea proiectului n IAR 6.11
menu=Project menu=Options...
n fereastra ce se va deschide vor fi alese urmtoarele opiuni:
36
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.24
Figura 2.25
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.26
Figura 2.27
C/C++ Compiler List Output list file = enabled (pentru a obine fiierul lst)
38
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.28
Linker List Generate linker listing = enabled, Segment Map = enabled, Module
map = enabled (pentru a vedea fiierul map)
Figura 2.29
39
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
DebuggerSetupDriverJTAGICE
Figura 2.30
40
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.31
Execuia programului
Pentru a vedea care e COM-ul corespunztor portului serial USB:
Control Panel - System-Hardware-Device manager-Ports
Figura 2.32
41
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Figura 2.33
Este notabil faptul c se pot crea breakpoint-uri n program. Astfel putem verifica, de exemplu:
dac o secven de cod se execut sau nu (o rutin de ntrerupere)
valoarea regitrilor i coninutul memoriei la un moment dat
4.
Figura 2.34
42
Laborator 2 - Introducere n AVR Studio 4.19 i IAR Embedded Workbench 5.51 6.11
Pentru a urmri valoarea unei variabile n program se va aduga numele variabilei n fereastra
Watch:
Meniu=View ->Watch
Figura 2.35
Se poate studia coninutul memoriei de la o adres oarecare:
menu=View menu=Memory
Figura 2.36
43
3.1.1
CE ESTE UN LED?
44
3.1.2
Anod
Catod
DC
R
R = ( U - Ub )/ I, unde:
U este tensiunea de alimentare a circuitului;
Ub este tensiunea la bornele LED-ului (uzual: 2V pentru LED rou, galben,
verde i 3,5V pentru albastru i alb). n cazul mai multor LED-uri montate n
serie, aceasta se multiplic cu numrul de LED-uri;
I este curentul maxim prin LED ( uzual 20 mA).
45
Greit:
Corect:
3.2
3.2.1
PB4 (SS)
PB3 (AIN1/OC0)
PB2 (AIN0/INT2)
PB1 (T1)
PB0 (XCK/T0)
GND
VCC
PA0 (ADC0)
PA1 (ADC1)
PA2 (ADC2)
PA3 (ADC3)
TQFP/QFN/MLF
PDIP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
PA0
PA1
PA2
PA3
PA4
PA5
PA6
PA7
AREF
GND
AVCC
PC7
PC6
PC5
PC4
PC3
PC2
PC1 (SDA)
PC0 (SCL)
PD7
44
(MOSI) PB5
(MISO) PB6
(SCK) PB7
RESET
VCC
GND
XTAL2
XTAL1
(RXD) PD0
(TXD) PD1
(INT0) PD2
43
42
41
40
39
38
37
36
34
35
1
2
3
4
5
6
7
8
9
10
11
33
32
31
30
29
28
27
26
25
24
23
12
13
14
15
16
17
18
19
20
21
PA4 (ADC4)
PA5 (ADC5)
PA6 (ADC6)
PA7 (ADC7)
AREF
GND
AVCC
PC7 (TOSC2)
PC6 (TOSC1)
PC5 (TDI)
PC4 (TDO)
22
TWI
(INT1) PD3
(OC1B) PD4
(OC1A) PD5
(ICP1) PD6
(OC2) PD7
VCC
GND
(SCL) PC0
(SDA) PC1
(TCK) PC2
(TMS) PC3
(XCK) PB0
PB1
PB2
PB3
(SS) PB4
(MOSI) PB5
SPI
(MISO) PB6
(SCK) PB7
RESET
VCC
GND
XTAL2
XTAL1
(RXD) PD0
USART
(TXD) PD1
PD2
PD3
PD4
PD5
PD6
3.2.2
47
3.2.3
PORTURILE DE INTRARE/IEIRE
Atunci cnd sunt folosite ca porturi generale digitale I/O, toate porturile au
funcionalitate de citire-modificare-scriere (true Read-Modify-Write). Aceasta
nseamn c, direcia unui port poate fi schimbat fr schimbarea neintenionat a
direciei oricrui alt pin prin instruciunile SBI i CBI. Toi pinii porturilor au rezisten
de pull-up individual, selectabil, cu rezerve de putere. Toi pinii I/O au diod de
protecie att pentru Vcc ct i pentru mas, aa cum se poate vedea n figura urmtoare:
Rpu
Pin
Cpin
3.2.4
CONFIGURAREA PINILOR
Trei locaii de memorie (cte 3 registre pe 8 bii) sunt alocate pentru fiecare
port n parte: pentru Registrul de date (Data Register) PORTx, Registrul de direcie a
datelor (Data Direction Register) DDRx i Registrul de intrare ( Port Input Pins)
PINx. Locaia registrului PINx poate fi doar citit nu i scris, n timp ce DDRx i
PORTx pot fi att scrise ct i citite. Pentru a dezactiva rezistena de pull-up trebuie
setat (1 logic) bitul PUD (Pull-up Disable) din registrul SFIOR.
Notaia generic pentru aceti regitrii este DDxn, PORTxn, i PINxn, unde
xn se refer la denumirea pinului respectiv (x reprezint numrul literei portului (A,
B, C, D) i n reprezint numrul bit-ului (1-8) ). La utilizarea regitrilor i biilor ntrun program, trebuie precizat forma exact, de exemplu PORTB3 pentru bitul nr. 3 din
portul PORTB. Biii DDxn se gsesc la adresa registrului DDRx, biii PORTxn se
gsesc la adresa registrului PORTx, iar biii PINxn se gsesc la adresa registrului PINx.
DDRx (Data Direction Register) seteaz direcia pinilor, i anume dac acetia sunt de
intrare sau de ieire. Scrierea valorii de 0 pe un bit din DDRx face ca pinul
corespunztor din portul x s fie pin de intrare, iar scrierea valorii de 1 l seteaz ca
pin de ieire. Implicit toi pinii sunt pini de intrare. De exemplu:
- pentru a seta toi pinii portului A pini de intrare vom scrie:
DDRA = 0x00;
- pentru a seta toi pinii portului A pini de ieire vom scrie:
DDRA = 0xFF;
- pentru a seta pinii 0, 4, 5 si 7 a portului B ca pini de ieire vom scrie:
DDRB = 0xB1;
PORTx este folosit n dou scopuri: pentru a asigna valori pinilor de ieire (low sau
high) i pentru a activa i dezactiva rezistenta de pull-up pentru pinii de intrare. Dac
PORTxn este scris ca 1 logic atunci cnd pinul este configurat ca pin de intrare,
rezistena de pull-up este activat. Pentru a dezactiva rezistena de pull-up , PORTxn
trebuie resetat (pus pe 0 logic), sau pinul trebuie s fie configurat ca pin de ieire. Pinii
porturilor au valoarea HiZ atunci cnd este activat o condiie de reset, chiar dac nu
este nici un clock activ. Dac PORTxn este scris ca 1 logic, atunci cnd pinul este
configurat ca pin de ieire, pinul portului este trecut in 1 logic. Dac PORTxn este scris
ca 0 logic atunci cnd pinul este configurat ca pin de ieire pinul portului este trecut n 0
logic. Rolul acestui registru este astfel n legtur cu registrul DDRx. De exemplu:
- pentru a seta pinii 0, 4, 5 si 7 a portului B ca pini de ieire cu valori de 1 logic se va
scrie:
DDRB = 0xB1; //se seteaz pinii ca ieiri
PORTB = 0xB1; //se seteaz pinii cu valori de 1 logic
- pentru a seta pinii 0 i 2 a portului A ca pini de ieire cu valori de 1 logic se va scrie:
DDRA = 0x03; // se seteaz pinii ca ieiri
PORTA = 0x03; // se seteaz pinii cu valori de 1 logic
PINx este folosit pentru a citi valorile pinilor de intrare. Astfel dup ce se seteaz pinii
portului x ca pini de intrare, se pot afla valorile intrrilor citind registrul PINx. De
exemplu:
- pentru a citi valorile pinilor de la portul C se poate scrie:
49
DDxn
PORTxn
I/O
Pull-up
0
1
PUD
(n SFIOR)
x
0
0
0
Input
Input
Nu
Da
0
1
1
1
0
1
1
x
x
Input
Output
Output
Nu
Nu
Nu
Descriere
Tri-state (Hi-Z)
Va trece curent prin pin
doar dac n exterior avem
0 logic.
Tri-state (Hi-Z)
Ieirea va fi 0 logic
Ieirea va fi 1 logic
3.2.5
Independent de setrile bitului DDxn, portul pinului poate fi citit prin PINxn
Register bit. Din figura se arat c PINxn Register bit, mpreun cu circuitul latch ce l
precede, constituie un sincronizator. Acesta introduce o ntrziere dac pinul fizic i
schimb valoarea aproape de maximul ceasului intern. Figura urmtoare prezint o
diagram de timp a sincronizrii atunci cnd se citete o solicitare extern a valorii unui
pin. Maximul i minimul propagrii unei ntrzieri sunt indicate de t pd,max i tpd,min.
50
SYSTEM CLK
INSTRUCTIONS
XXX
XXX
in r17, PIN x
SYNC LATCH
PIN xn
0xFF
0x00
r17
tpd,max
tpd,min
SYSTEM CLK
0xFF
r16
INSTRUCTIONS
out PORTx,r16
nop
in r17,PINx
SYNC LATCH
PIN xn
0xFF
0x00
r17
tpd
3.2.6
Numele ntreg
Descriere
PUOV
DDOE
DDOV
PVOE
Port
Value
Enable
Override
52
PVOV
DIEOE
Digital
Input
Override Enable
Enable
DIEOV
Digital
Input
Override Value
Enable
DI
AIO
Digital Inputs
Analog Input/Output
Figura 3.9 Descrierea generic a semnalelor de suprascriere pentru alte funcii ale
porturilor
3.2.6.1 Funcii alternative ale portului A
Portul A mai are si funcia de intrare analogic pentru ADC, aa cum se poate
vedea n Figura 3.. Dac unii pini ai Portului A sunt configurai ca ieire, este esenial ca
acest lucru s nu se schimbe atunci cnd are loc o conversie. Acest fapt ar duce la o
conversie eronat.
53
Pinul Portului
PA7
PA6
PA5
PA4
PA3
PA2
PA1
PA0
Alt Funcie
ADC7 ( canalul 7 de intrare ADC)
ADC6 ( canalul 6 de intrare ADC)
ADC5 ( canalul 5 de intrare ADC)
ADC4 ( canalul 4 de intrare ADC)
ADC3 ( canalul 3 de intrare ADC)
ADC2 ( canalul 2 de intrare ADC)
ADC1 ( canalul 1 de intrare ADC)
ADC0 ( canalul 0 de intrare ADC)
Figura 3.10 Alte funcii ale Portului A
Figura 3. face legtura ntre aceste funcii ale Portului A i semnalele de suprascriere
din Figura 3..
Numele
semnalului
PUOE
PUOV
DDOE
DDOV
PVOE
PVOV
DIEOE
DIEOV
DI
AIO
PA7/
ADC7
0
0
0
0
0
0
0
0
Intrare
ADC7
PA6/
ADC6
0
0
0
0
0
0
0
0
Intrare
ADC6
PA5/
ADC5
0
0
0
0
0
0
0
0
Intrare
ADC5
PA4/
ADC4
0
0
0
0
0
0
0
0
Intrare
ADC4
PA3/
ADC3
0
0
0
0
0
0
0
0
Intrare
ADC3
PA2/
ADC2
0
0
0
0
0
0
0
0
Intrare
ADC2
PA1/
ADC1
0
0
0
0
0
0
0
0
Intrare
ADC1
PA0/
ADC0
0
0
0
0
0
0
0
0
Intrare
ADC0
54
Alt funcie
SCK ( SPI Bus Serial Clock)
MISO ( SPI Bus Master Input/Slave Output )
MOSI ( SPI Bus Master Output/Slave Input )
PB7/SCK
PB6/MISO
PB5/MOSI
PB4/ SS
SPE MSTR
SPEMSTR
SPE MSTR
SPE MSTR
PUOV
PB7 PUD
PB4 PUD
DDOV
PVOE
SPE MSTR
0
SPEMSTR
PB6 PUD
SPEMSTR
PB5 PUD
DDOE
SPE MSTR
0
SPEMSTR
SPE MSTR
0
0
PVOV
SCK OUTPUT
DIEOE
DIEOV
DI
0
0
SCK INPUT
AIO
SPI MSTR
OUTPUT
0
0
SPI SLAVE
INPUT
-
0
SPE MSTR
SPI SLAVE
OUTPUT
0
0
SPI MSTR
INPUT
-
0
0
SPI SS
-
Numele
Semnalului
PUOE
PUOV
DDOE
DDOV
PVOE
PVOV
DIEOE
DIEOV
DI
PB3/OC0/AIN1
PB2/INT2/AIN0
PB1/T1
PB0/T0/XCK
0
0
0
0
OC0 ENABLE
OC0
0
0
-
0
0
0
0
0
0
INT2 ENABLE
1
INT2 INPUT
0
0
0
0
0
0
0
0
T1 INPUT
AIO
AIN1 INPUT
AIN0 INPUT
0
0
0
0
UMSEL
XCK OUTPUT
0
0
XCK INPUT /
T0 INPUT
-
Alt Funcie
TOSC2 ( Timer Oscillator Pin 2 )
TOSC1 ( Timer Oscillator Pin 1 )
TDI ( JTAG Test Data In )
TDO ( JTAG Test Data Out )
TMS ( JTAG test Mode Select )
TCK ( JTAG Test Clock )
SDA ( Two-wire Serial Bus Data Input / Output Line )
SCL ( Two-wire Serial Bus Clock Line )
Figura 3.15 Alte funcii ale Portului C
Figura 3. i Figura 3.2 fac legtura ntre aceste funcii ale Portului C i semnalele de
suprascriere din Figura 3..
56
Numele
Semnalului
PUOE
PUOV
DDOE
DDOV
PVOE
PVOV
DIEOE
DIEOV
DI
AIO
PC7/TOSC2
PC6/TOSC1
PC5/TDI
AS2
0
AS2
0
AS2
0
AS2
0
JTAGEN
1
JTAGEN
0
0
0
AS2
0
T/C2 OSC
OUTPUT
0
0
v
T/C2 OSC
INPUT
0
0
JTAGEN
0
TDI
PC4/TDO
JTAGEN
0
JTAGEN
SHIFT_IR +
SHIFT_DR
JTAGEN
TDO
JTAGEN
0
-
Numele
Semnalului
PUOE
PUOV
PC3/TMS
PC2/TCK
PC1/SDA
PC0/SCL
JTAGEN
1
JTAGEN
1
TWEN
TWEN
DDOE
DDOV
PVOE
PVOV
DIEOE
DIEOV
DI
AIO
JTAGEN
0
0
0
JTAGEN
0
TMS
JTAGEN
0
0
0
JTAGEN
0
TCK
PC1 PUD
TWEN
DA_OUT
TWEN
0
0
0
SDA INPUT
PC0 PUD
TWEN
SCL_OUT
TWEN
0
0
0
SCL INPUT
57
Pinul Portului
PD7
PD6
PD5
PD4
PD3
PD2
PD1
PD0
Alt funcie
OC2 ( Timer/Counter2 Output Compare Match Output )
ICP ( Timer/Counter1 Input Capture Pin )
OC1A ( Timer/Counter1 Output Compare A Match Output )
OC1B ( Timer/Counter1 Output Compare B Match Output )
INT1 (External Interrupt 1 Input )
INT0 ( External Interrupt 0 Input )
TXD ( USART Output Pin )
RXD ( USART Input Pin )
Figura 3.18 Alte funcii ale Portului D
Figura 3. i Figura 3.3 fac legtura ntre aceste funcii ale Portului D i semnalele de
suprascriere din Figura 3..
Numele
Semnalului
PUOE
PUOV
DDOE
DDOV
PVOE
PD7/OC2
PD6/ICP
PD5/OC1A
PD4/OC1B
0
0
0
0
OC2 ENABLE
0
0
0
0
0
PVOV
DIEOE
DIEOV
DI
AIO
OC2
0
0
-
0
0
0
ICP INPUT
-
0
0
0
0
OC1A
ENABLE
OC1A
0
0
-
0
0
0
0
OC1B
ENABLE
OC1B
0
0
-
58
Numele
Semnalului
PUOE
PUOV
PD3/INT1
PD2/INT0
PD1/TXD
PD0/RXD
0
0
0
0
TXEN
0
RXEN
DDOE
DDOV
PVOE
PVOV
Numele
Semnalului
DIEOE
0
0
0
0
PD3/INT1
0
0
0
0
PD2/INT0
TXEN
1
TXEN
TXD
PD1/TXD
PD0 PUD
RXEN
0
0
0
PD0/RXD
INT1
ENABLE
1
INT1 INPUT
-
INT0
ENABLE
1
INT0 INPUT
-
0
-
0
RXD
-
DIEOV
DI
AIO
3.3
REZISTENA DE PULL-UP
3.3.1
PUD
PSR2
PSR10
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
SFIOR
59
3.4
PINII NECONECTAI
Dac unii pini rmn neconectai, este recomandat s se asigure faptul c aceti
pini au valori definite. Cel mai simplu mod de a se asigura acest lucru este prin activarea
rezistenei de pull-up interne. n acest caz, rezistena va fi dezactivat n momentul
reset-ului. Dac este important un consum redus de curent n momentul reset-ului, este
recomandat folosirea unui pull-up sau pull-down extern. Conectarea pinilor nefolosii
direct la VCC sau la mas nu se recomand, deoarece va produce cureni inutili dac
pinul este setat ca pin de ieire.
3.5
FUNCII INTRINSECI
Descriere
Inserii de un timp de ntrziere
Dezactiveaz ntreruperile
Activeaz ntreruperile
Returneaz un octet din codul
memoriei
Genereaz o instruciune FMULS
Genereaz o instruciune FMULSU
Genereaz o instruciune FMUL
Genereaz o instruciune IJMP
Atribuie o valoare ntr-un registru
procesor
Returneaz un octet din codul
memoriei
Genereaz o instruciune MULS
Genereaz o instruciune MULSU
Genereaz o instruciune MUL
Genereaz o instruciune NOP
Introduce o instruciune SLEEP
Swap-uri bit cu bit 0-3 cu 4-7
Resetare watchdog
60
__DELAY_CYCLES(UNSIGNED LONG);
__DISABLE_INTERRUPT (VOID);
void __disable_interrupt(void);
Dezactiveaz ntreruperile prin introducerea de instruciuni CLI.
3.5.3
__ENABLE_INTERRUPT (VOID);
void __enable_interrupt(void);
Activeaz ntreruperile prin introducerea de instruciuni SEI.
3.5.4
__EXTENDED_LOAD_PROGRAM_MEMORY(UNSIGNED CHAR
__FARFLASH *);
unsigned char
__flash *);
__load_program_memory(const
unsigned
char
Returneaz un octet din memoria cod. Constantele trebuie s fie plasate n primii 64 Kb
de memorie.
61
3.5.6
__NO_OPERATION (VOID);
void __no_operation(void);
Genereaz o instruciune NOP.
3.5.7
__SLEEP (VOID);
void __sleep(void);
Inserii de o instruciune sleep. Pentru a utiliza aceast funcie intrinsec, trebuie
asigurat faptul c instruciunea a fost activat n registrul MCUCR.
3.5.8
__WATCHDOG_RESET (VOID);
void __watchdog_reset(void);
Inserii de o instruciune de resetare watchdog.
APLICAII
3.6
Enun
2.
trebuie setat direcia pinului. Aa cum a fost menionat n laborator, implicit toi
pinii sunt pini de intrare. Se va seta pinul ales (de exemplu, PD1 din portul D) ca
pin de ieire prin urmtoarea instruciune: DDRD = (1<<PD1);
62
3.
se vor realiza operaii de toggle asupra portului de ieire selectat. Astfel, pentru
operaia de aprindere i stingere succesiv a led-ului, va trebui scris valoarea de
1 logic, respectiv 0 logic pe portul de ieire (PORTD=0), cu o anumit frecven;
acea frecven va fi generat cu ajutorul funciei prezentate mai sus:
__delay_cycles(); Parametrul trimis funciei va fi calculat n funcie de
frecvena oscilatorului intern (n acest caz, 4Mhz).
Cod surs
#include <inavr.h> //aceast bibliotec conine prototipurile
funciilor delay_cycles(),
enable_interrupt(),disable_interrupt() etc.
#include <ioavr.h> //conine definiiile funciilor pentru
input/output
int main(void)
{
DDRD = (1<<PD1); //seteaz pinul PD1 ca pin de ieire
while(1)
{
PORTD=2;// se seteaz valoarea 1 logic pe pinul de ieire
//2(DEC)=0b00000010, ceea ce seteaz pinul PD1 (al
doilea pin din portul D) cu valoarea de 1 logic
//PORTD=0x02; //echivalentul n hexa
__delay_cycles(2000000); //numrul de cicli echivaleni pentru
0,5s
PORTD=0;// setm toi pinii portului D pe 0 logic, inclusiv
pinul PD1. Avem astfel 0 Voli la ieirea acestuia ceea
ce va determina stingerea ledului. n acest mod se
realizeaz operaia de toggle(nchis/deschis)
__delay_cycles(2000000);
}
return 0;
}
63
4 Comunicaia serial
4.1
INTRODUCERE
4.2
ECD
(modem)
Centrala telefonica
ETD
ECD
(modem)
ETD
Linie de comunicatie
Circuit de date
Legatura de date
2.
ECD (Echipamente pentru comunicaia de date). Aceste echipamente se numesc modemuri i permit calculatorului s transmit informaii printr-o linie telefonic analogic.
Funciile principale realizate de un modem sunt urmtoarele:
3.
Linia de comunicaie reprezint o linie fizic sau o linie telefonic. Linia telefonic
poate fi o linie comutat (conectat la o central telefonic) sau o linie nchiriat
(dedicat);
4.
Circuitul de date cuprinde poriunea dintre dou echipamente terminale de date, modemurile i linia de comunicaie. Pe distane reduse, este posibil comunicaia serial direct
ntre dou echipamente terminale de date prin linii fizice, fr utilizarea unor modem-uri.
n acest caz, circuitul de date este reprezentat de aceste linii;
5.
4.3
Simplex;
Semiduplex;
Duplex.
n cazul comunicaiei simplex, datele sunt transferate ntotdeauna n aceeai direcie, de la
echipamentul transmitor la cel receptor. La comunicaia semiduplex, fiecare echipament terminal
de date funcioneaz alternativ ca transmitor, iar apoi ca receptor. Pentru acest tip de conexiune,
este suficient o singur linie de transmisie (dou fire de legtur). ntr-o comunicaie duplex
(numit i duplex integral), datele se transfer simultan n ambele direcii. Primele conexiuni
duplex necesitau dou linii de transmisie (patru fire de legtur), dar conexiunile ulterioare
necesit o singur linie.
Din punctul de vedere al sincronizrii dintre transmitor i receptor, exist dou tipuri de
comunicaie serial:
Asincron;
Sincron.
4.3.1
COMUNICAIA ASINCRON
65
b0
b1
b2
b3
b4
b5
b6
b7
1
s1
s2
0
T
Pauz
START
1 bit
Paritate
Caracter
STOP
2 bii
Pauz
Transmisie
COMUNICAIA SINCRON
4.3.3
STANDARDUL RS-232C
4.4
2.
3.
4.
Atunci cnd un modem aflat la distan dorete stabilirea conexiunii cu modemul local,
transmite semnalul de apel pe linia telefonic. Acest semnal este detectat de ctre
modemul local, care activeaz semnalul RI pentru a informa calculatorul local asupra
existenei unui apel telefonic.
La detectarea activrii semnalului RI, pe calculatorul local se lanseaz n execuie un
program de comunicaie. Acest program indic disponibilitatea calculatorului de a ncepe
comunicaia prin activarea semnalului DTR.
Atunci cnd modemul local sesizeaz faptul c terminalul de date (calculatorul) este
pregtit, rspunde la apelul telefonic i ateapt activarea semnalului purttor de ctre
modemul aflat la distan. Atunci cnd modemul local detecteaz semnalul purttor,
activeaz semnalul CD.
Modemul local negociaz cu modemul aflat la distan o conexiune cu anumii
parametri. De exemplu, cele dou modem-uri pot determina viteza optim de
68
5.
6.
7.
8.
9.
10.
11.
4.4.2
Metoda software pentru controlul fluxului de date presupune transmiterea unor caractere
de control ntre cele dou echipamente. De exemplu, perifericul va transmite un anumit caracter de
control pentru a indica faptul c nu mai poate primi date de la calculator i va transmite un alt
caracter de control pentru a indica faptul c transmiterea datelor poate fi reluat de calculator.
Exist dou variante ale acestei metode. Prima variant utilizeaz caracterele de control
XON/XOFF, iar a doua variant utilizeaz caracterele de control ETX/ACK.
n cazul utilizrii variantei XON/XOFF, perifericul transmite caracterul XOFF pentru a indica faptul
c bufferul su este plin i transmiterea datelor trebuie oprit de calculator. Acest caracter mai este
denumit DC1 (Device Control 1) i are codul ASCII 0x13, fiind echivalent cu caracterul Ctrl-S.
Caracterul Ctrl-S poate fi introdus i de utilizator la anumite programe de comunicaie pentru a
opri transmiterea datelor de ctre un echipament cu care este conectat calculatorul. Atunci cnd
perifericul este pregtit pentru a primi noi date, transmite calculatorului caracterul XON. Acest
69
4.5
CONECTORI
Porturile seriale pot utiliza unul din dou tipuri de conectori. Conectorul DB-25 cu 25 de
pini a fost utilizat la calculatoarele din generaiile anterioare. La calculatoarele mai noi se
utilizeaz conectorul DB-9 cu 9 pini. Pentru porturile seriale ale calculatoarelor se utilizeaz
conectori tat, iar pentru porturile seriale ale echipamentelor periferice se utilizeaz conectori
mam.
Conectorul DB-25 al portului serial are o form similar cu conectorul DB-25 al portului
paralel. Portul serial care utilizeaz un conector DB-25 se poate deosebi de portul paralel prin faptul
c pentru portul serial se utilizeaz un conector tat, n timp ce pentru portul paralel se utilizeaz un
conector mam. Figura 4.3 ilustreaz conectorul DB-25 al portului serial.
Semnal
Semnificaie
In
Out
Protective Ground
Transmit Data
Receive Data
Request To Send
Clear To Send
Data Set Ready
Signal Ground
Carrier Detect
Data Terminal Ready
Ring Indicator
Tabel 4.1
Pentru a se reduce spaiul ocupat de conectorul portului serial, conectorul DB-25 a fost nlocuit
cu un conector de dimensiuni mai reduse, conectorul cu 9 pini DB-9 (Figura 4.4).
1
2
3
4
5
6
7
8
20
22
PG
TD
RD
RTS
CTS
DSR
SG
CD
DTR
RI
70
4.6
CABLURI
Exist mai multe variante de cabluri care se pot utiliza pentru comunicaia serial. Pentru
viteze de comunicaie reduse i lungimi scurte, se pot utiliza cabluri obinuite, care nu sunt
ecranate. Pentru a reduce interferenele cu alte echipamente, trebuie utilizate cabluri ecranate care
conin un nveli sub forma unei folii de aluminiu. n mod ideal, ecranul cablului trebuie conectat
la masa de protecie a conectorului, dac acesta este de tip DB-25. Conectorul DB-9 nu conine un
pin pentru masa de protecie. n cazul utilizrii conectorilor de acest tip, ecranul cablului se poate
conecta la masa electric.
Observaii:
n cazul cablului serial care utilizeaz conectori DB-25, masa electric sau masa de
semnal SG (Signal Ground) este separat de masa mecanic sau masa de protecie PG (Protective
Ground). Masa de protecie este conectat direct la carcasa conectorului (i a echipamentului),
avnd un rol de protecie. Prin realizarea acestei conexiuni, carcasele metalice ale celor dou
echipamente conectate prin cablul serial se vor afla la acelai potenial, evitndu-se formarea
unor diferene de tensiune ntre cele dou echipamente, tensiuni care pot fi periculoase pentru
acestea. Deseori, conexiunea mesei de protecie lipsete din cablurile seriale.
Masa de protecie PG nu trebuie conectat niciodat la masa electric SG.
Semnalele interfeei seriale au fost prevzute n scopul conectrii unui echipament
terminal de date (ETD) la un echipament pentru comunicaia de date (ECD). Atunci cnd se
conecteaz dou asemenea echipamente, de exemplu, un calculator cu un modem, care dispun de
conectori de acelai tip (de exemplu, DB-25), este necesar un cablu care conecteaz pinii cu
acelai numr ai conectorilor de la cele dou capete. Acesta este un cablu direct. Dac se
conecteaz dou echipamente cu conectori diferii, este necesar un cablu adaptor. Dac se
conecteaz dou echipamente terminale de date, de exemplu, dou calculatoare, datele transmise
pe pinul TD al unui echipament trebuie recepionate pe pinul RD al celuilalt echipament. De
aceea, conexiunile acestor pini trebuie inversate la cele dou capete ale cablului; un asemenea
cablu este numit cablu inversor.
71
4.7
MODULUL USART
Clock
Generator
UBRR[H:L]
OSC
SYNC LOGIC
PIN
CONTROL
XCK
Transmitter
UDR (Transmit)
TX
CONTROL
DATABUS
PARITY
GENERATOR
PIN
CONTROL
TxD
Receiver
CLOCK
RECOVERY
RX
CONTROL
DATA
RECOVERY
PIN
CONTROL
UDR (Receive)
PARITY
CHECKER
UCSRA
UCSRB
RxD
UCSRC
72
MODULUL USART
Componenta principal a unui port serial este un circuit UART (Universal Asynchronous
Receiver/Transmitter). Acest circuit realizeaz conversia datelor paralele de la calculator n
formatul necesar pentru transmisia serial i conversia datelor seriale recepionate n formatul
paralel utilizat de calculator. Circuitul adaug bitul de start, bitul de stop i bitul de paritate la
datele seriale transmise i detecteaz aceti bii n cadrul datelor seriale recepionate.
Modulul UART (Universal Asinchronous Receiver Transmiter) efectueaz
recepia/transmisia datelor de la/ctre un dispozitiv periferic cu acces serie. Principalele
caracteristici sunt:
Un nou caracter este scris n UDR i caracterul precedent a fost deja transferat. Registrul
de deplasare este ncrcat imediat;
Un nou caracter este scris n UDR nainte ca un caracter precedent s fi fost transferat
complet. Registul de deplasare este ncrcat dup ce prima operaie a fost finalizat.
4.7.2
INTERFAA SPI
Interfaa de comunicaie SPI (Serial Peripheral Interface) asigur transferul rapid sincron
de date ntre microcontroler i dispozitivele periferice sau cu alte microcontrolere AVR.
4.7.3
INTERFAA TWI
73
REGITRII USART
4.8
Pentru a comunica via USART trebuie s fie setate anumite valori pentru regitrii
USART, informaii care se pot obine din datasheet-ul microcontroler-ului.
UDR : USART Data Register : conine data receptat sau transmis;
UCSRA / USCRB / UCSRC : USART Control and Status Registers : folosit pentru a configura
USART-ul i a stoca statusul acestuia;
UBRRH / UBRRL : USART Baud Rate Register : stocheaz valoarea corespunztoare baud
rate-ului folosit.
4.8.1
RXC
TXC
UDRE
FE
DOR
PE
U2X
MPCM
Read/Write
R/W
R/W
R/W
Valoare iniial
Bit
UCSRA
Bit
RXEN
TXEN
UCSZ2
RXB8
TXB8
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
UCSRB
RXCIE: Receive Complete Interrupt Enable dac este setat pe 1, ntreruperea pe flagul RXC
este activat.
TXCIE: Transmit Complete Interrupt Enable dac este setat pe 1, ntreruperea pe flagul TXC
este activat.
RXEN: Receiver Enable pentru a activa recepia trebuie setat pe 1.
TXEN: Transmitter Enable pentru a activa transmisia trebuie setat pe 1.
UCSZ2: USART Character Size este utilizat pentru a stabili numrul de bii per pachet.
74
UPM0
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
UCSRC
UMSEL: USART Mode Select acest bit selecteaz ntre modurile sincron i asincron.
UMSEL
0
1
Mod
Asincron
Sincron
UPM1:0: Parity Mode Aceti bii activeaz i seteaz tipul generrii i verificrii paritii. Dac
este activat, transmitorul va genera automat i va trimite paritatea biilor din dat. Receptorul va
genera o valoare de paritate pentru datele primite i o va compara cu setarea UPM0. Dac se
detecteaz o nepotrivire, va fi setat flagul PE din UCSRA.
UPM1
0
0
1
1
Modul paritii
Dezactivat
Rezervat
Activat, paritate par
Activat, paritate impar
UPM10
0
1
0
1
USBS: USART Stop Bit Select Acest bit selecteaz numrul de bii de stop din transferul de
date.
USBS
Bii de stop
1 BIT
2 BIT
UCSZ: USART Character size Aceti trei bii (unul n UCSRB) selecteaz numrul de bii din
dat. ntotdeauna vom opta pentru 8 bii, ntruct acesta este standardul.
UCSZ2
UCSZ1
UCSZ0
Dimensiune
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
5Bit
6Bit
7Bit
8Bit
Rezervat
Rezervat
Rezervat
9Bit
75
Acest registru are o dimensiune de 16 bii, aadar UBRRH este High Byte i UBRRL Low byte.
Acest registru este folosit de ctre USART pentru a genera baud rate (de exemplu 9600Bps).
Valoarea UBRR este calculat n funcie de urmtoarea formul:
Operating Mode
Asynchronous Normal
Mode (U2X = 0)
Asynchronous Double
Speed Mode (U2X =
1)
Synchronous Master
Mode
4.9
APLICAII
Enun
S se transmit prin comunicaie serial un ir dac se primete litera s sau S.
Codul surs
usart.h
#ifndef __USART__
#define __USART__
#include <inavr.h>
#include <iom16.h>
#define F_OSC 4000000
#define BAUD 19200
#define BAUD_RATE (F_OSC/16/BAUD - 1)
void USART_initialize(unsigned short int baud_rate);
void USART_transmit(unsigned char data);
unsigned char USART_Receive( void );
//#pragma vector = USART_RXC_vect
//__interrupt void interrupt_routine_USART_RXC(void);
#endif
usart.c
#include "usart.h"
void USART_initialize(unsigned short int baud_rate)
76
main.c
#include"usart.h"
void main( void )
{
unsigned char string[]="Hello world!", aux;
unsigned int i=0;
USART_initialize(BAUD_RATE);
while(1)
{
77
78
INTRODUCERE
5.1.1
1.
2.
Embedded C++ (EC++), un subset al standardului de programare C++, care este destinat
programrii sistemelor embedded. Este definit de un consoriu industrial, Embedded C++
Technical Comitee;
IAR Extended EC++, cu caracteristici suplimentare cum ar fi suportul total pentru
template-uri, suportul pentru namespace-uri, operatorii de cast, precum i Standard
Template Library (STL).
Fiecare din cele dou limbaje de programare suportate pot fi folosite fie ntr-un mod
strict, fie n unul mai puin strict, fie n unul mai puin strict cu extensiile IAR activate. Modul
strict ader la standard, pe cnd cellalt mod permite anumite deviaii de la acest standard.
Este de asemenea posibil ca anumite pri ale aplicaiei s fie implementate n limbaj de
asamblare.
5.1.2
MEDIUL DE RULARE
Pentru crearea mediului de rulare este necesar alegerea unei biblioteci de rulare i
setarea opiunilor de bibliotec.
Exist dou seturi de biblioteci de rulare puse la dispoziie:
IAR DLIB Library, care suport ISO/ANSI C i C++. Aceast bibliotec suport de
asemenea numere n virgul mobil n format IEEE 754 i poate fi configurat pentru a
include diferite nivele de suport pentru locale, descriptori de fiier, caractere multibyte,
etc.
IAR CLIB Library, este o bibliotec din categoria uoar, care nu este compilat n
totalitate cu ISO/ANSI C. De asemenea nu ofer suport deplin pentru numere n virgul
mobil n format IEEE 754 sau suport pentru Embedded C++ (aceast librrie este
folosit implicit).
Librria de rulare aleas poate fi una dintre librriile prebuilt, sau o librrie pe care ai
customizat-o sau ai construit-o chiar dumneavoastr. IAR Embedded Workbench IDE ofer
template-uri pentru librriile de proiect pentru ambele librrii, care se pot folosi pentru construirea
79
Descriere
Specific calea pentru includere
Specific calea pentru fiiere specifice bibliotecii. Utilizai
clib//dlib depinznd de ce biblioteca folosii.
Specific fiierul obiect.
Specific fiierul de configurare pentru biblioteca(doar
pentru biblioteca DLIB).
Unele pri, cum ar fi codul de intrare i de ieire i mrimea heap-urilor trebuie s fie
adaptate att pentru hardware-ul specificat, ct i pentru cerinele aplicaiei.
5.1.3.3 Selectarea bibliotecii
Pentru a configura ct mai eficient mediul de rulare al codului, trebuie s fie cunoscute
cerinele hardware ale aplicaiei.
IAR Embedded Workbench vine cu un set de biblioteci runtime precompilate. Pentru a se
obine mediul de execuie necesar, sunt necesare urmtoarele:
Setarea opiunilor de bibliotec, de exemplu, pentru alegerea lui scanf i printf, i pentru a
preciza dimensiunea stivei i heap-ului;
Setarea funciilor bibliotec, de exemplu cstartup.s90, cu propria versiune;
Alegerea nivelului de sprijin pentru anumite funcionaliti a bibliotecii standard, de
exemplu: locale, descriptori de fiiere i multibytes, prin alegerea unui library
configuration: normal sau complet.
n plus, se pot face, de asemenea modificri propriei biblioteci, fapt care necesit
reconstruirea bibliotecii. Acest lucru permite obinerea controlului deplin a mediului runtime.
Not: Aplicaia proiectului trebuie s poat localiza biblioteca, inclusiv fiierele de
configurare ale bibliotecii.
5.1.3.4 Situaii care necesit construirea bibliotecii
Construirea unei biblioteci proprii este un proces complex. Prin urmare, ar trebui s se ia
n considerare doar ceea ce este cu adevrat necesar.
Propria bibliotec se construiete:
Descriere
Nu conine: interfa local, C locale, suport de descriptor de fiier, caractere
multibyte n printf i scanf, hex floats in strtod.
Conine interfa local complet, C locale, suport descriptor de fiier,
caractere multibyte n printf i scanf i hex floats n strtod.
Tabel 5.1 Configuraii bibliotec
Suport
de depanare
Depanare de
baz
Depanarea
funcionrii
Depanare I/O
Opiune linker n
IAR
Embedded
Workbench
Informaii C-SPY
Comanda
linker optiune
de linie
-Fubrof
Cu
module
control
funcionrii
Cu
module
emulare I/O
de
a
-r
de
-rt
Descriere
Tipul de bibliotec;
Opiunea procesor (-v);
Opiunea modelului de memorie (--memory_model);
Opiune de baz AVR (--enhanced_core);
Mici opiuni ale memoriei flash (--64k_flash);
Opiune 64-bit doubles (--64bit_doubles);
Biblioteca de configurare-normal sau complet.
Pentru AVR IAR C/C++ Compiler i configuraia bibliotec Normal, exist precompilate
biblioteci runtime pentru toate combinaiile acestor opiuni.
Urmtorul tabel prezint numele bibliotecilor i modul n care sunt reflectate setrile utilizate:
Fiierul de
Biblioteca
dlavr-3secsfn.r90
dlavr-3sec64-f.r90
Opiune
Generic
Procesor
-v3
Opiune
Generic
Procesor
-v3
Modelul
memoriei
Enhanced
core
Small
-v3
-v3
Small
Small
flash
64-bit
doubles
Configurarea
bibliotecii
--
Normal
--
Full
<library>este dl pentru biblioteca DLIB IAR sau cl pentru biblioteca CLIB IAR (pentru o
list de fiiere bibliotec CLIB, a se vedea Runtime environment)
<target>este avr
<cpu> este o valoare de 0-6, optiunea-v
<memory_model> este fie t, e, sau l pentru modelul de memorie respectiv(Tiny, Small,
Large)
83
<enhanced_core> este CE atunci cnd baza consolidat este folosit. n cazul n care baza
consolidat nu este folosit, aceast valoare nu este specificat
<small_flash> este SF atunci cnd memoria flash small este disponibil. Cnd memoria
flash nu este disponibil, aceast valoare nu este specificat
<64-bit_doubles> este de 64 bii cnd se utilizeaz 64 bii doubles. Cnd sunt utilizai 32
de bii doubles, aceast valoare nu este specificat
<library_configuration> N=normal sau F=full
Se descrie mediul runtime n care o aplicaie este executat. n particular aceasta acoper
biblioteca mediului CLIB runtime i cum se poate optimiza aplicaia.
Mediul CLIB descrie sistemul de iniializare i oprire. Acesta prezint cum o aplicaie
poate fi controlat i ceea ce se ntmpl nainte de pornirea funciei main, precum i metoda de
personalizare a interfeei. n cele din urm, interfaa de runtime C-SPY este inclus.
5.1.4.1 Mediul Runtime
Mediul de rulare CLIB include biblioteci standard C. Link-editarea va include numai
acele rulri care sunt necesare direct sau indirect de ctre aplicaie.
IAR Embedded Workbench vine cu un set de biblioteci de rulare precompilate, care sunt
configurate pentru diferite combinaii:
Tipul bibliotecii;
Opiunile procesorului (-v);
Opiunile modelului de memorie (--memory_model);
Opiunile consolidate ale nucleului AVR-ului (--enhanced_core);
Opiunile memoriei flash mai mici (--64k_flash);
Opiunile n dubl precizie pe 64-bii (--64bit_doubles).
Opiunea
procesorului
-v0
-v1
-v6
Modelul
memoriei
Tiny
Small
Large
Baz
consolidat
--X
Small
flash
----
64-bit
doubles
-X
X
84
5.2
<library> este cl pentru biblioteca IAR CLIB, sau dl pentru biblioteca IAR DLIB;
<cpu> este o valoare de la 0 la 6;
<memory_model>
FUNCII
Se gsete o privire de ansamblu la mecanismele de control asupra funciilor.
5.2.1
Cuvinte cheie care pot controla locaia i tipul funciilor. Cuvintele cheie din acest grup trebuie
specificate i cnd funciile sunt definite, i cnd funciile sunt declarate: __nearfunc i
__farfunc
Cuvinte cheie care controleaz tipul funciilor. Cuvintele cheie din acest grup trebuie folosite
doar atunci cnd funcia este definit: __interrupt, __task, i __version_1
Cuvinte cheie care controleaz doar funciile definite : __root, __monitor, i
__noreturn
Cuvintele cheie care controleaz locaia i tipul funciilor sunt de asemenea denumite
type attributes (atribute de tip). De obicei, aceste funcii controleaz aspecte ale funciei vizibile
din contextul exterior. Cuvintele cheie care controleaz doar comportamentul funciei i nu
afecteaz interfaa funciei, sunt numite object attributes (atribute de obiect).
5.2.2
SINTAXA
5.2.3
STOCAREA FUNCIILOR
Interval de adres
0-0x1FFFE
Kbytes)
0-0x7FFFFE
Mbytes)
(128
(8
Dimensiune
pointer
16 bii
24 bii
Folosit n opiunea
procesor
-v0, -v1, -v2, -v3, v4
-v5, -v6
5.2.4
FUNCIA MYPRINT
1.
2.
3.
89
5.3
5.4
Pentru importarea unei biblioteci ntr-un nou proiect este nevoie de fiierul header ce
conine toate prototipurile funciilor care pot fi apelate prin intermediul bibliotecii importate.
Primul pas pentru importarea unei biblioteci ntr-un nou proiect este de a include fiierul
header corespunztor. Acest lucru se poate face fie prin intermediul directivei #include ,fie
prin navigarea ctre Project>Options>C/C++ Compiler>Preprocessor>Preinclude File unde se
alege fiierul header corespunztor.
Urmtorul pas reprezint navigarea ctre Project>Options>Linker>Extra options. Aici
se va bifa opiunea Use command line options. n zona text nou activat se va include biblioteca
creat astfel:
-I\avr\inc\cib <calea complet ctre fiierul .r90 >
Laborator 6 - ntreruperi
6 ntreruperi
6.1
6.1.1
INTRODUCERE
6.2
NOIUNI
O ntrerupere are dou nelesuri apropiate:
transferul hardware al controlului (saltul firului de execuie) ctre un vector de
ntrerupere pe baza nregistrrii unui fenomen exterior procesorului;
funcia de tratare a ntreruperii secvena de cod la care se ajunge plecnd de la vectorul
de ntrerupere.
93
Laborator 6 - ntreruperi
Fir de execuie
Starea microprocesorului
este copiat pe stiv
Rutin de ntrerupere
Starea microprocesorului
este restaurat
94
Laborator 6 - ntreruperi
Pentru ATMega16, TVI este dat n tabelul de mai jos:
Numr
vector
Adresa
programului
Sursa
Definiia ntreruperii
$000
RESET
2
3
4
5
6
7
$002
$004
$006
$008
$00A
$00C
INT0
INT1
TIMER2 COMP
TIMER2 OVF
TIMER1 CAPT
TIMER1 COMPA
$00E
TIMER1 COMPB
9
10
11
12
13
14
15
16
17
18
19
20
21
$010
$012
$014
$016
$018
$01A
$01C
$01E
$020
$022
$024
$026
$028
TIMER1 OVF
TIMER0 OVF
SPI,STC
USART, RXC
USART, UDRE
USART, TXC
ADC
EE_RDY
ANA_COMP
TWI
INT2
TIMER0 COMP
SPM_RDY
Timer/Counter2 Overflow
Timer/Counter1 Capture Event
Timer/Counter1 Compare
Match A
Timer/Counter1 Compare
Match B
Timer/Counter1 Overflow
Timer/Counter0 Overflow
Serial Transfer Complete
USART, Rx Complete
USART Data Register Empty
USART, Tx Complete
ADC Conversion Complete
EEPROM Ready
Analog Comparator
Two-wire Serial Interface
External Interrupt Request 2
Timer/Counter0 Compare Match
Laborator 6 - ntreruperi
6.3
ACTIVAREA/DEZACTIVAREA NTRERUPERILOR
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
SREG
Mnemonic
Descriere
Operaie
SEI
Global Interrupt
Enable
Global Interrupt
Disable
CLI
I1
Numr de
cicli
1
__enable_interrupt
I0
__disable_interrupt
Funcii IAR
Pentru a modifica bitul individual de validare a ntreruperii, acesta trebuie cutat pentru
fiecare tip de ntrerupere. De exemplu, pentru ntreruperea extern INT0, acesta se regsete n
registrul Figura , pe poziia 6. Astfel, pentru a admite ntreruperi de tip INT0, pe frontul cresctor
al semnalului extern, putem utiliza urmtorul cod:
Cod surs 1:
#include <inavr.h> //include biblioteca inavr.h
#include <iom16.h> //include biblioteca iom16.h
int main(void)
{
96
Laborator 6 - ntreruperi
// nceputul iniializrilor
MCUCR |= ((1 << ISC01) | (1 << ISC00)); // seteaz ca front pozitiv
GICR |= (1 << INT0); // activeaz INT0 (External Interrupt Request 0
Enable)
__enable_interrupt(); /* activeaz ntreruperea globala */
// sfritul iniializrilor
}
6.4
INT1
INT0
INT2
IVSEL
IVCE
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
GICR
Figura 6.3 Registrul de control a ntreruperilor (GICR = General Interrupt Control Register)
Acest registru este rspunztor pentru plasarea tabelului vectorului de ntreruperi.
97
Laborator 6 - ntreruperi
Bitul 0 din acest registru se numete IVCE (Interrupt Vector Change Enable). Acest bit trebuie
iniializat cu valoarea logic 1 pentru a permite schimbarea urmtorului bit din registru i anume
IVSEL. Setnd acest bit, nu se vor mai putea genera ntreruperi.
Bitul 1 din acest registru se numete IVSEL (Interrupt Vector Select). Cnd acest bit are valoarea
logic 0 vectorii de ntreruperi sunt plasai la nceputul memoriei de program (Flash). Cnd acest
bit este setat cu valoarea logic 1, vectorii de ntreruperi sunt mutai la nceputul zonei de boot .
Bitul 7 INT1:External Interrupt Request 1 Enable:
Cnd INT1 e setat cu valoarea logic 1 si bitul I din Figura 6.2este setat cu aceeai valoare,
pinul destinat ntreruperii externe INT1 este activat. Biii ISC11 i ISC10 definesc logica de
generare a ntreruperii, respectiv dac aceasta este generat pe front cresctor sau descresctor.
ntreruperea va fi setat conform rutinei asociate vectorului de ntrerupere.
Bitul 6INT0:External Interrupt Request 0 Enable:
Cnd INT0 e setat cu valoarea logic 1 si bitul I din Figura 6.2este setat cu aceeai valoare
pinul destinat ntreruperii externe 0 este activat. Biii ISC01 si ISC00 definesc logica de generare a
ntreruperii, respective dac aceasta este generat pe tranziia de cretere sau pe cea de scdere.
Bitul 5INT2:External Interrupt Request 2 Enable:
Cnd INT0 e setat cu valoarea logic 1 si bitul I din Figura 6.2este setat cu aceeai valoare,
pinul destinat ntreruperii externe 2 este activat. Bitul ISC2 definete logica de generare a
ntreruperii, respectiv dac aceasta este generat pe tranziia de cretere sau pe cea de scdere.
6.4.1
NTRERUPERILE EXTERNE
Aceste ntreruperi sunt generate prin intermediul pinilor INT0, INT1 i INT2. Ele sunt
activate chiar dac aceti pini sunt setai ca fiind de output (ieire). Modul n care se pot genera
ntreruperile externe poate fi setat prin configurarea registrelor Figura 6.4 i Figura 6.5 .
7
SM2
SE
SM1
SM0
ISC11
ISC10
ISC01
ISC00
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
MCUCR
ISC11
0
0
1
1
ISC10
0
1
0
1
Descriere
Nivelul sczut al lui INT1 genereaz o cerere de ntrerupere.
Orice schimbare logic pe INT1 genereaz o cerere de ntrerupere.
Pe frontul negativ al lui INT1 se genereaz o cerere de ntrerupere.
Pe frontul pozitiv al lui INT1 se genereaz o cerere de ntrerupere.
Tabel 6.3
98
Laborator 6 - ntreruperi
JTD
ISC2
JTRF
WDRF
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
MCUCSR
6.5
6.5.1
PROBLEME
CORECTITUDINEA CONCURENIAL
1
2
3
99
Laborator 6 - ntreruperi
Ceea ce rmne de fcut din partea proiectantului este s scrie rutine de ntrerupere care
s utilizeze ct mai puin stiv i s dimensioneze stiva astfel nct s nu se ajung la coruperea
ei.
6.5.1.2 Suprancrcarea procesorului
La proiectarea unui sistem se va lua n consideraie frecvena de ntrerupere i timpul
utilizat de ctre rutinele de tratare a ntreruperilor.
De exemplu, conectarea direct a unui buton la un pin de ntrerupere extern ar putea
nsemna generarea unui numr mare de ntreruperi inutile (din cauza fenomenului de bouncing).
6.5.1.3 Tipuri: hard i soft
Att timp ct fenomenul cauz al ntreruperii este de natur extern ntreruperea este de
tip hard. Exist i posibilitatea ca printr-o metod software s se satisfac condiia de ntrerupere.
O ntrerupere declanat pe aceast cale va fi de tip soft.
De exemplu, dac o ntrerupere extern este activat (INT0, INT1, INT2) i pinul
corespunztor este setat ca ieire, atunci ntreruperea poate fi declanat prin scrierea pinului.
O alt cale prin care se poate genera software o ntrerupere este de a seta bitul folosit de ctre
platforma hardware pentru nregistrarea satisfacerii condiiei de ntrerupere.
6.5.1.4 Vectori de ntrerupere
Vectorii de ntrerupere sunt definii n fiierul iom16.h, dup cum urmeaz (adresele sunt
exprimate n octei):
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
RESET_vect
INT0_vect
INT1_vect
TIMER2_COMP_vect
TIMER2_OVF_vect
TIMER1_CAPT_vect
TIMER1_COMPA_vect
TIMER1_COMPB_vect
TIMER1_OVF_vect
TIMER0_OVF_vect
SPI_STC_vect
USART_RXC_vect
USART_UDRE_vect
USART_TXC_vect
ADC_vect
EE_RDY_vect
ANA_COMP_vect
TWI_vect
INT2_vect
TIMER0_COMP_vect
SPM_RDY_vect
(0x00)
(0x04)
(0x08)
(0x0C)
(0x10)
(0x14)
(0x18)
(0x1C)
(0x20)
(0x24)
(0x28)
(0x2C)
(0x30)
(0x34)
(0x38)
(0x3C)
(0x40)
(0x44)
(0x48)
(0x4C)
(0x50)
100
Laborator 6 - ntreruperi
6.5.2
Pentru a defini o funcie de ntrerupere pentru Timer1 Overflow, n limbajul C, se vor crea
fiierele isr.h i isr.c dup cum urmeaz:
Cod surs 1:
isr.h
#ifndef __ISR__
#define __ISR__
#include <iom16.h> //include biblioteca iom16.h
#pragma vector = TIMER1_OVF_vect
//asocierea dintre o funcie i un vector de ntrerupere
//vectorul ntreruperii este dat sub forma unui simbol
//definit
de
regul
ntr-un
fiier
header
aflat
n
biblioteca
compilatorului
__interrupt void isr_TIMER1_overflow(void); //declararea funciei de
ntrerupere
#endif
isr.c
#include "isr.h" //include fiierul header de mai sus
__interrupt void isr_TIMER1_overflow(void)
{
/* to do */
}
Se poate observa de mai sus c asocierea dintre o funcie i un vector de ntrerupere se face cu
ajutorul directivei #pragma vector = [vectorul ntreruperii], unde vectorul ntreruperii
este dat sub forma unui simbol definit de regul ntr-un fiier header aflat n biblioteca
compilatorului.
6.5.3
101
Laborator 6 - ntreruperi
Flash. Aceast instruciune reprezint un salt la funcia de ntrerupere corespunztoare. Pentru a
verifica acest lucru vom studia fiierul generat la compilare:
In segment CODE, align 2, keep-with-next
3
__interrupt void isr_TIMER1_overflow(void)
\
isr_TIMER1_overflow:
4
{
\ 00000000 930A
ST
-Y, R16
\ 00000002 B70F
IN
R16, 0x3F
5
/* to do */
6
}
\ 00000004 BF0F
OUT 0x3F, R16
\ 00000006 9109
LD
R16, Y+
\ 00000008 9518
RETI
\
In segment INTVEC, offset 0x20, root
\
`??isr_TIMER1_overflow??INTVEC 32`:
\ 00000020 ........
JMP isr_TIMER1_overflow
7
Observm faptul c, n segmentul vectorilor de ntrerupere, la adresa 0x20, se afl o
instruciune Tabel , ce va efectua un salt la funcia isr_TIMER1_overflow, aflat n segmentul de
cod, la o adres relocabil.
Adresa efectiv (adresa fizic din memoria Flash) a acestei instruciuni Tabel i a
funciei de ntrerupere poate fi cutat n fiierul Disassembler pus la dispoziie de mediul AVR
Studio (menu = View, option = Disassembler):
+0000000F: 9518
RETI
Interrupt return
@00000010: _..X_CSTACK_SIZE
+00000010: 940C002A JMP
0x0000002A Jump
+00000012: 9518
RETI
Interrupt return
+00000013: 9518
RETI
Interrupt return
Se observ aadar faptul c n memoria de cod la adresa 0x10 (numr de cuvinte)
urmeaz o instruciune Tabel cu operandul 0x43 (numr de cuvinte). La adresa 0x2A se gsete de
fapt funcia de ntrerupere:
@0000002A: isr_TIMER1_overflow
---- isr.c ---------------------------------------------------------------------------------------__interrupt void isr_TIMER1_overflow(void)
4:
{
+0000002A: 930A
ST
-Y,R16
Store indirect and predecrement
+0000002B: B70F
IN
R16,0x3F
In from I/O location
6:
}
+0000002C: BF0F
OUT
0x3F,R16
Out to I/O location
+0000002D: 9109
LD
R16,Y+
Load indirect and postincrement
+0000002E: 9518
RETI
Interrupt return
@0000002F: main
102
Laborator 6 - ntreruperi
n mediul AVR Studio putem vizualiza direct memoria de cod (menu = View, option = Memory
Window):
Operanzi
0 k < 4M
Cod main
1001
kkkk
010k
kkkk
kkkk
kkkk
110k
kkkk
Tabel 6.5
Observaie: Instruciunea Tabel se codific ntr-un dublu-cuvnt.
Not: n cazul n care exist vectori de ntrerupere pentru care nu s-au definit funcii de
ntrerupere, n zona de cod corespunztoare se pun instruciuni Tabel (mai puin pentru
ntreruperea de Reset pentru care se definete implicit o funcie de ntrerupere). Acest lucru se
poate observa n fiierul Disassembler sau analiznd memoria de program i codificarea
instruciunii Tabel .
6.5.3.2 Instruciunea RETI
Sintax
RETI
Operanzi
Cod main
1001
0101
0001
1000
Tabel 6.6
103
Laborator 6 - ntreruperi
// numele funciei
// include biblioteca iom16.h
//funcia extern utilizat
COMMON INTVEC(1)
//codul din segmentul vectorului de ntrerupere
ORG INT0_vect
//regiunea care conine codul din vectorul de ntrerupere
jmp isr_INT0 //salt la funcia de ntrerupere
ENDMOD
NAME CODE_int0 //numele funciei
#include <iom16.h> // include biblioteca iom16.h
set_B0 MACRO //macrodefiniia care seteaz pinul 0 de la portul B
sbi 0x18, 0x00
ENDM
reset_B0 MACRO //macrodefiniia care reseteaz pinul 0 de la portul B
cbi 0x18, 0x00
ENDM
PUBLIC isr_INT0
6.5.4
A msura latena ntreruperii nseamn practic a examina intervalul de timp dup care
microprocesorul rspunde la o ntrerupere extern (care este probabil acelai pentru toate tipurile
de ntreruperi).
Rspunsul la o ntrerupere dureaz minim 4 cicli, timp n care se salveaz pe stiv PC
(Program Counter) i se face posibil executarea instruciunii aflate n vectorul de ntrerupere
104
Laborator 6 - ntreruperi
corespunztor. Aceast instruciune este de regul Tabel (deci nc 3 cicli) ctre rutina propriuzis de ntrerupere.
Pentru a msura timpul de rspuns la o ntrerupere extern s-a utilizat o funcie de
ntrerupere scris n limbaj de asamblare (codul surs 2).
O descriere aproximativ n domeniul timp a ceea ce se ntmpl pn la apariia
rspunsului funciei de ntrerupere este dat n Diagrama 6.1:
CPU clock
T1
T2
T3
T4
T5
T6
T7
T8
T9
T10
T11
T12
T13
T14
T15
T16
External interrupt
Effect of instruction
Set bit in I/O register
Output pin
Current
instruction
Push PC.
Go to interrupt vector.
Execute jump to
interrupt
subroutine
Set bit
in I/O
register
End of current
instruction
Reset bit
in I/O
register
Interrupt service
routine
Diagrama 6.1
105
Laborator 6 - ntreruperi
Figura 6.6
Observaii:
intervalul de timp ct pinul de ieire se afl pe 1 logic este egal cu aproximativ 500ns (a
se vedea figura 6.6). Acest timp corespunde a 2 cicli main, ceea ce pare a fi normal,
dac se consider faptul c instruciunile SBI (set bit in I/O register) i CBI (clear bit in
I/O register) dureaz, fiecare, 2 cicli main.
n Figura este redat rezultatul aceluiai program, doar c a fost mrit persistena n timp a
semnalelor (exist o astfel de opiune la osciloscop).
106
Laborator 6 - ntreruperi
Figura 6.7
Observaii:
107
Laborator 6 - ntreruperi
Figura 6.8
De regul, ntr-o funcie de ntrerupere scris n C, compilatorul va salva:
6.5.5
108
Laborator 6 - ntreruperi
INT1_definition.c
#include <iom16.h> //include biblioteca iom16.h
/* declararea acestei funcii se gsete n INT1_declaration.asm */
__interrupt void isr_INT1(void)
{
unsigned char test = 0;
test += 1; // putem pune un breakpoint aici
}
109
7
7.1
INTRODUCERE
110
7.2
Codurile ciclice au fost proiectate s protejeze datele de erorile cel mai des ntlnite n
canalele de comunicaie. n acest domeniu, CRC ofer o siguran rezonabil a mesajelor
transmise. Totui, aceste coduri nu sunt convenabile contra alterrii intenionate a datelor.
n primul rnd, CRC nu necesit nici un fel de autentificare, adic un atacator poate edita
mesajul i recalcula suma de control fr ca aceast substituie s fie detectat. Dac sunt stocate
alturi de date, codurile redundante ciclice i funciile criptografice hash nu protejeaz mpotriva
alterrii intenionate a datelor. Orice aplicaie care necesit protecie mpotriva acestui tip de atacuri
trebuie s utilizeze mecanisme de autentificare, ca mesaje de autentificare sau semnturi digitale
(care sunt adesea bazate pe funcii criptografice hash).
n al doilea rnd, spre deosebire de funciile criptografice hash, CRC este o funcie uor
reversibil, ceea ce o face inconvenabil pentru a fi folosit n semnturile digitale.
n al treilea rnd, CRC este o funcie liniar cu proprietatea c
i, ca rezultat, chiar dac CRC-ul ar fi criptat, mesajul i CRC-ul asociat ar putea fi
manipulate fr cunoaterea cheii de criptare; acesta este un neajuns bine-cunoscut al protocolului
Wired Equivalent Privacy (WEP).
7.3
SPECIFICAII CRC
Uneori implementarea adaug un ir fix de bii naintea irului care trebuie verificat. Acest
fapt este util atunci cnd erorile de sincronizare insereaz bii de zero n faa unui mesaj
fr a modifica irul ce va fi verificat;
Ordinea biilor: Unele scheme vd cel mai nesemnificativ bit dintr-un octet ca fiind
primul, ceea ce nseamn cel mai din stnga n timpul mpririi polinomiale. Aceast
convenie are sens atunci cnd mesajele transmise pe interfaa serial sunt verificate cu
CRC n interiorul dispozitivelor, datorit rspndirii pe larg a conveniei conform creia
cel mai nesemnificativ bit este transmis primul;
Ordinea octeilor: La CRC-urile pe mai muli octei, poate aprea o confuzie cu privire la
primul octet transmis (sau octetul stocat la adresa mai mic n memorie) dac acesta este
cel mai semnificativ octet (LSB) sau cel mai semnificativ octet (MSB). De exemplu, unele
implementri ale CRC interschimb octeii polinomului generator;
Omiterea celui mai semnificativ bit al polinomului generator. Datorit faptului c cel mai
semnificativ bit este tot timpul 1 i pentru c un CRC pe N bii trebuie definit printr-un
111
Omiterea celui mai nesemnificativ bit al polinomului generator. Datorit faptului c cel
mai nesemnificativ bit este tot timpul 1, unii autori ca Philip Koopman reprezint
polinomul divizor cu bitul cel mai semnificativ intact, dar fr cel mai nesemnificativ bit
(x0). Aceast convenie codeaz polinomul mpreun cu gradul su ntr-un singur ntreg.
Aceste complicaii nseamn c exist trei modaliti uzuale de a exprima polinomul ca un ntreg:
primele dou sunt constantele regsite n cod, cea de-a treia este numrul regsit n materialele lui
Koopman. n orice caz, un termen este omis. Deci, polinomul
Reprezentri
Normal
Inversat
0x3
0xC
Inversat reciproc
(Koopman)
0x9
Tabel 7.1
7.4
CRC STANDARDIZATE
112
Reprezentri
Nume
Normal
Inversat
Inversat reciproc
CRC-1
0x1
0x1
0x1
CRC-4-ITU
0x3
0xC
0x9
CRC-5-EPC
0x09
0x12
0x14
CRC-5-USB
0x05
0x14
0x12
CRC-6-ITU
0x03
0x30
0x21
CRC-7
0x09
0x48
0x44
CRC-8-CCITT
0x07
0xE0
0x83
CRC-8
0xD5
0xAB
0x8E
CRC-8-Dallas/Maxim
0x31
0x8C
0x98
CRC-8-SAE J1850
0x1D
0xB8
0x8E
CRC-8-WCDMA
0x9B
0xD9
0xCD
CRC-10
0x233
0x331
0x319
CRC-11
0x385
0x50E
0x5C2
CRC-12
0x80F
0xF01
0xC07
CRC-15-CAN
0x4599
0x4CD1
0x62CC
CRC-15-MPT1327
0x6815
0x540B
0x740A
CRC-16-IBM (ANSI)
0x8005
0xA001
0xC002
CRC-16-CCITT
0x1021
0x8408
0x8810
CRC-16-T10-DIF
0x8BB7
0xEDD1
0xC5DB
CRC-16-DNP
0x3D65
0xA6BC
0x9EB2
CRC-16-DECT
0x0589
0x91A0
0x82C4
CRC-16-ARINC
0xA02B
0xD405
0xD015
CRC-24
0x5D6DCB
0xD3B6BA
0xAEB6E5
CRC-32
0x04C11DB7
0xEDB88320
0x82608EDB
Tabel 7.2
113
7.5
7.5.1
Pentru a realiza o aplicaie software pentru calculul CRC exist mai multe metode de
implementare, n funcie de:
HARDWARE
Implementarea hardware a CRC sub forma unui sistem ce are la baza un microcontroler
are urmtoarele avantaje:
Pentru obinerea unor timpi foarte mici se folosete o implementare de tip hardware cu
bistabile n varianta paralel.
114
7.5.3
Pentru calculul unui CRC pe n bii, se vor poziiona n partea stng a mesajului iniial cei
n+1 bii ai polinomului generator.
Se pornete de la mesajul iniial:
11010011101100
Se completeaz mesajul iniial cu n zerouri corespunztoare celor n bii de la CRC. Mai
jos sunt prezentate calculele pentru un CRC pe 3 bii:
11010011101100 000 <--- completm mesajul cu cei 3 bii
1011
<--- divizorul (4 bii) = x+x+1
-----------------01100011101100 000 <--- rezultatul
Dac bitul deasupra bitului cel mai semnificativ din divizor este 0, nu trebuie fcute
calcule. Dac bitul din mesajul iniial deasupra bitului cel mai semnificativ din divizor este 1, se
face un XOR ntre mesajul iniial i divizor. Apoi divizorul este mutat cu o poziie n dreapta i
procesul se repet pn cnd divizorul ajunge n partea dreapt a mesajului iniial.
Mai jos este prezentat calculul complet:
11010011101100 000
1011
01100011101100 000
1011
00111011101100 000
1011
00010111101100 000
1011
00000001101100 000
1011
00000000110100 000
1011
00000000011000 000
1011
00000000001110 000
1011
00000000000101 000
101 1
----------------00000000000000 100
<--<--<--<---
<---rest (3 bii)
7.6
7.6.1
POINTERI N IAR
POINTERI I TIPURI DE MEMORIE
Pointerii sunt folosii pentru a referi locaia datelor. n general, pointerii au un tip. De
exemplu, un pointer de tipul int * indic ctre un ntreg.
n compilator, pointerul indic ctre un anumit tip de memorie. Tipul memoriei este
specificat utiliznd un cuvnt cheie nainte de asterisc. De exemplu un pointer care indic ctre un
ntreg stocat n memoria far este declarat astfel:
int_ _far * MyPtr;
Trebuie menionat faptul c locaia variabilei pointer MyPtr nu este afectat de cuvntulcheie care precede asteriscul. n exemplul urmtor variabila MyPtr2 este plasat n memoria
tiny. Ambele variabile, MyPtr i MyPtr2, indic ctre o dat de tip caracter din memoria far.
char __far * __tiny MyPtr2;
Oricnd este posibil, pointerii trebuie declarai fr atribute de memorie. De exemplu,
funciile din biblioteca standard toate sunt declarate fr specificarea explicit a tipului de
memorie.
7.6.2
Un pointer trebuie s conin informaia necesar pentru a specifica locaia unui anumit
tip de memorie. Acest fapt nseamn c dimensiunile pointerilor sunt diferite pentru diferite tipuri
de memorie. n IAR C/C++ Compiler for AVR este interzis conversia pointerilor de tipuri diferite
fr utilizarea unui cast explicit.
7.6.2.1 Pointeri la funcii
Dimensiunea unui pointer la funcie este tot timpul 16 sau 24 de bii i acetia pot adresa
ntreaga memorie. Reprezentarea intern a unui pointer la funcie reprezint adresa de la care
ncepe funcia mprit la doi.
116
Interval de
memorie
Dimensiune
pointer
Tip index
__nearfunc
0-0x1FFFE
2 octei
signed int
__farfunc
0-0x7FFFFE
3 octei
signed long
Descriere
Poate fi apelat din oriunde n
memoria program, dar trebuie
s refere o locaie din primii
128KB ai acelui spaiu de
memorie.
Poate fi apelat de oriunde.
Tabel 7.3
Cuvnt-cheie
Dimensiune
pointer
Spaiul de
memorie
Tipul indicelui
Intervalul de
memorie
__tiny
1 octet
Data
signed char
0x0-0xFF
__near
2 octei
Data
signed int
0x0-0xFFFF
__far
3 octei
Data
signed int
0x0-0xFFFFFF
__huge
3 octei
Data
signed long
0x0-0xFFFFFF
__tinyflash
1 octet
Code
signed char
0x0-0xFF
__flash
2 octei
Code
signed int
0x0-0xFFFF
__farflash
3 octei
Code
signed int
0x0-0xFFFFFF
__hugeflash
3 octei
Code
signed long
0x0-0xFFFFFF
__eeprom
1 octet
EEPROM
signed long
0x0-0xFF
__eeprom
2 octei
EEPROM
signed int
0x0-0xFFFF
Tabel 7.3
117
7.7
7.7.1
Pentru a genera n mod automat CRC-ul pentru toat memoria flash, mediul IAR trebuie
configurat ca n figura urmtoare:
Figura 7.1
Se las debifat csua Initialize unused interrupt vectors with RETI instructions pentru a
evita un conflict cu opiunea Fill unused code memory din categoria Linker.
118
Figura 7.2
Fill unused code memory seteaz valoarea cu care se completeaz memoria neutilizat.
Generate checksum seteaz generarea CRC-ului.
Size seteaz dimensiunea CRC-ului generat n octei.
Arithmetic sum calculeaz suma tuturor biilor de 1.
CRC polynomial seteaz un polinom propriu pentru generarea CRC-ului.
Complement seteaz modul de reprezentare al CRC-ului generat:
As is rezultatul rmne neschimbat.
1s Complement complement fa de 1.
2s Complement complement fa de 2.
Bit order modul de reprezentare al CRC-ului generat.
LSB first primul bit reprezint coeficientul termenului la puterea 0.
MSB first primul bit reprezint coeficientul termenului la puterea cea mai mare.
Initial value seteaz valoarea iniial a CRC-ului.
119
Implementare CRC-16
Setri IAR:
Figura 7.3
120
Figura 7.4
Cod surs 7.1:
#define CRC16_CCITT 0x1021
enum BitOrder { LSBF, MSBF };
unsigned int crc16(unsigned int polinom16, unsigned int init_val_16,
unsigned int adr_start,unsigned int len, enum BitOrder ord)
{
//rezultatul final
unsigned int crc = init_val_16;
//reine n octetul cel mai semnificativ datele
//extrase din memoria flash
unsigned int data = 0;
121
while( len-- ) {
unsigned int i;
//se extrage valoarea unui octet de la adresa de start
//din memoria flash
data = *(__flash char *)adr_start;
if ( ord == MSBF ) //opiunea cu shiftare spre MSB
{
//octetul este shiftat la stnga pentru a se alinia
//cu polinomul generator
data <<= 8;
//datele sunt "transferate" n rezultat
crc ^= data;
adr_start++;
//pentru biii de date se face XOR cu polinomul generator,
//daca bitul cel mai semnificativ este 1 sau se shifteaza datele
//la stnga, dac bitul cel mai semnificativ este 0
for( i = 0; i < 8; ++i ) {
//se verific dac bitul cel mai semnificativ este 1
if( crc & 0x8000 )
crc = (crc << 1) ^ polinom16;
else
crc = crc << 1;
}
}
else
//opiunea cu shiftare spre LSB
//parametrul polinom16 al funciei trebuie s aib biii inversai n
//prealabil
{
crc ^= data;
adr_start++;
//se verific bitul cel mai putin semnificativ i dac
//acesta este 1 se face XOR cu polinomul generator,
// altfel datele sunt shiftate la dreapta
for( i = 0; i < 8; ++i ) {
//se verific daca cel mai puin semnificativ bit este 1
if( crc & 0x0001 )
crc = (crc >> 1) ^ polinom16;
else
crc = crc >> 1;
}
}
}
return crc;
}
122
123
7.7.2
IMPLEMENTARE CRC-32
Setri IAR:
Figura 7.5
124
Figura 7.6
Cod surs 7.2:
unsigned long crc32(unsigned long polinom32, unsigned long init_val_32,
unsigned int adr_start,unsigned int len, enum BitOrder
ord)
{
//variabile pe 32 bii
unsigned long crc = init_val_32;
unsigned long data = 0;
while( len-- ) {
int i;
//se extrage un octet din memoria flash
125
pre-calculate ale
0x130476dc,
0x2f8ad6d6,
0x4c11db70,
0x569796c2,
0x791d4014,
0x91a18d8e,
0xbe2b5b58,
0xa4ad16ea,
0xc7361b4c,
0xfbb8bb46,
0x34867077,
0x2e003dc5,
0x018aeb13,
0x17c56b6b,
0x2b4bcb61,
0x48d0c6c7,
0x52568b75,
0x7ddc5da3,
0x95609039,
0xbaea46ef,
0xa06c0b5d,
0xc3f706fb,
0xff79a6f1,
0x30476dc0,
0x2ac12072,
0x054bf6a4,
126
0x0808d07d,
0x6b93dddb,
0x571d7dd1,
0xaca5c697,
0xb6238b25,
0x99a95df3,
0xe9362689,
0xc6bcf05f,
0xdc3abded,
0x7a089632,
0x46863638,
0x251d3b9e,
0x3f9b762c,
0x1011a0fa,
0xf8ad6d60,
0xd727bbb6,
0xcda1f604,
0xae3afba2,
0x92b45ba8,
0x5d8a9099,
0x470cdd2b,
0x68860bfd,
0x18197087,
0x3793a651,
0x2d15ebe3,
0xd6ad50a5,
0xea23f0af,
0x89b8fd09,
0x933eb0bb,
0xbcb4666d,
};
0x0cc9cdca,
0x6f52c06c,
0x53dc6066,
0xa864db20,
0xb2e29692,
0x9d684044,
0xedf73b3e,
0xc27dede8,
0xd8fba05a,
0x7ec98b85,
0x42472b8f,
0x21dc2629,
0x3b5a6b9b,
0x14d0bd4d,
0xfc6c70d7,
0xd3e6a601,
0xc960ebb3,
0xaafbe615,
0x9675461f,
0x594b8d2e,
0x43cdc09c,
0x6c47164a,
0x1cd86d30,
0x3352bbe6,
0x29d4f654,
0xd26c4d12,
0xeee2ed18,
0x8d79e0be,
0x97ffad0c,
0xb8757bda,
0x7897ab07,
0x6211e6b5,
0x4d9b3063,
0xa527fdf9,
0x8aad2b2f,
0x902b669d,
0xf3b06b3b,
0xcf3ecb31,
0x690ce0ee,
0x738aad5c,
0x5c007b8a,
0x2c9f00f0,
0x0315d626,
0x19939b94,
0xe22b20d2,
0xdea580d8,
0xbd3e8d7e,
0xa7b8c0cc,
0x8832161a,
0x5408abf7,
0x7b827d21,
0x61043093,
0x029f3d35,
0x3e119d3f,
0xc5a92679,
0xdf2f6bcb,
0xf0a5bd1d,
0x803ac667,
0xafb010b1,
0xb5365d03,
0x7c56b6b0,
0x66d0fb02,
0x495a2dd4,
0xa1e6e04e,
0x8e6c3698,
0x94ea7b2a,
0xf771768c,
0xcbffd686,
0x6dcdfd59,
0x774bb0eb,
0x58c1663d,
0x285e1d47,
0x07d4cb91,
0x1d528623,
0xe6ea3d65,
0xda649d6f,
0xb9ff90c9,
0xa379dd7b,
0x8cf30bad,
0x50c9b640,
0x7f436096,
0x65c52d24,
0x065e2082,
0x3ad08088,
0xc1683bce,
0xdbee767c,
0xf464a0aa,
0x84fbdbd0,
0xab710d06,
0xb1f740b4,
0x71159069,
0x5e9f46bf,
0x44190b0d,
0xbfa1b04b,
0x832f1041,
0xe0b41de7,
0xfa325055,
0xd5b88683,
0x608edb80,
0x4f040d56,
0x558240e4,
0x36194d42,
0x0a97ed48,
0xf12f560e,
0xeba91bbc,
0xc423cd6a,
0xb4bcb610,
0x9b3660c6,
0x81b02d74,
0x4e8ee645,
0x7200464f,
0x119b4be9,
0x0b1d065b,
0x2497d08d,
0xcc2b1d17,
0xe3a1cbc1,
0xf9278673,
0x9abc8bd5,
0xa6322bdf,
0x75d48dde,
0x5a5e5b08,
0x40d816ba,
0xbb60adfc,
0x87ee0df6,
0xe4750050,
0xfef34de2,
0xd1799b34,
0x644fc637,
0x4bc510e1,
0x51435d53,
0x32d850f5,
0x0e56f0ff,
0xf5ee4bb9,
0xef68060b,
0xc0e2d0dd,
0xb07daba7,
0x9ff77d71,
0x857130c3,
0x4a4ffbf2,
0x76c15bf8,
0x155a565e,
0x0fdc1bec,
0x2056cd3a,
0xc8ea00a0,
0xe760d676,
0xfde69bc4,
0x9e7d9662,
0xa2f33668,
127
7.7.3
Figura 7.7
CRC-16 ce utilizeaz tabel cu valori pre-calculate:
Figura 7.8
128
7.8
ANEX
129
8 Frecvenmetru. Timer/Counter 0
8.1
8.1.1
FRECVENMETRUL
DEFINIIE
PRINCIPIU DE OPERARE
Counter
Display
33 MHz
Decade dividers
Flip flop
Clock
8.2
TIMER/COUNTER 0
TCCR0
count
TOV0
Intr.
clear
Control Logic
direction
DATABUS
BOTTOM
clkT0
Clock Select
Detector de
front
TOP
Numrtor
TCNT0
T0
(de la
Prescaler)
=0
= 0xFF
OC0
Intr.
Generator
form de
und
OC0
OCR0
8.2.1
NOIUNI INTRODUCTIVE
Atmega16 dispune de trei timere dintre care dou sunt pe 8 bii (Timer/Counter0 ,
Timer/Counter2 ) i unul este pe 16 bii (Timer/Counter1) .
Sursa semnalului de clock poate fi selectat intern (de la Prescaler), sau de la o surs de
clock extern conectat la pinul T0. Timer -ul este inactiv cnd nu este selectat nici o surs de
clock. Ieirea din blocul Clock Select reprezint semnalul de clock la care va opera Timer/Counter
0 (clkT0).
8.2.1.1 Regitri
n Error! Reference source not found.2 putem observa urmtorii registri :
OCR0 (Output Compare Register) este comparat tot timpul cu valoarea lui TCNT0.
Rezultatul comparrii poate fi folosit de generatorul de und pentru a genera la ieire un semnal
PWM sau semnal de clock cu frecvene variabile pe pinul Output Compare (OC0). Rezultatul
comparrii va seta, de asemenea, i Compare Flag (OCF0), care poate fi folosit pentru a genera o
cerere de ntrerupere la ieire.
8.2.1.2 Unitatea de numrare
132
DATA BUS
TOV0 Intr.
TOSC1
count
clear
TCNT0
direction
Control
Logic
clkT0
T/C
Oscillator
Prescaler
TOSC2
clkI/O
bottom
top
de
numrare
DATA BUS
este
pe
bii,
bidirecional
TOV0 Intr.
TOSC1
count
TCNT0
programabil.
clear
direction
Control
Logic
clkT0
T/C
Oscillator
Prescaler
TOSC2
clkI/O
bottom
top
133
OCR0
TCNT0
Comparator pe 8 bii
OCF0
Intr.
top
bottom
OC0
FOC0
WGM01:0
COM01:0
Moduri de funcionare
Definiii:
BOTTOM : reprezint valoarea minim a counterului 0x00
MAX : reprezint valoarea maxim a counterului 0xFF ( aceasta difer n funcie de
numrul de bii al counter-ului)
TOP : counterul ajunge la valoarea de TOP cnd devine egal cu cea mai mare valoare din
secvena de numrat. Aceasta poate fi o valoare fix (MAX) sau valoarea stocat n registrul OCR
n funcie de modul de operare.
PROBLEM REZOLVAT
8.3
Enun
T = T(on) + T(off)
DC = 45%
T(off) = 20 ms 9 ms =11 ms
Configurare Timer/Counter 0
Bit
CS01
CS00
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
TCCR0
135
Mod
0
1
2
3
WGM01
(CTC0)
0
0
1
1
Setare Flag
TOV0
MAX
BOTTOM
MAX
MAX
=> Biii COM01:0 . Cu ajutorul lor putem controla dac PWM poate fi inversabil sau nu.
COM01
COM00
0
0
1
1
0
1
0
1
Descriere
Mod normal de operare, OC0 deconectat
Toggle OC0 la compare match
Resetare OC0 la compare match
Setare OC0 la compare match
Tabel 8.2
Codul surs :
#include <inavr.h>
#include <iom16.h>
void timer0_init()
{
// iniializare TCCR0
TCCR0 |= (1<<WGM00)|(1<<COM01)|(1<<WGM01)|(1<<CS00);
// setare pinul OC0 ca output (este pinul PB3)
DDRB |= (1<<PB3);
}
void main()
{
uint8_t duty;
duty = 115; // duty cycle = 45% i deoarece Timer 0 este pe
8 bii acesta poate numra pn la 255. Deci
45% din 255 = 114.75 = 115
timer0_init();// iniializarea timer-ului
while(1) // crearea unei bucle infinite
{
OCR0 = duty; //Output Compare registrer
}
}
136
Rezultate
8.4
PROBLEM PROPUS
137
138
resetarea registrului
( revenirea la o
valoare iniial stabilit).
resetarea microcontroler-ului
.
9.1.1
SCHEMA DE PRINCIPIU
Watchdog timer
Reset
Procesor
Restart
Clock
139
9.1.2
SURSA DE CLOCK
9.1.3
i
opereaz n domenii de clock diferite, iar sincronizarea ntre aceste domenii
trebuie luat n considerare atunci cnd folosim watchdog-ul. Pentru a configura
sunt
necesare 2-3 perioade de clock
. Setrile sunt scrise n registrele de control ale
, ele sunt efective la urmtorul front pozitiv al clock-ului
, adic
dup
dup ce setrile sunt scrise n registru. De aici rezult c perioada iniial de
este cu
mai lung. Dac perioada de
este de
, perioada actual
este ntre
i
. Acest lucru este relevant atunci cnd se folosete
i
perioade de
mici. Aceast caracteristic nu este specific doar
, toate
timer-ele asincrone opereaz n acest fel pentru sincronizarea clock-ului ntre diferite
domenii.
este resetat atunci cnd are loc o scriere valid n registrele de control.
O alt caracteristic de sincronizare este diferena de timp dintre executarea instruciunii
de
i resetarea acestuia efectiv, problem ce ine de sincronizare dintre domenii de
clock.
este resetat dup 3 perioade de clock dup ce instruciunea de reset este executat,
adic ntre
dup executarea instruciunii. Dac se folosete o perioad de
de
prima instruciune de
va fi executat dup
de la activarea
. innd cont de precizia oscilatorului
, instruciunea trebuie s fie
executat n
sau mai puin. Intervalul dintre dou intstruciuni de
poate fi de
sau mai mic
incertitudineprecizia oscilatorului). Efectul acestei
sincronizri este minimizat atunci cnd perioada de
este mai mare.
Dac
genereaz un semnal de reset (de ex. dup expirarea perioadei de
) resetarea sistemului are loc la urmtorul front al clock-ului
. Resetarea
sistemului are loc la
dup ce perioada de
a expirat. Acest lucru n mod normal nu
ar trebui s creeze nici o problem, dar este important de tiut dac se dorete s se msoare
perioada watchdog-ului urmrind nivelului logic de tensiune al unui pin. Cea mai bun metod de
calcul a perioadei efective a watchdog-ului este folosirea XMEGA Real Time Clock timer-ului.
Toate aceste caracteristici sunt valabile n ambele moduri, normal i fereastr.
140
WDT
timer
Resetarea WDT
TOWD=8
WDT timeout
5
4
TWDT_Reset
0
T0
t[ms]
10
15
WDT clock
9.1.4
MODURILE DE FUNCIONARE
WDT timer
WDT reset
Deschis
TOWDT=16
WDT time-out
t[ms]
5
10
15
20
TOWDT
25
30
35
141
TOWDT=8
Deschis
TOWDTW=8
nchis
WDT timer
WDT reset
Resetarea sistemului
t[ms]
5
10
15
20
25
TOWDTW
30
35
40
TOWDT
9.2
IEC 60730 este un standard de siguran pentru aparatele de uz casnic , care abordeaz
aspectele de design i funcionare a produselor. Acest standard este menionat i de alte standarde
care vizeaz sigurana dispozitivelor, de exemplu standardul IEC 60335. Pentru siguran este
foarte important ca sistemul s fie certificat de acest standard.
9.2.1
Anexa H a standardului IEC 60730 definete trei clase de control al soft-ului pentru diferite
aparate electrocasnice :
aplicaii care includ cod cu scopul de a preveni alte erori dect cele software;
WATCHDOG-UL DE CLAS B
142
Resetarea
poate fi resetat;
Sistemul este resetat la resetarea prematur a
fereastr.
sistemului
;
este
realizat
dup
expirarea
perioadei
de
time-out
n modul de funcionare
Conform diagramei logice dispozitivul este resetat de cteva ori n timpul testului. Prin
urmare variabila SRAM i flag-urile de reset ale dispozitivului sunt utilizate de rutina de
autodiagnosticare, pentru a urmri faza de testare. n continuare utilizatorul poate configura ce s
fac n cazul unui reset software , brown-out sau cum s proceseze resetul cauzat de watchdog,
atunci cnd testul se afl n starea
.
Rutina de autodiagnosticare folosete un
pentru a verifica
perioada
.
are o sursa de clock independent fa de
i
.
Ambele module au oscilatoare care funcioneaz la
. Cu toate acestea oscilatorul
este optimizat pentru un consum redus de energie.
-ul este folosit pentru
estimarea perioadei
, iar programul verific dac aceast perioad este n intervalul
unde este perioada nominal a
.
Fluxul de execuie fr erori este :
1.
Dup punerea sub tensiune sau reset extern se verific dac
poate reseta
sistemul. Se seteaz starea
. Sistemul este resetat de
.
2.
Se verific dac
poate fi resetat. Se seteaz starea
. Sistemul este
resetat de
.
3.
Se verific dac modul window funcioneaz corect. Se seteaz
. Sistemul este
resetat de
.
4.
Se configureaz
conform setrilor .Se seteaz starea testului
. Se
continu cu funcia main.
Primul pas este asigurarea faptului c
poate genera semnalul de reset. Acest
lucru se realizeaz configurnd
conform datasheet-ului i ateptnd pn cnd
1
procesul de resetare a avut loc. n plus
este folosit pentru a estima perioada
watchdog-ului, care este necesar n fazele ulterioare ale testului. Acest lucru se realizeaz setnd
perioada
cu o valoare destul de mic (aproximativ
) i numrnd perioadele
pn la resetare. Exist un timp maxim de ateptare care poate fi configurat, dup
expirarea acestui timp programul intr ntr-o stare de eroare.
9.2.3
n primul rnd rutina de autodiagnosticare va seta starea de eroare dac nu are loc
resetarea sistemului. O posibil problem care poate mpiedica
s genereze un semnal
de reset ar putea fi dezactivarea lui. Starea de eroare va fi stabilit, iar sistemul pur i simplu va fi
suspendat.
O eroare a frecvenei
sau a
poate fi simulat printr-un break
point i modificnd variabila
, astfel nct s fie n afara intervalului prestabilit.
O eroare n mecanismul de resetare a
poate fi simulat prin nlturarea
liniei de cod n care
. Fiind dat structura programului, n al doilea rnd
rutina de autodiagnosticare va seta starea de eroare nainte ca
s urmeze
constrngerile de timp care sunt impuse.
O eroare n modul fereastr al watchdog-ului poate fi simulat prin nlturarea setrilor
acestui mod. Codul va reseta
i apoi va atepta din perioada de time-out. La
momentul respectiv perioada watchdog-ului va fi mai mare sau egal cu perioada estimat
(perioada total este suma perioadelor nchis i deschis). Prin urmare sistemul nu va fi resetat
nainte de setarea strii de eroare.
144
WDT Test
Power-on
Reset Extern
PDI
Cauza
Resetului?
WDT
Alta
Stare
Poate WDT
reseta sistemul? Nu
Brownout sau
Software
WDT_OK
Starea
testului?
Configurat de
utilizator
Configurat de
utilizator
WDT_3
WDT_2
WDT_1
Da
Poate WDT fi
resetat?
Nu
Da
Nu
Setarea WDT
Da
Starea
WDT_1
Starea
WDT_ERR
Starea
WDT_2
Starea
WDT_3
Starea
WDT_OK
Eroare
WDT Test
Stop
Resetat de
WDT
145
9.3
ATMEGA16
9.3.1
NTRERUPEREA DE RESET
9.3.2
segmentul CSRACK;
segmentul RSTACK (return address stack). Compilatorul utilizeaz
acest spaiu pentru adresele de revenire salvate de instruciunile de apel de procedur i la
tratarea ntreruperilor.
ntotdeauna nainte de funcia main, va fi executat rutina de ntrerupere de Reset (de fapt main-ul
este apelat din rutina de Reset).
9.3.3
146
RESET
INTERN
9.3.4
REGISTRUL MCUCSR
JTD
ISC2
JTRF
WDRF
Read/Write
R/W
R/W
R/W
R/W
Valoare iniial
Bit
R/W
MCUCSR
R/W
JTRF: JTAG Reset Flag acest bit este setat dac resetarea sistemului este cauzat de scrierea de 1
logic n registrul JTAG Reset selectat de instruciunea JTAG, AVR_RESET. Acest bit este resetat
printr-un power-on reset sau prin scrierea de 0 logic.
WDRF: Watchdog Reset Flag - acest bit este setat dac resetarea sistemului este cauzat
de
. Acest bit este resetat printr-un power-on reset sau prin scrierea de 0
logic.
BORF: Brown-out Reset Flag - acest bit este setat dac se produce un brown-out reset.
Bitul este resetat prin power-on reset sau prin scrierea de 0 logic.
EXTRF: External Reset Flag acest bit este setat dac se produce un reset extern. Bitul
este resetat prin power-on reset sau prin scrierea de 0 logic.
PORF: Power-on Reset Flag Acest bit este setat dac se produce un power-on reset.
Bitul este resetat numai prin scrierea de 0 logic.
Pentru a folosi aceti bii ei trebuiesc citii i resetai ct mai devreme n program.
147
9.3.5
WATCHDOG TIMER
OSC/2048K
OSC/512K
OSC/1024K
OSC/128K
OSC/256K
OSC/32K
WATCHDOG
RESET
OSC/64K
WATCHDOG PRESCALER
OSC/16K
OSCILATOR
WDP0
WDP1
WDP2
WDE
RESET
6
-
5
-
WDTOE
WDE
WDP2
WDP1
WDP0
Read/Write
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
WDTCR
148
WDP2
WDP1
WDP0
Timpul de
expirare pentru
VCC = 3.0V
17.1 ms
Timpul de
expirare pentru
VCC = 5.0V
16.3 ms
Numrul de cicli ai
WDT
16K(16,384)
32K(32,768)
34.3 ms
32.5 ms
64K(65536)
68.5 ms
65 ms
128K(131,072)
0.14 s
0.13 s
256K(262,144)
0.27 s
0.26 s
512K(524,288)
0.55 s
0.52 s
1024K(1,048,576)
1.1 s
1.0 s
2048K(2,097,152)
2.2 s
2.1 s
9.4
APLICAII
9.4.1
APLICAIA 1
9.1.1.1
Enun
Rezolvare
149
9.1.1.3
Schema logic
START
Seteaz Watchdog-ul cu
o perioad de time-out de
0.26 ms
Activeaz watchdog-ul
Nu f nimic
Rezultate
150
9.1.1.4
Codul surs
main.c
#include <iom16.h>
#include <inavr.h>
#define DELAY_CYCLES 32768
int main( void )
{
__disable_interrupt();
/*Setare perioad de time-out 0.26s*/
WDTCR|=(1<<WDP2);
/*Activare watchdog timer*/
WDTCR|=(1<<WDE);
/*Setare PD6 ca pin de ieire*/
DDRD|=(1<<PD5);
__enable_interrupt();
/*Setare PD6 pe 1 logic*/
PORTD|=(1<<PD5);
__delay_cycles(DELAY_CYCLES);
/*Setare PD6 pe 0 logic*/
PORTD&=~(1<<PD5);
while(1);
return 0;
}
9.4.2
APLICAIA 2
9.1.1.5
Enun
S se creeze o aplicaie care s calculeze perioada efectiv a
9.1.1.6
Rezolvare
151
9.1.1.7
Schema logic
START
Initializeaz USART
Initializeaz Timer
Initializeaz Watchdog
Calculeaz frecvena
folosint variabilele __no_init
Trimite frecvena pe serial
Pune variabilele pe 0
Reseteaz Watchdog-ul
Activeaz Watchdog-ul
9.1.1.8
Rezultate
9.1.1.9
Codul surs
#include <iom16.h>
#include <inavr.h>
int main( void )
152
{
__enable_interrupt();
/*iniializare Watchdog*/
/*Setare time-out de 16.3 ms*/
WDTCR|= (~(1<<WDP0))| (~(1<<WDP1))| (~(1<<WDP2));
__delay_cycles(100000);
/*Resetare WDT*/
asm("WDR");
/*Activare WDT*/
WDTCR|=(1<<WDE);
DDRC|=(1<<DDC1);
PORTC|=(1<<PC1);
while(1)
{
PORTC^=(1<<PC1);
__delay_cycles(1000);
}
return 0;
}
9.4.3
APLICAIA 3
9.1.1.10
Enun
S se scrie o aplicaie care calculeaz frecvena efectiv a
. Pentru
calculul exact al frecvenei se va folosi unul dintre timer-ele microcontroler-ului. Frecvena va fi
trimis pe serial. Nu se va folosi tipul de dat double.
9.1.1.11
Rezolvare
153
9.1.1.12
Schem logic
START
Initializeaz USART
Initializeaz Timer
Initializeaz Watchdog
Calculeaz frecvena
folosint variabilele __no_init
Trimite frecvena pe serial
Pune variabilele pe 0
Reseteaz Watchdog-ul
Activeaz Watchdog-ul
9.1.1.13
Rezultate
154
9.1.1.14
Codul surs
#include <iom16.h>
#include <inavr.h>
#include "usart.h"
__no_init unsigned int Timer1_currentValue;
__no_init unsigned int Timer1_numberOverflows;
#pragma vector = TIMER1_OVF_vect
__interrupt void T1_OVF()
{
Timer1_numberOverflows++;
}
int main( void )
{
/*iniializare usart*/
USART_initialize(BAUD_RATE);
/*iniializare Timer 1*/
/*Mod de funcionare Normal*/
/*Setare prescaler */
TCCR1B|=(1<<CS10);
/*Activare ntrerupere*/
TIMSK|=(1<<TOIE1);
__enable_interrupt();
/*iniializare Watchdog*/
/*Setare time-out de 32.5 ms*/
WDTCR|= (1<<WDP0);
if(Timer1_numberOverflows >0 || Timer1_currentValue>0)
{
/*calculul perioadei efective de time-out a watchdog-ului*/
unsigned long number=Timer1_numberOverflows*65535+Timer1_currentValue;
/*calculul perioadei n ms*/
unsigned long period=number*0.00025;
/*calculul perioadei unui ciclu de clock al watchdog-ului*/
unsigned long time_per_clock=(unsigned long)((period*1000000)/32768);
/*calculul frecvenei n Hz*/
unsigned long frecv=(unsigned long)((1000000./time_per_clock));
print(frecv);
}
Timer1_numberOverflows=0;
Timer1_currentValue=0;
TCNT1=0;
/*Resetare WDT*/
asm("WDR");
/*Activare WDT*/
WDTCR|=(1<<WDE);
while(1)
{
Timer1_currentValue=TCNT1;
}
return 0;
}
155
10.1
156
10.2
UTILIZARE TIMER/COUNTER1
Control Logic
Direcie
Detector
de front
TOP
Tn
BOTTOM
Timer/Counter
(de la prescaler)
TCNTn
=
=0
Generator
de forma
de und
OCRnA
Valori
TOP fixate
Generator
de forma
de und
OCRnB
ICFn(Int. req.)
Detector
de front
ICRn
ICPn
ICPn
De la ieirea
comparatorului
analogic
Atenuator
de zgomot
ICPn
TCCRnA
TCCRnB
157
Exemplu de cod C
void TIM16_WriteTCNT1 ( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Salveaz flagul global de ntreruperi */
sreg = SREG;
/* Dezactiveaz ntreruperile */
_CLI();
/* Seteaz valoarea din TCNT1 n i */
TCNT1 = i;
/* Restaureaz flagul de ntreruperei */
SREG = sreg;
}
Codul n asamblare necesit ca regitrii r17:r16 s conin valoarea ce trebuie
scris in TCNT1.
10.3.1 UNITATEA DE NUMRARE
Partea principal a Timer/Counter-ului pe 16 bii este unitatea de numrare pe
16 bii, bidirecional i programabil. n Figura 10.2 se poate vedea structura aceste
uniti, unde semnificaia semnalelor este urmtoarea:
count
incrementare sau decrementare a TCNT1 cu 1
direction
selecteaz ntre incrementare sau decrementare
clear
resetare TCNT1
clkT1
clock-ul Timer/Counter1
top
TCNT1 a ajuns la valoarea sa maxim
bottom TCNT1 a ajuns la valoarea minim (zero)
DATABUS (8-bit)
TOVn
(Int.
req.)
TEMP (8-bit)
Numr
TCNTnL (8-bit)
Direcie
TOP
Resetare
Control
Logic
clkTn
BOTTOM
TCNTnH (8-bit)
Detector
de front
Tn
De la
prescal
er
este scris. Acest lucru face posibil scrierea sau citirea de ctre CPU a ntregii valori de
16 bii a numrtorului ntr-un singur ciclu de clock prin intemediul magistralei de 8
bii.
n funcie de modul de operare folosit, numrtorul este resetat, incrementat,
sau decrementat la fiecare ciclu de clock clkT1. ClkT1 poate fi generat extern sau intern,
in funcie de biii de selecie a clock-ului (CS12:10). Atunci cnd nu este selectat nici o
surs de clock (CS12:10=0) timer-ul este oprit. Indiferent dac clkT1 este prezent sau nu
valoarea TCNT1 poate fi accesat de ctre CPU.
Secvena de numrare este determinat de biii ce determin Modul De
Generare A Formei De Und (WGM13:10), aflai in regitrii TCCR1A i TCCR1B.
Flag-ul Timer/Counter Overflow (TOV1) este setat n funcie de modul de operare
selectat de biii WGM13:10. TOV1 poate fi folosit pentru a genera ntreruperi CPU.
10.3.2 UNITATEA INPUT CAPTURE
Timer-ul ncorporeaz o unitate Input Capture ce poate capta evenimente
externe i le poate da o marc de timp ce indic momentul producerii. Semnalul extern
ce indic un eveniment sau mai multe evenimente poate fi aplicat pe pinul ICP1 sau
prin comparatorul analogic. Mrcile de timp pot fi folosite n calcularea frecvenei,
factorului de umplere i altor caracteristici aplicate semnalelor. Mrcile de timp mai pot
fi folosite n crearea unui event log.
Unitatea Input Capture este ilustrat n diagrama bloc din Figura 10.3 . Elementele ce
nu fac parte direct din acest ansamblu sunt colorate cu gri. Litera n din registre i
numele biilor indic numrul Timer/Counter.
TEMP (8 bii)
ICRnH(8 bii)
ICRnL(8 bii)
WRITEICRn(Registru pe 16 bii)
+
ICPn
TCNTnH(8 bii)
TCNTnL(8 bii)
TCNTn(Registru pe 16 bii)
ACO
Analog
Comparator
Atenuator de
zgomot
Detector de
front
este copiat n registrul temporar (TEMP). Cnd procesorul citete locaia I/O a ICR1H
va accesa registrul TEMP.
Registrul ICR1 poate fi scris doar n modurile de generare de forme de und ce
folosesc acest registru pentru redefinirea valorii TOP a numrtorului. n aceste cazuri
modul de generare a formei de und trebuie setat nainte ca valoarea de TOP s poat fi
scris n registrul ICR1. Atunci cnd se scrie registrul ICR1 octetul High trebuie scris
n ICR1H naintea octetului Low n ICR1L.
Registrul ICR1 poate fi scris doar n modurile de generare de forme de und
pentru redefinirea valorii de TOP a registrului TCNT1. Astfel biii de mod WGM13:10
trebuie setai nainte de scrierea unei valori n ICR1.
10.1.1.1
TEMP (8 bii)
OCRnxH (8 bii)
OCRnxL (8 bii)
= (Comparator pe 16 bii)
OCFnx (Int. Req.)
TOP
BOTTOM
Generator de forme de
und
WGMn3:0
OCnx
COMnx1:0
COMnx1
COMnx0
Generator de
forme de und
FOCnX
SET
CLR
OCnx
SET
OCN
x
Pin
0
0
CLR
CLK_I/O
PORT
SET
CLR
DDR
164
Logica pinului de output compare permite iniializarea strii OC1x nainte ca ieirea s
fie activat. Unele setri ale biilor COM1x1:0 sunt rezervate pentru anumite moduri de
operare. Acetia nu au nici un efect asupra unitii Input Capture.
10.3.3.3 Modul Compare Output si Generarea de forme de und
Generatorul de forme de und utilizeaz biii COM1x1:0 diferit n modurile
normal, CTC i PWM. Pentru toate modurile COM1x1:0 semnaleaz generatorului de
forme de und c nici o aciune nu va fi fcut asupra registrului OC1x la urmtoarea
potrivire. O schimbare a strii biilor COM1x1:0 va lua efect la prima potrivire dup ce
biii au fost scrii.
FPWM
log( TOP 1)
log( 2)
n modul Fast PWM counterul este incrementat pn cnd valoarea lui atinge
una din valorile fixate 0x00FF, 0x01FF sau 0x03FF (WGM13:0 = 5, 6 sau 7), valoarea
n ICR1 (WGM13:0 = 14), sau valoarea n OCR1A (WGM13:0 = 15). Counter-ul este
resetat la urmtorul ciclu de clock al timer-ului.
165
OCnx
COMnx1:0=2
OCnx
COMnx1:0=3
Perioada
n Figura 10.6 este descris modul de operare Fast PWM cnd OCR1A sau
ICR1 sunt utilizai ca TOP. Valorile lui TCNT1 din diagram ilustreaz modul de
operare pe o singur pant. Linia orizontal dintre pantele lui TCNT1, reprezint
comparrile dintre OCR1x i TCNT1. OC1x va fi setat atunci cnd apare o potrivire de
valori.
Timer/Counter Overflow Flag (TOV1) este setat de fiecare dat cnd counterul
ajunge la TOP. n plus, OC1A sau ICF1 Flag este setat la acelai ciclu de clock al
timer-ului ca TOV1 atunci cnd OCR1A sau ICR1 este folosit pentru a defini valoarea
TOP.
Dac vreuna dintre ntreruperi este permis, rutina de ntreruperi poate fi
folosit pentru updatarea valorii TOP i compararea valorilor.
Cnd se schimb valoarea TOP, programul trebuie s se asigure c noua
valoare TOP este mai mare sau egal cu valoarea tuturor celorlali regitri. Dac
valoarea TOP este mai mic dect una dintre valorile regitrilor Compare nu va aprea
nici o potrivire de valori ntre TCNT1 i OCR1x.
Cnd sunt folosite valori fixe TOP, biii nefolosii sunt redui la zero cnd
oricare dintre valorile regitrilor OCR1x este stabilit.
Procedura de updatare pentru ICR1 difer de updatarea pentru OCR1A cnd
este folosit pentru definirea valorii TOP. Registrul ICR1 nu este dublu buffered. Asta
nseamn c, dac ICR1 este schimbat la o valoarea mai mic cnd counter-ul
funcioneaz fr nici o valoare sau cu o valoare mic a prescaler-ului, atunci exist
riscul ca noua valoare stabilit pentru ICR1 s fie mai mic dect valoarea curent a
TCNT1. n acest fel counter-ul nu va atinge nici o valoarea comun la valoarea TOP.
Counter-ul va trebui atunci s numere pn la valoarea MAX (0xFFFF) i s revin la
0x0000 pentru a atinge o valoarea comun.
Registrul OCR1A este dublu buffered. Aceast caracteristic permite ca locaia
I/O pentru OCR1A s fie scris oricnd. Cnd locaia I/O pentru OCR1A este stabilit
166
OCnxPWM
clk _ I / O
N * (1 TOP)
OC1 A
clk _ I / O
167
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
TCCR1A
168
Mode
WG
M13
WGM
12
WG
M11
WGM
10
0
1
0
0
0
0
0
0
0
1
4
5
6
7
8
0
0
0
0
1
1
1
1
1
0
0
0
1
1
0
0
1
0
1
0
10
11
12
13
14
15
1
1
1
1
1
1
1
1
0
0
1
1
0
1
0
1
Moduri de
operare ale
Timer/Counter
TOP
Actualizare
OCR1x
Flag-ul
TOV1 setat
pe
Normal
PWM, Phase
Correct, 8-bit
PWM, Phase
Correct, 9-bit
PWM, Phase
Correct, 10-bit
CTC
Fast PWM, 8-bit
Fast PWM, 9-bit
Fast PWM, 10-bit
PWM, Phase and
Frequency Correct
PWM, Phase and
Frequency Correct
PWM, Phase
Correct
PWM, Phase
Correct
CTC
Rezervat
Fast PWM
Fast PWM
0xFFFF
0x00FF
Imediat
TOP
MAX
BOTTOM
0x01FF
TOP
BOTTOM
0x03FF
TOP
BOTTOM
OCR1A
0x00FF
0x01FF
0x03FF
ICR1
Imediat
BOTTOM
BOTTOM
BOTTOM
BOTTOM
MAX
TOP
TOP
TOP
BOTTOM
OCR1A
BOTTOM
BOTTOM
ICR1
TOP
BOTTOM
OCR1A
TOP
BOTTOM
ICR1
ICR1
OCR1A
Imediat
BOTTOM
BOTTOM
MAX
TOP
TOP
ICNC1
ICNS1
Read/Write
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
CS11
CS10
R/W
R/W
R/W
TCCR1B
CS11
0
0
1
1
0
0
1
1
CS10
0
1
0
1
0
1
0
1
Descriere
Fr surs clock ( Timer/Counter oprit)
clkI/O (fr prescaler)
clkI/O/8 (de la prescaler)
clkI/O/64 (de la prescaler)
clkI/O/254 (de la prescaler)
clkI/O/1024 (de la prescaler)
Surs extern de clock pe pinul T0. Clock pe front negativ.
Surs extern de clock pe pinul T0. Clock pe front pozitiv.
TCNT1[15:8]
TCNT1H
TCNT1[7:0]
TCNT1L
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
OCR1A[15:8]
OCR1AH
OCR1A[7:0]
OCR1AL
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
170
Bit
OCR1B[15:8]
OCR1BH
OCR1B[7:0]
OCR1BL
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Read/Write
R/W
0
Valoare iniial
R/W
0
R/W
0
ICR1[15:8]
ICR1H
ICR1[7:0]
ICR1L
R/W
0
R/W
0
R/W
0
R/W
0
R/W
0
OCIE2
TOIE2
Read/Write
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
OCIE0
TOIE0
R/W
R/W
R/W
TIMSK
171
10.4
#include<inavr.h>
#include<iom16.h>
int cnt=0; //variabila pentru ntrerupere
//ntreruperea de overflow la timer1
#pragma vector=TIMER1_OVF_vect
__interrupt void T1int(void)
{
cnt++;
}
//configurarea timer 1
void timer1_INIT()
{
/*
Modul Fast PWM: WGM13:10=1110;
Fr prescaler: CS12:10=001;
Compare Output Mode: 10
*/
TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<CS10);
TCCR1A|=(1<<COM1A1)|(1<<WGM11);
TIMSK|=(1<<TOIE1);
}
172
void main()
{
//Alegerea pinului de ieire
DDRD|=(1<<PD5);
PORTD&=(1<<PD5);
//Iniializarea timer-ului
timer1_INIT();
//Valoarea care se ncarc
frecvena necesar
ICR1=4000;
//Factor de umplere de 50%
OCR1A=ICR1>>1;
registru
funcie
de
//pornirea ntreruperii
__enable_interrupt();
while(1)
{
}
}
173
10.5
APLICAII
b.
c.
174
175
Metoda are dezavantajul c att timp ct se numr nu se mai pot executa alte
aciuni; Toat fora de calcul a procesorului este folosit pentru incrementare.
n plus metoda este imprecis. Cu toate acestea metoda este uneori utilizat.
3 4
5 6
Tx
7 8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
9
24
17
Figura 11.1
Pentru a calcula perioada semnalului PT se folosete metoda ceasului pentru
msurarea duratei unei activiti sau fenomen: se noteaz timpul la care a nceput
activitatea i timpul la care aceasta s-a sfrit i apoi se face diferena celor doi timpi.
Numrtorul joac rolul ceasului. n Figura 11.1 prima perioad a lui PT ncepe cnd
numrtorul are valoarea 1 i se termin cnd are valoarea 9. Perioada Tx a lui PT este
9-1=8 perioade ale ceasului numrtorului. Pentru un Tnum de 1us obinem Tx=8 us.
176
11.3
APLICAII
Enun
Msurare impuls fr ntreruperi.
#include <inavr.h>
#include <iom16.h>
unsigned long nr_us;
unsigned int nr_cicli;
//msurare impuls fr ntrerupere
void main( void )
{
TCCR1A=0;//iniializare timer mod normal i dezactivare clock
TCCR1B=0;
DDRD&=~(1<<PD2);//pinul PD2 este de input
177
<inavr.h>
<iom16.h>
int per;
int nr_cicli;
int flag_per;
#pragma vector=INT0
__interrupt void isr_INT0(void){
if(PIND&(1<<PD2)==1){
TCNT1=0;///reset timer
TCCR1B=(1<<CS12);//start timer cu prescaler de 256
}
else{
nr_cicli=TCNT1;//salveaz nr cicli
per=(nr_cicli/4)*256;//calculeaz perioada n microsecunde
flag_per=1;
}
}
int main( void )
{
unsigned int x;
// iniializare ntrerupere extern
MCUCR |=(1<<ISC00);
MCUCR &=~(1<<ISC01);
GICR |=(1<<INT0); //activare ntrerupere extern
178
while(1){
while(flag_per==0);//ateapt msurare ntrerupere
flag_per=0;//reseteaz flag
x=per;//se face ceva cu valoarea msurat
}
}
179
12
12.1
INTRODUCERE
Assembly
+Control total al modului de utilizare a
resurselor
+ Compact i foarte rapid n aplicaii
mici
- Ineficient n aplicaii de dimensiuni
mari
-Greu de neles
-Greu de meninut
-Nu e portabil
C
+Eficient n aplicaii mari
+Cod structurat
+Uor de metinut
+Uor de portat
-Contol limitat al modului de utilizare a
resurselor
-Cod de dimensiuni mai mari i mai
ncet n aplicaii mici
12.2
180
Scratch Register
R0-R3
Local Register
R4-R15
Scratch Register
R16-R23
Local Register
R24-R27
R28-R29
Scratch Register
R30-R31
Function
Parameter 1 Registers
Parameter 2
Registers
R16
R20
R16
R20, R21
R16,R17
R16,R17,R18,R19
PUBLIC get_port
RSEG CODE
get_port:
RSEG
182
in R16, PIND
swap R16
; Interschimb valorile
ret
; ntoarcere n main
END
12.2.1.2 Cu parametri i valoare de return
n exemplul de mai jos se apeleaz o funcie ASM. Variabila mask pe un octet
este trimis ca parametru ctre funcia ASM , mask este salvat n R16 nainte de apelul
funciei . Dup terminarea funciei valoarea de return este salvat n R16 i apoi salvat
n variabila value.
#include "io8515.h"
char get_port(char mask); /*Prototipul funciei ASM */
void C_task main(void)
{
DDRB=0xFF
while(1) /* Bucl infinit*/
{
char value, temp;/*Declarare variabile locale
*/
temp = 0x0F;
value = get_port(temp); /* Apelul funciei
scrise in ASM */
if(value==0x01)
{
/* Se intr n if */
PORTB=~(PORTB); /* Neag valoarea din
PORTB */
}
}
}
Codul ASM ce va fi chemat n modulul C
Function
NAME get_port
#include "io8515.h"
PUBLIC get_port
RSEG CODE
get_port:
in R17, PIND
swap R16
; Interschimb valorile
rol R16
brcc ret0
ldi r16,0x01
ret
; Return
ret
; Return
END
12.3
ret
; Return
END
12.4
12.5
#include "io8515.h"
char max_val ;
void get_port(void) ; /* Prototipul funciei ASM */
void C_task main(void)
{
DDRB = 0xFF; /* Seteaz ca output port B */
while(1) /* Bucl infinit */
{
get_port(); /* Apeleaz funcia ASM */
}
}
NAME get_port
#include "io8515.h"
END
12.6
Acest exemplu seteaz pinii portului B astfel: pinii 0 i 1 pe high iar pinii 2 i 3 pe low i definete
porturile de la 4 la 7 ca input:
ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
ldir17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
out PORTB,r16
out DDRB,r17
; Apeleaz nop pentru sincronizare
nop
; Citete valorile din pini
in r16, PINB
unsigned char i;
...
PORTB
=
(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB
=
(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Apeleaz nop pentru sincronizare */
_NOP();
/* Citete valorile din pini */
i = PINB;
TIM16_ReadTCNT1:
; Salveaz flagul global de ntreruperi
in r18,SREG
; Dezactiveaz ntreruperile
cli
; Read TCNT1 into r17:r16
in r16,TCNT1L
in r17,TCNT1H
; Restaureaz flagul de ntreruperi
out SREG,r18
ret
Acest exemplu arat cum s iniializm SPI-ul ca master i cum s realizm o simpl transmisie:
SPI_MasterInit:
; Seteaz MOSI i SCK ca output, i restul ca input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
;Activeaz SPI, ca Master, seteaz clock rate ca fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
SPI_MasterTransmit:
; ncepe transmisia de date (r16)
out SPDR,r16
Wait_Transmit:
; Ateapt ca transmisia s fie complet
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
void SPI_MasterInit(void)
{
/* Seteaz MOSI i SCK ca output, i
restul ca input */
DDR_SPI
=
(1<<DD_MOSI)
|(1<<DD_SCK);
/* Activeaz SPI, ca Master, seteaz
clock rate ca fck/16 */
SPCR
=
(1<<SPE)|(1<<MSTR)
|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* ncepe transmisia de date */
SPDR = cData;
/* Ateapt ca transmisia sa fie
complet */
while(!(SPSR & (1<<SPIF)))
;
}
Acest exemplu arat cum s iniializm SPI-ul ca slave i cum s realizm o simpl recepie:
SPI_SlaveInit:
; Seteaz MISO ca output, i restul ca input
ldi r17,(1<<DD_MISO)
out DDR_SPI,r17
; Enable SPI
ldi r17,(1<<SPE)
void SPI_SlaveInit(void)
{
/* Seteaz MISO ca output,i restul ca
input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
187
SPCR = (1<<SPE);
out SPCR,r17
}
ret
SPI_SlaveReceive:
; Ateapt ca recepia s fie complet
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Citete valorile recepionate
in r16,SPDR
ret
char SPI_SlaveReceive(void)
{
/* Ateapt ca recepia s fie complet
*/
while(!(SPSR & (1<<SPIF)))
;
/* Citete valorile recepionate */
return SPDR;
}
188
ret
13
13.1
Microcontrolere AVR
CARACTERISTICI
13.2
FAMILIA AVR
190
191
(XCK) PB0
PB1
PB2
PB3
(SS) PB4
(MOSI) PB5
SPI
(MISO) PB6
(SCK) PB7
RESET
VCC
GND
XTAL2
XTAL1
(RXD) PD0
USART
(TXD) PD1
PD2
PD3
PD4
PD5
PD6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
PA0
PA1
PA2
PA3
PA4
PA5
PA6
PA7
AREF
GND
AVCC
PC7
PC6
PC5
PC4
PC3
PC2
PC1 (SDA)
PC0 (SCL)
PD7
TWI
Figura 13.1
VCC Sursa de alimentare
GND Masa
Portul A (PA7PA0)
Portul A este un port bidirecional de 8 bii programabil. Liniile portului A sunt
folosite i ca intrri analogice pentru convertorul A/D. Liniile portului pot fi conectate
opional la VCC prin rezistene de agare (pull-up resistor), selectate pentru fiecare
linie. Buffer-ele de ieire ale portului A au caracteristici de amplificare.
Portul B (PB7PB0)
Portul B este un port I/O de 8 bii bidirecional prevzut cu rezistene de agare
interne (opional). Buffer-ele de ieire ale portului B au caracteristici de amplificare.
Portul B ndeplinete de asemenea funcii speciale ale microcontrolerului ATmega16.
Portul C (PC7PC0)
Portul C este un port I/O de 8 bii bidirecional cu prevzut cu rezistene de
agare interne (opional). Buffer-ele de ieire ale portului C au caracteristici de
amplificare. Dac interfaa JTAG (de depanare) este activat, rezistenele pinilor
PC5(TDI), PC3(TMS) i PC2(TCK) vor fi activate, chiar dac are loc o resetare. Port-ul
C ndeplinete de asemenea funcii ale interfeei JTAG i alte funcii speciale ale
ATmega16.
Port D (PD7PD0)
192
Program
Counter
Status
and Control
Control
Lines
Indirect Addressing
Instruction
Register
Direct addressing
Instruction
Register
32 x 8
General
Purpose
Registers
Interrupt
Unit
SPI
Unit
Watchdog
Timer
ALU
Analog
Comparator
I/O Module 1
Data
SRAM
I/O Module 2
I/O Module n
EEPROM
I/O LINES
193
13.3
EXECUIA INSTRUCIUNILOR
T2
T3
T4
clkCPU
1st Instruction Fetch
1st Instruction Execute
2nd Instruction Fetch
2nd Instruction Execute
3rd Instruction Fetch
CPHA=0
194
T1
T2
T3
T4
clkCPU
Total Execution Time
Register Operands Fetch
ALU Operation Execute
Reset Write Back
T4
Figur 13.4 Operaii cu registre executate de ALU ntr-un singur ciclu de tact
Instruciunile care acceseaz memoria necesit doi cicli de tact pentru o operaie
dup cum se vede din Figura 13.5.
T1
T2
T3
clkCPU
Address
Complete Address
Address Valid
Write
Data
WR
Read
Data
RD
Memory Access Instruction
Next Instruction
13.4
Sursa
$000
Reset
2
3
4
5
6
$002
$004
$006
$008
$00A
EXT_INT0
EXT_INT1
TIM2_COMP
TIM2_OVF
TIM1_CAPT
7
8
9
10
11
$00C
$00E
$010
$012
$014
TIM1_COMPA
TIM1_COMPB
TIM1_OVF
TIM0_OVF
SPI_STC
12
13
14
15
$016
$018
$01A
$01C
UART_RXC
UART_DRE
UART_TXC
ADC
16
17
$01E
$020
EE_RDY
ANA_COMP
18
$022
TWI
19
$024
INT2
20
21
$026
$028
TIM0_COMP
SPM_RDY
Definirea ntreruperii
RESET-ul are cea mai mare prioritate. Vectorii de ntrerupere pot fi mutai la nceputul
seciunii Boot Flash prin setarea bitului IVSEL din registrul global de control al
ntreruperilor (GICR). Vectorul de RESET poate fi de asemenea mutat la nceputul
aceleiai seciuni prin programarea seciunii BOOTRST.
Cnd apare o ntrerupere bitul I din registrul de stare este resetat i toate
ntreruperile sunt invalidate. n cadrul subrutinei de tratare utilizatorul poate reactiva
sistemul de ntreruperi. Dac sistemul de ntreruperi este activat subrutina de tratare
poate fi la rndul ei ntrerupt de o sursa de ntrerupere cu prioritate mai mare. Bitul I
este automat setat cnd este executat instruciunea RETI.
ntreruperile externe pot fi controlate individual cu ajutorul registrului GIMSK
(adresa 3B n spaiul I/O). Fiecare bit din acest registru corespunde unei ntreruperi.
Bitul 7 controleaz INT1, iar bitul 6 controleaz INT0. Setarea bitului corespunztor
activeaz ntreruperea. Registrul GIMSK poate fi citit/scris cu instruciunile IN/OUT.
Starea ntreruperilor este indicat de registrul GIFR (adresa 3A n spaiul I/O). Dac o
ntrerupere extern a fost activat este setat bitul corespunztor din GIFR.
AVR are o structur complex a sistemului de ntreruperi. Aproape toate
dispozitivele periferice au fost dotate cu capaciti de ntrerupere, motiv pentru care
programul principal nu trebuie s verifice periodic starea acestor dispozitive.
Secvena de aciuni care se deruleaz cnd apare o ntrerupere este urmtoarea:
1.
2.
3.
4.
5.
6.
7.
13.5
MEMORIA
Memoria de program este de tip Flash i are o mrime de 256K. Este organizat
pe 16 bii (128K x 16) deoarece instruciunile se codific pe 2 sau 4 octei.
Nu se poate aduga memorie de program extern.
Din considerente de securitate software, spaiul memoriei de program este
mprit n 2 regiuni (Figura 13.6):
197
0
Application flash section
direct adresa efectiv este operandul instruciunii. Acest mod de adresare este
folosit de instruciunile JMP i CALL;
198
21
0
Adres
Memoria de program (FLASH)
21
PC
Exemplu:
farp:
2.
jmp farp
...
nop
0
Registrul Z
15
PC
Exemplu:
ijmp
3.
relativ adresa efectiv este suma dintre valoarea curent a registrului PC,
coninutul registrului Z i 1. Acest mod de adresare este folosit de instruciunile
RJMP i RCALL.
0
15
PC
11
0
Deplasament
Exemplu:
rjmp error
...
error: nop
199
15
0
Registrul Z
LSB
2.
0
Memoria de program (FLASH)
Registrul Z
LSB
SRAM
SRAM-ul este un tip de memorie foarte rapid i relativ scump, celula de baz
fiind construit din tranzistori.
ATmega2560 dispune de 8K de SRAM.
Spaiul din SRAM este organizat n mai multe regiuni (Error! Reference
source not found.):
200
32 Registers
0 1F
64 I/O Registers
20 5F
60 1FF
Internal SRAM
8192 x 8
200 21FF
External SRAM
0 64K x 8
2200 FFFF
1.
direct
Adres
SRAM
201
2.
indirect cu deplasament
15
0
Registrul Y, Z
+
5
SRAM
0
Deplasament
3.
indirect
15
Registrul X, Y, Z
SRAM
4.
indirect cu pre-decrementare
15
Registrul X, Y, Z
SRAM
-1
5.
indirect cu post-decrementare
15
Registrul X, Y, Z
-1
SRAM
+
202
EEPROM
13.6
POINTERI
Cunotine necesare:
limbajul C
structura i organizarea memoriei la ATmega2560
tipul de memorie n care este stocat obiectul referit SRAM, Flash, EEPROM,
etc deoarece, de regul, exist spaii de adresare separate;
natura obiectului referit (funcie sau variabil) acest aspect determin efectul
operatorului de indexare aplicat asupra pointerului.
Pentru declararea unui pointer de un anumit tip se vor folosi nite cuvinte cheie
specifice compilatorului (acestea nu fac parte din limbajul C standard) cu rol de
modificator al variabilei.
a) Pointeri la funcii
Pointerii la funcii pot avea o dimensiune de 2 sau 3 octei. Valoarea unui
pointer la funcie este adresa referit n octei mprit la 2, adic adresa exprimat n
cuvinte.
Cuvnt cheie
Spaiul de adresare
Dimensiunea
Tipul indexului
00x1FFFE
2 octei
signed int
__nearfunc
00x7FFFFE
3 octei
signed long
__farfunc
204
b) Pointeri la variabile
Pointerii la variabile pot avea o dimensiune de 1, 2 sau 3 octei.
Cuvnt
Spaiul de adresare
Dimensiunea Tipul
cheie
indexului
0x00xFF
1 octet
signed
__tiny
char
0x00xFFFF
2 octei
signed int
__near
0x00xFFFFFF
3 octei
signed int
__far
0x00xFFFFFF
3 octei
signed
__huge
long
0x00xFF
1 octet
signed
__tinyflash
char
0x00xFFFF
2 octei
signed int
__flash
0x00xFFFFFF
3 octei
signed int
__farflash
3 octei
signed
__hugeflash 0x00xFFFFFF
long
0x00xFF
1 octet
signed
__eeprom
char
0x00xFFFF
2 octei
signed int
__eeprom
Cel mai semnificativ bit 1-2 octei
signed int,
__generic
(MSB) indic tipul de
signed
memorie referit (1=Flash,
long
2=SRAM)
Tipul
memoriei
SRAM
SRAM
SRAM
SRAM
Flash
Flash
Flash
Flash
EEPROM
EEPROM
SRAM,
Flash
13.6.2 APLICAII
Enun
S se copie 6 octei din memoria de program de la adresa 0x0020 ntr-o
variabil definit n memoria de date i s se verifice dac operaia a fost fcut corect.
Rezolvare
Se va declara o variabil de tip pointer ctre o zon din memoria de cod
(variabila propriu-zis va fi stocat n memoria de date). Se va iniializa variabila de tip
pointer cu adresa primului octet ce trebuie de copiat. Acum, cei 6 octei se pot obine
derefereniind de 6 ori variabila de tip pointer adunat cu un offset corespunztor.
Verificarea se face comparnd coninutul memoriei din surs (0x0020) i
destinaie.
205
Codul surs
main.c
#include <inavr.h>
#include <iom16.h>
unsigned char destination[6];
#define SOURCE 0x0020
int main( void )
{
unsigned char __flash *ptr;
unsigned char i;
ptr = SOURCE;
for (i = 0; i < 6; i += 1)
{
destination[i] = *(ptr + i); // <=> destination[i] = ptr[i];
}
return 0;
}
206
14
14.1
ATMega16 I2C
INTRODUCERE N I2C
207
Vcc
Device 1
Device 2
Device 3
Device n
R
1
R
2
SDA
SCL
14.2
208
SDA
SCL
Data Stable
Data Stable
Data Change
SDA
SCL
START
STOP START
REPEATED START
STOP
209
Addr MSB
Addr LSB
RW
ACK
SDA
SCL
1
210
Data LSB
Data MSB
ACK
Aggregate
SDA
SDA from
Transmitter
SDA from
receiverR
SCL from
Master
1
SLA+R/W
7
Data
Byte
9
STOP, REPEATED
START or Next
Data Byte
211
SCL
Slew-rate
Control
SDA
Spike
Filter
Slew-rate
Control
Spike
Filter
Arbitration detection
Prescaler
Spike Suppresion
Address/Data Shift
Register (TWDR)
Ack
Control Unit
Address Register
(TWAR)
Status Register
(TWSR)
Address
Comparator
Control Register
(TWCR)
TWI Unit
14.3.1
Aceti pini au rolul de interfa ntre modulele TWI i cel MCU. Driverele de
output conin componente limitatoare pentru a respecta specificaiile TWI. Astfel,
semnalele cu durate mai mici de 50 de nanosecunde sunt eliminate de la nceput.
14.3.2
Acest modul controleaz perioada liniei SCL atunci cnd se opereaz n modul
master. Aceast perioad este controlat configurnd registrul TWBR i biii de
prescaler din registrul TWSR. Operaiile de tip slave nu depind de bit rate sau de
configurarea prescaler-ului, dar este necesar ca frecvena de clock a device-ului slave s
fie de cel puin 16 ori mai mare dect frecvena liniei SCL. Frecvena liniei SCL este
generat folosind relaia urmtoare:
n aceast relaie TWBR reprezint valoarea registrului TWI Bit Rate Register
iar TWPS valoarea biilor de prescale din registrul TWI Status Register.
212
14.3.3
14.4
14.4.1
Bit
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
TWBR
TWCR este utilizat pentru a controla operaiile din TWI. Acesta este folosit
pentru a activa TWI, pentru a iniia accesul la Master prin aplicarea unor condiii de
Start pe bus, pentru a genera condiiile de stop i pentru a stopa controlul bus-ului ct
timp datele ce trebuie scrise pe bus, sunt scrise n TWDR
Bit
TWIE
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
TWCR
TWS7
TWS6
TWS5
TWS4
TWS3
Read/Write
R/W
R/W
Valoare iniial
Bit
TWPS1 TWPS0
TWSR
Valoare prescaler
16
64
214
14.4.4
TWD7
TWD6
TWD5
TWD4
TWD3
TWD2
TWD1
TWD0
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
TWDR
TWA6
TWA5
TWA4
TWA3
TWA2
TWA1
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
Bit
TWA0 TWGCE
TWAR
14.5
PROBLEM REZOLVAT
215
Pentru a scrie pe bus-ul TWI se va utiliza funcia de mai jos. Aceasta scrie biii
de date n registrul TWDR, iar mai apoi ateapt terminarea transmisiei i citirea
statusului transmisiei din registrul TWSR.
void TWIWrite(uint8_t data)
{
TWDR = data;
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
}
uint8_t TWIGetStatus(void)
{
uint8_t status;
//citirea statusului prin mascare
status = TWSR & 0xF8;
return status;
}
Folosind modulele de mai sus se poate implementa funcia de scriere a
memoriei EEPROM:
uint8_t EEWriteByte(uint16_t addr, uint8_t data)
{
//startarea modulului TWI
TWIStart();
//verificarea strii acestuia
if (TWIGetStatus() != 0x08)
return -1; //eroare
//selectarea
adresei
device-ului
slave
trimiterea datelor
TWIWrite((uint8_t)(( addr & 0x0700)>>7));
//verificarea strii transmisiei
if (TWIGetStatus() != 0x18)
return -1; //eroare
//stoparea modulului TWI
TWIStop();
return 0; //succes
}
corespunztor
Similar, mai jos este implementat funcia de citire din memoria EEPROM:
uint8_t EEReadByte(uint16_t addr, uint8_t *data)
{
//startarea modului TWI
TWIStart();
if (TWIGetStatus() != 0x10)
return -1; //eroare
//selectarea nodului i citirea statusului
TWIWrite(((uint8_t)(( addr & 0x0700)>>7)));
if (TWIGetStatus() != 0x40)
return -1; //eroare
//citirea statusului confirmrii i a valorii recepionate
* data = TWIReadNACK();
if (TWIGetStatus() != 0x58)
216
return -1;
//stopare TWI
TWIStop();
return 0;
}
uint8_t TWIReadNACK(void)
{
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
return TWDR;
CARACTERISTICI
Rezoluie de 10 bii
Precizie absolut de 2 LSB
Timp de conversie ntre 13 260 s
16 canale de intrare nedifereniale multiplexate
14 canale de intrare difereniale
4 canale difereniale cu amplificare de 10x i 200x
Interval tensiune intrare ntre 0 i Vcc pentru modul nediferential
Interval tensiune intrare ntre 2.7 i Vcc pentru modul diferenial
Posibilitatea de a alege ntre 2.56V sau 1.1V ca tensiune referin
Moduri de conversie Free Running sau Single
Posibilitate de generare ntrerupere la sfritul conversiei AD
Posibilitate de a diminua zgomotul
FLAGURI DE
NTRERUPERE
ADPS0
ADPS1
ADPS2
ADIF
ADSC
ADATE
SELECIE
TRIGGER
ADC[9:0]
ADIF
15
MUX0
MUX1
MUX2
MUX3
MUX4
REFS0
ADLAR
REFS1
ADIE
ADTS[2:0]
AVCC
SELECIE AMPLIFICARE
SELECIE CANAL
DECODOR
PRESCALER
START
LOGICA CONVERSIEI
Referin
intern 2,56V
DAC 10 bii
AREF
+
COMPARATOR
GND
Referin lungime
de band(1,1 V)
ADC7
ADC6
ADC5
MUX
INTR.
POZ.
IEIRE
MULTIPLEXOR ADC
ADC4
ADC3
+
ADC2
AMPLIFICATOR
MUX
ADC1
ADC0
MUX
INTR.
NEG.
ADTS[2:0]
PRESCALER
START
ADATE
ADIF
SOURCE 1
CLK convertor
LOGICA
CONVERSIE
DETECIE
FRONT
SOURCE N
ADSC
Reset
START
PRESCALER 7 bii
Ck/128
Ck/64
Ck/32
Ck/16
Ck/8
Ck/4
Ck/2
CK
ADPS0
ADPS1
ADPS2
Sursa clock
convertor
Conversie curenta
Numar ciclu
11
12
Conversia viitoare
13
Clock ADC
ADSC
ADIF
Semnul si bitul,
MSB al rezultatului
ADCH
Bitul LSB al
rezultatului
ADCL
Conversia viitoare
Actualizare MUX si REFS
Esantionare si memorare
Condiie
Eantionare
& Timp
221
Prima conversie
Conversii
normale,
nediferentiale
Conversii autodeclansate
Conversii
normale,
difereniale
Memorare(Cicli de la Conversie(Cicli)
inceputul conversiei)
13.5
25
Tabel 4 Timpii
1.5
13
13.5
1.5/2.5
13/14
223
IIH
ADCn
1..100k
IIL
CS/H=14pF
VCC/2
PA3 (ADC3)
PA2 (ADC2)
PA1 (ADC1)
GND
4.
PA0 (ADC0)
3.
VCC
2.
PA4 (ADC4)
PA5 (ADC5)
PA6 (ADC6)
AREF
100H
PA7 (ADC7)
100nF
GND
AVCC
PC7
convertorului
Mod
ideal
Convertor real
Convertor ideal
Mod real
Tensiune
intrare
VREF
Offset
Eroare
castig
Convertor real
Mod real
Convertor ideal
Mod
ideal
Tensiune
intrare
VREF
15.1.11.1
Eroarea de amplificare
Eroare
castig
Convertor real
Mod real
Convertor ideal
Mod
ideal
Tensiune
intrare
VREF
Neliniaritatea integral
227
Cod
Iesire
0x3FF
Convertor real
Convertor ideal
1 LSB
DNL
0x01
Tensiune
intrare
0x00
VREF
Neliniaritatea diferenial
ADC
VIN *1024
VREF
unde Vin este tensiunea de pe pinul de intrare i VREF tensiunea de referin aleas.
Dac sunt folosite canalele difereniale, rezultatul este:
ADC
unde VIN este tensiunea pe pinul de intrare pozitiv i VNEG tensiunea de pe pinul negativ,
iar VREF tensiunea de referin aleas. Rezultatul este pstrat n complement fa de 2,
de la 0x200 (-512d) pn la 0x1FF (+511d). De meninut este faptul c dac utilizatorul
vrea s verifice polaritatea rezultatului, este suficient ca bitul MSB s fie citit (ADC9
din ADCH). Dac bitul este 1, atunci rezultatul este negativ, n caz contrar este pozitiv.
228
Cod
iesire
0x1FF
0x00
-VREF
`
0x3FF
VREF
Tensiune de
intrare
diferentiala
0x200
VADCn
VADCm+ VREF/GAIN
VADCm+
0.999VREF/GAIN
VADCm+ 0.998VREF/GAIN
Cod
citit
0x1FF
Valoare decimal
corespunztoare
511
0x1FF
511
0x1FE
510
...
VADCm+ 0.001VREF/GAIN
...
0x001
1
229
VADCm
VADCm- 0.001VREF/GAIN
0x000
0x3FF
0
-1
...
...
VADCm- 0.999VREF/GAIN
VADCm- VREF/GAIN
0x201
0x200
-511
-512
Bit
MUX3
MUX2
MUX1
MUX0
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
ADMUX
REFS
1
0
REFS
0
0
230
Intrare
Single
MUX[4:0] Ended
00000
ADC0
00001
ADC1
00010
ADC2
00011
ADC3
00100
ADC4
00101
ADC5
00110
ADC6
00111
ADC7
01000
01001
01010
01011
01100
01101
01110
01111
N/A
10000
10001
10010
10011
10100
10101
10110
Intrare
Diferenial
Pozitiv
Intrare
Diferenial
Pozitiv
Ampl.
N/A
ADC0
ADC1
ADC0
ADC1
ADC2
ADC3
ADC2
ADC3
ADC0
ADC1
ADC2
ADC3
ADC4
ADC5
ADC6
ADC0
ADC0
ADC0
ADC0
ADC2
ADC2
ADC2
ADC2
ADC1
ADC1
ADC1
ADC1
ADC1
ADC1
ADC1
10x
10x
200x
200x
10x
10x
200x
200x
1x
1x
1x
1x
1x
1x
1x
231
10111
11000
11001
11010
11011
11100
11101
11110
11111
ADC7
ADC0
ADC1
ADC2
ADC3
ADC4
ADC5
1.22V
(VBG)
0 V (GND)
ADC1
ADC2
ADC2
ADC2
ADC2
ADC2
ADC2
1x
1x
1x
1x
1x
1x
1x
N/A
15.1.14.2
Bit
ADSC ADATE
ADIF
ADIE
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
ADCSRA
ADPS2
0
0
0
0
1
1
1
1
ADPS1
0
0
1
1
0
0
1
1
ADPS0
0
1
0
1
0
1
0
1
Factor divizare
2
2
4
8
16
32
64
128
15.1.14.3
ADLAR = 0
Bit
Read/Write
Valoare iniial
15
14
13
12
11
10
ADC9
ADC8
ADCH
ADC7
ADC6
ADC5
ADC4
ADC3
ADC2
ADC1
ADC0
ADCL
ADLAR = 1
233
Bit
15
14
13
12
11
10
ADC9
ADC8
ADC7
ADC6
ADC5
ADC4
ADC3
ADC2
ADCH
ADC1
ADC0
ADCL
Read/Write
Valoare iniial
Cnd conversia este complet, rezultatul este stocat n aceste registre. Dac
sunt utilizate canalele difereniale, rezultatul este prezent sub complement fa de 2.
Cnd registrul ADCL este citit, registrul de date nu este actualizat pn ce nu
are loc citirea registrului ADCH. Dac rezultatul este aliniat la stnga i nu este
necesar o precizie mai mare de 8 bii, este suficient numai citirea registrului ADCH.
n caz contrar registrul ADCL trebuie citit mai nti, apoi registrul ADCH.
15.1.14.4
Bit
ACME
PUD
PSR2
PSR10
Read/Write
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
Valoare iniial
SFIOR
0
0
1
1
1
1
1
1
0
0
1
1
0
1
0
1
0
1
235