Доброго всем времени суток!
Пользуюсь Microchip Studio 7.0.
При написании программ (ранее мучал только atmega8) обратил внимание, что при заполнении более 80% flash program memory начинаются всякого рода глюки.
Я пишу свои программы последовательно, т.е. - подсоединил индикатор, написал, скомпилировал, залил в микроконтроллер, проверил - работает. Далее подключаю (к примеру) энкодер, пишу, проверяю. Ну и так далее. И когда устройство полностью функционирует, пишу сервисное меню и прочие рюшечки, которые сжирают львиную часть памяти. И при написании которых и появляются те самые глюки которых раньше не было.
Закон четности ошибок? - Не думаю...

Сейчас бьюсь с программой для 3х канального регулятора мощности. И как всегда - основная программа работает, но требуется добавить при запуске измерение мощности нагрузки подключенной к каждому каналу. Пишу следующую функцию:
Спойлер
float Power_Measurement (void)
{
float power;
производит измерение напряжения, тока, мощности.
вычисляет произведение измеренного тока на измеренное напряжение и сравнивает с измеренной мощностью.
если разница межу измеренной и вычисленной мощностью меньше 1%, тогда:
power += измеренной мощности
счетчик++
И так 10 раз.
return power/10;
}
В основном тексте программы пишу:
Спойлер
float electric_power[3];
…………..
int main(void)
{
……………………………………………………………………………..
PORTB &= ~(1<<PB1); //включаем ТЭН1
electric_power[0] = Power_Measurement();
PORTB |= 1<<PB1; //отключаем ТЭН1
PORTB &= ~(1<<PB2); //включаем ТЭН2
electric_power[1] = Power_Measurement();
PORTB |= 1<<PB2; //отключаем ТЭН2
PORTB &= ~(1<<PB3); //включаем ТЭН3
electric_power[2] = Power_Measurement();
PORTB |= 1<<PB3; //отключаем ТЭН3
………………………………………………………………………………
Выводим на дисплей electric_power[0]
Выводим на дисплей electric_power[1]
Выводим на дисплей electric_power[2]
…………………………………………………………………………………
while (1)
{
...........
}
}
И на дисплее видим только мощность ТЭН1, а мощность ТЭН2 и ТЭН3 отображаются как -0,0.
При чем, видно, что нагрузка ТЭН2 и ТЭН3 - включаются и отключаются, функция Power_Measurement() - вызывается, замеры идут, а в electric_power[2] и electric_power[1] - не возвращаются значения из функции.
Понятно, что дело в драйвере руки.sys. Машина не виновата. Она делает то, что ей сказано.

Не уже ли волшебный volatile float electric_power[3] - поможет?
P.S. Сейчас проверить не могу т.к. до прочтения этой уже начал пользоваться этим девайсом и он у меня в гараже. В ближайшее время принесу домой и попробую. Но это не единственный глюк. Есть и более странные.