зависает прога
- Войдите на сайт для отправки комментариев
Втр, 03/01/2012 - 20:01
Скажите, почему может зависать программа, все возможные причины.
данный скетч больше по объему, меньший вариант залит в atmega168, после нескольких операций зависает, чем это может быть вызвано, подскажите.
#include <LiquidCrystalRus.h>
#include <EEPROM.h>
// initialize the library with the numbers of the interface pins
LiquidCrystalRus lcd(12, 10, 11, 5, 4, 3, 6);
//переменные, используемые при работе программы
int i;
String s1, buf, sch, zn_sch;
float int_1, int_2, res;
boolean inp=false, clean=false, zn_set=false, synch=false;
//////////////////////////////////////////////////////////
//о программе
void about()
{
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Альтернативный");
//
lcd.setCursor(4, 1);
lcd.print( "калькулятор");
//
lcd.setCursor(6, 2);
lcd.print( "автор");
//
lcd.setCursor(5, 3);
lcd.print( "Ver. 1.0");
//
delay(3000);
lcd.clear();
}
//функция очистки последней строки
void clscr_two()
{
for (int i=0;i<=20;i++)
{
lcd.setCursor(i,3);
lcd.print(' ');
}
}
//функция очистки первой строки
void clscr_one()
{
for (int i=0;i<=20;i++)
{
lcd.setCursor(i,0);
lcd.print(' ');
}
}
//вывод на дисплей главной строки
void write_s1()
{
lcd.setCursor(0,0);
lcd.print(s1);
}
//проверка валидности синтаксиса
void error_syntax()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Error syntax");
delay(500);
lcd.clear();
//
buf='0';
s1='0';
zn_set=false;
zn_sch='0';
res=0;
sch=0;
int_1=0;
int_2=0;
}
void setup()
{
// set up the LCD"s number of rows and columns:
lcd.begin(20, 4);
s1='0';
// Print a message to the LCD.
about();
}
void loop()
{
//
i=analogRead(A0);
//
if ((i==22)or(i==46)or(i==70) or
(i==94)or(i==118)or(i==142) or
(i==166)or(i==190)or(i==214)or
(i==238)or(i==262)or(i==286)or
(i==310)or(i==334)or(i==358)or
(i==382)or(i==406)or(i==430)or
(i==454)or(i==478)or(i==502)or
(i==526)or(i==550)or(i==574)or
(i==597))
{
clscr_two();
}
//
if (digitalRead(13)==LOW)
{
inp=false;
}
//нажатие кнопки обрабатывает все события с учетом дополнительных условий для уменьшения ветвлений кода срабатывания одного события
if ((digitalRead(13)==HIGH)&&(inp==false))
{
write_s1();
if (inp==false)
{
lcd.clear();
}
//событие по вводу символов, ограничение ввода до 40 символов
if (s1.length()==40)
{
//проверка на допустимую длину строки
clscr_one();
lcd.setCursor(0, 0);
lcd.print("max input");
}
else
{
//непосредственный вывод набранной строки на дисплей
if (s1=='0')
{
s1=buf;
}
else
{
s1=s1+buf;
}
lcd.setCursor(0, 0);
lcd.print(s1);
inp=true;
//определение знака операции
if ((buf=='+') or
(buf=='-') or
(buf=='/') or
(buf=='*') or
(buf=="cos(")or
(buf=="sin(")or
(buf=="tg("))
{
zn_set=true;
zn_sch=buf;
sch='0';
if ((int_1==0)&&(int_2==0)&&((479<=i)&&(i<=501)))
{
error_syntax();
}
}
//получение первого слагаемого
if (((buf=='1')or
(buf=='2')or
(buf=='3')or
(buf=='4')or
(buf=='5')or
(buf=='6')or
(buf=='7')or
(buf=='8')or
(buf=='9')or
(buf=='0'))&&(zn_set==false))
{
sch=sch+buf;
int_1=sch.toInt();
}
//получение второго слагаемого
if (((buf=='1')or
(buf=='2')or
(buf=='3')or
(buf=='4')or
(buf=='5')or
(buf=='6')or
(buf=='7')or
(buf=='8')or
(buf=='9')or
(buf=='0'))&&(zn_set==true))
{
sch=sch+buf;
int_2=sch.toInt();
}
//получение синхронизирующей скобки
if (buf==')')
{
synch=true;
}
//
}
//работа с готовыми данными: слагаемые и знак
int L=analogRead(A0);
if ((503<=L)&&(L<=525))
{
//lcd.print("((503<=L)&&(L<=525))");
//сумма
if (zn_sch=='+')
{
res=int_1+int_2;
}
//разность
if (zn_sch=='-')
{
res=int_1-int_2;
}
//произведение
if (zn_sch=='*')
{
res=int_1*int_2;
//for (int g=1;g<=int_1;g++)res=res+int_2;
}
//деление
if (zn_sch=='/')
{
res=int_1/int_2;
}
//косинус
if (zn_sch=="cos(")
{
if ((int_1>0)or(synch==false))
{
error_syntax();
}
else
{
if ((int_2==0)&&(s1=='0')&&(synch==true))
{
res=cos(0);
}
else
{
res=cos(int_2);
}
}
}
//синус
if (zn_sch=="sin(")
{
if ((int_1>0)or(synch==false))
{
error_syntax();
}
else
{
if ((int_2==0)&&(s1=='0')&&(synch==true))
{
res=sin(0);
}
else
{
res=sin(int_2);
}
}
}
//тангенс
if (zn_sch=="tg(")
{
if ((int_1>0)or(synch==false))
{
error_syntax();
}
else
{
if ((int_2==0)&&(s1=='0')&&(synch==true))
{
res=tan(0);
}
else
{
res=tan(int_2);
}
}
}
//модуль числа
if (zn_sch=="abs(")
{
if ((int_1>0)or(synch==false))
{
error_syntax();
}
else
{
if ((int_2==0)&&(s1=='0')&&(synch==true))
{
res=abs(0);
}
else
{
res=abs(int_2);
}
}
}
//квадратный корень
if (zn_sch=="sqrt(")
{
if ((int_1>0)or(synch==false))
{
error_syntax();
}
else
{
if ((int_2==0)&&(s1=='0')&&(synch==true))
{
res=sqrt(0);
}
else
{
res=sqrt(int_2);
}
}
}
//вывод посчитанного значенения
lcd.clear();
lcd.setCursor(0,0);
//
/*
if (int_1>0)
{
lcd.print(int_1);
}
//
lcd.print(zn_sch);
//
if (int_2>0)
{
lcd.print(int_2);
}
//
lcd.print('=');
*/
//lcd.print(int_1);
//lcd.print(zn_sch);
//lcd.print(int_2);
lcd.print('=');
lcd.print(res);
buf='0';
s1="";
zn_set=false;
zn_sch='0';
res=0;
sch=0;
int_1=0;
int_2=0;
clscr_two();
}
}
//конец обработки события нажатия кнопки
//******************************************************************************
//установка курсора в нижнюю часть дисплея для вывода данных о выбранном символе
lcd.setCursor(0, 3);
//
//вывод информационной строки о возможности выбора цифры "1"
if ((0<=i)&&(i<=21))
{
lcd.print("s: 1");
buf='1';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "2"
if ((23<=i)&&(i<=45))
{
lcd.print("s: 2");
buf='2';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "3"
if ((47<=i)&&(i<=69))
{
lcd.print("s: 3");
buf='3';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "4"
if ((71<=i)&&(i<=93))
{
lcd.print("s: 4");
buf='4';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "5"
if ((95<=i)&&(i<=117))
{
lcd.print("s: 5");
buf='5';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "6"
if ((119<=i)&&(i<=141))
{
lcd.print("s: 6");
buf='6';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "7"
if ((143<=i)&&(i<=165))
{
lcd.print("s: 7");
buf='7';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "8"
if ((167<=i)&&(i<=189))
{
lcd.print("s: 8");
buf='8';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "9"
if ((191<=i)&&(i<=213))
{
lcd.print("s: 9");
buf='9';
//write_s1();
}
//вывод информационной строки о возможности выбора цифры "0"
if ((215<=i)&&(i<=237))
{
lcd.print("s: 0");
buf='0';
//write_s1();
}
//вывод информационной строки о возможности выбора функции модуля числа
if ((239<=i)&&(i<=261))
{
lcd.print("s: abs");
buf="abs(";
//write_s1();
}
//вывод информационной строки о возможности выбора функции квадратного корня числа
if ((263<=i)&&(i<=285))
{
lcd.print("s: sqrt");
buf="sqrt(";
//write_s1();
}
//вывод информационной строки о возможности выбора функции косинуса числа
if ((287<=i)&&(i<=309))
{
lcd.print("s: cos");//
buf="cos(";
//write_s1();
}
//вывод информационной строки о возможности выбора функции синуса числа
if ((311<=i)&&(i<=333))
{
lcd.print("s: sin");//
buf="sin(";
//write_s1();
}
//вывод информационной строки о возможности выбора функции тангенса числа
if ((335<=i)&&(i<=357))
{
lcd.print("s: tg");//
buf="tg(";
//write_s1();
}
//вывод информационной строки о возможности выбора функции суммы чисел
if ((359<=i)&&(i<=381))
{
lcd.print("s: +");
buf='+';
//write_s1();
}
//вывод информационной строки о возможности выбора функции разности чисел
if ((383<=i)&&(i<=405))
{
lcd.print("s: -");
buf='-';
//write_s1();
}
//вывод информационной строки о возможности выбора функции умножения чисел
if ((407<=i)&&(i<=429))
{
lcd.print("s: *");
buf='*';
//write_s1();
}
//вывод информационной строки о возможности выбора функции деления чисел
if ((431<=i)&&(i<=453))
{
lcd.print("s: /");
buf='/';
//write_s1();
}
//вывод информационной строки о возможности выбора функции установки открывающей скобки
if ((455<=i)&&(i<=477))
{
lcd.print("s: (");
buf='(';
//write_s1();
}
//вывод информационной строки о возможности выбора функции установки закрывающей синхронизирующей скобки
if ((479<=i)&&(i<=501))
{
lcd.print("s: )");
buf=')';
//write_s1();
}
//вывод информационной строки о возможности выбора функции парсинга, при нажатии кнопки она будет вызвана обработкой события нажатия
//с учетом дополнительного условия положения переменной i
if ((503<=i)&&(i<=524))
{
lcd.print("s: =");
buf='=';
//write_s1();
}
//вывод информационной строки о возможности выбора функции возведения в степень
if ((527<=i)&&(i<=549))
{
lcd.print("s: sqr");
buf="sqr(";
//write_s1();
}
//вывод информационной строки о возможности использования функции очистки памяти
if ((551<=i)&&(i<=573))
{
lcd.print("s: clear all");
if (digitalRead(13)==HIGH)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Clear memory..");
//
s1='0';
buf='0';
int_1=0;
int_2=0;
res=0;
sch='0';
//
delay(250);
lcd.clear();
inp=true;
}
//write_s1();
}
//вывод информационной строки, при нажатии кнопки выходит информацию о прошивке
if ((575<=i)&&(i<=597))
{
lcd.print("s: about");
if (digitalRead(13)==HIGH)
{
about();
inp=true;
}
//write_s1();
}
//вывод строки, символизирующей о выходе за пределы используемого диапазона выбираемых функций
if (i>=598)
{
lcd.print("out of range");
//write_s1();
}
}
Комментируйте части кода и ловите после какого кода не "виснет"
Включите в коды вывод диагностических сообщений по UART-USB в окно терминала (как он там в Arduino IDE называется - Serial Monitor вроде?.