Обсуждаем контроллеры компании Atmel.
Ответить

АЦП на atmega328p нужна помощь в освоении

Пн янв 01, 2018 20:00:14

Салам всем котам 8) Хочу сделать чтобы ацп atmega328p работал в режиме фриран. А конкретнее, чтобы мониторил измениения входа ADC, уходил в прерывание ADC, а отуда передавал значения ADC по UART. Для этого написал прикрепленный ниже код. Данный код проверял в протеусе. По UART в терминал он мне передает верные значения входа ADC, но только один раз. Не понимаю почему. Ведь в настройках бит ADATE=1. Почему прерывание вызывается только один раз?
Вложения
adc.png
(28.12 KiB) Скачиваний: 755

Re: АЦП на atmega328p нужна помощь в освоении

Пн янв 01, 2018 22:34:33

АЦП с данным МК не применял. Но вот эта фраза из ДШ из описания регистра ADCSRB походу означает что АЦП надо запускать каждый раз ручками
Switching to Free Running mode (ADTS[2:0]=0) will not cause a trigger event, even if the ADC Interrupt Flag is set.

Re: АЦП на atmega328p нужна помощь в освоении

Пн янв 01, 2018 23:27:29

Switching to Free Running mode (ADTS[2:0]=0) will not cause a trigger event, even if the ADC Interrupt Flag is set.

Так в этом же абзаце ДШ сказано, так будет если в ADTE очищен, т.е. ADTE=0:
If ADATE is cleared, the ADTS[2:0] settings will have no effect

А у меня ADTE=1, а тогда :
If ADATE in ADCSRA is written to one, the value of these bits selects which source will trigger an ADC
conversion.
, режим ADC определяется так:
ADTS[2:0] Trigger Source
000 Free Running mode
001 Analog Comparator
010 External Interrupt Request 0
011 Timer/Counter0 Compare Match A
100 Timer/Counter0 Overflow
101 Timer/Counter1 Compare Match B
110 Timer/Counter1 Overflow
111 Timer/Counter1 Capture Event

А так как я не изменял значения битов ADTS[2:0], то в них нули, а это как раз и есть режим Free Running mode
Может откликнится тот, кто делал уже такое, подскажите в чем может быть косяк

Re: АЦП на atmega328p нужна помощь в освоении

Пн янв 01, 2018 23:55:19

<deleted>

Re: АЦП на atmega328p нужна помощь в освоении

Вт янв 02, 2018 09:11:28

В прерывании ISR (ADC_vect) после последнего transmit поставьте ADCSRA|=(1<<ADSC).

Re: АЦП на atmega328p нужна помощь в освоении

Вт янв 02, 2018 18:13:10

Огромное кошачье МЯ, и чедовеческое спасибо за ответы, особенно Dimon456 :beer: Теперь все как нодо работает :music:
Ответить