Вопрос такой: после работы с АЦП без ПДП не получается работать с АЦП по ПДП. АЦП работает (данные идут в ADC12MEM0 и взводится флаг ADC12IFG0), но данные в буфер не копируются. Если после запуска МК сразу начать работать с АЦП по ПДП, то буфер заполняется.
Как заставить работать АЦП по ПДП после использования АЦП без ПДП?
Инициализация АЦП, частота TB0.0 400 кГц:</p><p>
Код
mov #ADC12SHT1_15|ADC12SHT0_1|ADC12ON|ADC12REFON|ADC12REF2_5V,&adc12ctl0;выборка 1024 и 8 тактов
mov #ADC12CSTARTADD_0|ADC12SHS_2|ADC12SHP|ADC12DIV_3|ADC12SSEL_3|ADC12CONSEQ_2,&adc12ctl1;ADCClk=5 МГц (от SMClk), повтор с одного канала, запрос от TB0.0
mov #ADC12RES_3,&adc12ctl2 ;12 разрядов
mov.b #ADC12SREF_7|ADC12INCH_0 |ADC12EOS,&adc12mctl0
mov.b #ADC12SREF_2|ADC12INCH_8 |ADC12EOS,&adc12mctl8
mov.b #ADC12SREF_2|ADC12INCH_9, &adc12mctl9
mov.b #ADC12SREF_1|ADC12INCH_10,&adc12mctl10
mov.b #ADC12SREF_1|ADC12INCH_11|ADC12EOS,&adc12mctl11
mov #ADC12CSTARTADD_0|ADC12SHS_2|ADC12SHP|ADC12DIV_3|ADC12SSEL_3|ADC12CONSEQ_2,&adc12ctl1;ADCClk=5 МГц (от SMClk), повтор с одного канала, запрос от TB0.0
mov #ADC12RES_3,&adc12ctl2 ;12 разрядов
mov.b #ADC12SREF_7|ADC12INCH_0 |ADC12EOS,&adc12mctl0
mov.b #ADC12SREF_2|ADC12INCH_8 |ADC12EOS,&adc12mctl8
mov.b #ADC12SREF_2|ADC12INCH_9, &adc12mctl9
mov.b #ADC12SREF_1|ADC12INCH_10,&adc12mctl10
mov.b #ADC12SREF_1|ADC12INCH_11|ADC12EOS,&adc12mctl11
Инициализация ПДП:
Код
clr &DMACTL4 ;ПДП
bic #DMAEN,&dma0ctl
bic #DMAEN,&dma1ctl
mov #DMA0TSEL_19|DMA1TSEL_5,&DMACTL0 ;DMA0 - UCB0TX (vs1011), DMA1 - TB0.0 (формирование синуса)
mov #DMA2TSEL_24,&DMACTL1 ;DMA2 - ADC12IFG
movx.a #adc12mem0,&dma2sa
movx.a #lcz_buffer,&dma2da
mov #lcz_buffer_len/2,&dma2sz
movx.a #sin_20k_pwm,&dma1sa
movx.a #tb0ccr0+2*lcz_20khz_bit,&dma1da
mov #sin_20k_pwm_len,&dma1sz</p><p>
bic #DMAEN,&dma0ctl
bic #DMAEN,&dma1ctl
mov #DMA0TSEL_19|DMA1TSEL_5,&DMACTL0 ;DMA0 - UCB0TX (vs1011), DMA1 - TB0.0 (формирование синуса)
mov #DMA2TSEL_24,&DMACTL1 ;DMA2 - ADC12IFG
movx.a #adc12mem0,&dma2sa
movx.a #lcz_buffer,&dma2da
mov #lcz_buffer_len/2,&dma2sz
movx.a #sin_20k_pwm,&dma1sa
movx.a #tb0ccr0+2*lcz_20khz_bit,&dma1da
mov #sin_20k_pwm_len,&dma1sz</p><p>
sin_20k_pwm - таблица шим-значений для генерации синуса 20 кГц
sin_20k_pwm_len - ее длина (=20)
lcz_buffer - буфер, куда надо складывать значения с АЦП
lcz_buffer_len - его длина (= 5120)
lcz_20khz_bit - номер канала таймера для генерации синуса (=6)
Работа с АЦП без ПДП:
Включить ADC12ENC, дождаться установки ADC12IFG, выключить ENC, считать ADC12MEM0 в регистр, считать ADC12IV в регистр, сбросить ADC12IFG (уже танцы с бубном)
Запуск с АЦП по ПДП (режим DMADT_4)
Код
dint ;синхронный запуск АЦП и ШИМ-синуса
xor r4,r4
mov #DMADT_4|DMADSTINCR_3|DMASWDW|DMAEN|DMAIE,&dma2ctl
bic #TBIFG,&tb0ctl
lm_sync_wait:
bit #TBIFG,&tb0ctl
jz lm_sync_wait
bis #ADC12ENC,&adc12ctl0 ;запускаем АЦП
mov #DMADT_4|DMASRCINCR_3|DMASBDW|DMAEN,&dma1ctl ;включаем синус 20 кГц
bic #CCIFG,&tb0cctl0+2*lcz_adctimer_channel
eint
xor r4,r4
mov #DMADT_4|DMADSTINCR_3|DMASWDW|DMAEN|DMAIE,&dma2ctl
bic #TBIFG,&tb0ctl
lm_sync_wait:
bit #TBIFG,&tb0ctl
jz lm_sync_wait
bis #ADC12ENC,&adc12ctl0 ;запускаем АЦП
mov #DMADT_4|DMASRCINCR_3|DMASBDW|DMAEN,&dma1ctl ;включаем синус 20 кГц
bic #CCIFG,&tb0cctl0+2*lcz_adctimer_channel
eint