19.02.2019, 21:58
|
|
Прохожий
Регистрация: 19.02.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC -> DMA -> UART прерывния
Сообщение от eddy
|
Чтобы обеспечить постоянную загрузку канала я бы сделал так. Запускаем ПДП на АЦП. На середине заполнения буфера выставляем флаг, что можно запускать ПДП на уарт. Прерывание по окончанию буфера АЦП не нужно. А вот по окончанию передачи уартом - нужно. Как только передача закончилась, опять запускаем заполнение буфера со стороны АЦП, а пока он первую половину заполняет, отправляем метку, что предыдущая порция данных кончилась и сейчас пойдет новая. А тут и флаг, разрешающий отправку, подоспеет. В принципе, можно вообще без него работать и сразу после отправления метки запускать ПДП на отправку буфера.
|
Значит я был не так и далек от истины т.к. примерно такому ходу мыслей я и следовал. У меня нет прерываний АЦП. А в настройках ПДП у меня как раз и установлены запросы прерываний на HT (половина) на TC (полный) строки 73 и 74 приложенного кода.
У меня сейчас вопрос даже не по реализации получения/передачи как таковой, у меня прерывания не обрабатываются, а вот почему я понять и не могу
|
|
|
|
19.02.2019, 22:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 116
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: ADC -> DMA -> UART прерывния
pavell, я ж говорю: надо надергать инициализации из сниппетов!
Там и более компактно записано, и с нормальными комментариями, и работает!
Я, кстати, понял, что судя по коду, читается только один канал АЦП, т.е. передавать надо квазинепрерывно → сделать что-то вроде звуковой карты. Можно, кстати, и сделать из МК псевдозвуковушку и слать себе данные по USB.
Ну, а если так хочется по уарту добиться псевдо-реального времени, то лучше воспользоваться двойной буферизацией. Алгоритм:
0. N = 0
1. заполняем буфер N данными с АЦП, на середине заполнения выставляем в прерывании флаг; по этому флагу запускаем передачу по уарту буфера N (когда уарт свободен)
2. N = !N, ждем прерывания половины передачи данных по уарту; как только оно произошло, переходим к п.1; в прерывании по окончании передачи выставляем флаг - уарт свободен.
В результате уарт будет постоянно передавать данные то из одного буфера, то из другого. Квазинепрерывно.
В main просто будет происходить проверка двух флагов: свободен ли уарт и заполнен ли очередной буфер (в качестве флага можно использовать номер буфера + 1). Если там еще полным-полно чего происходит, то можно попробовать этот функционал прямо в прерывания запихнуть. Но я, например, стараюсь слишком длинные обработчики прерываний не делать, некошерно это. Там только флаги должны устанавливаться/сниматься.
__________________
Союз Советских Социалистических Округов Северной Америки
Последний раз редактировалось eddy; 19.02.2019 в 22:22.
|
|
|
|
20.02.2019, 00:16
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: ADC -> DMA -> UART прерывния
pavell, в отладчике после init проверяйте состояние всех флагов по DS (вообще всех, а не только установленных в Вашей программе). Что-то пошло не так именно там, поскольку считаем камень рабочим и демонов Максвелла не привлекаем
PS Что-то я про вектора прерываний ещё забыл упомянуть - их тоже проверить…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 20.02.2019 в 05:51.
|
|
|
|
21.02.2019, 20:27
|
|
Прохожий
Регистрация: 19.02.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC -> DMA -> UART прерывния
Из последнего, что нарыл - программа заходит в default_handler, осталось найти почему
|
|
|
|
21.02.2019, 21:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,637
Сказал спасибо: 116
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: ADC -> DMA -> UART прерывния
Сообщение от pavell
|
осталось найти почему
|
Очевидно, потому, что не объявлен свой обработчик прерываний.
Нужно внимательно смотреть, правильно ли указано имя функции-обработчика. Сравнить с таблицей имен векторов в vector.c или где там оно у вас перечисляется.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
23.02.2019, 11:11
|
|
Прохожий
Регистрация: 19.02.2019
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: ADC -> DMA -> UART прерывния
Благодаря знающим людям проблема решена и причина ее тривиальна - extertn "C"
Спасибо за помощь
Последний раз редактировалось pavell; 23.02.2019 в 12:33.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:50.
|
|