Sunteți pe pagina 1din 20

Microcontrolere

Curs 4

Ș.l. dr. ing. Mihai Niculescu


Cuprins

 Funcții alternative ale porturilor ATmega32


 Managementul întreruperilor la ATmega32

2
Porturile ATmega32

 Pinii
unui uC pot avea funcții multiple, nu
numai porturi
 Funcțiile alternative pot include:
 I2C, SPI, USART, PWM, ADC
 Când o funcție alternativă este activă pinul
nu mai poate funcționa ca pin al portului

3
Porturile ATmega32

 Funcții alternative

4
Porturile ATmega32

 Exemplu funcții alternative port A

Convertor
A/D

5
Porturile ATmega32

 Exemplu funcții alternative port B

Comunicație
SPI

Comparator
analogic
6
Modul timer
Porturile ATmega32

 Butoane și comutatoare
 Pot apărea oscilații nedorite la comutare/apăsare
 Debounce
 Se pot filtra cu ajutorul unui filtru RC
 Se pot utiliza și filtre software

7
Porturile ATmega32
 Butoane și comutatoare – exemplu debounce
ISR (TIMER1_COMPA_vect) { //intrerupere periodica timer la aprox 0,5s
unsigned short newstate;

newstate=PINB&(0b00000001);
if (newstate!=oldstate) {
if (oldstate) {oldstate=newstate; apasat=TRUE;}
else {apasat=FALSE; oldstate=newstate;}
}
else apasat=FALSE;
…………………………………………
} 8
Noțiuni generale întreruperi
 Ce este o întrerupere ?
 O întrerupere este un eveniment HW sau SW care oprește
uC din execuția codului curent și determină realizarea unei
acțiuni (set de comenzi) prestabilite

9
Noțiuni generale întreruperi

 Întreruperile pot fi activate/dezactivate


 La nivel global
Bitul I din Nu se poate
CLI SREG executa nici o
devine 0 întrerupere

Bitul I din Se pot executa


SEI SREG întreruperile care au
devine 1 fost activate individual

 Individual – în funcție de regiștrii de configurare ai modulului


hardware 10
Noțiuni generale întreruperi

 Orice întrerupere activată trebuie să aibă o secvență de


cod asociată = rutina de întrerupere
 Definiție: tratarea unei întreruperi = realizarea operațiilor
automate de răspuns la întrerupere și execuția rutinei de
întrerupere
 O întrerupere poate întrerupe o altă întrerupere = nested
interrupts
 În cazul ATmega32 programatorul decide dacă folosește nested
interrupts

11
Noțiuni generale întreruperi

 Anumite întreruperi pot scoate uC din starea SLEEP


 Apariția unei întreruperi conduce la setarea (schimbarea
în 1) unor biți (flags) care marchează acest eveniment
 Întreruperile pot avea prioritate diferită

12
Exemple surse de întrerupere

 Întrerupere ca urmare a unui RESET (ex.: power, pin extern,


brown-out, watchdog)
 Întreruperi externe. Sunt de două tipuri:
 Active pe nivel de tensiune (level-triggered interrupts): întreruperea
apare încontinuu atâta timp cât linia are valoarea considerată (low
sau high)
 Active pe schimbare de nivel (edge-triggered): întreruperea apare
doar când este o schimbarea de nivel pe linia respectivă (front
crescător sau descrescător)
 Întreruperi interne corespunzătoare timerelor:
 Când valoarea din timer atinge maximul (overflow)
 Când valoarea din timer atinge o valoare prestabilită dintr-un
registru (on compare)
13
Exemple surse de întrerupere

 Întreruperi interne corespunzătoare ADC:


 Apare când este terminată o conversie
 Întreruperi cauzate de sistemele de comunicație
(ex. USART, I2C, SPI):
 La finalizarea transmisiei sau recepției de date
 Alte surse de întrerupere
 Comparator analogic, instrucțiuni EEPROM, instrucțiuni
FLASH
14
Managementul întreruperilor

 uC salvează PC în stivă și îl restaurează la


finalizarea rutinei de întrerupere
 Instrucțiunea reti marchează finalizarea rutinei de
întrerupere
 ASM : Trebuie folosită ca ultimă instrucţiune în oricare dintre
variantele posibile de finalizare a codului întreruperii !
 uC nu salvează SREG
 ASM : Este sarcina programatorului să salveze și apoi să
restaureze SREG !
15
Managementul întreruperilor

 De ce trebuie să salvez SREG ?


ldi r16,0x02
in r17,PINC //PINC=0x02 I T H S V N Z C
cp r17,r16
1 0 SREG

breq et1 //if (Z == 1) then jump ldi r19,0x04


.................... ldi r20,0x06
add r19,r20
reti
breq et1 //if (Z == 1) then jump
....................
I T H S V N Z C 16

0 0 SREG
Tabela vectorilor de întreruperi

 Reprezintă legătura între întreruperi și rutina de


întrerupere
 Vectorul de întrerupere este un număr asociat cu o
întrerupere
 Definește nivelul de prioritate: vector 1 =
prioritate maximă
 La ATmega32 fiecare vector are atribuite 2 locații
din Flash: de obicei se scrie jmp către rutina
întreruperii
17
Tabela vectorilor de întreruperi

 Tabela poate fi implementată în diverse zone ale


memoriei Flash în funcție de combinația biților
BOOTRST și IVSEL
 BOOTRST este un bit care poate fi modificat doar la
transferul codului în uC (fuse bit)
 IVSEL este un bit al registrului GICR

18
Tabela vectorilor de întreruperi

 Exemplu pentru BOOTRST=1 și IVSEL=0

Adresa
Vector Sursa întrerupere Descriere
FLASH
External Pin, Power-on Reset, Brown-out
1 0x0000 RESET Reset, Watchdog Reset, and JTAG AVR
Reset
2 0x0002 INT0 External Interrupt Request 0
3 0x0004 INT1 External Interrupt Request 1
4 0x0006 INT2 External Interrupt Request 2
5 0x0008 TIMER2 COMP Timer/Counter2 Compare 19Match
Întrebări ?

20

S-ar putea să vă placă și