Sie sind auf Seite 1von 102

MICROCONTROLERE

AVR
APLICATIE- Preluarea datelor de la un
traductor optic de deplasare
A 0 1 1 0 0 1 1 0 0 1
B 0 0 1 1 0 0 1 1 0 0

00 : A=1 increment numarator


00 : B=1 decrement numarator
01 : A=1 increment decrement
01 : B=0 increment numarator
10 : A=0 decrement numarator
10 : B=1 increment numarator
11 : A=0 increment numarator
11 : B=0 decrement numarator
Schema citire traductor de deplasare
A+

A-

Traductor
deplasare B+

B-

TRIG2

U2
U1
13 12
RxD 8 R1IN R1OUT 9 2 12
R2IN R2OUT 3 PD0/RXD PB0/AIN0 13
14 11 6 PD1/TXD PB1/AIN1 14
TxD 7 T1OUT T1IN 10 7 PD2/INT0 PB2/OC0A 15
T2OUT T2IN 8 PD3/INT1 PB3/OC1A 16
1 9 PD4/T0 PB4/OC1B 17
3 C1+ 11 PD5/T1 PB5/MOSI 18
C1- PD6/ICP PB6/MISO
+ C3 4 19
2u2 5 C2+ Y1 5 PB7/SCK
2 C2- 4 XTAL1
6 V+ XTAL2
V- 1
RESET
+ C4 4MHz
2u2 MAX232 C1C2 Vcc 20
3333 VCC
C9
ATtiny 2313
100n
+ C5 + C6
2u2
2u2 GND GND
U1

Generator semnal 2
3
6
PD0/RXD
PD1/TXD
PB0/AIN0
PB1/AIN1
12
13
14
10k

7 PD2/INT0 PB2/OC0A 15

sinusoidal
8 PD3/INT1 PB3/OC1A 16
9 PD4/T0 PB4/OC1B 17
11 PD5/T1 PB5/MOSI 18 33n
PD6/ICP PB6/MISO 19
5 PB7/SCK
#include <tiny2313.h> XTAL1 GND
4
XTAL2
char valsin[100]= 1
RESET

{ 20
VCC

0x80,0x88,0x90,0x98,0xA0,0xA7,0xAF,0xB6, ATtiny 2313

0xBE,0xC4,0xCB,0xD1,0xD7,0xDD,0xE2,0xE7, char i,j=25;


0xEB,0xEF,0xF3,0xF6,0xF9,0xFB,0xFD,0xFE, // Timer1 output compare A interrupt service routine
0xFF,0xFF,0xFF,0xFE,0xFD,0xFB,0xF9,0xF6, interrupt [TIM1_COMPA] void
0xF3,0xEF,0xEB,0xE7,0xE2,0xDD,0xD7,0xD1, timer1_compa_isr(void)
0xCB,0xC4,0xBD,0xB6,0xAF,0xA7,0xA0,0x98, { OCR0A=valsin[i];
0x90,0x88, OCR0B=valsin[j];
0x80,0x78,0x70,0x68,0x60,0x59,0x51,0x4A, i++;
0x43,0x3C,0x35,0x2F,0x29,0x23,0x1E,0x19, j++;
0x15,0x11,0x0D,0x0A,0x07,0x05,0x03,0x02,
if(i==100)
{PORTB.3=1;
0x01,0x01,0x01,0x02,0x03,0x05,0x07,0x0A,
i=0;
0x0D,0x11,0x15,0x19,0x1E,0x23,0x29,0x2F,
PORTB.3=0; }
0x35,0x3C,0x43,0x4A,0x51,0x59,0x60,0x68,
if(j==100)
0x70,0x78 j=0; }
};
char aux1,aux2;
int poz;

// External Interrupt 0 service routine


interrupt [EXT_INT0] void ext_int0_isr(void)
{aux1=PIND;
aux2=aux1;
if((aux1&0x08)^((aux2&0x04)<<1))
poz++;
else
poz--;}

// External Interrupt 1 service routine


interrupt [EXT_INT1] void ext_int1_isr(void)
{aux1=PIND;
aux2=aux1;
if((aux1&0x08)^((aux2&0x04)<<1))
poz--;
else
poz++;}
Tipuri de microcontrolere
• Istoric
– Primul microcontroler din seria `51 a fost I8048 (gestioneaza tastatura in calculatoerele PC)

• Numar de biti:
– 8, 16 sau 32
• Categorii:
1. Microcontrolere CISC (Set complex de instructiuni)
• Seria `51: I8048, 8035, 8031, 80C52, AT80F51, AT80F52, 83C053, SAB80C515,
SAB80C535, SAB80C537, 83C5183C550, , 83C562, 80C552, 87C51, 87C750, 87C751,
87C752, S87C752, AT87LPC762, P89C51, P89C52, AT89C1051, AT89C2051,
AT89C4051, AT89C51, P89C58, AT89LV51, AT89C52, AT89C53, AT89C55, AT89S53,
AT89S8252 etc.
• Motorola: MC6801, MC68C11, MC68H705, MC68C711 etc
• SGS: ST62T01, ST62T10, ST62T15, ST62T20, ST62T40, ST62T65, ST72C104,
ST72C215, ST72C254, ST72C334N2T6 etc.

2. Microcontrolere RISC (set redus de instructiuni)


• AVR: AT90S1200, AT90S2313, AT2343, AT902333, AT90S4433, AT90S4414/ 8515,
AT90S8535, AT90C8534, Attiny10/11/12, AT tiny22/22L, AT mega103, AT mega 603, AT
mega 161 etc
• PICmicro: PIC12C508, PIC12C509, PIC12CE519, PIC12C672, PIC12CE674, PIC16C54,
PIC16C55, PIC16C56, PIC16C57, PIC16C715, PIC16F74, PIC16F84, PIC17C44 etc.
• TexasInstruments: MPS430

• Definitie:
– Un calculator intr-un singur cip.
Exemple de microcontrolere AVR
(ATmega 8 si respectiv ATtyni2313)
Exemple de µC seria `51 (I8052)
Exemple de microcontrolere PIC
(PIC16F690)
Exemplu de uC Motorola (MC68HC11)
Exemple de uC Texas Instruments
Componente ale structurii interne
• oscilatorul;
• memoria program (PM);
• numărătorul de instrucţiuni (PC);
• registrul de instrucţiuni;
• decodorul de instrucţiuni;
• Acumulatorul, regiştrii de uz general si speciali;
• regiştrii de comandă;
• memoria EEPROM;
• memoria RAM;
• unitatea aritmetică şi logică (ALU);
• unitatea de întreruperi;
• blocul de numărătoare;
• watchdog-ul;
• interfaţa serie UART;
• interfaţa serie SPI;
• Interfata I2C
• interfata USB;
• comparatorul analogic;
• convertorul analog numeric etc.
OSCILATORUL INTERN
• Toate tipurile de microcontroler au implementat in structura
interna un oscilator.
• RC (intern sau extern),
• cu cristal de cuart
• cu rezonator ceramic.
• Pentru realizarea schemei, cu componente externe, pentru
conectare sunt disponibili 2 pini XTAL1 (intrare) si XTAL2
(iesire).
• Ca semnal de ceas pentru microcontrolere poate fi folosit si
un semnal extern aplicat la intrarea XTAL1.
•Exista al doilea oscilator pentru RTC (32768Hz)
Memoria

• Memoria microcontrolerelor AVR se


compune din:
1. Memoria program (FLASH)
2. Memoria RAM - compusa din:
• Registrii de uz general (R0-R31)
• Memoria I/O (registrii de configurare microcontroler)
• Memoria RAM interna
• Memoria RAM externa (doar pentru unele µC)
3. Memoria EEPROM
Memoria program (FLASH)
• Capacitatea memoriei microcontrolerelor AVR
este cuprinsa intre 2k si 64kocteti.
• Memoria program este o memorie FLASH ce
poate fi scrisa locatie cu locatie, stergerea
facandu-se pe cate un bloc.
• Poate fi scrisa si stearsa de 10000 ori.
• Este organizata pe cuvante (16 biti), majoritatea
instructiunilor ocupand 2 octeti (1 cuvant).
• Exista microcontrolere AVR cu FLASH pe 22 biti
• Unele microcontrolere au incarcare automata
(reactualizare) a programului de aplicatie (boot).
Harta
memoriei
program
Registrii de lucru
• Microcontrolerele AVR au 32 de registrii de uz general,
avand functia de acumulator
• Proprietatitile acestori registrii (R0… R31) nu sunt
uniforme astfel:
– Doar registrii R16-R31 pot fi accesati cu instructiunile
ce contin un operand (LDI, ANDI,ORI, CBR, SBR,
SER, CPI)
– Doar perechile de registrii R24-R24,R26-R27,R28-
R29 si R30-R31 pot fi operanzi la ADIW si SBIW
• Registrii folositi ca registrii index (pointeri): X (R26-R27),
Y (R28-R29) si Z (R30-R31). Citirea memoriei program
se face in registruul R0 utilizand registrul index Z.
• Registrii de lucru pot fi accesati si ca memorie RAM in
spatiul de adresa 0x0000-0x001F
Memoria I/O sau Registrii I/O
• Spatiul de memorie I/O pentru µC AVR este de 64 locatii.
Pentru microcontrolerele din noua generatie este extins
pana la 224.
• Alocarea spatiului de memorie I/O pentru diferite tipuri de
µC este specifica fiecarui tip.
• Spatiul de meorie este cuprins intre 0x0020 si 0x005F daca
consideram ca memoria I/O face parte din spatiul de
memorie RAM
• Cateva locatii din memoria I/O au aceleasi alocari indiferent
de tipul de µC (SREG-0x5F, SPL-0x5E…)
• Doar primele 32 de locatii pot fi accesati pentru modificare
pe bit cu instructiunile SBI si CBI.
• Spatiul de 64 de locatii poate fi citit sau scris cu
instructiunilee IN si OUT, restul locatiilor pana la 244 pot fi
accesate doar cu instructiunile cu adresare directa sau
indirecta LD(LDD), LDS, ST(STD) si STS.
Registrii I/O pentru microcontrolerul ATmega8
Registrii I/O pentru microcontrolerul ATmega8
Memoria RAM interna

• Memoria RAM a µC AVR are o capacitate


cuprinsa intre 128 octeti (ATtiny2313) si 2K
(ATmega328)
• In aceasta memorie trebuie fixata stiva si sunt
stocate variabilele program
• Adresa de start a memoriei RAM este 0x0060
pentru majoritatea µC AVR si 0x0100 pentru
microcontrolerele cu structura complexa (µC ce
au spatiul I/O extins la 244 de locatii.
• Instructiunile ce adreseaza memoria RAM sunt
PUSH, POP, LD(LDD), LDS, ST(STD) si STS.
Memoria RAM externa

• Memoria RAM a µC AVR are o capacitate de


pana la 64K
• Numai o parte dintre microcontrolerele AVR pot
accesa o memorie RAM externa (AT90S8515,
ATmega 64)
• Adresa de start a memoriei RAM externe este
dupa ultima adresa de start a memoriei RAM
interne.
• Instructiunile ce adreseaza memoria RAM
externa sunt LD (LDD), STS, LDS si ST (STD).
Schema cu
memorie
externa
Harta memoriei de date (RAM)
Harta memoriei
pentru microcontrolerul ATmega328
Memoria EEPROM

• Memoria EEPROM a µC AVR are o


capacitate cuprinsa intre 128 octeti si 2K
• Memoria EEPROM poate fi scrisa si stearsa
de 100000 de ori
• Scrierea si citirea memoriei EEPROM se
face locatie cu locatie
• Accesarea memoriei EEPROM se face prin:
– EEAR (EEARL si EEARH),
– EEDR
– EECR
Registrii pentru memoria EEPROM
Scrierea memoriei EEPROM
• Pentru scrierea datelor în EEPROM trebuie parcurse următoarele etape:
1. Aşteptarea până ce bitul EEWE este zero (s-a terminat scrierea
precedentă);
2. Scrierea în registrul EEAR a adresei locaţiei ce urmează a fi înscrisă
(opţional);
3. Scrierea în registrul EEDR a datelor ce trebuie memorate (opţional);
4. Setarea în 1 logic a bitului EEMWE din registrul de comandă EECR;
5. Setarea în 1 logic a bitului EEWE. Bitul EEWE trebuie setat în
maxim 4 cicluri de ceas după setarea bitului EEMWE pentru a valida
scrierea datelor în memoria EEPROM.
• Durata de scriere a unei locaţii din memoria EEPROM este de 2,5
milisecunde la 5V sau de 4 milisecunde la 2,7V. Bitul EEWE este şters
(trecut în 0 logic) hard. Softul de aplicaţie poate testa acest bit pentru a
detecta momentul în care se poate iniţia o nouă scriere în memoria
EEPROM. Când EEWE este setat în unu microcontrolerul intră în starea de
halt pentru două perioade de ceas înainte de executarea instrucţiunii
următoare.
• Atenţie! O întrerupere între paşii 4 şi 5 va bloca generarea ciclului de scriere
deoarece bitul EEMWE este şters automat după 4 cicluri de ceas (time out).
Înainte de paşii 4 şi 5 este indicată dezactivarea întreruperilor (ştergerea
bitului de validare a întreruperilor I din registrul de stare SREG).
Porturile de intrare-iesire

• Porturile de intrare-iesire (I/O) fac posibila legatura


intre microcontroler si aplicatia externa.
• Numarul de intrari-iesiri pentru un microcontroler
este cuprins in majoritatea cazurilor intre 3 si 48.
• Majoritatea pinilor de port pot fi programati fie ca
intrare fie ca iesire.
• Programarea se realizeaza prin intermediul unui
registru special, pentru fiecare port, functie de tipul
de microcontroler.
Cum se programeaza
porturile I/O pentru cateva
tipuri reprezentative de
microcontrolere?

• 8051 ?
• PIC?
• AVR?
Modul de programare a porturilor I/O
• Programarea porturilor I/O se face cu ajutorul
registrilor de functii.
• Microcontrolerele
– din seria ‘51 au un singur registru pentru
setarea fiecarui port,
– PIC au 2 registrii: TRISx (1 – intrare, 0 – iesire), PORTX
– AVR au 3 registrii: DDRX, PORTX, PINX
• Capabilitate in curent: PIC - ±25mA, AVR - ±20mA

• Existenta unui singur registru pentru programarea unui


port limiteaza caracteristicile portului
Microcontrolerele AVR
• Programarea porturilor pentru microcontrolerele
AVR se face prin intermediul a 3 registrii si
anume DDRx, PORTx si PINx.
• Registrul DDRx seteaza sensul de transfer al
informatiei: intrare respectiv iesire (0 pentru
intrare si 1 pentru iesire).
• Prin registrul PORTx se stabileste valoarea 0
sau 1 daca pinul este iesire si inalta impedanta
sau rezistenta conectata la Vcc daca pinul este
setat intrare
• Prin registrul PINx se citeste starea logica a
pinilor de microcontroler
• Capabilitatea in curent este de +/-20mA.
Structura unui bit de port I/O fără
funcţii auxiliare-microcontrolere AVR
Registri de control porturi AVR
Numeregistru ADRESA ATtyni2313 ATmega8 AT908515
PORTA $1B 3 - 8
DDRA $1A 3 - 8
PINA $19 3 - 8
PORTB $18 8 8 8
DDRB $17 8 8 8
BPINB $16 8 8 8
PORTC $15 - 7 8
DDRC $14 - 7 8
PINC $13 - 7 8
PORTD $12 7 8 8
DDRD $11 7 8 8
PIND $10 7 8 8
Semnificatia datelor referitoare la
registrii DDRx si PORTx
• Stările programabile pentru portul x pinul y
DDRx.y PORTx.y Rezistenta la COMENTARIU
Vcc
0 0 Nu Impedanţă ridicată (Hi Z)
0 1 Da 1 logic –generează curent
1 0 Nu 0 logic – absoarbe curent Stare
1 1 Nu 1 logic –generează curent

Mentionam ca, pentru majoritatea microcontrolelelor intrate in productie


recent, exista bitul PUD din registrul SFIOR (Special function IO Register)
prin care pot fi dezactivate toate rezistentele de pull-up pentru toate porturile
setate ca intrare cu rezistenta la Vcc
Programati portul PORTB pentru schema urmatoare
U1
470 VCC
2 12 LED1
3 PD0/RXD PB0/AIN0 13 470
6 PD1/TXD PB1/AIN1 14 LED2
7 PD2/INT0 PB2 15 470
8 PD3/INT1 PB3/OC1 16 LED3
9 PD4/T0 PB4 17 470
11 PD5/T1 PB5/MOSI 18 LED4
PD6/ICP PB6/MISO 19 470
5 PB7/SCK LED5
4 XTAL1 470
XTAL2 LED6
1 470
RESET LED7
20 470
VCC LED8

AT90S2313

LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8


Varianta 1 on on off off on on off off
Varianta 2 on off off on on off off on
Varianta 3 on off on off on off on off
Varianta 4 on on on off off off on off
Varianta 5 off off on on off off on on
Varianta 6 off on on off off on on off
Varianta 7 off off off off on on on on
Varianta 8 on off off off on on on off
Exemple de programare
• LDI R16,$ff
• OUT DDRB,R16
• LDI R16,$0F
• OUT PORTB,R16

• Pentru secventa de mai sus care sunt


ledurile aplinse (luati in calcul schema
precedenta)
Tema 1: Programati porturile I/O pentru
urmatoarea schema electrica
Obs. considerati ledurile aprinse, releul anclansat,
iar afisorul cu 7 segmenta va indica cifra 5
RESETUL
Toate microcontroler AVR au implementat mai multe surse
pentru generarea resetului.
Reset la alimentare (POR)
Reset extern la cerere (EXTR)
Reset generat de caderea tensiunii de alimentare sub o valoare (BOR)
Reset generat de WATCHDOG (WDR)

Prin testarea semaforului corespunzator registrului MCUCSR


din memoria IO poate fi identificata sursa ce a generat resetul.

Dupa reset se executa instructiunea de la adresa 0x0000.

De obicei prima instructiune este o instructiune de salt RJMP


sau JMP

Pentru memorie program mai mare de 16k sunt rezervate 2


cuvinte pentru vectorii de reset si intrerupere
INTRERUPERILE
• Toate microcontrolerele AVR au mai multe surse de
intrerupere
– INT0 – întrerupere generată de intrarea externă 0.
– INT1 – întrerupere generată de intrarea externă 1.
– T0_OVF – întrerupere generată de numărătorul 0 la depăşire.
– T1_OVF – întrerupere generată de numărătorul 1 la depăşire.
– T1_CPA – întrerupere generată de numărătorul 1 pentru comparare (A).
– T1_CPB – întrerupere generată de numărătorul 1 pentru comparare (B).
– T1_CAP – întrerupere generată de numărătorul 1 pentru captură.
– T2_OVF – întrerupere generată de numărătorul 2 la depăşire
– T2_CPA – întrerupere generată de numărătorul 2 pentru comparare.
– SPI_STC – întrerupere generată de interfaţa serie SPI
– U_RX – întrerupere generată de interfaţa UART la recepţie caracter.
– U_UDRE – întrerupere generată de UAR pentru buffer de transmisie gol.
– U_TX – întrerupere generată de interfaţa UART pentru transmisie gata.
– ADC – întrerupere generată de convertorul analog numeric.
– EE_RDY – întrerupere generată de terminarea scrierii memoriei
EEPROM.
– ACOM – întrerupere generată de comparatorul analogic.
Numar total de intreruperi si surse
de reset pentru cateva µC AVR

Micro-controler Nr. Intreruperi Intreruperi Surse reset Nr. Biti reg.


externe MCUSR
AT90S4414 13 2 3 -

AT90S8515 13 2 3 -

AT90S/L4434 17 2 3 2

AT90S/L8535 17 2 3 2

ATtiny2313 18 2 4 8

ATmega8 18 2 4 8

ATmega16 20 3 5 8

ATmega328 28 2 4 8

ATmega64 30 8 5 8

Pentru microcontrolerele ATmega328 si ATmega64 programarea


intreruperilor externe se face cu registrii EICRA si respectiv EICRB
Validare si servire intreruperi
• Validarea intreruperilor se face prin bitul I din registrul
general de stare SREG
• Fiecare intrerupere are un bit individual de validare ce
trebuie setat pentru activare
• Daca bitul I si bitul individual de validare sunt setate si
sunt indeplinite conditiile de intrerupere, atunci executia
programului curent este intrerupta si se executa
subrutina de intrerupere specifica intreruperii respective.
• Subrutinele de intrerupere sunt incheiate cu
instructiunea RETI, dupa care se continua executia
programului curent din punctul unde s-a intrerupt.
• La executia unei subrutine de intrerupere in stiva este
salvata doar adresa unde s-a intrerupt programul
principal. In corpul sbrutinei trebuind salvat registrul
SREG si refacut inainte de executia instructiunii RETI
pentru evitarea erorilor datorate modificarii lui SREG.
Subrutinele de intreruperi
• La executia unei subrutine de intreruperi bitul I
din registrul SREG este sters deci alta
intrerupere nu mai poate fi servita pana la
terminarea executiei subrutinei curente.
• O alta intrerupere poate fi validata daca este
setat bitul I din SREG inainte de terminarea
executiei subrutinei de intrerupere curenta
• Vectorii de intrerupere sunt plasati imediat dupa
vectorul de reset.
• Microcontrolerele cu memorie program sub 32k
au alocat pentru vectorul de reset un cuvant iar
cele cu memorie mai mare sau egala cu 32K au
alocat 2 cuvunte.
ATtiny2313
ATtiny4313
Intreruperile externe
• Microcontrolerele AVR au intre una si 8 intreruperi
externe
• Aceste intreruperi sunt validate prin registrul EIMSK si
sunt semnalizate prin registrul EIFR
• Unele microcontrolere genereaza intreruperi si la
modificarea starii logice pentru o parte dintre pinii de
intrare.
• Se poate seta care dintre pini poate genera intreruperi.
De asemenea intreruperile pot mascate .
• Intreruperile externe pot fi programate sa actioneze pe
front crescator, pe front descrescator sau pe nivel (zero
logic).
• Intreruperile pe nivel nu activeaza semaforii de
intrerupere.
• Generarea intreruperilor externe pentru majoritatea
microcontrolerelor AVR se face pe nivel, pe font
crescator, pe front descrescator sau la schimbare stare.
• Pentru unele microcontrolere AVR (seria AT90) starea
01 este rezervata (nu pot fi generate intreruperi la
schimbare stare logica pe intrarile INT0 sau INT1)

ICSx1 ICSx0 Descriere


0 0 Generare întrerupere pe nivel 0 logic (INTx)
0 1 Generare intrerupere la schimbare stare (INTx)
1 0 Generare întrerupere pe front căzător (INTx)
1 1 Generare întrerupere pe front crescător (INTx)
• Atentie!.
1. Daca se activeaza intreruperile pe nivel ele
pot bloca microcontrolerul daca nu sunt
gestionate corect (sunt active tot timpul cand
sunt indeplinite conditiile de generare, astfel
incat microcontrolerul executa in
permanenta subrutina de intrerupere).
2. La intrarea in subrutinele de intrerupere se
salveaza registrul SREG, iar la revenire
caesta este refacut cu informatia din
momentul servirii intreruperii
Intreruperile generate de numaratoere
NUMARATOARELE
• Toate microcontroler AVR au implementat doua pana la
patru numaratoare de 8 sau 16 biti.
–TCN0 – 8 biti
–TCN1 – 16 biti
–TCN2 – 8 biti
–TCN3 – 16 biti
• Fiecare numarator are un circuit de prescalare prin care
frecventa de ceas este divizata cu 1, 8, 64, 256 si 1024.
• Numaratoarele pot genera una sau mai multe intreruperi
–Intrerupere la depasire
–Intrerupere la comparare
–Intrerupere la captura.
• O parte din numaratoare pot fi setate ca modulator PWM.
• De asemena numaratoarele pot fi configurate sa genereze
un semnal de iesire si pot avea ca intrare un semnal extern.
Numaratorul 0 (TCN0)
• Acest numarator este pe 8 biti si in majoritatea
cazurilor este setat cu ajutorul registrului TCCR0

• In principal genereaza intrerupere la depasire (si


comparare) iar ca intrare pot fi selectate
urmatoarele surse: CK, CK/8, CK/64, CK/256,
CK/1024, semnal extern front pozitiv, semnal
extern front negativ.
• Exista microcontrolere AVR la care pentru
TCNT0 sunt implementate si alte functii.
Selectie semnal de intrare TCN0
Numaratorul T0 cu functii de comparare
• Genereaza 2 / 3 intreruperi
– Depasire
– Comparare / comparare A si B
• 2 registrii de control: TCCR0A si TCCR0B
TCN1
• Acest numarator este pe 16 biti si in
majoritatea cazurilor este setat cu ajutorul
registrilor TCCR1A si TCCR1B
• In principal genereaza intrerupere la depasire,
comparare (doua A si B) si captura.
• Pot fi selectate urmatoarele surse de intrare: CK,
CK/8, CK/64, CK/256, CK/1024, semnal extern
front negativ, semnal extern front pozitiv
• Poate fi setat ca modulator PWM pe 8, 9, 10 biti
sau programabil prin setarea valorii maxime de
numararein registrul OCR1a sau ICR1.
• Cu ajutorul acestui numarator se pot realiza
divizari foarte precise a frecventei semnalului de
intrare datorita modului de resetare automata
numarator la atingerea unei valori programate.
Setare TCN1

Atentie! Daca COM1x1|COM1x0=1 iesirea OC1x este comandata


de compararea OC1X cu TCNT1 si nu desetarile din PORTB.
Numarare cu aducere la zero
Generare PWM (o singura panta de
numarare)
Generare PWM (faza corecta si doua pante
de numarare)
Generare PWM (faza si frecventa corecta cu
doua pante de numarare)
Generare frecvente
Registri intreruperi numaratoare
• Registru mascare intreruperi numaratoare -
TIMSK

• Registru semafori intreruperi numaratoare-TIFR


Registri intreruperi numaratoare ATtiny2313
TCN2
• Acest numarator este pe 8 biti si in
majoritatea cazurilor este setat cu ajutorul
registrului TCCR2

• In principal genereaza intrerupere la


depasire si comparare iar ca intrare pot fi
selectate urmatoarele surse: CK, CK/8,
CK/32, CK/64, CK/128, CK/256 siCK/1024
•Cu ajutorul bitilor COM21 si COM20 se activeaza iesire
OC2 (output commpare) ca si in cazul TCN1
•TCN2 poate lucra si in modul asincron avand o ca
semnal de cloc o frecventa joasa (32768Hz)
•Bitul FOC2 are rolul de a forta functionarea numaratorului
ca si in cazul in care ar avea loc o comparare normala
•Selectarea modurilor de lucru se face cu bitii WGM20 si
WGM21 conform tabelului de mai jos
• Majoritatea microcontroler AVR au implementat
una pana la doua interfete UART (USART) o
interfata SPI si o interfata I2C (sau compatibila TWI).
• O parte din tipurile noi de microcontrolere au
implementata o interfata USB sau o interfata CAN .
• In cele mai multe cazuri interfata SPI se foloseste
si pentru inscrierea programelor de aplicatie in
memoria program (FLASH).
• Interfetele de comunicatie serie pot servi ca suport
pentru reactualizarea programelor de aplicatie
(BOOTLOADER).
INTERFATA UART
• Interfata UART este o interfata de
comunicare serie, full-duplex
• In principu vitezele de comunicare pot fi
cuprinse intre 600 si 19200 Baud.
Standard exista viteze sub 600 si peste
19200.
• Pentru transferarea unui octet (8 biti de
date) sunt transmise, suplimentar, un bit
de start, cel putin un bit de stop si optional
un bit de paritate.
• O secventa transmisa pe interfata UART
incepe cu bitul de START, 8 biti de date
(bitul 0 se transmite primul) si 1 sau 2 biti
de STOP.
• Transmisia se poate face si pe 9 biti (un
bit suplimentar de date – de obicei bit de
paritate)
• Vitezele de comunicatie standard sunt:
150, 300, 600, 1200, 2400, 4800, 9600,
19200, 38400, 57600, 115200 baud.
Registrii pentru comunicatia serie
• Pentru comunicatia serie µC are implementat in
spatiul I/O urmatorii registrii: UDR, USCRA,
UCSRB, UCSRC, UBRR, UBRRH.
• UDR este registrul dublu pentru date. Datele
receptionate pe interfata serie sunt memorate in
registrul UDR de unde pot fi citite cu
instructiunea IN sau LD (LDD). Daca subt scrise
date in registrul UDR acestea sunt transferate in
registrul de serializare si sunt transmise imediat.
• Prin registrii UDRA, UDRB si UDRC se
programeaza modul de lucru al intefetei serie.
• UCSRA semnalizeaza starea interfetei UART.
– RXC - receptie completa caracter
– TXC - transmisie completa caracter (inclusiv bitul de STOP)
– UDRE - bufer de transmisie gol.
• In caz de eroare sunt setati bitii
– FE (eroare transmisie date - framing error)
– DOR (suprareceptie)
– PE (eroare de paritate)
• Dublarea vitezei de comunicatie pentru U2X=1
• MPCM - comunicatie multiprocesor.
• UCSRB este setat modul de lucru al interfetei
– RXEN - este validata receptia respectic
– TXEN - este validata transmisia de date.
Putem valida, fie receptia, fie transmisia, fie ambele in functie de aplicatie
– RXCIE este validata intreruperea la receptie caracter
– TXCIE - validate intreruperile la transmisie completa
– UDRIE – validata intreruperea pentru bufer de transmisie gol.
• UCSZ2 seteaza transmisia pe 9 biti,
• RXB8 - bitul suplimentar receptionat
• TXB8 bitul suplimentar transmis.
• Transmisia si receptia se fac cu aceeasi viteza de
transmisie
• In cazul in care este implementat si registrul UCSRC prin
acest registru se seteaza functii extinse ale interfetei
serie cum ar fi cea de comunicatie sincrona.
• Prin bitul URSEL este selectat accesul la registrul
UBRRH sau UCSRC.
• Prin bitul UMSEL este selectat modul asincron (0) sau
modul sincron (1)
• Prin bitii UPM1 si UPM0 este setata unitatea de paritate
(00 – inactiva, 10 – paritate impara si 11 – paritate para)
Bitii UCSZ2, UCSZ1 si UCSZ0 selecteaza numarul de
biti pe care se face comunicatia iar UCPOL selecteaza
polaritatea semnalului de ceas la comunicatia sincrona.
• Setarea vitezei de comunicatie se face prin registrul de
12 bitii UBRRH si UBRRL
• Diferenta dintre viteza de comunicatie dintre receptor si
transmitator trebuie sa fie mai mica de 2,5%.
• Valoarea ce trebuie scrisa in registrul UBRR se
calculeaza, functie de viteza de comunicatie, cu formula
urmatoare:
INTERFATA SPI (Seria peripheral inteface)
• Interfata SPI este o interfata de comunicatie
sincrona pe trei fire.
• De obicei comunicatia se face intre 2 dispozitive,
unul master si altul slave. Comunicatia se poate
face si intre mai multe dispozitive.
• Receptia de date pe interfata SPI poate trezi
microcontrolerul din starea Idle Mode.
• Comunicatia este full-duplex, practic avand loc
un schimb simultan de date intre master si slave.
• Semnalele interfetei SPI sunt SCK (serial clock),
MOSI (master output-slave imput) MISO (master
imput – slave output) si SS (slave select)
• Registrii din spatiu I/O ce seteaza modul de
comunicatie pe interfata SPI sunt SPCR
(control) si SPSR (stare) iar registru de date este
SPDR.
• Modul de interconectare intre master si slave
este schitat mai jos.
• Prin registrul SPCR este controlat modul de comunicare
pe interfata SPI.
• Bitul SPIE valideaza intreruperea generata de interfata
SPI activata prin bitul SPE (setat in 1).
• DORD sters determina ca prima data receptionata sau
transmisa sa fie MSB iar daca este setat prima data va fi
LSB
• MSTR sters selecteaza functionarea ca slave iar daca
este in unu selecteaza functionarea ca master.
• CPOL si CPHA selecteaza polaritatea ceasului si faza
semnalului de date
• Prin bitii SPR1 si SPR0 se selecteaza viteza de
comunicatie intre fosc/4, fosc/16, fosc/64 si fosc/128.
• Bitul SPIE din registrul de stare SPSR reprezinta
semaforul de intrerupere al interfetei SPI. Ca orice
semafor de intrerupere este sters automat daca este
validata intreruperea generata de interfata SPI sau este
sters soft prin scriere cu 1.
• Bitul WCOL este setat daca are loc o scriere a registrului
de date in timp ce se receptioneaza un caracter. Este
sters in momentul cand se citeste registrul de stare
SPSR.
• Bitul SPI2x dubleaza viteza de comunicatie pe interfata
SPI.
• Atentie!. Daca bitul SS este setat ca intrare (tree-state)
el poate comuta interfata SPI din master in slave
generand erori de functionare a interfetei.
INTERFATA I2C (Two-wire Serial Interface)
• TWI este practic interfata I2C creata de Philips.
• Poate functiona atat ca master cat si slave.
• Avand un camp de 128 de adrese pot fi
conectate pana la 128 de dispozitive slave la un
master.
• Interfata poate fi setata fie sa receptioneze fie sa
transmita date cu o viteza de pana la 400kHz.
• Pentru comunicare sunt folosite 2 semnale
bidirectionale SCL (ceas) si SDA (date)
• Modul de conectare pe interfata TWI este
prezentat in figura de mai jos.
• Fiecare din dispozitivele conectate are o adresa
individuala, ce rezolva mecanismul de conectare
pe bus.
• Dispozitivul master genereaza semnalul de
ceas, initiaza si termina transmisia.
• Dispozitivul slave isi recunoaste adresa
transmisa de master si raspunde la comenzile
primite.
• Transmisia pe interfata TWI se initiaza prin
indeplinirea conditiilor de START si este
incheiata prin indeplinirea conditiilor de
STOP. In figura de mai jos sunt schitate
conditiile de START, repetare START si
STOP ale semnalelor SCL si SDA.
• Controlul comunicatiei pe interfetei TWI se face prin registrii TWCR
(control), TWSR (stare), TWDR (date) si TWAR (adresa slave) a
caror componenta este prezentata mai jos.
• Descruierea detaliata este prezentata in pdf-ul µC-lor ce au
implementata aceasta interfata in structura interna.
Comparatorul analogic
• Comparatorul analogic este prezent in majoritatea
microcontrolerelor AVR
• Cele 2 intrari ale comparatorului sunt legate la 2
pini de intrare
• Pentru multe microcontrolere la intrarile
comparatorului pot fi selectate fie o referinta de
tensiune fie iesirea multiplexorului analogic de la
convertorul analog numeric.
• După reset comparatorul analogic este activat.
•In cazul in care comparatorul analogic nu este
folosit, curentul de alimentare poate fi redus prin
stergerea bitului ACD din registrul ACSR
(dezactivare comparator).
• Schema bloc simplificată a comparatorului analogic este
prezentată în figura de mai jos. Iesirea comparatorului
este setata in unu daca tensiunea de pe intrarea pozitiva
este mai mare decat tensiunea de pe intrarea negativa.
• Plaja tensiunilor de intrare este cuprinsa intre tensiunea
de alimentare si masa
• Setarea comparatorului analogic (CA) se face prin
intermediul registrului de stare al acestuia ACSR (Analog
Comparator Control and Status Register)
• Prin bitul ACD comparatorul analogic este dezactivat iar
prin bitul ACBG la intrarea pozitiva este cuplata o
tensiune de referinta de 1,22V
• Iesirea comparatorului analogic este acesata prin bitul
ACO.
• Intreruperile generate de CA sunt semnalizate prin
semaforul ACI si sunt activate prin bitul ACIE. Bitii ACIS1
si ACIS0 selecteaza modul de generare a intreruperilor:
schimbare iesire (00), front cazator (10) si front crescator
(11).
• Prin setarea bitului ACIC se selecteaza ca intrare de
captura (TCN1) iesirea comparatorului analogic.
CONVERTORUL ANALOG NUMERIC
• Principalele caracteristici ale convertorul analog
numeric (ADC) sunt:
– Conversie pe 10 biti
– Eroare de neliniaritate 0,5LSB
– Eroare maxima ±2LSB
– 13-260µs timp de conversie
– 6 pana la 8 canale de intrare
– Referinta interna de 2,56V sau referinta externa
– Domeniul de intrare intre 0 si Vcc
– Generare intrerupere la sfarsit conversie
– O singura conversie sau conversie continua
• Alimentarea ADC se
face de la o sursa de
tensiune filtrata
suplimentar pentru
reducerea erorilor de
conversie. Aceasta
tensiune se poate
obtine de la tensiunea
digitala utilizand un
filtru LC, ca in figura
alaturata.
• Rezultatul conversiei este dat de formula de mai jos.

• Selectarea canalului de intrare se face prin registrul


ADMUX.
• Prin semnalele MUX3-0 este selectat canalul de intrare
iar prin semnalele REFs1 si REFS0 este selectata
referinta de tensiune.
Semnalul ADLAR selecteaza modul de aranjare a
rezultatului (setat aliniaza rezultatul la stanga pe 16 biti).
Selectie referinta de tensiune pentru ATmega8 si
ATmega328
Selectie canal de conversie pentru
ATmega8
Selectie canal de conversie pentru
ATmega328 (ADC8 pentru senzorul de temperatura)
• Controlul ADC se face prin registrul ADCSRA.
• Pentru unele µC exista un al doilea registru(ADCSRB)
prin care se seteaza functii suplimentare cum ar fi sursa
de trigherare.
• Activarea ADC se face prin setarea bitului ADEN.
• Declansarea unei conversii se face prin bitul ADSC iar
realizarea conversiei continue se face daca este setat si
bitul ADFR.
• Validarea intreruperii ADC se face prin setarea bitului
ADIE, intrerupere semnalizata prin semaforul ADIF.
• Selectarea ceasului de conversie cu o frecventa
cuprinsa intre 50 si 200kHz se face bitii ADPS2, ADPs1
si ADPS0 (divixare cu 2, 2, 4, 8, 16, 32, 64, 128)
Selectie frecventa de conversie
Frecventa de conversie trebuie sa fie intre 50 si 200kHz. Frecventa de
ceas se divizeaza cu 2, 4, 8, 32, 64 sau 128.
• Rezultatul conversiei este memorat in registrii ADCH si
ADCL, aliniat la stanga sau dreapta in functie de bitul
ADLAR
• Daca rezultatul este aliniat la stanga este suficient sa
citim ADCH, daca avem nevoie doar de 8 biti. In alte
situatii prima data trebuie citit ADCL si apoi ADCH.
Declansarea conversiei A-D
• Declansarea conversiei A-D se poate face soft
sau hard.
• Declansarea conversiei hard se face din mai
multe surse si anume:
– Conversie continuaI
– iesire comparator analogic
– Intrarea de intrerupere INT0
– Comparare A numarator T0
– Depasire numarator T0
– Comparare B numarator T1
– Depasire numarator T1
– Captura numarator T1
Registrul suplimentar de control şi stare ADC: ADCSRB

• ACME (Analog Comparator Multiplexor Enable) realizează selectia semnalului


de intrare de la intrarea inversoare a comparatorului analogic daca convertorul
analog numeric este dezactivat (ADEN=0 din registrul ADCSRA). Daca acest
bit este zero la intrarea comparatorului este cuplata intrarea AIN1.
• ACTS2, ADTS1 şi ADTS0 (ADC Auto Trigger Sourse) selecteaza sursa de
trigherare pentru declansarea conversiei conform tabelului

ADTS2 ADTS1 ADTS0 Sursa pentru start conversie


0 0 0 Conversie continua
0 0 1 Iesire comparator analogic
0 1 0 Intrarea de intrerupere INT0
0 1 1 Comparare A numarator T0
1 0 0 Depasire numarator T0
1 0 1 Comparare B numarator T1
1 1 0 Depasire numarator T1
1 1 1 Captura numarator T1
• Pentru reducerea consumului multe microcontrolere au implementat
posibilitatea de decuplare a intrarilor digitale de la intrarile analogice
si cuplarea acestora la masa.
• O tensiune de intrare in jurul valorii de 1...2 V pe intrarile digitale va
avea ca efect cresterea curentului de alimentare al
microcontrolerului.
• Decuplarea se face individual prin setarea semnalelor
ADC6D...ADC0D din registrul DIDR0 (digital input disable register).
Aceste semnale sunt pot fi citite sau scrise si, dupa reset, au
valoarea zero.
• Semnificatia registrului DIDR este urmatoarea:
BIBLIOGRAFIE (de iniţiere şi
aprofundare)
1. ATMEL, 1999, AVR RISC Microcontroller. Data Book, San Jose CA.
2. ATMEL, 1997, 8051 FLASH Microcontroller. Data Book, San Jose CA.
3. BĂLAN, Radu, 2002, Microprocesoare – structură şi aplicaţii, Cluj-Napoca,
Editura Todesco.
4. BORZA, A., GHERIGAN, Carmen, OGRUŢAN, Petre, TOACŞE, Ghe.,
2000, Microcontrolere – Aplicaţii, Bucureşti, Editura Tehnică.
5. BURILEANU, Constantin, şi col, 1999, Microprocesoare x86. O abordare
Software. Cluj-Napoca, Editura Albastă – Microinformatica.
6. CIASCAI, Ioan, 1998, Sisteme de achiziţie de date pentru calculatoare
personale. Cluj-Napoca, Editura Albastră – Microinformatica.
7. CIASCAI, Ioan, 2002, Sisteme electronice dedicate cu microcontrolere AVR
RISC. Cluj-Napoca, Editura Casa Cărţii de Ştiinţă.
8. CIASCAI, Ioan, 2002, Microcontrolerul AT90S2313 în 12 lucrări practice.
Cluj-Napoca, Editura Casa Cărţii de Ştiinţă.
9. CIASCAI, Ioan, 2003, Microcontrolerul AT90S4433 structură şi aplicaţii.
Cluj-Napoca, Editura Casa Cărţii de Ştiinţă.
10. CIASCAI, Ioan, 2004, Microcontrolerele AT90S structură şi aplicaţii. Cluj-
Napoca, Editura Casa Cărţii de Ştiinţă.
11. LUPU, Cristian, ŢEPELEA, Vlad, PURICE, Emil, 1982, Microprocesoare,
aplicaţii. Bucureşti, Editura Militară.
12. LUPU, Cristian, STĂNCESCU, Ştefan, 1986, Microprocesoare. Circuite.
Proiectare. Bucureşti, Editura Militară.
13. LUPU, Eugen, 2000, Microprocesoare-îndrumător de lucrări de laborator.
Cluj-Napoca, Editura Risoprint.
14. LUPU, E,. SUCIU, A., 2002, Procesoare digitale de semnal. U.T. Pres.
15. MHS, 1993, 8 bit Microcontrollers, MATRA MHS.
16. MUSCĂ, Gheorghe, 1997, Programarea în limbaj de asamblare. Bucureşti,
Editura Teora.
17. NEDEVSCHI, Sergiu, 1994, Microprocesoare. UTCN, U.T. Pres.
18. PHILIPS, 1992, 8051 – based 8-bit Microcontrollers. Data Handbuok, IC20.
19. STOJANOV Istvan (coord.), 1987, De la poarta TTL la microprocesor. (Vol.
II), Bucureşti, Editura Tehnică.
20. TEXAX INSTRUMENTS, 1994, MSP430 Family-Assembly Language.
SLAUE12.
21. TEXAX INSTRUMENTS, 1997, Metering Aplication Report. SLAE10B.
22. TEXAX INSTRUMENTS, 1998, Digital Desing Seminar. SDYDE01B.
23. TODEREAN, Gavril, DOBROTĂ, Virgil, GIURGIU, M., LUPU, Eugen, 1993.
Microprocesoare. Îndrumător de laborator. Cluj-Napoca, UTCN.
24. www.atmel.com

Das könnte Ihnen auch gefallen