Уффф... бум отвечать по пунктам:
Цитата(Владимир_КПИ @ May 7 2008, 23:38)

Когда я запрещал или разрешал прерывания, я подразумевал, что эти 2 команды разрешают/запрещают глобальное разрешение прерываний (то есть изменение флага I в регистре SREG). Посмотрел в книге - там команда sei, например, означает общее разрешение прерываний. Это ведь ассемблерные вставки. А вы говорите про разрешение/запрешение вложеных прерываний... Что это значит?
когда я говорил про 2 команды я имел в виду вот это:
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
только эта спецпоследовательность должна выполняться при запрещенных прерываниях,
когда Вы в своей функции EEPROM_write в конце ставите #asm("sei"); Вы разрешаете ВСЕ прерывания...
Цитата
Это уже не важно, что будет потом. Запись в ЕЕPROM будет происходить лишь при пропадании питания. Сейчас я записывал в EEPROM лишь чтобы узнать правильно ли считается мощность. То есть периодической записи в EEPROM происходить не будет.
Про потом это конечно хорошо, но при таком коде Вы никогда не перейдете
к этой самой стадии "потом", Ваш код записи в EEPROM просто мешает фунициклировать правильно
всем прерываниям....
Ну и уже чисто мое ИМХО, это неправильно уповать только на то что Вы успеете записать
многобайтовую переменную в случае пропадания питания, должно быть 2 механизма записи,
1 это привязанное ко времени(типа раз в XXX) второе при пропадании питания, ну
и механизм который разруливает это при старте...
Цитата
Нет, а где можно почитать?
Можно не прочитать а посчитать/просимулировать.
Ваша проблема в том что Вы пытаетесь сразу все посчитать в float и сразу все поделить,
а это нужно делать в самый последний момент, те пока можем, считаем все в целых и
желательно без делений, перевод в float или деления только перед выдачей на экран или
сохранением, хотя если еще чуть подумать, для сохранения это тоже не нужно,
какая разница в каких единицах будет все храниться в EEPROM ?
Цитата
Получается вложеные прерывания будут разрешины, а общие запрещины? И тогда устройство не сможет нормально работать из-за общего запрета прерываний?
выше ответил, будут разрешены ВСЕ прерывания и вложенные в том числе,
и при рассчетах с float прямо в прерывании АЦП Вы явно не всегда будете успевать...
Цитата
А что за фильтрация? Вы имеете ввиду антидребезг? Или возможность ложного срабатывания в случае помехи?
Антидребезг конечно, фильтрация это просто общее название.
Цитата
1 прерывание для синхронизации (INT0)
1 прерывание для таймера0 (для измерения значений)
1 прерывание для таймера1 (для отсчёта угла отпирания)
Кака же можно обойтись одним-двумя?
Если вызвана подпрограмма обработки прерывания, она будет выполняться до конца или её в любой момент может прервать другое прерывание или только прерывание с более высоким приоритетом?
Да, наверное так и есть. Значит буду начинать с более простого(то, что вы предложили).
Ну как минимум 2 из этих задач можно совместить,
ну и еще, подумайте, может чего-нить из этого можно делать и в основной проге ?
про прерывания Вы неправильно поняли, Вы сами разрешаете им быть вложенными,
НО, если Вы им запретите быть вложенными при том софте который есть, станет тока хуже...
Цитата
Но я так и не понял сути, что мне нужно сделать. Нужно паралельно мерять значения напряжения, их каким-то образом обрабатывать (так называемое скольжение) и паралельно со всем этим записывать результат в EEPROM?
Скользящее среднее это очень простая штука, это просто сумма
последних N отсчетов какой-нить меняющейся величины(например показаний АЦП) поделенная на
количество отсчетов N. То есть при получении каждого нового отсчета, мы просто суммируем
последние N отсчетов и делим сумму на N. Нужно просто грамотно организовать хранение
отсчетов и иметь это скользящее среднее в любой момент времени.
Так же нужно раз в секунду записать текущее значение скользящего среднего в EEPROM при этом
не прерывая рассчет скользящего среднего...
Это просто задачка такая, но после того как Вы с ней справитесь, Вам будет намного проще
написать более сложный вариант...
P.S. про кольцевые буферы Вам уже намекнули, ну и делить не всегда необходимо(для хранения)...