This is an old revision of the document!
Taimerid
Käesolev taimerite teek katab suure osa ATXmega128A1U taimerite funktsionaalsusest. Kuna AVR taimerid on erinevate kiipide vahel päris erinevad, siis ei saa nende kasutamiseks kirjutada universaalseid funktsioone. Ka kirjeldatavad ATXmega128A1U funktsioonid on suures osas lihtsalt primitiivsed registri muutmise või lugemise funktsioonid, kuid siiski on nad loetavamad kui registrid.
Andmetüübid
Timer wgm
Taimer 0/1 režiim. Väärtuste variandid ja tähendused:
TC_WGMODE_FRQ_gc - Sagedus generaator režiim
TC_WGMODE_SINGLESLOPE_gc - PWM režiim ainult üles loendusega
TC_WGMODE_DSTOP_gc - PWM režiim üles-alla loendusega, Registrite uuendus TOP väärtusel
TC_WGMODE_DSBOTH_gc - PWM režiim üles-alla loendusega, Registrite uuendus TOP ja BOTTOM väärtusel
TC_WGMODE_DSBOTTOM_gc - PWM režiim üles-alla loendusega, Registrite uuendus BOTTOM väärtusel
Timer katkestuste nimed ja prioriteedid. Kõik katkestused XMega seeria mikrokontrolleritel on prioritiseeritud.
* TC_OVFINTLVL - Ületäituvuse katkestus
* _OFF_gc - Katkestus ei ole lubatud
* _LO_gc - Madala prioriteediga katkestus
* _MED_gc - Keskmise prioriteediga katkestus
* _HI_gc - Kõrge prioriteediga katkestus
* TC_CCAINTLVL - Võrdlusregistri katkestus
* TC_CCBINTLVL - Võrdlusregistri katkestus
* TC_CCCINTLVL - Võrdlusregistri katkestus
* TC_CCDINTLVL - Võrdlusregistri katkestus
* _OFF_gc - Katkestus ei ole lubatud
* _LO_gc - Madala prioriteediga katkestus
* _MED_gc - Keskmise prioriteediga katkestus
* _HI_gc - Kõrge prioriteediga katkestus
===== Funktsioonid =====
* void TC0_ConfigClockSource( volatile TC0_t * tc, TC_CLKSEL_t clockSelection ); \\Timer0 taktigeneraatori seadistamine.
* tc - Taimeri port
* clockSelection - Kella seadistus
* void TC0_ConfigWGM( volatile TC0_t * tc, TC_WGMODE_t wgm ); \\Timer0 režiimi seadistamine.
* tc - Taimeri port
* wgm - režiimi seadistus
* void TC0_EnableCCChannels( volatile TC0_t * tc, uint8_t enableMask ); \\Timer0 signaaligenereerimis üksuste käivitamine
* tc - Taimeri port
* enableMask - Kanalid, mida käivitada (Võib loogilise OR tehtega käivitada korraga mitu)
* void TC0_DisableCCChannels( volatile TC0_t * tc, uint8_t disableMask ); \\Timer0 signaaligenereerimis üksuste seiskamine
* tc - Taimeri port
* disableMask - Kanalid, mida seisata (Võib loogilise OR tehtega seisata korraga mitu)
* void TC0_SetOverflowIntLevel( volatile TC0_t * tc, TC_OVFINTLVL_t intLevel ); \\Timer0 ületäituvuse katkestuse käivitamine
* tc - Taimeri port
* intLevel - ületäitumise katkestuse prioriteet
* void TC0_SetCCAIntLevel( volatile TC0_t * tc, TC_CCAINTLVL_t intLevel ); \\Timer0 signaaligenereerimis viigu A katkestuse seadistamine
* void TC0_SetCCBIntLevel( volatile TC0_t * tc, TC_CCBINTLVL_t intLevel ); \\Timer0 signaaligenereerimis viigu B katkestuse seadistamine
* void TC0_SetCCCIntLevel( volatile TC0_t * tc, TC_CCCINTLVL_t intLevel ); \\Timer0 signaaligenereerimis viigu C katkestuse seadistamine
* void TC0_SetCCDIntLevel( volatile TC0_t * tc, TC_CCDINTLVL_t intLevel ); \\Timer0 signaaligenereerimis viigu D katkestuse seadistamine
* tc - Taimeri port
* intLevel - Võrdlusregistri katkestuse prioriteet
* void TC0_Reset( volatile TC0_t * tc ); \\Timer0 taaskäivitus
* tc - Taimeri port
Kõik funktsioonid kehtivad sarnaselt ka Taimer1 kohta.
===== Makrod =====
* TC_SetCount( _tc, _count )
Võimaldab taimeri väärtust käsitsi muuta
* _tc - Taimeri moodul
* _count - seadesuurus
* TC_SetPeriod( _tc, _period )
Seadistab taimeri perioodi
* _tc - Taimeri moodul
* _period - perioodi seadesuurus
* TC_SetCompareA( _tc, _compareValue )
* TC_SetCompareB( _tc, _compareValue )
* TC_SetCompareC( _tc, _compareValue )
* TC_SetCompareD( _tc, _compareValue )
Sea väärtus, millega toimub kanali võrdlus
* _tc - Taimeri moodul
* _compareValue - seadesuurus
* TC_GetOverflowFlag( _tc )
Kontrolli ületäituvuse lippu
* _tc - Taimeri moodul
* TC_ClearOverflowFlag( _tc )
Puhasta ületäituvuse lipp
* _tc - Taimeri moodul
* TC_GetCCAFlag( _tc )
* TC_GetCCBFlag( _tc )
* TC_GetCCCFlag( _tc )
* TC_GetCCDFlag( _tc )
Kontrolli signaaligeneraatori lippu
* _tc - Taimeri moodul
* TC_ClearCCAFlag( _tc )
* TC_ClearCCBFlag( _tc )
* TC_ClearCCCFlag( _tc )
* TC_ClearCCDFlag( _tc )
Puhasta signaaligeneraatori lipp
* _tc - Taimeri moodul
* TC_GetCaptureA( _tc )
* TC_GetCaptureB( _tc )
* TC_GetCaptureC( _tc )
* TC_GetCaptureD( _tc )
Kontrolli sündmuste loendurit
* _tc - Taimeri moodul
===== Näide =====
Näites seadistatakse Pordi E Timer0 tavalisse loendamise režiimi ja lubatakse ületäitumise ning võrdluskanali A katkestus.
<code c>
#include <homelab/xmega/clksys_driver.h>
#include <homelab/pin.h>
#include <homelab/xmega/TC_driver.h>
#include <avr/interrupt.h>
Ületäituvuse katkestus
ISR(TCE0_OVF_vect)
{
led_on(led_green);
}
Võrdluskanali A katkestus
ISR(TCE0_CCA_vect)
{
led_off(led_green);
}
int main(void)
{
Homelab_clock_init();
Seadista roheline LED väljundiks
pin_setup_output(led_green);
led_off(led_green);
TC_SetPeriod(&TCE0, 20000); Seame taimer E0i perioodi
TC_SetCompareA(&TCE0, 15000); Seame taimer E0i töötsükli pikkuse
TC0_ConfigClockSource(&TCE0, TC_CLKSEL_DIV1024_gc); Seame taimer E0i taktsageduse (F_CPU/1024)
TC0_ConfigWGM(&TCE0, TC_WGMODE_NORMAL_gc); Seame taimer E0i töötama normaalrežiimis
TC0_SetOverflowIntLevel(&TCE0,TC_OVFINTLVL_HI_gc); Lubame ületäituvuse katkestuse kõrge prioriteediga
TC0_SetCCAIntLevel(&TCE0, TC_CCAINTLVL_MED_gc); Lubame värdluskanali A katkestuse keskmise prioriteediga
PMIC.CTRL |= PMIC_MEDLVLEN_bm|PMIC_HILVLEN_bm; Lubame keskmised ja kõrge prioriteedika katkestused
sei(); Lubame globaalselt katkestused
Tühi tsükkel, programm jookseb katkestuste peal
while(1);
}
</code>