16+
Среда
17 октября
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры AVR

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
Ксения  (01.05.2017 01:49 - 01.05.2017 01:56) , в ответ на Сразу включать DMA_CH_ENABLE_bm нельзя! автор: Idler
Несомненно! 
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 в следующий раз не перезагружаем, то он всегда постоянный.
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7527 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII