Taimerid XMega
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 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.
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
void TC0_DisableCCChannels( volatile TC0_t * tc, uint8_t disableMask );
Timer0 signaaligenereerimis üksuste seiskamine
void TC0_SetOverflowIntLevel( volatile TC0_t * tc, TC_OVFINTLVL_t intLevel );
Timer0 ületäituvuse katkestuse käivitamine
void TC0_SetCCAIntLevel( volatile TC0_t * tc, TC_CCAINTLVL_t intLevel );
void TC0_SetCCBIntLevel( volatile TC0_t * tc, TC_CCBINTLVL_t intLevel );
void TC0_SetCCCIntLevel( volatile TC0_t * tc, TC_CCCINTLVL_t intLevel );
void TC0_SetCCDIntLevel( volatile TC0_t * tc, TC_CCDINTLVL_t intLevel );
Timer0 signaaligenereerimis viigu A/B/C/D katkestuse seadistamine
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_SetCompareA( _tc, _compareValue )
TC_SetCompareB( _tc, _compareValue )
TC_SetCompareC( _tc, _compareValue )
TC_SetCompareD( _tc, _compareValue ) Sea väärtus, millega toimub kanali võrdlus
TC_GetOverflowFlag( _tc ) Kontrolli ületäituvuse lippu
TC_ClearOverflowFlag( _tc ) Puhasta ületäituvuse lipp
TC_GetCCAFlag( _tc )
TC_GetCCBFlag( _tc )
TC_GetCCCFlag( _tc )
TC_GetCCDFlag( _tc ) Kontrolli signaaligeneraatori lippu
TC_ClearCCAFlag( _tc )
TC_ClearCCBFlag( _tc )
TC_ClearCCCFlag( _tc )
TC_ClearCCDFlag( _tc ) Puhasta signaaligeneraatori lipp
TC_GetCaptureA( _tc )
TC_GetCaptureB( _tc )
TC_GetCaptureC( _tc )
TC_GetCaptureD( _tc ) Kontrolli sündmuste loendurit
Näide
Näites seadistatakse Pordi E Timer0 tavalisse loendamise režiimi ja lubatakse ületäitumise ning võrdluskanali A katkestus.
#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)
{
// Seadista roheline LED väljundiks
pin_setup_output(led_green);
led_off(led_green);
// Seame taimer E0i perioodi
// Seame taimer E0i töötsükli pikkuse
TC_SetPeriod(&TCE0, 20000);
TC_SetCompareA(&TCE0, 15000);
// Seame taimer E0i taktsageduse (F_CPU/1024)
TC0_ConfigClockSource(&TCE0, TC_CLKSEL_DIV1024_gc);
// Seame taimer E0i töötama normaalrežiimis
TC0_ConfigWGM(&TCE0, TC_WGMODE_NORMAL_gc);
// Lubame ületäituvuse katkestuse kõrge prioriteediga
// Lubame värdluskanali A katkestuse keskmise prioriteediga
TC0_SetOverflowIntLevel(&TCE0,TC_OVFINTLVL_HI_gc);
TC0_SetCCAIntLevel(&TCE0, TC_CCAINTLVL_MED_gc);
// Lubame keskmised ja kõrge prioriteedika katkestused
// Lubame globaalselt katkestused
PMIC.CTRL |= PMIC_MEDLVLEN_bm|PMIC_HILVLEN_bm;
sei();
//Tühi tsükkel, programm jookseb katkestuste peal
while(1);
}