CADRS Cvičenie 9: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(16 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
[[Obrázok:MexleBanner.png|center]] | |||
== 16-bitové počítadlo a časovač T1 s prerušením == | == 16-bitové počítadlo a časovač T1 s prerušením == | ||
Riadok 4: | Riadok 5: | ||
Literatúra: | Literatúra: | ||
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106] | * [http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106 Newbie's Guide to AVR Timers] | ||
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=55347 The traps when using interrupts] | |||
* [http://www.kar.elf.stuba.sk/predmety/mmp/pdf/AVR-C-Timers.pdf Ako používať časovače v AVR C] | |||
* [http://www.kar.elf.stuba.sk/predmety/mmp/pdf/PreruseniaAVR.pdf Prednáška o prerušeniach] (Ing. Chamraz) | |||
=== Rekapitulácia === | |||
= | Máte k dispozícii vývojovú dosku '''MiniMEXLE''' ([http://virtuallab.kar.elf.stuba.sk/robowiki/index.php?title=Mexle popis],[[Médiá:MiniMexleSchematic.jpg|schéma zapojenia]]) a s procesorom ATmega88 ([http://ap.urpi.fei.stuba.sk/mmp/ATmega88.pdf datasheet]) a prípadne aj testovací program [[Médiá:MexleTest2.hex|mexletest2.hex]]. | ||
V tejto úlohe sa predpokladá znalosť funkcie časovača T1 z prednášky (datasheet, str. 87 -- 115). | V tejto úlohe sa predpokladá znalosť funkcie časovača T1 z prednášky (datasheet, str. 87 -- 115). | ||
Procesor je nakonfigurovaný na prácu s externým | Procesor je nakonfigurovaný na prácu s externým kryštálovým oscilátorom 18,432 MHz (fuses). | ||
Demonštračný program je tuto: [[Médiá:MexleTest9.hex|mexletest9.hex]] | |||
=== Časovač T1 === | |||
Pozri [[AVR ExampleT1pooled.c]] | |||
'''Úlohy''' | |||
# Program doplňte podľa pokynov asistenta a odsimulujte.<BR>Pozn.: Treba vypnúť optimalizáciu! (Project/Project options [[Médiá:AVRstudioOptimize0.png|Pozri obr.]]) | |||
# Doplňte chýbajúce časti programu tak, aby LED blikala s frekvenciou 1 s. | |||
# Vyskúšajte na svojej doske. | |||
=== Prerušenia v AVR-GCC === | === Prerušenia v AVR-GCC === | ||
Kompilátor AVR-GCC má obsluhu prerušení vyriešenú tak, že tabuľka s vektormi jednotlivých prerušení ukazuje na obslužné rutiny s preddefinovanými názvami. Pri výskyte niektorého z povolených prerušení sa vykoná rutina so zodpovedajúcim názvom. | Kompilátor AVR-GCC má obsluhu prerušení vyriešenú tak, že tabuľka s vektormi jednotlivých prerušení ukazuje na obslužné rutiny s preddefinovanými názvami. Pri výskyte niektorého z povolených prerušení sa vykoná rutina so zodpovedajúcim názvom. | ||
Riadok 38: | Riadok 51: | ||
External Interrupt Request 1 INT1_vect | External Interrupt Request 1 INT1_vect | ||
External Interrupt Request 2 INT2_vect | External Interrupt Request 2 INT2_vect | ||
Timer/Counter1 Overflow | Timer/Counter1 Overflow TIMER1_OVF_vect | ||
USART, Rx Complete USART_RXC_vect | USART, Rx Complete USART_RXC_vect | ||
USART, Tx Complete USART_TXC_vect | USART, Tx Complete USART_TXC_vect | ||
Riadok 50: | Riadok 63: | ||
Obe funkcie sa preložia do jedinej asm inštrukcie, bez zbytočného pridaného kódu. | Obe funkcie sa preložia do jedinej asm inštrukcie, bez zbytočného pridaného kódu. | ||
Pozn.: | '''Pozn.:''' | ||
Ak chcete používať v obsluhe premenné, ktorých obsah chcete uchovať napr. až do ďalšieho prerušenia, musia byť deklarované ako <TT>static</TT>. Ak chcete mať v obsluhe prerušenia prístup aj k nejakej premennej v hlavnom programe, musí byť deklarovaná ako globálna. Navyše, ak kompilátor pri preklade nenájde miesto, kde sa premenná mení, vyhodí ju z programu úplne. Nie je taký múdry, | Ak chcete používať v obsluhe premenné, ktorých obsah chcete uchovať napr. až do ďalšieho prerušenia, musia byť deklarované ako <TT>static</TT>. Ak chcete mať v obsluhe prerušenia prístup aj k nejakej premennej v hlavnom programe, musí byť deklarovaná ako globálna. Navyše, ak kompilátor pri preklade nenájde miesto, kde sa premenná mení, vyhodí ju z programu úplne. Nie je taký múdry, | ||
aby zistil, že s ňou manipulujete v ISR nezistí, preto použite pri deklarácii <TT>volatile</TT>. | aby zistil, že s ňou manipulujete v ISR nezistí, preto použite pri deklarácii <TT>volatile</TT>. | ||
Úloha | '''Úloha''' | ||
# Doplňte program o vyhodnocovanie pretečenia časovača v prerušení.<BR>Pozri [[AVR ExampleT1int.c]] | |||
[[CAD_Riadiacich_syst%C3%A9mov#Cvi.C4.8Denia|Návrat na zoznam cvičení...]] | |||
[[Category:AVR]][[Category:CAD_RS]] |
Aktuálna revízia z 09:18, 19. november 2008
16-bitové počítadlo a časovač T1 s prerušením
Literatúra:
- Newbie's Guide to AVR Timers
- The traps when using interrupts
- Ako používať časovače v AVR C
- Prednáška o prerušeniach (Ing. Chamraz)
Rekapitulácia
Máte k dispozícii vývojovú dosku MiniMEXLE (popis,schéma zapojenia) a s procesorom ATmega88 (datasheet) a prípadne aj testovací program mexletest2.hex.
V tejto úlohe sa predpokladá znalosť funkcie časovača T1 z prednášky (datasheet, str. 87 -- 115).
Procesor je nakonfigurovaný na prácu s externým kryštálovým oscilátorom 18,432 MHz (fuses).
Demonštračný program je tuto: mexletest9.hex
Časovač T1
Pozri AVR ExampleT1pooled.c
Úlohy
- Program doplňte podľa pokynov asistenta a odsimulujte.
Pozn.: Treba vypnúť optimalizáciu! (Project/Project options Pozri obr.) - Doplňte chýbajúce časti programu tak, aby LED blikala s frekvenciou 1 s.
- Vyskúšajte na svojej doske.
Prerušenia v AVR-GCC
Kompilátor AVR-GCC má obsluhu prerušení vyriešenú tak, že tabuľka s vektormi jednotlivých prerušení ukazuje na obslužné rutiny s preddefinovanými názvami. Pri výskyte niektorého z povolených prerušení sa vykoná rutina so zodpovedajúcim názvom.
Vo vašom kóde použijete obslužné funkcie pre prerušenie napr. takto (obsluha prerušenia z AD prevodníka):
#include <avr/interrupt.h>
ISR(ADC_vect)
{
// user code here
}
Takáto obsluha prerušenia sa potom spustí so globálnym zákazom prerušení (jednoúrovňové), ktoré sa po skončení prípadne zasa obnovia. Obsluha sa skončí špeciálnou inštrukciiou RETI, preto sa nedá zavolať z programu ako bežná funkcia.
Niektoré názvy vektorov:
ADC Conversion Complete ADC_vect External Interrupt Request 0 INT0_vect External Interrupt Request 1 INT1_vect External Interrupt Request 2 INT2_vect Timer/Counter1 Overflow TIMER1_OVF_vect USART, Rx Complete USART_RXC_vect USART, Tx Complete USART_TXC_vect
Ak potrebujete prerušenia povoliť, resp. zakázať, máte k dispozícii funkcie
void sei(void); // Enables interrupts by setting the global interrupt mask.
void cli(void); // Disables all interrupts by clearing the global interrupt mask.
Obe funkcie sa preložia do jedinej asm inštrukcie, bez zbytočného pridaného kódu.
Pozn.: Ak chcete používať v obsluhe premenné, ktorých obsah chcete uchovať napr. až do ďalšieho prerušenia, musia byť deklarované ako static. Ak chcete mať v obsluhe prerušenia prístup aj k nejakej premennej v hlavnom programe, musí byť deklarovaná ako globálna. Navyše, ak kompilátor pri preklade nenájde miesto, kde sa premenná mení, vyhodí ju z programu úplne. Nie je taký múdry, aby zistil, že s ňou manipulujete v ISR nezistí, preto použite pri deklarácii volatile.
Úloha
- Doplňte program o vyhodnocovanie pretečenia časovača v prerušení.
Pozri AVR ExampleT1int.c