Извините за беспокойство, но она все-таки не работает

Приведу более толковый текст программы:
CODE
#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>
/******************************************************************
Здесь еще есть обработчики прерываний при переполнении таймеров,
дополнительные процедуры и т.д. и т.п. Их текст не привожу, чтобы не
усложнять чтение программы.
******************************************************************/
volatile unsigned int OCR1AMaxValue=9900;
volatile unsigned char ADCresult=255;
ISR(ADC_vect)
{
//Запись в переменную ADCresult значения АЦ преобразования
ADCresult=ADCH;
//Запись в регистр OCR1A целого выражения
OCR1A=floor(ADCresult/255*OCR1AMaxValue); //Ошибка в этой строке, как мне кажется
//Начать новое преобразование
ADCSRA|=(1<<ADSC);
}
int main (void)
{
SREG=1<<7;
//Установка вывода OC1A при совпадении значений регистров OCR1A и TCNT1
TCCR1A|=(1<<COM1A1)|(1<<COM1A0);
//Включение АЦП. Разрешение прерываний от АЦП.
//Предделитель частоты - 32
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);
//Выбор опорного напряжения. Выбор аналогового входа
ADMUX|=(1<<REFS0)|(1<<MUX0);
//Левостороннее выравнивание
ADMUX|=(1<<ADLAR);
//Начать первое преобразование
ADCSRA|=(1<<ADSC);
while (1)
{
//Без этой строки похоже тоже не обойтись. Компилятор выбрасывает пустой цикл из программы
char i=1;
}
return (0);
}
МК выполняет аналогово-цифровое преобразование. В регистр OCR1A необходимо записать целое число значение которого вычисляется по формуле: floor(OCR1AMaxValue*ADCResult/255).
При отладке в Avr Studio происходит следующее (может все слишком подробно описано, но я уже начинаю думать, что я что-то не так делаю в отладчике):
1. В функции main установка битов в регистрах АЦП проходит правильно.
2. После того как программа входит в бесконечный цикл ввожу в регистр ADCH произвольное значение. Например, 64.
3. Устанавливаю breakpoint при входе в обработчик прерываний от АЦП.
4. Нажимаю F5.
5. Программа входит в тело процедуры ISR(ADC_vect).
6. Нажимаю F11.
7. Программа присваивает переменной ADCresult значение 64.
8. Нажимаю F11, когда курсор находится в строке OCR1A=floor(ADCresult/255*OCR1AMaxValue).
9. И в этот момент курсор перескакивает в бесконечный цикл, на строку char i=1. В окне watch значения переменной ADCresult=Not In Scope.
10. Нажимаю F11. Курсор возвращается в обработчик прерывания в строк ADCSRA|=(1<<ADSC). В окне watch ADCresult=64. Но в OCR1A все нули, хотя должно быть 64/255*9900=2484.
11. Далее выполнение программы идет нормально - ожидаем новое прерывание от АЦП. При его возникновении история повторяется.
Компилировал при OPT = 0. Если я правильно понимаю, то компилятор вообще ничего не должен оптимизировать? Может быть я не понял что-то в предыдущих ответах... WinAVR у меня 20090313. Может быть в нем причина? Может ли данная ситуация быть просто глюком AVRStudio, а в реальном устройстве работать правильно?
Подскажите, пожалуйста, в чем ошибка.
Сообщение отредактировал the_last_dreamer - Sep 22 2010, 20:33