Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неверный результат измерения потреблённой энергии
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Motion
По поводу прерываний:

Так как функция записи в EEPROM вызывается из прерывания EXT_INT0, то на момент вызова функции EEPROM_write(...); флаг I будет сброшен. То есть глобально будут запрещены все прерывания. Тогда зачем их запрещать на 2 команды -
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
???


Я так понял, что ошибка была в том, что я глобально разрешал прерывания внутри подпрограммы обработки прерываний INT0, чего не должно было быть. Все прерывания должны были быть разрешены (автоматически) только после завершения подпрограммы обработки INT0. Так?
singlskv
Цитата(Владимир_КПИ @ May 10 2008, 10:51) *
Так как функция записи в EEPROM вызывается из прерывания EXT_INT0, то на момент вызова функции EEPROM_write(...); флаг I будет сброшен. То есть глобально будут запрещены все прерывания. Тогда зачем их запрещать на 2 команды -
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
Для тех кто в танке, еще раз повторяю, нужно не запретить прерывания на эти
2 команды, нужно запомнить были ли запрещены/разрешены прерывания в момент когда
мы добрались до этих команд, если были запрещены так и оставить, если были разрешены,
запретить их только на эти 2 команды.
В Вашем конкретном случае, когда вся запись осуществляется только из прерываний,
запрещение/разрешение прерываний вобще не нужно.
Цитата
Я так понял, что ошибка была в том, что я глобально разрешал прерывания внутри подпрограммы обработки прерываний INT0, чего не должно было быть. Все прерывания должны были быть разрешены (автоматически) только после завершения подпрограммы обработки INT0. Так?
В первом приближении так, тока это Вам не поможет сделать Ваш код рабочим... sad.gif
У Вас принципиально неправильно спланированна программа,
я Вам уже советовал поупрожняться в этом деле, но похоже Вы решили править Ваш код,
ну чтож, пожелаем Вам удачи...
Motion
Цитата
У Вас принципиально неправильно спланированна программа,
я Вам уже советовал поупрожняться в этом деле, но похоже Вы решили править Ваш код,
ну чтож, пожелаем Вам удачи


Нет, я сделаю как вы посоветовали. Просто пытаюсь понять свои ошибки, чтобы не допустить их в будущем.
Motion
Есть уточняющие вопросы:

- скользящее среднее считать для моей схемы? При 100% мощности? Т.е. мерять "идеальную" синусоиду?
- с какой частотой?
- какое количество отсчётов?
- вы писали, что раз в секунду нужно писать скользящее среднее в EEPROM. Время равное 1 секунде можно считать по количеству внешних прерываний INT0 (периодов сетевого напряжения) или нужно использовать таймер, например?
- как организовать хранение последних N отсчётов? Т.е. этот самый кольцевой буфер. Понятно, что значения будут храниться где-то в ROM. Но где именно? В массиве, в памяти?
singlskv
Цитата(Владимир_КПИ @ May 12 2008, 18:42) *
Есть уточняющие вопросы:

- скользящее среднее считать для моей схемы? При 100% мощности? Т.е. мерять "идеальную" синусоиду?
- с какой частотой?
- какое количество отсчётов?
- вы писали, что раз в секунду нужно писать скользящее среднее в EEPROM. Время равное 1 секунде можно считать по количеству внешних прерываний INT0 (периодов сетевого напряжения) или нужно использовать таймер, например?
Считайте это пока просто абстрактной задачкой, к Вашим синусойдам это
пока отношения не имеет. Самое главное для Вас сейчас научиться планировать задачку,
и в частности сделать так чтобы несколько независимых функций работали "одновременно".
Иначе у Вас получается что функции которые должны работать в реалтайме (чтение показаний АЦП,
ловля перехода через 0, итд) постоянно прерываются функциями которые делаются
очень неспешно(запись в EEPROM, рассчет результатов в флоат, итд)

то есть я Вам предлагаю написать относительно простую задачку:
- опрос АЦП с какой-то частотой (лучше кстати сразу по нескольким каналам)
- рассчет среднего по каждому каналу(ну это типа просто для тренировки и понимания как нужно
хранить и делать предварительные вычисления побыстрому когда данных много)
- запись посcчитанных значений в EEPROM с некоторой переодичностью

вот когда Вы напишите этот учебный пример, мы его раскритикуем и после этого Вы
напишите правильно... smile.gif
у Вас просто будет готовый каркас к которому Вы уже просто будете прикручивать свою обработку.

Цитата
- как организовать хранение последних N отсчётов? Т.е. этот самый кольцевой буфер. Понятно, что значения будут храниться где-то в ROM. Но где именно? В массиве, в памяти?
кольцевой. не в ROM а в RAM. в массиве.

Ну а для уточнения задачки, ну пусть будет 2 делителя напряжения с переменными резисторами
в одном из плечей, частоту АЦП выберите сами, по максимуму но с запасом на обработку.
ibiza11
Цитата(Владимир_КПИ @ May 1 2008, 17:06) *
А можно подать постоянное напряжение 9В с батареек?

Дело в том, что это напряжение пойдёт на нагрузку. Сопротивление лампочки в холодном состоянии 26Ом. Почти к.з. Не взорвутся ли у меня, например, батарейки при включении?
ахахахахахахаха))))) cranky.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.