Documente Academic
Documente Profesional
Documente Cultură
Curs 4
2
Procedura de răspuns la întrerupere
PUSH PC
A DA SP=SP-2
apărut CLI
într. ? PC = Adr. vector într.
NU
SEI DA NU
POP PC RETI ?
SP=SP+2 3
Procedura de răspuns la întrerupere
7
Întreruperi externe
10
Întreruperi externe
Configurarea INT0/INT1
Esteposibil ca întreruperea să nu se declanșeze
dacă impulsul de modificare a nivelului logic
este mai scurt decât perioada semnalului de
tact
Întreruperea de nivel zero se declanșează doar
dacă nivelul este menținut până la finalizarea
execuției instrucțiunii curente
11
Întreruperi externe
Configurarea INT0/INT1
12
Întreruperi externe
Configurarea INT2
Este posibil ca întreruperea să nu se declanșeze
dacă impulsul de modificare a nivelului logic este
mai scurt de 50ns
ISC2=0 front descrescător
ISC2=1 front crescător
13
Întreruperi externe
Activarea INT0/INT1/INT2
Se scrie 1 în bitul corespunzător din GICR
Semnalizarea INT0/INT1/INT2
Biții 7, 6 și 5 din GIFR
14
Exemplu cod de întrerupere în asm –
program principal
jmp RESET MEMORIA FLASH
jmp et1
jmp RESET 0x0000
jmp et2
................
20 jmp et1 0x0002
jmp et20 jmp et2 0x0004
RESET: ........................... .................
ldi r16,high(RAMEND)
out SPH,r16 jmp et20 0x0028
ldi r16,low(RAMEND) ldi r16,high(RAMEND) 0x002A
out SPL, r16
sei
15
...........................
Exemplu cod de întrerupere în asm –
rutina de întrerupere
et1:
in r20,SREG
.............. //codul rutinei care nu trebuie să modifice r20
out SREG,r20
reti
16
Exemplu cod de întrerupere în C – ATMEL
Studio
ISR (TIMER1_COMPA_vect)
{
.............. //codul rutinei
17
Exemplu cod de întrerupere în C –
mikroC
void Timer1Overflow_ISR() org IVT_ADDR_TIMER1_OVF
{
.............. //codul rutinei
18
Exercițiu 1
19
Exercițiu 1
ASM C
in r16,TIMSK TIMSK=TIMSK|(1<<OCIE1A)|(1<<OCIE1B);
ori r16,0b00011000
out TIMSK,r16
20
Exercițiu 2
21
Exercițiu 2
.include "m32def.inc" jmp reset reset:
jmp reset jmp reset ldi r16,high(RAMEND)
jmp semnal jmp reset out SPH,r16
jmp reset jmp reset ldi r16,low(RAMEND)
jmp reset jmp reset out SPL,r16
jmp reset jmp reset ldi r16,0x00
jmp reset jmp reset out DDRD,r16 ; portul D este
jmp reset jmp reset setat ca intrare
bucla: in r16,PINA 23
ldi r17,0b00000100
Exercițiu 2
#define F_CPU 8000000U PORTA=PINA^(1<<PA2); } }
#include <avr/io.h>
#include <avr/interrupt.h> int main(void)
{
unsigned short contor; cli();
DDRD=0x00;
ISR(INT0_vect) DDRA=0xFF;
{ MCUCR=MCUCR|(1<<ISC00);
contor++; GICR=GICR|(1<<INT0);
if (contor==10) sei();
{ for(;;);
24
contor=0; }
Noțiuni generale timere
28