Несомненно! 1. Моя ошибка, исправила.
2. Переправила на =.
3. В IAR прерывание именно так и описываются (через #prаgma перед функцией).
А это зарезервированные имена, которые можно для этой цели использовать:
/* DMA interrupt vectors */
#define DMA_CH0_vect 0x0018 /* Channel 0 Interrupt */
#define DMA_CH1_vect 0x001C /* Channel 1 Interrupt */
#define DMA_CH2_vect 0x0020 /* Channel 2 Interrupt */
#define DMA_CH3_vect 0x0024 /* Channel 3 Interrupt */
Я использовала DMA_CH0_vect, ассемблер тоже вроде нормальный откомпилировался:
__interrupt void isrDMA0()
\ isrDMA0:
{
\ 00000000 93FA ST -Y, R31
\ 00000002 93EA ST -Y, R30
\ 00000004 933A ST -Y, R19
\ 00000006 932A ST -Y, R18
\ 00000008 931A ST -Y, R17
\ 0000000A 930A ST -Y, R16
\ 0000000C B71F IN R17, 0x3F
\ 0000000E B72B IN R18, 0x3B
Flag |= Flag_DMA;
\ 00000010 .... LDI R30, LOW(TestFreq)
\ 00000012 .... LDI R31, (TestFreq) >> 8
\ 00000014 E030 LDI R19, 0
\ 00000016 BF3B OUT 0x3B, R19
\ 00000018 A500 LDD R16, Z+40
\ 0000001A 6800 ORI R16, 0x80
\ 0000001C A700 STD Z+40, R16
DMA.INTFLAGS |= DMA_CH0TRNIF_bm;
\ 0000001E E0E3 LDI R30, LOW(259)
\ 00000020 E0F1 LDI R31, (259) >> 8
\ 00000022 8100 LD R16, Z
\ 00000024 6001 ORI R16, 0x01
\ 00000026 8300 ST Z, R16
}
\ 00000028 BF2B OUT 0x3B, R18
\ 0000002A BF1F OUT 0x3F, R17
\ 0000002C 9109 LD R16, Y+
\ 0000002E 9119 LD R17, Y+
\ 00000030 9129 LD R18, Y+
\ 00000032 9139 LD R19, Y+
\ 00000034 91E9 LD R30, Y+
\ 00000036 91F9 LD R31, Y+
\ 00000038 9518 RETI
Не поняла только, зачем он в 0x3B по дороге нулик пишет.
4. У меня на плате старая ATxmega128A1 еще без USB, но и канал АЦП мне нужен только один, а потому проблемы с этим возникнуть не должно.
5. Правильно ли я поняла, что бит DMA_CH0TRNIF_bm в регистре DMA_INTFLAGS по завершении задания установится все равно, даже если я прерывания не разрешала?
6. Ура! Даже не ожидала этого - думала, что раз уж TRFCNT в следующий раз не перезагружаем, то он всегда постоянный.