SYSTEMY PRZERWAŃ
SYSTEMY PRZERWAŃ
SYSTEMY PRZERWAŃ
Przerwanie ang. interrupt – sygnał skierowany do procesora wygenerowany przez sprzęt lub oprogramowanie wskazujący na zdarzenie, które wymaga natychmiastowej reakcji.
Przerwanie alarmuje procesor o wysokopriorytetowym zdarzeniu, które wymaga zaprzestania wykonywania bieżącego kodu.
SYSTEMY PRZERWAŃ
W odpowiedzi na przerwanie procesor: wstrzymuje swoje bieżące działania, zachowuje swój stan, wykonuje funkcję obsługi przerwania ang. Interrupt
Service Routine ISR lub Interrupt Handler skojarzoną z przerwaniem.
Po wykonaniu funkcji ISR procesor wznawia wykonywanie porzuconych wcześniej zadań.
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań
Przerwania sprzętowe;
Przerwania programowe;
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań sprzętowych
Przerwania zewnętrzne ang. external interrupt
Przerwania wewnętrzne ang. exceptions
SYSTEMY PRZERWAŃ
Przerwania sprzętowe zewnętrzne – używane są przez urządzenia w celu powiadomienia CPU, że wymagają uwagi z jego strony lub ze strony systemu operacyjnego.
Przerwania sprzętowe zewnętrzne – implementowane są jako sygnały elektryczne przesyłane do procesora z zewnętrznych urządzeń.
Przerwania sprzętowe zewnętrzne – są asynchroniczne w stosunku do wykonywanego programu (mogą pojawiać się w trakcie wykonywanej instrukcji).
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań wewnętrznych
Niepowodzenia ang. faults – sytuacja, w której aktualnie wykonywana operacja powoduje błąd, procesor powraca do wykonywania przerwanego kodu ponownie wykonuje przerwaną operację.
Pułapki ang. traps – sytuacja nie będąca błędem, jej wystąpienie wymaga wykonania określonego kodu, wykorzystywana przede wszystkim w debugerach.
Nienaprawialne ang. aborts – błędy, których nie można naprawić.
SYSTEMY PRZERWAŃ
Exceptions
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań zewnętrznych
Przerwania maskowalne ang. Maskable interrupts (IRQ): przerwania sprzętowe, które mogą być ignorowane poprzez ustawienie odpowiedniego bitu-maski w rejestrze IMR ang. Interrupt Mask Register.
Przerwania niemaskowalne ang. Non-maskable interrupts (NMI): – przetrwania, których nie można zignorować. Nie mają przypisanego bitu maski. NMI przypisane są do zdarzeń krytycznych lub zadań wysoko priorytetowych np. watchdog.
Przerwania międzyprocesorowe ang. Inter-processor interrupt (IPI): – szczególny rodzaj przerwań generowanych przez jeden procesor w celu przerwania pracy innego procesora w systemach wieloprocesorowych.
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań zewnętrznych
Przerwania fałszywe ang. Spurious interrupt – niepożądane przerwania wynikające z warunków pracy systemu, a np. generowane pod wpływem zakłóceń elektrycznych na linii IRQ bądź wynikające z błędnego projektu systemu.
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań zewnętrznych
Przerwanie precyzyjne ang. Precise interrupt – przerwanie, które pozostawia procesor w dobrze zdefiniowanym stanie. Warunki:
Ustalona jednoznacznie wartość licznika rozkazów (LR),
Wszystkie instrukcje przed tą wskazywaną przez LR są w pełni wykonane,
Żadna instrukcja po tej wskazywanej przez LR nie została wykonana,
Znany stan wykonania instrukcji wskazywanej aktualnie przez LR.
Przerwania precyzyjne wymagają dużo bardziej złożonej logiki procesora.
SYSTEMY PRZERWAŃ
Klasyfikacja przerwań zewnętrznych
Przerwania nieprecyzyjne ang. Imprecise interrupt – wszystkie pozostałe przerwania nie spełniające warunków przerwania precyzyjnego.
Przerwania nieprecyzyjne wymagają większego wykorzystania stosu, są źródłem wolniejszej obsługi.
Interrupt storm.
SYSTEMY PRZERWAŃ
SYSTEMY PRZERWAŃ
Można wyróżnić kilka podejść do obsługi przerwań: obsługa sekwencyjna — kolejne przerwanie (zgłoszone
podczas obsługi) obsługiwane jest po zakończeniu bieżącego,
obsługa zagnieżdżona — po zgłoszeniu nowego przerwania obsługa bieżącego jest zawieszana i kontynuowana po obsłużeniu przerwania nowo zgłoszonego,
obsługa priorytetowa — zawieszenie obsługi bieżącego przerwania następuje tylko wówczas, gdy nowo zgłoszone przerwanie ma wyższy priorytet, w przeciwnym razie obsługa następuje po obsłużeniu wszystkich zgłoszonych przerwań o wyższym priorytecie.
SYSTEMY PRZERWAŃ
Obsługa przerwań: Tryb rzeczywisty pracy procesora— ang. Real Mode: adres ISR zapisany jest w tablicy wektorów przerwań; przerwanie identyfikowane jest przez numer wektora
przerwań; w architekturze x86 możemy zdefiniować 256 przerwań; tablica wektorów przerwań 1024B (256 4-bajtowych
adresów).
SYSTEMY PRZERWAŃ
Obsługa przerwań: Tryb chroniony pracy procesora— ang. Protected Mode: tablica deskryptorów przerwań ang. Interrupt
Descriptor Table IDT łączy ona każdy wektor wyjątku lub przerwania z deskryptorem bramy – kontrolowany dostęp do segmentów kodu o różnych stopniach uprzywilejowana) dla procedury lub zadania (ang. task) – obsługującym dany wyjątek lub przerwanie; rozmiar IDT 256*8B;
położenie IDT jest zapisane w rejestrze tablicy deskryptorów przerwań (ang. Interrupt Descriptor Table Register IDTR);
SYSTEMY PRZERWAŃ
w IDT zdefiniowane mogą być trzy różne rodzaje deskryptorów bram: deskryptor bramy zadania, ang. Task-Gate
Descriptor - deskryptor używany przy sprzętowej wielozadaniowości, wskazuje położenie w pamięci struktury opisującej zadanie;
deskryptor bramy przerwania, ang. Interrupt-Gate Descriptor – informuje procesor o kodzie, który ma wykonać po wystąpieniu przerwania;
deskryptor bramy pułapki, ang. Trap-Gate Descriptor - zawierający lokalizację w kodzie, która gdy zostanie osiągnięta wywoła przerwanie - pułapkę (użyteczne przy debugowaniu).
SYSTEMY PRZERWAŃ
Warstwy oprogramowania operacji I/O
SYSTEMY PRZERWAŃ
x86 interrupt handling
SYSTEMY PRZERWAŃ
SYSTEMY PRZERWAŃ Obsługa przerwań w OS MsDOS
void set_interrupt_vme(){
_asm cli
/*save old INTVEC*/
BuforAdresuIRQ_VME2 = _dos_getvect( VME_INTVECT );
_dos_setvect( VME_INTVECT, MVME_INTERRUPT ) /* set new INTVEC */
andp( ICM_S, (unsigned char)~VME_MIRQ_S ); /* INT15 enabled */
/* odblokowanie CIO i obslugiwanych przerwan VME */
outp( VIMR, ( RS_MINT | PORT0_MINT) );
_asm sti
}
void clear_interrupt_vme()
{
outp( VIMR, 0xFE ); /* VME INT disabled */
orp ( ICM_S, VME_MIRQ_S ); /* INT15 disabled */
_dos_setvect( VME_INTVECT, BuforAdresuIRQ_VME2 ); /* restore old INTVEC */
}
SYSTEMY PRZERWAŃ Obsługa przerwań w OS MsDOS
#pragma check_stack (off)
void _interrupt _far MVME_INTERRUPT()
{
_asm{
cli
START_PRZERWANIA:
mov dx,VIPR ; odczytaj rejestr przerwań
in al,dx
and al,0xFE
cmp al,0
jz KONIEC_VME_INT
test al,PORT0_MINT
jnz PRZERWANIE_Z_PORTU_IO
jmp KONIEC_VME_INT
SYSTEMY PRZERWAŃ Obsługa przerwań w OS MsDOS
PRZERWANIE_Z_PORTU_IO:
mov dx,VIACKR+2*PORT1_INT ; odpowiedz IACK
in al,dx
cmp al,0x04 ; przerwanie od timer’a 1
je CT1
cmp al,0x02 ; przerwanie od timer’a 2
je CT2
cmp al,0x00 ; przerwanie od timer’a 3
je CT3
cmp al,0x3c
je ADC_
cmp al,0x06 ; błąd przerwania
je KONIEC_VME_INT
CT1:
jmp START_PRZERWANIA
KONIEC_VME_INT:
jmp EOI_VME
SYSTEMY PRZERWAŃ Obsługa przerwań w OS MsDOS
CT2:
les bx,V1
mov BYTE PTR es:[bx],BYTE PTR CT2CSR_REG ;kasuj flagę przerwania
mov BYTE PTR es:[bx],BYTE PTR RES_IPIUS|0x06
inc FIRST_SAMPLE
cmp FIRST_SAMPLE,0xFFFF
je STOP_CT2
jmp START_PRZERWANIA
STOP_CT2:
mov ax,FIRST_SAMPLE
xor ax,FIRST_SAMPLE
mov FIRST_SAMPLE,ax
jmp START_PRZERWANIA
CT3:
jmp START_PRZERWANIA
SYSTEMY PRZERWAŃ Obsługa przerwań w OS MsDOS
ADC_:
inc ADCDATA
inc FIRST_SAMPLE
cmp FIRST_SAMPLE,0xFFFF
je STOP_CT2
jmp START_PRZERWANIA
EOI_VME:
mov al,EOI8259 ;wyślij komendę EOI do kontrolerów
mov dx,IRR_M
out dx,al
mov dx,IRR_S
out dx,al
sti
} /* _asm */
}
#pragma check_stack (on)
SYSTEMY PRZERWAŃ
Obsługa przerwań w QNX Neutrino OS
Interrupt source
Programmable Interrupt Controller
μKERNEL
Driver A handler(){
…
return event;
}
main(){
…
}
Driver B
main(){
…
}
SYSTEMY PRZERWAŃ Obsługa przerwań w QNX Neutrino OS
Funkcje wykorzystywane w obsłudze przerwań: id = InterruptAttach (int intr,
struct sigevent *(*handler)(void *, int),
void *area, int size, unsigned flags);
id = InterruptAttachEvent (int intr, struct sigevent *event,
unsigned flags);
InterruptDetach (int id);
InterruptWait (int flags, uint64_t *reserved);
InterruptMask (int intr, int id);
InterruptUnmask (int intr, int id);
InterruptLock (struct intrspin *spinlock);
InterruptUnlock (struct intrspin *spinlock);
We have to obtain I/O permissions for these functions; ThreadCtl(_NTO_TCTL_IO, 0); We have to belong to a group of system administrators (root (userid 0)).
SYSTEMY PRZERWAŃ MSP430 Family
Trzy typy przerwań: System Reset. Przerwania niemaskowalne. Przerwania maskowalne.
Właściwości: Stałe priorytety przerwań określone przez położenie modułu w łańcuchu
połączeń. Przerwania od modułów położonych bliżej procesora posiadają wyższy
priorytet.
SYSTEMY PRZERWAŃ MSP430 Family
SYSTEMY PRZERWAŃ MSP430 Family
Non-Maskable Interrupts NMI (Non)-maskable NMI interrupts are not masked by the general
interrupt enable bit (GIE), but are enabled by individual interrupt enable bits (ACCVIE, NMIIE, OFIE).
When a NMI interrupt is accepted, all NMI interrupt enable bits are automatically reset.
User software must set the required NMI interrupt enable bits for the interrupt to be re-enabled.
A (non)-maskable NMI interrupt source: An edge on the RST/NMI pin when configured in NMI mode An oscillator fault occurs An access violation to the flash memory
SYSTEMY PRZERWAŃ MSP430 Family
Maskable Interrupts MI Maskable interrupts are caused by peripherals with interrupt
capability including the watchdog timer overflow in interval-timer mode.
Each maskable interrupt source can be disabled individually by an interrupt enable bit.
All maskable interrupts can be disabled by the general interrupt enable (GIE) bit in the status register (SR).
AVR XMEGA Interrupt Controller
Właściwości systemu przerwań: 3 poziomy przerwań: low, medium, high; szeregowanie karuzelowe ang. round-robin przerwań na niskim
poziomie; programowalne priorytety przerwań na niskim poziomie; Wygenerowanie przerwania następuje po spełnieniu poniższych warunków:
Spełnione są
wszystkie warunki,
które ustawiają
flagę przerwania
Przerwanie odblokowane jest w
module peryferyjnym
Poziom przerwania odblokowany jest w
kontrolerze przerwań
Globalna flaga przerwań w CPU jest
odblokowana
AVR XMEGA Interrupt Controller
AVR XMEGA Interrupt Controller
Kolejność wykonywania przerwań określona jest po pierwsze przez ich poziom, a następnie przez ich priorytet. Poziom przerwania ustalany jest indywidualnie dla przerwań w module, w którym będą generowane, natomiast priorytet określony jest przez stały adres wektora przerwań ang. Interrupt Vector Address. Alternatywnie, priorytet przerwań niskopoziomowych może bazować na algorytmie round-robin sterowanym za pomocą kontrolera przerwań. Przerwanie niemaskowalne ang. Non-Maskable Interrupt (NMI) jest to specjalne przerwanie, które nie może być zablokowane i jest wykorzystywane do sygnalizowania zdarzeń krytycznych w systemie. NMI może wskazywać usterkę rezonatora kwarcowego.
AVR XMEGA Interrupt Controller
AVR XMEGA Interrupt Controller
AVR XMEGA Interrupt Controller
Problemy: W wielopoziomowych systemach przerwań wywłaszczanie przerwań
nisko-priorytetowych przez przerwania o wysokim priorytecie. Rozmiar stosu. Ochrona dostępu do rejestrów i danych o rozmiarze przekraczającym 8
bitów. Magistrala danych AVR jest 8-bitowa i przesyłanie danych 16- lub 32-bitowych wymaga wykonania większej liczby instrukcji. Możliwa jest sytuacja iż przerwanie wystąpi w czasie przesyłania wielobajtowej danej. Jeżeli 16-bitowa zmienna używana jest w głównej pętli programu i jest modyfikowana w ISR, może zostać nadpisana. Podobna sytuacja może mieć miejsce w czasie wywłaszczania przerwań.
AVR XMEGA Interrupt Controller
Rozwiązanie: Stosowanie operacji atomowych do modyfikacji danych w ISR. Globalna blokada przerwań w czasie dostępu do zmiennych. Zachowywanie i przywracanie rejestrów tymczasowych.
AVR XMEGA Interrupt Controller
Przykład: void SetUp_USARTC0(){
cli(); /* Disable interrupts for setup */
/*Step 1) Set the TxD pin value high, and clear the RxD pin */
PORTC.OUTSET = PIN3_bm;
PORTC.OUTCLR = PIN2_bm;
PORTC.DIRSET = PIN3_bm; /* PC3 (TXD0) as output. */
PORTC.DIRCLR = PIN2_bm; /* PC2 (RXD0) as input. */
/* Baud rate selection */
/* BSEL = (14745600 / (2^0 * 16*19200) -1 = 47-> BSCALE = 0 */
/* FBAUD = ( (14745600)/(2^0*16(47+1)) = 19200-> it's alright*/
USARTC0_BAUDCTRLB = 0; /* Just to be sure that BSCALE is 0 */
USARTC0_BAUDCTRLA = 0x2F; /* 47 */
AVR XMEGA Interrupt Controller
/* Disable interrupts, just for safety */
USARTC0_CTRLA = 0;
/* 8 data bits, no parity and 1 stop bit */
USARTC0_CTRLC = USART_CHSIZE_8BIT_gc;
/* Enable receive and transmit */
USARTC0_CTRLB = USART_TXEN_bm | USART_RXEN_bm;
/* Enable interrupts */
USARTC0_CTRLA = USART_RXCINTLVL_LO_gc |
USART_DREINTLVL_LO_gc;
/* Enable PMIC interrupt level low. */
PMIC.CTRL |= PMIC_LOLVLEN_bm;
USARTC0.STATUS &= (0<<PIN7_bp);
sei();
};
AVR XMEGA Interrupt Controller
ISR(USARTC0_DRE_vect){
if (TxD_Data_count_C0 == FRAME_LEN){
uint8_t tempCTRLA = USARTC0.CTRLA;
tempCTRLA = ( tempCTRLA & ~USART_DREINTLVL_gm) |
USART_DREINTLVL_OFF_gc;
USARTC0.CTRLA = tempCTRLA; // Disable DRE int
}
else{
/* Start transmitting. */
sendChar_USARTC0(C0_TxD_BUFFER[TxD_Data_count_C0]);
TxD_Data_count_C0++;
}
}
AVR XMEGA Interrupt Controller
ISR(USARTC0_RXC_vect){
C0_RxD_BUFFER[RxD_Data_count_C0] = USARTC0.DATA;
RxD_Data_count_C0++;
if(RxD_Data_count_C0 == FRAME_LEN) RxD_Data_flag_C0=1;
}
AVR XMEGA
Interrupt Controller
SYSTEMY PRZERWAŃ
ARM Generic Interrupt Controller – AITC
Nuvoton ARM CortexTM-M0 Nested Vectored Interrupt Controller (NVIC)
Ściśle sprzężony z jądrem procesora i zapewniający następujące funkcjonalności: Wsparcie zagnieżdżonych i wektorowanych przerwań; Automatyczne zachowywanie i przywracanie stanu procesora; Zmniejszone i deterministyczne opóźnienie reakcji na przerwanie.
Nuvoton ARM CortexTM-M0 Nested Vectored Interrupt Controller (NVIC)
Nuvoton ARM CortexTM-M0 Nested Vectored Interrupt Controller (NVIC)
Nuvoton ARM CortexTM-M0
TI DSP C6000
Cztery typy przerwań kierowanych do CPU: Reset – najwyższy priorytet; Przerwania maskowalne – 12 przerwań MI o niższym
priorytecie niż NMI, reset i wyjątki; przerwania te mogą być powiązane z urządzeniami zewnętrznymi, zintegrowanymi układami peryferyjnymi lub oprogramowaniem;
Przerwania NMI – używane są do powiadamiania CPU o istotnych problemach sprzętowych np. awaria zasilania;
Wyjątki;
TI DSP C6000
TI DSP C6000
The following conditions must be met to process a maskable interrupt: The global interrupt enable bit (GIE) bit in the control
status register (CSR) is set to1. The NMIE bit in the interrupt enable register (IER) is
set to 1. The corresponding interrupt enable (IE) bit in the IER
is set to 1. The corresponding interrupt occurs, which sets the
corresponding bit in the interrupt flags register (IFR) to 1 and there are no higher priority interrupt flag (IF) bits set in the IFR.
TI DSP C6000
TI DSP C6000
TI DSP C6000
TI DSP C6000
Trzy typy wyjątków w CPU: Zewnętrzy maskowalny wyjątek. Zewnętrzny niemaskowalny wyjątek. Zbiór wewnętrznych wyjątków niemaskowalnych.
TI DSP C6000
AVR XMEGA – EVENT SYSTEM
W systemie zdarzeń możemy wyróżnić trzy odrębne części: generatory zdarzeń ang. event generators, które
mogą posiadać jedno lub wiele źródeł zdarzeń; sieć dostarczania zdarzeń ang. event routing
network; użytkownicy zdarzeń ang. event users.
AVR XMEGA – EVENT SYSTEM
AVR XMEGA – EVENT SYSTEM
AVR XMEGA – EVENT SYSTEM
AVR XMEGA – EVENT SYSTEM
W systemie zdarzeń uC XMEGA możemy wyróżnić dwa typy zdarzeń zdarzenia sygnalizacyjne ang. signaling events i zdarzenia danych ang. data events. Zdarzenia sygnalizacyjne nie zawierają żadnych informacji poza faktem wystąpienia określonego zdarzenia. Zdarzenia danych zawierają dodatkowe informacje o zdarzeniu. Ustawienie typu zdarzenia następuje po stronie źródła zdarzenia.
AVR XMEGA – EVENT GENERATOR
Generatorem zdarzenia jest moduł peryferyjny, który posiada jedno lub wiele źródeł zdarzeń. Ogólnie występuje silna korelacja pomiędzy dostępnymi źródłami zdarzeń a źródłami przerwań i kanałami DMA, należącymi do modułu peryferyjnego. Generator zdarzeń dołącza wszystkie swoje źródła zdarzeń do sieci przesyłania zdarzeń i nie jest świadomy, które z tych źródeł będzie używane przez inny moduł.
AVR XMEGA
Sieć dostarczania zdarzeń ang. Event Routing Network zajmuje się dostarczaniem zdarzeń od generatorów zdarzeń do
ich użytkowników. Sieć dostarczania zdarzeń składa się 8
równorzędnych kanałów.
Każdy kanał zawiera multiplekser (sterowany rejestrem CHnMUX register) i logikę sterująco filtrującą (sterowaną rejestrem CHnCTRL register), gdzie n jest numerem kanału.
Wszystkie źródła zdarzeń każdego generator zdarzeń podłączone są do wejścia każdego z ośmiu multiplekserów. Oznacza to że każdy kanał zdarzeń może być dołączony do dowolnego źródła zdarzeń. Kilka kanałów zdarzeń może być wybranych do przekazywania zdarzeń z tego samego źródła.
AVR XMEGA – EVENT USER
Użytkownikiem zdarzenia jest modułem peryferyjnym, który może wykorzystywać zdarzenie do wywołania działania, określanego jako działanie zdarzenia. Użytkownik zdarzenia wybiera źródło zdarzenia, na które ma reagować, wybierając kanał zdarzeń. Rzeczywiste źródło zdarzeń jest określane przez ustawienie multipleksera na wybrany kanał zdarzenia. Użytkownik zdarzeń może być jednocześnie generatorem zdarzeń. Układ Timer/Counter posiada kilka źródeł zdarzeń i jednocześnie może używać zdarzeń od innych modułów peryferyjnych do wyzwolenia zliczania impulsów.
AVR XMEGA – EVENT TIMING
Możliwe jest generowanie zdarzeń z poziomu oprogramowania lub z wykorzystaniem systemu debugowania.
Generowane zdarzenia są dostarczane bezpośrednio do kanałów zdarzeń.
Kanał zdarzeń nie musi mieć przypisanego źródła zdarzenia aby możliwe było ręczne generowanie zdarzeń. W przypadku gdy źródło zdarzenia jest skojarzone z kanałem zdarzeń, to ręcznie wygenerowane zdarzenie ma wyższy priorytet i nadpisze zdarzenie generowane przez układ peryferyjny.
AVR XMEGA – EVENT TIMING
Ręczna generacja zdarzeń możliwa jest poprzez wykorzystanie dwóch rejestrów STROBE i DATA. Generacja zdarzenia jest wyzwalana poprzez wpis do rejestru STROBE.
Do generacji zdarzenia sygnalizacyjnego potrzebny jest rejestr STROBE.
Kiedy chcemy wygenerować zdarzenie danych, wykorzystane muszą być oba rejestry STROBE i DATA, przy czym wpis do rejestru STROBE musi nastąpić po zapisie do rejestru DATA.
Rejestry STROBE i DATA zawierają bity odpowiadające każdemu z 8 kanałów zdarzeń. Bit n odpowiada n-temu kanałowi.
Możliwa jest generacja zdarzeń w kilku kanałach jednocześnie w tym samym czasie poprzez odpowiedni wpis do rejestrów.
AVR XMEGA – EVENT SYSTEM
System zdarzeń jest aktywny w trybie pracy ACTIVE MODE i IDLE MODE. We wszystkich pozostałych trybach ograniczonego poboru energii układy peryferyjne nie mogą wykorzystywać systemu zdarzeń.
AVR XMEGA – EVENT SYSTEM
Realizacja 32-bitowego licznika przy wykorzystaniu systemu zdarzeń.
AVR XMEGA – EVENT SYSTEM
/* Configure PD0 as input, sense on both edges. */
PORTD.PIN0CTRL = PORT_ISC_BOTHEDGES_gc;
PORTD.DIRCLR = 0x01;
/* Select TCC0 overflow as event channel 0
multiplexer input. (Overflow propagation) */
EVSYS_SetEventSource(0, EVSYS_CHMUX_TCC0_OVF_gc);
/* Select PD0 as event channel 1 multiplexer input.
(Input capture) */
EVSYS_SetEventSource(1, EVSYS_CHMUX_PORTD_PIN0_gc);
AVR XMEGA – EVENT SYSTEM
/*Select event channel 0 as clock source for TCC1.
*/
TCC1.CTRLA = TC_CLKSEL_EVCH0_gc;
/* Configure TCC0 for input capture. */
TCC0.CTRLD = (uint8_t) TC_EVSEL_CH1_gc |
TC_EVACT_CAPT_gc;
/* Configure TCC1 for input capture with event
delay. */
TCC1.CTRLD = (uint8_t) TC_EVSEL_CH1_gc |
TC0_EVDLY_bm |
TC_EVACT_CAPT_gc;
AVR XMEGA – EVENT SYSTEM
/* Enable Compare or Capture Channel A for both
timers. */
TCC0.CTRLB = TC0_CCAEN_bm;
TCC1.CTRLB = TC1_CCAEN_bm;
/* Select system clock as clock source for TCC0. */
TCC0.CTRLA = TC_CLKSEL_DIV1_gc;
while (1) {
if ( TCC0.INTFLAGS & TC0_CCAIF_bm ) {
/*Clear interrupt flag when new value is
captured. The last capture value is now
available in the CCA register. */
TCC0.INTFLAGS |= TC0_CCAIF_bm;
TCC1.INTFLAGS |= TC1_CCAIF_bm;
}
}
AVR XMEGA – EVENT SYSTEM /*Select TC overflow as event channel 0 multiplexer
input. */
EVSYS_SetEventSource(0, EVSYS_CHMUX_TCC0_OVF_gc);
/*Configure ADC A event channel and configure which
channels to sweep and enable channel sweep.*/
ADCA.EVCTRL = (uint8_t) ADC_SWEEP_0123_gc |
ADC_EVSEL_0123_gc |
ADC_EVACT_SWEEP_gc;
/* Configure the input of the ADC channels and
single ended mode. */
ADCA.CH0.MUXCTRL = (uint8_t)ADC_CH_MUXPOS_PIN4_gc |
ADC_CH_MUXNEG_PIN0_gc;
ADCA.CH0.CTRL = ADC_CH_INPUTMODE_SINGLEENDED_gc;
AVR XMEGA – EVENT SYSTEM
/* Configure prescaler, resolution, singed mode
and set voltage reference to internal Vcc - 0.6.
Finally enable ADC.*/
ADCA.PRESCALER = ( ADCA.PRESCALER &
~ADC_PRESCALER_gm ) |
ADC_PRESCALER_DIV8_gc;
ADCA.CTRLB = ( ADCA.CTRLB & ~ADC_RESOLUTION_gm )|
ADC_RESOLUTION_12BIT_gc;
ADCA.CTRLB = ( ADCA.CTRLB & ~( ADC_CONMODE_bm |
ADC_FREERUN_bm ) );
ADCA.REFCTRL = ( ADCA.REFCTRL & ~ADC_REFSEL_gm ) |
ADC_REFSEL_VCC_gc;
ADCA.CTRLA |= ADC_ENABLE_bm;
AVR XMEGA – EVENT SYSTEM
/* Configure TCC0 with the desired frequency and
period. */
TCC0.PER = 0xFFFF;
TCC0.CTRLA = TC_CLKSEL_DIV1_gc;
while (1) {
/* Wait while ADC sweeps on every TCC0 Overflow. */
}