Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Meseria se fura, ingineria se invata.Telecomunicatii, comunicatiile la distanta, Retele de, telefonie, VOIP, TV, satelit




Aeronautica Comunicatii Constructii Electronica Navigatie Pompieri
Tehnica mecanica

Electronica


Index » inginerie » Electronica
» Sistemul de intreruperi - Registrii de control


Sistemul de intreruperi - Registrii de control




Sistemul de intreruperi

  1. Introducere
  2. Registrii de control
  3. Latenta intreruperilor
  4. INT si intreruperile externe
  5. Salvarea contextului in timpul executiei rutinelor de intrerupere
  6. Initializare
  7. Informatii utile pentru dezvoltatorii de sisteme



1. Introducere

Microcontrollerele din familia PICmicro pot avea mai multe surse de intreruperi. In general acestea includ cate o sursa de intreruperi pentru modul periferic, desi unele module pot genera intreruperi multiple (de exemplu interfata seriala – USART). Intreruperile curente sunt:

    • Pinul INT (pentru intreruperi externe)
    • Depasire la TMR0 (timer 0)
    • Modificarea starii pinilor PORTB (pinii RB7:RB4)
    • Schimbarea iesirii comparatorului/comparatoarelor
    • Intreruperea generata de portul paralel in mod SLAVE
    • Intreruperile generate de USART
    • Intrerupere la receptia seriala
    • Intrerupere la transmisia seriala
    • Depasire la TMR1 (timer 1)
    • Depasire la TMR2 (timer 2)
    • Intrerupere generata de modulul CCP
    • Intrerupere generata de modulul SSP

Registrii folositi pentru controlul si monitorizarea starii sistemului de intreruperi sunt:

INTCON

PIE1

PIR1

PIE2

PIR2

Ne vom referi la acestia prin INTCON, PIR, PIE.

Registrul de control al intreruperilor, INTCON contine flaguri de un bit asociate cererile de intrerupere generate de nucleul microcontrollerului. De asemeni, mai contine si diferite flaguri de activare pentru unele intreruperi si un bit de activare globala a sistemului de intreruperi.

Bitul de activare globala a sistemului de intreruperi, GIE (INTCON(7)), activeaza, daca este setat, toate intreruperile nemascate sau dezactiveaza (daca este resetat) toate intreruperile. Diferitele surse de intrerupere pot fi dezactivate prin bitii de activare asociati lor in registrul INTCON. Bitul GIE este pus pe 0 la reset.

Instructiunea de revenire din rutina de intrerupere, RETFIE, realizeaza iesirea din intrerupere si seteaza bitul GIE, ceea ce permite tratarea in continuare a cererilor de intreruperilor existente.

Registrul INTCON contine urmatoarele intreruperi: cea generata pe pinul INT, cea generata de modificarea starii pinilor RB (portul B) si cea generata de depasirea timerului 0 (TMR0). De asemeni, registrul INTCON mai contine bitul de activare a intreruperilor provenite de la periferice, PEIE. Acesta activeaza/dezactiveaza     tratarea cererilor de intrerupere provenite de la periferice daca este setat/resetat.

La tratarea unei intreruperi, bitul GIE este resetat pentru a dezactiva alte intreruperi, adresa de revenire este salvata pe stiva si in PC este incarcata valoarea 0004h. In rutina de tratare a cererilor de intrerupere sursa intreruperii poate fi determinata prin verificarea flagurilor asociate intreruperilor. Flagul asociat unei intreruperi este setat indiferent de starea bitului de activare corespunzator sau a bitului GIE. In general flagul asociat intreruperii tratate trebuie resetat software inainte de re-activarea sistemului de intreruperi pentru a evita o cascadare recursiva a cererilor de intrerupere.

Nota 1 : Flagurile asociate individual intreruperilor sunt setate indiferent de starea bitilor corespunzatori de activare sau a bitului GIE.

Nota 2 : Cand se executa o instructiune care reseteaza bitul GIE, toate cererile de intrerupere care nu au fost inca tratate sunt ignorate. Microcontrollerul va executa o instructiune NOP imediat dupa instructiunea care a restetat bitul GIE. Intreruperile ignorate pot fi in continuare tratate cand bitul GIE va fi setat din nou.

Logica de generare a intreruperilor

2. Registrii de control

Microcontrollerul dispune de urmatorii registri asociati sistemului de intreruperi: INTCON care contine bitul de activare globala a sistemului de intreruperi GIE, precum si bitul de activare a intreruperilor generate de periferice (PEIE), si perechile de registri PIE/PIR care activeaza cererile de intrerupere de la periferice si contin si flagurile asociate acestora.

2.1 Registrul INTCON

Poate fi atat citit, cat si inscris. Contine diferiti biti de activare si flaguri.

Nota : flagurile asociate intreruperilor sunt setate indiferent de starea bitilor de activare corespunzatori sau a bitului GIE. Aceasta caracteristica ofera posibilitatea unui polling software.

Registrul INTCON

Bitul 7 GIE: Global Interrupt Enable bit

1 – Activeaza toate intreruperile nemascate

0 – Dezactiveaza toate intreruperile

Bitul 6 PEIE: Peripheral Interrupt Enable bit

1 – Activeaza toate intreruperile nemascate de la    periferice

0 – Dezactiveaza toate intreruperile de la periferice

Bitul 5    T0IE: TMR0 Overflow Interrupt Enable bit

1 – Activeaza intreruperea la depasire la timer0

0 – Dezactiveaza intreruperea la depasire la timer0



Bitul 4    INTE: INT External Interrupt Enable bit

1 – Activeaza intreruperea externa INT

0 – Dezactiveaza intreruperea externa INT

Bitul 3    RBIE(1): RB Port Change Interrupt Enable bit

1 – Activeaza intreruperea la modificarea portului RB

0 – Dezactiveaza intreruperea la modificarea portului RB

Bitul 2    T0IF: TMR0 Overflow Interrupt Flag bit

1 – in registrul TMR0 s-a produs o depasire (trebuie resetat software)

0 – in registrul TMR0 nu s-a produs nici o depasire

Bitul 1    INTF: INT External Interrupt Flag bit

1 – s-a produs o intrerupere externa pe pinul INT (trebuie resetat software

0 – nu s-a produs o intrerupere externa

Bitul 0    RBIF(1): RB Port Change Interrupt Flag biti

1 – cel putin unul din pinii RB7:RB4 si-a schimbat starea (trebuie resetat software)

0 – nici unul din pinii RB7:RB4 nu si-a schimbat starea

Legenda: R – bitul poate fi citit

W – bitul poate fi scris

U – neimplementat, valoarea 0 la citire

-n – valoarea dupa reset

Nota 1: La unele dispozitive, RBIE este cunoscut ca GPIE si RBIF ca GPIF

2.2 Registrii PIE

Acesti registri contin biti de activare individuala pentru intreruperile provenite de la periferice. Bitul PEIE(INTCON(6)) trebuie setat pentru a putea activa intreruperile de la periferice.

Registrii PIE

Bitul 0 TMR1IE: TMR1 Overflow Interrupt Enable bit

1 – Activeaza intreruperea la depasirea in TMR1

0 – Dezactiveaza intreruperea la depasirea in TMR1

Bitul TMR2IE: TMR2 to PR2 Match Interrupt Enable bit

1 – Activeaza intreruperea la egalitatea intre TMR2 si PR2

0 – Dezactiveaza intreruperea la egalitatea intre TMR2 si PR2

Bitul CCP1IE: CCP1 Interrupt Enable bit

1 – Activeaza intreruperea CCP1

0 – Dezactiveaza intreruperea CCP1

Bitul CCP2IE: CCP2 Interrupt Enable bit

1 – Activeaza intreruperea CCP2

0 – Dezactiveaza intreruperea CCP2

Bitul SSPIE: Synchronous Serial Port Interrupt Enable bit

1 – Activeaza intreruperea SSP

0 – Dezactiveaza intreruperea SSP

Bitul RCIE: USART Receive Interrupt Enable bit

1 – Activeaza intreruperea la receptia USART

0 – Dezactiveaza intreruperea la receptia USART

Bitul TXIE: USART Transmit Interrupt Enable bit

1 – Activeaza intreruperea la transmisia USART

0 – Dezactiveaza intreruperea la transmisia USART

Bitul ADIE: A/D Converter Interrupt Enable bit

1 – Activeaza intreruperea A/D

0 – Dezactiveaza intreruperea A/D

Bitul ADCIE: Slope A/D Converter Interrupt Enable bit

1 – Activeaza intreruperea Slope A/D

0 – Dezactiveaza intreruperea Slope A/D

Bitul OVFIE: Slope A/D TMR Interrupt Enable bit

1 – Activeaza intreruperea la depasirea Slope A/D timer

0 – Dezactiveaza intreruperea la depasirea Slope A/D timer

Bitul PSPIE: Parallel Slave Port Read/Write Interrupt Enable bit



1 – Activeaza intreruperea la citire/scriere PSP

0 – Dezactiveaza intreruperea la citire/scriere PSP

Bitul EEIE EEIE Write Complete Interrupt Enable bit

1 – Activeaza intreruperea la terminarea ciclului de scriere EE

0 – Dezactiveaza intreruperea la terminarea ciclului de scriere EE

Bitul LCDIE: LCD Interrupt Enable bit

1 – Activeaza intreruperea LCD

0 – Dezactiveaza intreruperea LCD

Bitul CMIE: Comparator Interrupt Enable bit

1 – Activeaza intreruperea generata de comparator

0 – Dezactiveaza intreruperea generata de comparator

Legenda: R – bitul poate fi citit

W – bitul poate fi scris

U – neimplementat, valoarea 0 la citire

-n – valoarea dupa reset

2.3 Registrii PIR

Acesti registri contin flagurile individuale asociate intreruperilor generate de periferice.

Nota 1: Flagurile asociate intreruperilor sunt setate indifferent de starea     bitilor de activare corespunzatori sau a bitului de activare globala a sistemului de intreruperi GIE.

Nota 2: Utilizatorul trebuie sa reseteze software flagurile corespunzatoare inainte de reactivarea unei intreruperi, dupa deservirea acesteia.

Registrii PIR

Bitul TMR1IF: TMR1 Overflow Interrupt Flag bit

1 – s-a produs o depasire in registrul TMR1

0 – nu s-a produs o depasire in registrul TMR1

Bitul TMR2IF: TMR2 to PR2 Match Interrupt Flag bit

1 – valorile lui TMR2 si PR2 au devenit egale

0 – valorile lui TMR2 si PR2 nu au devenit egale

Bitul CCP1IF: CCP1 Interrupt Flag bit

Mod captura:

1 – s-a produs o captura in registrul TMR1 (trebuie resetat software)

0 – nu s-a produs o captura in registrul TMR1

Mod comparare:

1 – s-a produs o potrivire prin comparare cu registrul TMR1 (trebuie resetat software)

0 – nu s-a produs nici o potrivire prin comparare cu registrul TMR1

Mod PWM

Nefolosit in acest mod

Bitul CCP2IF: CCP2 Interrupt Flag bit

Mod captura:

1 – s-a produs o captura in registrul TMR1 (trebuie resetat software)

0 – nu s-a produs o captura in registrul TMR1

Mod comparare:

1 – s-a produs o potrivire prin comparare cu registrul TMR1 (trebuie resetat software)

0 – nu s-a produs nici o potrivire prin comparare cu registrul TMR1

Mod PWM

Nefolosit in acest mod

Bitul SSPIF: Synchronous Serial Port Interrupt Flag bit

1 – transmisia/receptia s-a terminat

0 – se asteapta o transmisie/receptie

Bitul RCIF: USART Receive Interrupt Flag bit

1 – bufferul de receptie al USART, RCREG este plin (resetat la citirea RCREG)

0 – bufferul de receptie al USART este gol

Bitul TXIF: USART Transmit Interrupt Flag bit

1 – bufferul de transmisie al USART, TXREG este gol (resetat la scrierea TXEG)

0 – bufferul de transmisie al USART este plin

Bitul ADIF: A/D Converter Interrupt Flag bit

1 – s-a incheiat o conversie A/D (trebuie resetat software)

0 – nu s-a incheiat conversia A/D

Bitul ADCIF: Slope A/D Converter Comparator Trip Interrupt Flag bit

1 – s-a incheiat o conversie A/D (trebuie resetat software)

0 – nu s-a incheiat conversia A/D

Bitul OVFIF: Slope A/D TMR Overflow Interrupt Flag bit

1 – s-a produs o depasire a Slope A/D TMR (trebuie resetat software)

0 – nu s-a produs depasirea Slope A/D TMR

Bitul PSPIF: Parallel Slave Port Read/Write Interrupt Flag bit

1 – s-a produs o operatie de scriere/citire (trebuie resetat software)

0 – nu s-a produs nici o operatie de scriere/citire



Bitul EEIF: EE Write Complete Interrupt Flag bit

1 – s-a incheiat un ciclu de scriere EE (trebuie resetat software)

0 – nu s-a incheiat ciclul de scriere EE

Bitul LCDIF: LCD Interrupt Flag bit

1 – s-a produs o intrerupere LCD(trebuie resetat software)

0 – nu s-a produs nici o intrerupere LCD

Bitul CMIF: Comparator Interrupt Flag bit

1 – s-a modificat intrarea comparatorului(trebuie resetat software)

0 – nu s-a modificat intrarea comparatorului

Legenda: R – bitul poate fi citit

W – bitul poate fi scris

U – neimplementat, valoarea 0 la citire

-n – valoarea dupa reset

3. Latenta intreruperilor

Latenta intreruperilor este definita ca fiind timpul scurs intre producerea evenimentului care declanseaza cererea de intrerupere (seteaza flagul intreruperii) si momentul in care incepe executia instructiunii de la adresa 0004h (daca intreruperea respectiva este activata).

Pentru intreruperile sincrone (in general cele interne) latenta este 3Tcy.

Pentru intreruperile asincrone (in general cele externe), cum ar fi INT, sau modificarea pinilor RB, latenta va fi 3 – 3.75Tcy (cicli instructiune). Valoarea exacta a latentei/intarzierii depinde de momentul in care ea se produce in raport cu ciclul instructiune.

Latenta este la fel atat pentru instructiunile de un ciclu, cat si pentru cele de doi cicli.

Timing-ul pentru intreruperea INT si alte intreruperi externe

4. INT si intreruperile externe

Intreruperea externa pe pinul INT este declansata pe front: fie cel crescator, daca bitul INTEDG (OPTION(6)) este setat, fie cel cazator, daca INTEDG este resetat. Daca pe pinul INT se produce o tranzitie valida, bitul INTF (INTCON(1)) este setat. Aceasta intrerupere poate fi activata/dezactivata prin setarea/resetarea bitului de validare INTE (INTCON(4)). Bitul INTF trebuie resetat software in rutina de tratare a intreruperilor inainte de reactivarea ei. Intreruperea generata de INT poate reactiva microcontrollerul din modul SLEEP daca bitul INTE a fost setat inainte de a intra in mod SLEEP. Starea bitului GIE decide daca microcontrollerul va vectoriza intreruperea dupa iesirea din modul SLEEP.

5. Salvarea contextului in timpul executiei rutinei de tratare a intreruperilor

In timpul unei intreruperi, numai registrul PC este salvat pe stiva. In general, utilizatorii vor dori sa salveye continutul unor registri importanti, cum sunt W ori STATUS. Acest lucru trebuie implementat in software.

Actiunea de salvare a informatiei este in general cunoscuta ca “PUSHing”, iar cea de restaurare a informatiei inainte de intoarcere este de obicei numita “POPing”. Acestea (PUSH, POP) nu sunt mnemonice ale unor instructiuni, dar sunt actiuni conceptuale. Acestea pot fi implementate ca o secventa de instructiuni. Pentru usurinta in programare, aceste secvente de cod pot fi realizate sub forma de MACRO-uri.

Exemplul urmator salveaza si restaureaza registrii STATUS si W. Registrul utilizator, W_TEMP trebuie definit in toate bancurile si trebuie sa aiba acelasi offset fata de adresa de baza a bancului. Registrul utilizator STATUS_TEMP trebuie sa fie definit in bancul 0.

Pasii in acest exemplu:

  1. Salveaza registrul W indiferent de bancul curent
  2. Salveaza registrul STATUS in bancul 0
  3. Executa codul din rutina de tratare a intreruperilor
  4. Restaureaza registrulSTATUS (si implicit bitii de selectie ai bancurilor)
  5. Restaureaza registrul W

Daca este necesara salvarea si a altor registri, acestia trebuie salvati dupa salvarea registrului STATUS (pasul 2) si restaurati inainte de restaurarea registrului STATUS (pasul 4).

6. Initializarea

Exemplul urmator arata cum se face initializarea si activarea intreruperilor asociate dispozitivelor, unde valoarea PIE1_MASK1 este valoarea care trebuie inscrisa in registrul de activare a intreruperilor.

Exemplul urmator arata cum se pot crea macro-definitii pentru functii. Macro-urile trebuie definite inainte de a fi folosite. Pentru usurinta depanarii codului, poate fi de ajutor localizarea macro-urilor in alte fisiere ce vor fi incluse in momentul asamblarii. Aceasta permite o mai buna vizualizare a fisierelor ce contin codul sursa. Aceste fisiere trebuie incluse inainte de utilizarea macro-urilor in codul sursa, dar este mai usor de depanat programul daca toate incluziunile de fisiere se realizeaza la inceputul fisierului ce contine codul sursa al programului.

Ultimul exemplu pe care il prezentam arata structura tipica a rutinei de tratare a intreruperilor. Aceasta utilizeaza macro-uri pentru salvarea si restaurarea registrilor inainte de executia codului de tratare a cererii de intrerupere.

6. Informatii utile pentru dezvoltatorii de sisteme

Intrebarea 1: Un algoritm nu ofera rezultate corecte.

Raspunsul 1: Presupunaand ca algoritmul este corect si ca intreruperile sunt activate pe durata executiei algoritmului, asigurati-va ca toti registrii care sunt utilizati de algoritm si de catre rutina de tratare a cererilor de intrerupere sunt salvati si restaurati. Daca nu, continutul unor registri poate fi modificat de catre rutina de tratare a intreruperilor.

Intrebarea 2: Sistemul meu se blocheaza.

Raspunsul 2: Daca utilizati sistemul de intreruperi, asigurati-va ca flagul asociat intreruperii este resetat dupa tratarea cererii de intrerupere (dar inainte de executia instructiunii RETFIE). Daca flagul asociat intreruperii ramane setat, microcontrollerul va relua imediat executia rutinei de tratare a intreruperilor, deoarece cererea de intrerupere ramane.








Politica de confidentialitate





Copyright © 2021 - Toate drepturile rezervate