Карма: 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
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Карма: 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 и включению прерываний по АЦП... Но этого нет! Домой аппарат я уже не брал - праздники. Но код имеется. Устройство представляет собой электронную нагрузку с измерением отобранных ампер/часов, и не работающий АЦП это крах. Так как можно убить тестируемый аккумулятор.
; Пока прерывания от АЦП запрещены, измерим напряжение на температурном входе ; меняем канал на 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
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:0
Нашел баг в программе, который мог затирать флаг в регистре. После праздников проверю в железе - отпишусь.
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Карма: 20
Рейтинг сообщений: 188
Зарегистрирован: Вс мар 28, 2010 12:52:22 Сообщений: 1368 Откуда: Беларусь
Рейтинг сообщения:0
Описанный выше баг - порча регистра с флагами - flags+0. Его устранил, но проблема осталась. Периодически зависает устройство - нет измерений по каналам АЦП. Пытался отловить вводя счетчики в участки кода и наблюдая за их изменением по UART. Но! Как всегда по закону подлости в эти моменты зависаний нет. Вводил пустой регистр в оперативку и периодически отслеживал его отличие от 0(а потом и от стирания) - должен был зажигаться светодиод. Зажигания нет. Следовательно - оперативка не портится, со стеком тоже все в порядке. Уже дома, просматривая досконально программу обнаружил в одном из файлов include директиву .EXIT. Видимо, отлаживая блок в отдельной программе я скопировал и его... Так вот вопрос - может ли это (наличие посреди программы такой директивы) быть причиной разного рода глюков? Компилятор не ругается, хотя после .EXIT имеется порядка 10-ти подпрограмм...
_________________ «Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения