Вопросы по С/С++ (СИ)
- Сообщения: 64
- Зарегистрирован: Чт июн 09, 2016 18:24:41
В том то и дело что цепочка тактируется PINB и длинна цепочки событий может быть разной. Я уже думал так сделать, как Вы предложили Не разрешимые дилеммы не дали хода. Недостаток знаний.
Последний раз редактировалось Billi34 Пт сен 06, 2019 17:32:54, всего редактировалось 1 раз.
- Реклама
- Сообщения: 64
- Зарегистрирован: Чт июн 09, 2016 18:24:41
вот со всем сказанным в этом же сообщении соглашусь, а с процитированным - не могу. лично мне было довольно "больно" без goto решить самую простую задачу анализа символов в строке, если при обнаружении некоторых надо закончить анализ, а для остальных просто выполнить простейшие манипуляции с ними и другими данными.VladislavS писал(а):забудь оператор goto. Поверь, это не больно
Код: Выделить всё
while(ch = *s++){
switch(ch){
case 'A' : goto m1;
case 'D' : s[-1] = 'd'; break;
default:
continue;
}
}
m1:
//я не говорю, что это нельзя сделать без goto, я говорю, что лично я это готов сделать либо из чисто спортивного интереса, либо не готов вообще - добавление новых переменных, дробление кода на функции и т.п. "методы" избегания goto слишком болезненны для меня, потому как я очень ленивый...
кстати, смотрел исходники avr-libc... там goto очень много... видимо, не один я ленивый
Добавлено after 3 minutes 9 seconds:
то есть я хочу сказать, что в тех местах, где не помогает break, обойтись без goto представлет проблему.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3695704#p3695704"]слишком болезненны для меня[/uquote]От жеж...
Код: Выделить всё
while( *s && (*s!='A'))
{
switch(*s)
{
case 'D' : *s = 'd'; break;
default:
}
s++;
}
- Реклама
я ж сказал - пример кода сильно упрощен, только чтобы обозначить проблему. там не только символ 'A', там много вариантов анализа. и в некоторых case свои циклы. ну читайте же все, что я написал...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 64
- Зарегистрирован: Чт июн 09, 2016 18:24:41
У меня еще очень не стабильный тактирующий сигнал приходящий на PIND.B1 Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4
Добавлено after 5 minutes 6 seconds:
Я наверное плохо искал в примерах. А герцовый генератор вида
PORTD.B4 =1;Delay_ms(500);
PORTD.B4=0;Delay_ms(500);
тормозит выполнение всей программы. Зато мигает диодик.
Добавлено after 5 minutes 6 seconds:
Я наверное плохо искал в примерах. А герцовый генератор вида
PORTD.B4 =1;Delay_ms(500);
PORTD.B4=0;Delay_ms(500);
тормозит выполнение всей программы. Зато мигает диодик.
Аппаратным таймером воспользуйтесь. Он обеспечит прерывания через нужные периоды времени, в которых можно и светодиодом мигнуть, и кнопки опросить. Лишь бы было желание от всех этих вызовов delay избавиться.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3695717#p3695717"]там не только символ 'A', там много вариантов анализа.[/uquote]Что это меняет? А ничего.
[uquote="Billi34",url="/forum/viewtopic.php?p=3695685#p3695685"]о.к.[/uquote]Да не Ок как раз таки. Во-первых, оно тупо не скомпилируется по формальному признаку - количество { и } не совпадает. Во-вторых, ты уверен, что хотел if(t=1), а не if(t==1) ? В-третьих, стройное форматирование кода - половина читаемости и понимаемости. В-четвёртых, ты сам то понимаешь как оно должно работать? Резюме - переписывать с нуля.
[uquote="Billi34",url="/forum/viewtopic.php?p=3695731#p3695731"]Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4[/uquote]А ты даташит на контроллер дальше названия читал? Ну там про таймеры или прерывания???
[uquote="Billi34",url="/forum/viewtopic.php?p=3695685#p3695685"]о.к.[/uquote]Да не Ок как раз таки. Во-первых, оно тупо не скомпилируется по формальному признаку - количество { и } не совпадает. Во-вторых, ты уверен, что хотел if(t=1), а не if(t==1) ? В-третьих, стройное форматирование кода - половина читаемости и понимаемости. В-четвёртых, ты сам то понимаешь как оно должно работать? Резюме - переписывать с нуля.
[uquote="Billi34",url="/forum/viewtopic.php?p=3695731#p3695731"]Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4[/uquote]А ты даташит на контроллер дальше названия читал? Ну там про таймеры или прерывания???
Billi34, Ваша проблема в другом. Вы многократно читаете с пинов, забывая, что пин мог поменять свое значение между последовательными чтениями с него. Это же не переменная в памяти, а порт. Правильней, считывать сразу значение всего порта в переменную, а потом уже с ней разбираться, а читать из порта только тогда, когда нужны свежие данные оттуда. Не забывайте, что к моменту изменения данных на B1 может измениться и значение на B0.
goto mesto_1 однозначно не требуется, так как t Вы обнуляете. Достаточно continue. В конце же else ... goto mesto_1 вообще не нужен. Все равно туда управление попадет при любых раскладах.
goto mesto_2 тоже не неужен. Достаточно на месте метки mesto_2 начать цикл while(t) и закончить его после последнего if(PIND.B1&&t)
Ошибок много. На одну из них VladislavS уже указал. Код {PORTB.В1+0} вообще смысла не имеет.
goto mesto_1 однозначно не требуется, так как t Вы обнуляете. Достаточно continue. В конце же else ... goto mesto_1 вообще не нужен. Все равно туда управление попадет при любых раскладах.
goto mesto_2 тоже не неужен. Достаточно на месте метки mesto_2 начать цикл while(t) и закончить его после последнего if(PIND.B1&&t)
Ошибок много. На одну из них VladislavS уже указал. Код {PORTB.В1+0} вообще смысла не имеет.
- Сообщения: 1840
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="VladislavS",url="/forum/viewtopic.php?p=3695741#p3695741"]Во-вторых, ты уверен, что хотел if(t=1), а не if(t==1) ?[/uquote]
Обычно компилятор выдаёт варнинг в этом случае. И тут: либо 1) автор его отключил; либо 2) забивает на все варнинги компилятора.
Автору: на варнинги забивать не стОит. А отключать их стоит когда наберётесь опыта и начнёте понимать что делаете (т.е. - не скоро).
[uquote="VladislavS",url="/forum/viewtopic.php?p=3695741#p3695741"]В-третьих, стройное форматирование кода - половина читаемости и понимаемости.[/uquote]
Точно!! Такой бурелом даже смотреть нет никакого желания.
Порядок в голове начинается с порядка на рабочем столе в исходниках.
Обычно компилятор выдаёт варнинг в этом случае. И тут: либо 1) автор его отключил; либо 2) забивает на все варнинги компилятора.
Автору: на варнинги забивать не стОит. А отключать их стоит когда наберётесь опыта и начнёте понимать что делаете (т.е. - не скоро).
[uquote="VladislavS",url="/forum/viewtopic.php?p=3695741#p3695741"]В-третьих, стройное форматирование кода - половина читаемости и понимаемости.[/uquote]
Точно!! Такой бурелом даже смотреть нет никакого желания.
Порядок в голове начинается с порядка на рабочем столе в исходниках.
это меняет все - простой способ с goto заменяется весьма костыльным способом со сложными условиями в каждом цикле, в дополнительных if-break внутри switch и т.п.VladislavS писал(а):Что это меняет? А ничего.
а в остальном - все хорошо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3695863#p3695863"]это меняет все[/uquote]Ну так показывай, будем посмотреть высасывание проблемы из пальца.
- Сообщения: 64
- Зарегистрирован: Чт июн 09, 2016 18:24:41
Прошу принять во внимание мой статус новичка. Ученик, я совсем не профессионал в этом деле, как Вы. Все замечания постараюсь исправить. txt файл это потому что код вставляется криво почти так же как и текстовом файле. Варнинги как раз читаю. В компиляторе синтаксические ошибки выделяются красной подсветкой. И я посматриваю в низ окна компилятора. Да и кнопка BILD не активна в этом случае.
Добавлено after 6 minutes 23 seconds:
PORTB.В1+0 опечатка . Пин выключается этой командой PORTB.В1=0
Добавлено after 30 minutes 53 seconds:
Не пойму как вставить в текст код.
Добавлено after 26 minutes 5 seconds:
while(!PIND.B1&&i<20&&t)
{ Delay_ms 800; // первое звено цепочки событий
if(i<18)
{
t=0 ;
goto mesto_1;
}
Delay_ms(100) ;i++;
}
Здесь мне не понятно -фигурные скобки после while и с ними компилируется и без них---- с ними else начинается после скобок, без них в следущей строке после while так?
Добавлено after 6 minutes 5 seconds:
Исправил. Добавил скобки. По замыслу работать должно с ними.
Добавлено after 1 hour 12 minutes 40 seconds:
С учетом замечаний Простону6 добавил опрос PINB.B0 после каждого "звена цепочки событий" компилится без ошибок. Поеду на железе проверять
Добавлено after 6 minutes 23 seconds:
PORTB.В1+0 опечатка . Пин выключается этой командой PORTB.В1=0
Добавлено after 30 minutes 53 seconds:
Не пойму как вставить в текст код.
Добавлено after 26 minutes 5 seconds:
while(!PIND.B1&&i<20&&t)
{ Delay_ms 800; // первое звено цепочки событий
if(i<18)
{
t=0 ;
goto mesto_1;
}
Delay_ms(100) ;i++;
}
Здесь мне не понятно -фигурные скобки после while и с ними компилируется и без них---- с ними else начинается после скобок, без них в следущей строке после while так?
Добавлено after 6 minutes 5 seconds:
Исправил. Добавил скобки. По замыслу работать должно с ними.
Добавлено after 1 hour 12 minutes 40 seconds:
С учетом замечаний Простону6 добавил опрос PINB.B0 после каждого "звена цепочки событий" компилится без ошибок. Поеду на железе проверять
- Вложения
-
- исправл с пин Б 0 .c
- (3.36 КБ) 264 скачивания
-
- NewUnit.c
- (3.01 КБ) 290 скачиваний
-
- NewUnit.c
- (3.04 КБ) 275 скачиваний
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
И что, на if(t=1) тебе компилятор никакого варнинга не написал?
[uquote="Billi34",url="/forum/viewtopic.php?p=3695995#p3695995"]Здесь мне не понятно -фигурные скобки после while и с ними компилируется и без них[/uquote]Компилируется всё что синтаксически верно записано. Только со скобками и без это будет разный алгоритм.
[uquote="Billi34",url="/forum/viewtopic.php?p=3695995#p3695995"]Здесь мне не понятно -фигурные скобки после while и с ними компилируется и без них[/uquote]Компилируется всё что синтаксически верно записано. Только со скобками и без это будет разный алгоритм.
- Сообщения: 64
- Зарегистрирован: Чт июн 09, 2016 18:24:41
может я не вижу. будьте снисходительны. Или это демо версия компилятора такая?
- Вложения
-
- инговнет.PNG
- (70.63 КБ) 287 скачиваний
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Компилятор, однозначно, в топку. Вот на такой коддолжно выдаваться что-то типа
И я в третий раз спрашиваю вместо компилятора, ты правда хотел написать if(t=0) или всё же if(t==0)? Или тебе всё равно, лишь бы компилировалось?
Код: Выделить всё
if(data=255)
SPI_Tx<uint16_t>(data);
else
SPI_Tx<uint8_t>(data);
Код: Выделить всё
Warning[Pe187]: use of "=" where "==" may have been intended Billi34, мда, это Вам не GCC. У MikroC мозгов намного меньше и о таких косяках он предупреждать не умеет.
- Сообщения: 64
- Зарегистрирован: Чт июн 09, 2016 18:24:41
В этой строке я хочу: если переменная t все еще равна 1 (т.е. не была сброшена в ноль в пред идущих строках) управление перешло к mesto_2:
возможно я не правильно записал свою мысль в компиляторе.
Добавлено after 1 minute 15 seconds:
возможно я не правильно записал свою мысль в компиляторе.
Добавлено after 1 minute 15 seconds:


