странная работа while или for

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

согласен

что "согласен"-то? -  ошибку свою поняли?

mrtester
Offline
Зарегистрирован: 26.02.2015

нет

mrtester
Offline
Зарегистрирован: 26.02.2015

блокирует таймер WDT?

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

нет

вы сделали то, что сказал Евгений в сообщении 45 ?

mrtester
Offline
Зарегистрирован: 26.02.2015

если брать #43 то таймер ST и нога 13 с диодом работают

mrtester
Offline
Зарегистрирован: 26.02.2015

b707 пишет:

mrtester пишет:

нет

вы сделали то, что сказал Евгений в сообщении 45 ?

таймер работает, флаг стоит на 0

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

таймер работает, флаг стоит на 0

вы читать умееете? - прочитайте еще раз #45 внимательно - и сделайте ВСЕ В ТОЧНОСТИ, как там сказано.

Если и после этого не поймете - я уж и не знаю, как вам помочь.

mrtester
Offline
Зарегистрирован: 26.02.2015

b707 пишет:

mrtester пишет:

таймер работает, флаг стоит на 0

вы читать умееете? - прочитайте еще раз #45 внимательно - и сделайте ВСЕ В ТОЧНОСТИ, как там сказано.

Если и после этого не поймете - я уж и не знаю, как вам помочь.

поставил на 50 сроке, тоже самое что и loop

mrtester
Offline
Зарегистрирован: 26.02.2015

таймер работает флаг на 0, таймер доходит до 0 флаг переходит на 1 и таймер и флаг начинают работать

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

таймер работает флаг на 0, таймер доходит до 0 флаг переходит на 1 и таймер и флаг начинают работать

код из #39 работает?

mrtester
Offline
Зарегистрирован: 26.02.2015

b707 пишет:

mrtester пишет:

таймер работает флаг на 0, таймер доходит до 0 флаг переходит на 1 и таймер и флаг начинают работать

код из #39 работает?

я про него и писал

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

я про него и писал

ну значит проблемы больше нет, все работает? - поздравляю

mrtester
Offline
Зарегистрирован: 26.02.2015

работает, но не так как надо

mrtester
Offline
Зарегистрирован: 26.02.2015

но проблема понятна

при использования цикла пролетает таймер нуля и ждем пока дойдет до 0

правильно?

mrtester
Offline
Зарегистрирован: 26.02.2015

решается обнулением таймера после каждого цикла

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mrtester пишет:

но проблема понятна

при использования цикла пролетает таймер нуля и ждем пока дойдет до 0

правильно?

Правильно, только вот Вы отличаетесь редчайшим даром говорить так, что вообще не поймёшь что Вы хотели сказать.

Поэтому, давайте впредь, если у Вас есть вопрос, Вы

1. Выкладываете свежий скетч (хоть в каждом сообщении, пофиг)
2. Выкладываете копипасту из монитора порта - что печатается

Внятно объясняете в чём Ваш вопрос.

Например, сейчас, если Вы поняли то, что написали, я так понимаю, вопросов у Вас больше нет и тема закрыта? Или нет?

mrtester
Offline
Зарегистрирован: 26.02.2015

тема закрыта

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

решается обнулением таймера после каждого цикла

гланды через Ж :)

На самом деле надо исправить условия в процедуре DS18B20 - корень проблемы там, а не в том, что счетчик проскакивает

mrtester
Offline
Зарегистрирован: 26.02.2015
void DS18B20()
{
 byte data[12];
  if (timerDSB==0 && flagDR==0) 
  {
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
    flagDR=1;
  }
  if(timerDSB==3 && flagDR==1) 
  {
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE); // Чтение Scratchpad
  for (byte i = 0; i < 9; i++) 
    { //  нам нужно 9 байт (с сотыми после запятой)
      data[i] = ds.read ();
    }
    if (OneWire::crc8(data, 8) == data[8]) {//return; //проверяем CRC 
  celsW =((data[1] << 8) | data[0]) /16.0;} //  Пересчитываем в температуру
  timerDSB=0; flagDR=0; flagD=0;
}

 

а как, если while может сработать в любой момент между 0-3 timerDSB

b707
Offline
Зарегистрирован: 26.05.2017

например в обоих условиях (строчки 04 и 11) - прописать не строгое равенство timerDSB==0, а "больше равно"

 

mrtester
Offline
Зарегистрирован: 26.02.2015

тогда уменьшется время между обнулением и чтением датчика, могут быть ошибки

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

тогда уменьшется время между обнулением и чтением датчика, могут быть ошибки

не уменьшается

mrtester
Offline
Зарегистрирован: 26.02.2015
void loop() {
  if (flagBars==0) {flagBars=1; flagSteps=0; bars=0;}
  if (flagSteps==0){
    if (bars < is_steps_of_motor){
      digitalWrite (nENBL, 0);
      digitalWrite(STEPPER_DIR, closed);}
    else {digitalWrite (nENBL, 1); flagSteps=1;}}
  DS18B20();
  if (timerDSB==1 && flagD==0) {
    Disp();
    flagD=1; }
  a_w = celsW; //получаем целые градусы
 if (t==0) {
    closed=1; //открывает, положение начального запуска
    is_steps_of_motor = steps_of_motor; //где стоит
    flagBars=0;
    t=1; }
 if (timerST==20 && flagSteps==1) { 
   closed=0; //закрывает
   flagBars=0;}
 if (timerST==40 && flagSteps==1) { 
   closed=1; //открываем
   flagBars=0;
   timerST=0;}
}

 

я отказался от whili, при таком коде надо чем то жертвовать, либо мотор четко работает датчик пролетает, либо наоборот. Сделал как в коде, недостаток могут пролетать такты шаговика, чуть больше прокрутит, но 13000  шагов на 1 см это не сильно влияет

mrtester
Offline
Зарегистрирован: 26.02.2015

мотор на полный ход работает где то 0,4-0,6 секунд

b707
Offline
Зарегистрирован: 26.05.2017

вот так напишите, все остальное не трогайте - и все будет работать. Иногда интервалы считывания и конверсии DS18B20 будут больше запланированных - но не меньше.

void DS18B20()
{
 byte data[12];
  if (timerDSB>=0 && flagDR==0) 
  {
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
     timerDSB=0; flagDR=1;
  }
  if(timerDSB>=3 && flagDR==1) 
  {
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE); // Чтение Scratchpad
  for (byte i = 0; i < 9; i++) 
    { //  нам нужно 9 байт (с сотыми после запятой)
      data[i] = ds.read ();
    }
    if (OneWire::crc8(data, 8) == data[8]) {//return; //проверяем CRC 
  celsW =((data[1] << 8) | data[0]) /16.0;} //  Пересчитываем в температуру
  timerDSB=0; flagDR=0; flagD=0;
}
}

 

mrtester
Offline
Зарегистрирован: 26.02.2015

вечером попробую на коде #39

mrtester
Offline
Зарегистрирован: 26.02.2015

только вместо градусов вставлю таймер и флаг, отпишу

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

только вместо градусов вставлю таймер и флаг, отпишу

лучше не надо. Простите за откровенность, но за время темы вы показали, что даже запятую в коде не всегда знаете, куда поставить.