Например TDA7294

Форум РадиоКот • Просмотр темы - Вопрос по АЦП ATmega8
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 24, 2024 17:20:26

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Вопрос по АЦП ATmega8
СообщениеДобавлено: Пн май 07, 2018 18:26:36 
Это не хвост, это антенна
Аватар пользователя

Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22
Сообщений: 1368
Откуда: Беларусь
Рейтинг сообщения: 0
Впервые пробую вариант с оверсемплингом. Столкнулся с следующей проблемой: 512 раз выполняется измерение на 2 канала АЦП, в прерывании идет суммирование по каналам. По окончании необходимого количества отсчетов запрещаетсяпрерывание от АЦП и выставляется флаг для обработки полученных данных.
В подпрограмме обработки выполняю однократное измерение АЦП в канале 7, после чего разрешаю прерывания от АЦП, предварительно сбросив флаг ADIF и запускаю режим Free Running.
В один прекрасный момент времени (от секунд, до 5-ти часов) происходит сброс флага ADIE, регистра ADCSRA. И все - работа устройства нарушена. Причем это происходит как в железе, так и в Proteus... При этом состояние счетчика overs в Proteus всегда равно 0! Следовательно логично предположить о том, что затирается флаг ADC_DATA регистра flags+0 именно в момент выхода из прерывания по АЦП и нет выхода на участок обработки. Пробовать менять бит флага на другой? Замена адреса регистра ни к чему не привела...
Косвенную адресацию по коду проглядывал, регистр ADCSRA нигде не портится. Регистр флагов, в котором выставляется флаг готовности данных - тоже. Можно, конечно, заменить этот флаг на проверку запрета прерываний от АЦП - ADCSRA,ADIE... Но это не отменит моего вопроса. Может какие есть подводные камни?
Участки кода:
Прерывания:
СпойлерADC_:
; По первому прерыванию читаем значение напряжения, меняем канал на ток.
; По второму запрещаем прерывания от АЦП, читаем значение тока и выставляем флаг готовности данных
push r16
in r16,Sreg
push r16
push r17
push r18
push r19
push r20
...
lds r16,overs
dec r16
sts overs,r16
brne ADC_2
; Запрещаем прерывания от АЦП
cbi ADCSRA,ADIE
; Выставим флаг готовности данных для преобразования
lds r16,flags+0
sbr r16,EXP2(ADC_DATA)
sts flags+0,r16

ADC_2:
pop r20
pop r19
pop r18
pop r17
pop r16
out Sreg,r16
pop r16
reti

Основное тело:
Спойлерlds r16,flags+0
sbrc r16,ADC_DATA
rcall oversampling ; подсчет напряжения по наличию нужного количества отсчетов

Обработка данных:
Спойлерoversampling:
cbr r16,EXP2(ADC_DATA)
sts flags+0,r16
...
in r16,ADMUX
andi r16,(1<<REFS1|1<<REFS0|1<<ADLAR|0<<MUX3|0<<MUX2|0<<MUX1|0<<MUX0) ; clear MUX
ori r16,(0<<REFS1|0<<REFS0|0<<ADLAR|0<<MUX3|1<<MUX2|1<<MUX1|1<<MUX0) ; set MUX ADC7
out ADMUX,r16

ldi r16,(1<<ADEN|0<<ADSC|0<<ADFR|0<<ADIE|1<<ADPS2|0<<ADPS2|1<<ADPS0)
out ADCSRA,r16

rcall Delay_100uS ;Нужно для отключения free running, т.к.
; бит ADSС в режиме free running не выключается!

ldi r16,(1<<ADEN|1<<ADSC|0<<ADFR|0<<ADIE|1<<ADPS2|0<<ADPS2|1<<ADPS0)
out ADCSRA,r16


ADC_7:
sbic ADCSRA,ADSC
rjmp ADC_7

in r16,ADCL
in r17,ADCH
...
sbi ADCSRA,ADIF ; сбросим признак прерывания по АЦП перед его разрешением

ldi r16,(1<<ADEN|1<<ADSC|1<<ADFR|1<<ADIE|1<<ADPS2|0<<ADPS2|1<<ADPS0)
out ADCSRA,r16

ldi r16,(0<<REFS1|0<<REFS0|0<<ADLAR|0<<MUX3|0<<MUX2|0<<MUX1|0<<MUX0)
out ADMUX,r16

ret

_________________
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по АЦП ATmega8
СообщениеДобавлено: Вт май 08, 2018 13:03:14 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2694
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
dr.doc писал(а):
lds r16,overs
dec r16
sts overs,r16
brne ADC_2
; Запрещаем прерывания от АЦП
cbi ADCSRA,ADIE
dr.doc писал(а):
При этом состояние счетчика overs в Proteus всегда равно 0!
Т.е. этот счетчик где-то обнуляется?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по АЦП ATmega8
СообщениеДобавлено: Вт май 08, 2018 15:45:00 
Это не хвост, это антенна
Аватар пользователя

Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22
Сообщений: 1368
Откуда: Беларусь
Рейтинг сообщения: 0
Цитата:
Т.е. этот счетчик где-то обнуляется?
Он декрементируется в прерывании по АЦП. При этом, когда он достигает значения в 256 (0) происходит обработка данных. Но интересно не это - я тестово вывел значение регистра ADCSRA в UART и дождался зависания. Значение его было: 11111101 - т.е. АЦП должен работать во free running и должно было быть прерывание по АЦП. Однако прерывания от ADIF нет, в то время как остальные работают (по таймерам отрабатывает ШИМ и опрос кнопок с выводом инфы на дисплей).
При попытке запустить wathdog и его циклическом сбросе в прерывании по АЦП добивался того, что происходит перезапуск контроллера. Такое же поведение имеется и при замене моего флага готовности данных (flags+0,ADC_DATA) на проверку на запрет прерываний от АЦП в основном цикле программы. Конструкция вида
lds r16,flags+0
sbrc r16,ADC_DATA
rcall oversampling
заменяется на:
sbic ADCSRA,ADIE
rcall oversampling
что должно было приводить к вызову подпрограммы oversampling и включению прерываний по АЦП... Но этого нет!
Домой аппарат я уже не брал - праздники. Но код имеется.
Устройство представляет собой электронную нагрузку с измерением отобранных ампер/часов, и не работающий АЦП это крах. Так как можно убить тестируемый аккумулятор.

Спойлерoversampling:
cbr r16,EXP2(ADC_DATA)
sts flags+0,r16
.....

; Пока прерывания от АЦП запрещены, измерим напряжение на температурном входе
; меняем канал на ADC7

in r16,ADMUX
andi r16,(1<<REFS1|1<<REFS0|1<<ADLAR|0<<MUX3|0<<MUX2|0<<MUX1|0<<MUX0) ; clear MUX
ori r16,(0<<REFS1|0<<REFS0|0<<ADLAR|0<<MUX3|1<<MUX2|1<<MUX1|1<<MUX0) ; set MUX ADC7
out ADMUX,r16

rcall Delay_100uS ; Нужно для переключения канала

ldi r16,(1<<ADEN|1<<ADSC|0<<ADFR|0<<ADIE|1<<ADPS2|0<<ADPS2|1<<ADPS0)
out ADCSRA,r16


ADC_7:
sbic ADCSRA,ADSC
rjmp ADC_7

in r16,ADCL
in r17,ADCH
....

; Запустим преобразование АЦП в "свободной конвертации" на два входа

;----------
sbi ADCSRA,ADIF ; сбросим признак прерывания по АЦП перед его разрешением
;----------

ldi r16,(1<<ADEN|1<<ADSC|1<<ADFR|1<<ADIE|1<<ADPS2|0<<ADPS2|1<<ADPS0)
out ADCSRA,r16

ldi r16,(0<<REFS1|0<<REFS0|0<<ADLAR|0<<MUX3|0<<MUX2|0<<MUX1|0<<MUX0)
out ADMUX,r16

ret

_________________
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Вопрос по АЦП ATmega8
СообщениеДобавлено: Ср май 09, 2018 05:34:27 
Это не хвост, это антенна
Аватар пользователя

Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22
Сообщений: 1368
Откуда: Беларусь
Рейтинг сообщения: 0
Нашел баг в программе, который мог затирать флаг в регистре. После праздников проверю в железе - отпишусь.

_________________
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопрос по АЦП ATmega8
СообщениеДобавлено: Сб май 12, 2018 08:15:16 
Это не хвост, это антенна
Аватар пользователя

Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22
Сообщений: 1368
Откуда: Беларусь
Рейтинг сообщения: 0
Описанный выше баг - порча регистра с флагами - flags+0. Его устранил, но проблема осталась. Периодически зависает устройство - нет измерений по каналам АЦП. Пытался отловить вводя счетчики в участки кода и наблюдая за их изменением по UART. Но! Как всегда по закону подлости в эти моменты зависаний нет. Вводил пустой регистр в оперативку и периодически отслеживал его отличие от 0(а потом и от стирания) - должен был зажигаться светодиод. Зажигания нет. Следовательно - оперативка не портится, со стеком тоже все в порядке.
Уже дома, просматривая досконально программу обнаружил в одном из файлов include директиву .EXIT. Видимо, отлаживая блок в отдельной программе я скопировал и его...
Так вот вопрос - может ли это (наличие посреди программы такой директивы) быть причиной разного рода глюков? Компилятор не ругается, хотя после .EXIT имеется порядка 10-ти подпрограмм...

_________________
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y