Они как бы более правильны для построения программ на LV. К этому надо привыкнуть.
"Мыши плакали, кололись, но продолжали есть кактус". Зачем привыкать? Просто взять и написать нормальную программу на С/С++.
может есть какая-нибудь статейка в интернете как надо оформлять код по стандарту, чтоб было удобно и правильно читать?
Я Вас огорчу, стандарта нет.

В принципе, каждый оформляет код по-своему, и оттого регулярно случаются холивары.

Но есть общие принципы:
1. Переменные и функции должны по-возможности называться осмысленно и по-английски. Английский поймут все, транслит - только носители языка. Т.е., переменная должна бы называться не datchik, а, например, sensor_present (датчик присутствует), тем более, что по смыслу она логическая, 0/1. Но к слову, как видно, там эта переменная вообще не нужна.
2. То же касается комментариев. Предпочтителен английский язык. Во-первых, в любой точке земли поймут, а, во-вторых, комментарии на других языках порождают проблемы с кодировкой. Латиница же - везде латиница.
3. Каждый новый блок (if, while, объявление функции) должен начинаться с отступа/табуляции. Продвинутые редакторы вроде Code::Blocks это вообще сами делают. Например:
Код: Выделить всё
if (<условие>)
{
[два пробела/табуляция]<оператор>;
[два пробела/табуляция]<оператор>;
[два пробела/табуляция]if (<условие>)
[два пробела/табуляция][два пробела/табуляция]<оператор>;
}
т.е.
if (foo())
{
bar();
if (foo()*bar())
{
boo();
}
}
Еще пример:
Код: Выделить всё
void foo(int x)
{
if (x)
{
x=0;
return;
}
else
while (1);
}
И так далее.
Пробовал отключать датчик, а потом включать, прибор возвращается в работу сам
Значит Ваш косяк прикрыл компилятор, и в случае вылета за пределы программы отправляет МК в ребут.
Приведу цитату из пособия, которое я писал для кружка электроники, который веду:
Еще один момент, специфичный для встроенных систем. Чаще всего обычная программа
для «большого» компьютера выполняется под управлением операционной системы, и
потому функция main() завершается командой возврата т.н. кода завершения – знакомый
всем return 0 в ее конце. Кроме того, main() может принимать аргументы – параметры
командной строки. Однако ясно, что в микроконтроллере нет операционной системы – с
самого начала управление всеми ресурсами отдается единственной управляющей
программе. Поэтому стандартное завершение не имеет смысла – возвращать код некуда.
И, естесственно, main() в программе для МК не может принимать никаких аргументов –
им просто неоткуда взяться. Кстати, поскольку микроконтроллером исполняется всего
одна программа, оная должна иметь вид бесконечного цикла или кончаться им, потому
что поведение устройства за пределами управляющей программы не определено, и пока
устройство включено, постоянно должен исполняться пользовательский код.
Исходя из всего вышесказанного, можно представить себе базовую структуру программы
для микроконтроллера:
#include <avr/io.h>
void main(void)
{
/*Здесь обычно производится настройка периферии*/
while (1);
}
Иногда в бесконечном цикле делается что-то осмысленное, но довольно часто он пустой,
как в примере, и служит только для того, чтобы не пустить контроллер дальше
пользовательской программы, а вся работа выполняется в прерываниях.
Мораль - main() должна содержать бесконечный цикл. У вас цикл имеет условие. Как только датчик отключают, программа вылетакет из main() в неведомые дали. Посмотрите дизассемблированный листинг, наверняка CVAVR после main() воткнул перезагрузку.
ну или руки чутка кривые)
Скорее CVAVR убогий.
Разница между теорией и практикой на практике гораздо больше, чем в теории.