NewSistems Опубликовано 29 августа, 2016 Жалоба Поделиться Опубликовано 29 августа, 2016 Приветствую всех! Какие причины могут быть "зависания" МК. Пример: простейший бегущий огонь, посредством битовых сдвигов работает некорректно. То бежит с одинаковым ритмом, то раз и остановился на одном диоде и горит какое то время потом опять пробежал пару бит и опять горит, и всё в таком духе...В протеусе к слову, всё бегает прекрасно. Вопрос к знатокам, перечислите пожалуйста возможные причины такого поведения МК. Заранее благодарю всех откликнувшихся. Голову уже сломал..... Вот схема http://forum.cxem.net/uploads/monthly_08_2016/post-188855-0-60401400-1472268630_thumb.jpg Вот прошивка #include #include typedef unsigned char byte;unsigned char trig, var_no, i, b, flag, flag1, flag2;int count, LONG, WAIT;eeprom byte memory_var;eeprom int memory_speed;// Port B initializationvoid main(void){PORTB=0x00;DDRB=0b11111111;PORTD=0b00000001;DDRD=0x00;if(memory_var) // если режим выбран ранее{if (memory_var==0xFF){var_no=1;}else{var_no=memory_var; // пишем последнее запомненное состояние на выход}}if(memory_speed) // если скорость выбрана ранее{if (memory_speed==0xFFFF){LONG=70;}else{LONG=memory_speed; // пишем последнее запомненное состояние на выход}}// ****************************** НАСТРОЙКА ТАЙМЕРА ПО ПЕРЕПОЛНЕНИЮ И ПРЕРЫВАНИЯ *****************************************TCCR0B=(0<8) { i=1; trig=0; } count=0; } }break;}case 2: //ВТОРОЙ РЕЖИМ{ if (trig==0) { if (b==1)PORTB=0b00000000; i--; trig=1; } else { if(count7) { i=1; trig=0; b=0; } } else { PORTB = (PORTB<<1); i++; if(i>7) { i=1; trig=0; b=1; } } count=0; } }break;}case 3: //ТРЕТИЙ РЕЖИМ{ if (trig==0) { if (b==1)PORTB=0b00000000; i--; trig=1; } else { if(count7) { i=1; trig=0; b=0; } } else { PORTB = ~(PORTB); i++; if(i>4) { i=1; trig=0; b=1; } } count=0; } }break;} //конец case 3} //конец свича//******************************************************ОБРАБОТКА НАЖАТИЯ КНОПОК***************************************************if (PIND.1==0) // КНОПКА СМЕНЫ РЕЖИМОВ{if (flag==0) //если кнопка нажата впервые{zero_var();var_no++;if (var_no==4)var_no=1;memory_var=var_no;}}else{if (flag){flag++;if (flag>WAIT)flag=0; // ОБРАБОТКА АНТИДРЕБЕЗГА}}if (PIND.2==0) // КНОПКА ЗАМЕДЛЕНИЯ{if (flag2==0) // если кнопка нажата впервые{flag2=1;LONG=(LONG+10);if (LONG>1000){LONG=400;}memory_speed=LONG;zero_var();}}else{if (flag2){flag2++;if (flag2>WAIT)flag2=0; // ОБРАБОТКА АНТИДРЕБЕЗГА}}if (PIND.3==0) // КНОПКА УСКОРЕНИЯ{if (flag1==0) //если кнопка нажата впервые{flag1=1;LONG=(LONG-10);if (LONG<10){LONG=10;}memory_speed=LONG;zero_var();}}else{if (flag1){flag1++;if (flag1>WAIT)flag1=0; // ОБРАБОТКА АНТИДРЕБЕЗГА}}} //конец прерывания Раздел: AVR Читать дальше Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.