Svetelektro.com

Svetelektro.com

Meno:
Heslo:

Programujeme AVR v jazyku C - 3. časť

Kategória: Mikroprocesory | 11.02.2012 | Autor: zawin 

Popis funkcie prerušenia, práca s externým prerušením.

Prerušenie

Prerušovací podsystém umožňuje efektívnu obsluhu nepravidelných udalostí, na ktoré má mikrokontrolér reagovať. V prípade výskytu definovanej udalosti mikokontrolér preruší beh programu a venuje sa programovej obsluhe udalosti, ktorá dané prerušenie vyvolala. Po skončení tejto programovej obsluhy mikrokontrolér pokračuje vo výkone hlavného programu. Význam prerušení je hlavne v zrýchlení a zefektívnení behu programu.

V jednej chvíli (t.j. v jednom strojovom cykle) sa môžu vyskytnúť viaceré prerušenia a mikrokontrolér musí rozhodnúť, ktorá žiadosť bude vykonaná ako prvá. Na to je potrebné definovať akési poradie dôležitosti – prioritu prerušení.

Na základe priority prerušení sa určí postupnosť spracovania žiadostí v tom istom strojovom cykle. Tabuľka zdrojov prerušení pre ATmega8 je uvedená na str.46. Platí teda, že čím menšie číslo vektora prerušenia, tým ma prerušenie vyššiu prioritu. Z tabuľky teda vidíme že najväčšiu prioritu ma prerušenie od RESET a najmenšiu od SPM_RDY.

Pred použitím akéhokoľvek prerušenia sa musia prerušenia najskôr globálne povoliť. To dosiahneme pomocou funkcie sei();

Naopak v niektorých kritických častiach programu chceme prerušenie globálne zakázať. Na to slúži funkcia cli();



Vidíme teda že ATmega8 má celkovo 19 zdrojov prerušenia. V tejto časti sa budeme venovať externým prerušeniam - INT0, INT1. Z využitým ďalších zdrojov prerušenia sa zoznámime v ďalších častiach seriálu.

Zápis obsluhy prerušenia:

Na začiatku programu pridáme hlavičkový súbor #include <avr/interrupt.h> , ktorý nám zabezpečí prácu s prerušeniami.

Samotnú funkciu prerušenia potom deklarujeme takto:
ISR (vektor prerušenia) {
// ... akcia prerušenia ... //
}

Kompletný zoznam vektorov prerušenia pre C nájdete na adrese: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Program s prerušením môže teda vyzerať takto:
Podľa možnosti sa snažíme obslužnú funkciu prerušenia spraviť čo najkratšiu (zmeniť premennú a pod.). Robíme to preto, aby zbytočne dlhá obsluha prerušenia nebrzdila hlavný program alebo prípadne ďalšie prerušenia, ktoré môžu nastať.

Zdielané premenné:
Ak potrebujeme v obsluhe prerušenia meniť hodnotu globálnej premennej, musí byť táto premenná deklarovaná s kľúčovým slovom volatile. V opačnom prípade sa zmena hodnoty premennej vykonaná v obsluhe prerušenia neuchová po skončení obsluhy. Príklad: volatile uint8_t abc;

Externé prerušenia:

Využívame ich vtedy, ak chceme prerušenie vyvolať zvonku (napr. stlačenie tlačidla). ATmega8 má dva externé zdroje prerušenia nazvané INT0 (na pine PD2) a INT1 (na pine PD3).
Na ich obsluhu využívame dva registre (pozri datasheet strana 66):

MCUCR – pomocou bitov ISC11, ISC10, ISC01 a ISC00 v tomto registri nastavíme spôsob aktivácie externého prerušenia od INT0 a INT1.

Na výber máme tieto možnosti:
- Reakcia na nízku úroveň napätia na pine
- Zmena logického stavu na pine
- Reakcia na nábežnú hranu (rising edge)
- Reakcia na dobežnú hranu (falling edge)







Príklad:
Nastavíme reakciu INT0 na nábežnú hranu a INT1 na dobežnú hranu:
MCUCR |= (1 << ISC01) | (1 << ISC00) ; // INT0 na nábežnú hranu
MCUCR |= (1 << ISC11); //INT1 na dobežnú hranu

GICR - pomocou bitov INT1 a INT0 v tomto registri povolíme prerušenia od INT0 a INT1.



Príklad:
Povolenie prerušenia od INT1:
GICR |= (1 << INT1);

Ukážkový program:

Zapnutie LED na pine PD7 pomocou INT0 a vypnutie pomocou INT1. Reakcia prerušenia na dobežnú hranu (zmenu z log. 1 na log. 0).

Schéma zapojenia:


Zdrojový kód:

Zdrojový kód – použitie globálnej premennej:
To isté ako prvý ukážkový program, ale s použitím globálnej premennej. Tip: vyskúšajte si program bez kľúčového slova „volatile“.
Youtube video:


V ďalšej časti sa pozrieme na prácu s čítačom/časovačom a oboznámime sa s možnosťami jeho použitia.
Ďakujem za pomoc všetkým, čo sa podieľali na tvorbe tejto časti.
 


02.02.2012

Programujeme AVR v jazyku C - 2. časť

 34673   14  Hodnotenie: 4.85Hodnotenie: 4.85Hodnotenie: 4.85Hodnotenie: 4.85Hodnotenie: 4.85

20.02.2012

Programujeme AVR v jazyku C - 4. časť

 25953   9  Hodnotenie: 5Hodnotenie: 5Hodnotenie: 5Hodnotenie: 5Hodnotenie: 5

11.07.2013

Pripojenie VFD displeja k mikropočítaču

 8788   8  Hodnotenie: 5Hodnotenie: 5Hodnotenie: 5Hodnotenie: 5Hodnotenie: 5

14.09.2012

Programujeme AVR v jazyku C - 9. časť

 11623   3  Hodnotenie: 4.8571428571429Hodnotenie: 4.8571428571429Hodnotenie: 4.8571428571429Hodnotenie: 4.8571428571429Hodnotenie: 4.8571428571429

Priemerné hodnotenie: 5
Hlasov: 22

Vynikajúci

Zvoľte počet hviezdičiek:
Vynikajúci
Veľmi dobrý
Dobrý
Priemerný
Zlý



Za obsah komentárov je zodpovedný užívateľ, nie prevádzkovateľ týchto stránok.

Re: Programujeme AVR v jazyku C - 3. časť (Hodnotenie: 1)
Od: elektonik737 - 11.02.2012
(O užívateľovi | Poslať súkromú správu) http://dydo-robots.webnode.sk
Zawin skvela praca :) poznam dost ludi ktorym toto pomaha :)

Re: Programujeme AVR v jazyku C - 3. časť (Hodnotenie: 1)
Od: andyn - 15.02.2012
(O užívateľovi | Poslať súkromú správu)
skušal som to preložit aj bez toho kľúčového slova „volatile“. a preložilo mi to aj tak.toto bol ten tip?inak velmi dobry serial.teším sa na dalšiu časť.
Re: Programujeme AVR v jazyku C - 3. časť (Hodnotenie: 1)
Od: awen - 15.02.2012
(O užívateľovi | Poslať súkromú správu)
 
a aj to fungovalo? :)
Re: Programujeme AVR v jazyku C - 3. časť (Hodnotenie: 1)
Od: awen - 16.02.2012
(O užívateľovi | Poslať súkromú správu)
 
precitaj si este raz odsek "Zdielané premenné"

Re: Programujeme AVR v jazyku C - 3. časť (Hodnotenie: 1)
Od: johny29 - 05.05.2012
(O užívateľovi | Poslať súkromú správu)
Ahojte,
Ak to spravne chapem tak pull-up nastavi na portX log. 1,
ale co sposobi, ze po stlaceni tlacidla dostavame log. 0?
Dakujem.
Re: Programujeme AVR v jazyku C - 3. časť (Hodnotenie: 1)
Od: elektonik737 - 02.07.2012
(O užívateľovi | Poslať súkromú správu) http://dydo-robots.webnode.sk
 
nastavi log1 ale cez napriklad 10K odpor.. a ked stlačiš tlačidlo tak to spojiš priamo s GND. Z toho vyplýva ze je tam ,,silnejšie,, GND ako 5V :D neviem ako ti to inak vysvetliť
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.02 sekúnd