sphincs писал(а):да нет, просто осваиваю AVR на примере игрушки для себя. подозреваю, что протеус может просто плохо дружить с прерываниями от таймеров, не имел с ними дел еще.
Посмотрел код 32-й меги.
общие замечания:
1) Если Вы не используете для вывода строки стандартную библиотечную функцию, а в своей функции просто выводите фиксированное значение символов, то добавлять в конце строки NULL не имеет смысла.
2) При настройке таймера в асинхронном режиме и дальнейшем изменении его регистров необходимо учитывать, что изменение этих регистров в контроллере происходит не мгновенно, а с некоторой задержкой. Поэтому факт самого изменения регистров нужно отслеживать по изменению флагов в регистре ASSR.
3) В функции
if (PINC.2==1) //СБРОС
Код: Выделить всё
#asm("cli"); // Запретили прерывания
TCCR2=0x01;
time1=0;
//#asm("sei"); // Забыли разрешить прерывания
4) Для повышения скорости вычислений рекомендую избавиться от типа данных float.
5) переменная
mode у Вас принимает значения 0..2. можно выделить для нее тип данных
char (занимает в два раза меньше места). Важно понимать, что перевод типов данных
char(символ) и
integer(целое число) никак не соотносятся с целевым применением этих типов и обозначают всего лишь размер места в памяти.
char занимает 1 байт и может содержать как число, так и символ (кодировка ASCII);
integer занимает (для AVR) 2 байта и также может содержать число или символ (кодировка UNICODE).
6) Не работают остальные кнопки у Вас потому, что в начале идет кусок кода, который заключен в бесконечный цикл
while(1). Оператора выхода из цикла (
break) я у Вас там что-то не увидел. Т.е. все банально просто - у Вас молотит все время первый кусок, а до остальных дело не доходит.
Дальше не смотрел.
amd9800 писал(а):Хочу оптимизировать данную функцию на скорость.
Тогда изучайте Ассемблер.
