Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Сообщение Billi34 »

В том то и дело что цепочка тактируется PINB и длинна цепочки событий может быть разной. Я уже думал так сделать, как Вы предложили Не разрешимые дилеммы не дали хода. Недостаток знаний.
Последний раз редактировалось Billi34 Пт сен 06, 2019 17:32:54, всего редактировалось 1 раз.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Billi34, не бывает неразрешимых проблем. Приведите весь код, пожалуйства.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Сообщение Billi34 »

о.к.
Вложения
Новый текстовый документ.txt
(2.7 КБ) 170 скачиваний
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):забудь оператор goto. Поверь, это не больно
вот со всем сказанным в этом же сообщении соглашусь, а с процитированным - не могу. лично мне было довольно "больно" без goto решить самую простую задачу анализа символов в строке, если при обнаружении некоторых надо закончить анализ, а для остальных просто выполнить простейшие манипуляции с ними и другими данными.

Код: Выделить всё

while(ch = *s++){
   switch(ch){
   case 'A' : goto m1;
   case 'D' : s[-1] = 'd'; break;
   default:
      continue;
   }
}
m1:
   //
сильно упрощенный код. на самом деле там в switch-е в одной из веток тоже был цикл... и тоже с вариантом досрочного прерывания как switch, так и while

я не говорю, что это нельзя сделать без goto, я говорю, что лично я это готов сделать либо из чисто спортивного интереса, либо не готов вообще - добавление новых переменных, дробление кода на функции и т.п. "методы" избегания goto слишком болезненны для меня, потому как я очень ленивый...

кстати, смотрел исходники avr-libc... там goto очень много... видимо, не один я ленивый :)))

Добавлено after 3 minutes 9 seconds:
то есть я хочу сказать, что в тех местах, где не помогает break, обойтись без goto представлет проблему.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3695704#p3695704"]слишком болезненны для меня[/uquote]От жеж...

Код: Выделить всё

while( *s && (*s!='A'))
{
   switch(*s)
   {   
     case 'D' : *s = 'd'; break;
     default:
   }
   s++;
}
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я ж сказал - пример кода сильно упрощен, только чтобы обозначить проблему. там не только символ 'A', там много вариантов анализа. и в некоторых case свои циклы. ну читайте же все, что я написал...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Сообщение Billi34 »

У меня еще очень не стабильный тактирующий сигнал приходящий на PIND.B1 Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4

Добавлено after 5 minutes 6 seconds:
Я наверное плохо искал в примерах. А герцовый генератор вида
PORTD.B4 =1;Delay_ms(500);
PORTD.B4=0;Delay_ms(500);

тормозит выполнение всей программы. Зато мигает диодик.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Аппаратным таймером воспользуйтесь. Он обеспечит прерывания через нужные периоды времени, в которых можно и светодиодом мигнуть, и кнопки опросить. Лишь бы было желание от всех этих вызовов delay избавиться.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[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]А ты даташит на контроллер дальше названия читал? Ну там про таймеры или прерывания???
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

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} вообще смысла не имеет.
Мудрый кот
Сообщения: 1840
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[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]
Точно!! Такой бурелом даже смотреть нет никакого желания.
Порядок в голове начинается с порядка на рабочем столе в исходниках.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18788
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Что это меняет? А ничего.
это меняет все - простой способ с goto заменяется весьма костыльным способом со сложными условиями в каждом цикле, в дополнительных if-break внутри switch и т.п.

а в остальном - все хорошо :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3695863#p3695863"]это меняет все[/uquote]Ну так показывай, будем посмотреть высасывание проблемы из пальца.
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Сообщение Billi34 »

Прошу принять во внимание мой статус новичка. Ученик, я совсем не профессионал в этом деле, как Вы. Все замечания постараюсь исправить. 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 после каждого "звена цепочки событий" компилится без ошибок. Поеду на железе проверять
Вложения
исправл с пин Б 0 .c
(3.36 КБ) 264 скачивания
NewUnit.c
(3.01 КБ) 290 скачиваний
NewUnit.c
(3.04 КБ) 275 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

И что, на if(t=1) тебе компилятор никакого варнинга не написал?

[uquote="Billi34",url="/forum/viewtopic.php?p=3695995#p3695995"]Здесь мне не понятно -фигурные скобки после while и с ними компилируется и без них[/uquote]Компилируется всё что синтаксически верно записано. Только со скобками и без это будет разный алгоритм.
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Сообщение Billi34 »

может я не вижу. будьте снисходительны. Или это демо версия компилятора такая?
Вложения
инговнет.PNG
(70.63 КБ) 287 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Компилятор, однозначно, в топку. Вот на такой код

Код: Выделить всё

  if(data=255)
    SPI_Tx<uint16_t>(data);
  else
    SPI_Tx<uint8_t>(data);
должно выдаваться что-то типа

Код: Выделить всё

Warning[Pe187]: use of "=" where "==" may have been intended 
И я в третий раз спрашиваю вместо компилятора, ты правда хотел написать if(t=0) или всё же if(t==0)? Или тебе всё равно, лишь бы компилировалось?
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Billi34, мда, это Вам не GCC. У MikroC мозгов намного меньше и о таких косяках он предупреждать не умеет.
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

Сообщение Billi34 »

В этой строке я хочу: если переменная t все еще равна 1 (т.е. не была сброшена в ноль в пред идущих строках) управление перешло к mesto_2:
возможно я не правильно записал свою мысль в компиляторе.

Добавлено after 1 minute 15 seconds:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Напишите просто if(t)
Ответить

Вернуться в «Разные вопросы по МК»