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

mrtester
Offline
Зарегистрирован: 26.02.2015
#define nSLEEP 21
#define STEPPER_STEP 44 //STEP Pin
#define STEPPER_DIR 45 // DIR Pin
#define nENBL 46

unsigned int motor_running = 13000; // полный ход
unsigned int steps_of_motor = 12500; // рабочее положение, начальное
unsigned int is_steps_of_motor = 0;  // текущее положение
unsigned int bars;
boolean t=0, closed=1;
byte timerST;

byte timerDSB=0; //таймер датчика температуры
byte timerDR=0; //таймер переключения показаний температуры
boolean flagD=0, flagDR=0; //флаги

void setup() {
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    
    closed=0;// полностью закрываем
    bars=0;
    while (bars < motor_running){ 
    digitalWrite (nENBL, 0);
    digitalWrite(STEPPER_DIR, closed);}
    digitalWrite (nENBL, 1);
    //delay(3000);  
}

void loop() {
  if (t==0) {
    closed=1; //открывает, положение начального запуска
    is_steps_of_motor = steps_of_motor; //где стоит
    Step();
    t=1; }
 if (timerST==20) { 
  closed=0; //закрывает
  Step();
 }
  if (timerST==40) { 
  closed=1; //открываем
  Step();
  timerST=0;}
}

ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}

void Step() {
  bars=0;
  while (bars < is_steps_of_motor){
    digitalWrite(STEPPER_DIR, closed);
    digitalWrite (nENBL, 0);}
  digitalWrite (nENBL, 1);
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
timerDR++; //таймер переключения показаний температуры
timerST++;
}  

есть такой код, все замечательно работает

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

#include <OneWire.h>

#define DALLAS 41 //

OneWire  ds(DALLAS);
volatile float celsW;
byte a_w; //температура датчика целая 
byte timerDSB=0; //таймер датчика температуры
byte timerDR=0; //таймер переключения показаний температуры
boolean flagD=0, flagDR=0; //флаги

byte g_digits [23] = {63,6,91,79,102,109,125,7,127,103,191,134,219,207,230,237,253,135,255,231,97,115,0};
//74HC595
const byte  latchPin = 38; //STB
const byte  clockPin = 39; //SLK
const byte  dataPin = 40; //S_IN

void setup()
{
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
  //Serial.begin(9600);
 //Входы 
 pinMode (latchPin, OUTPUT); // 
 pinMode (clockPin, OUTPUT); // 
 pinMode (dataPin, OUTPUT); // 
//Serial.begin(9600);
 
 /*//без точки 
g_digits [0] =  63; //B00111111;
g_digits [1] =  6; //B00000110;
g_digits [2] =  91; //B01011011;
g_digits [3] =  79; //B01001111;
g_digits [4] =  102; //B01100110;
g_digits [5] =  109; //B01101101;
g_digits [6] =  125; //B01111101;
g_digits [7] =  7; //B00000111;
g_digits [8] =  127; //B01111111;
g_digits [9] =  103; //B01100111;

//с точкой
g_digits [10] =  191; //B10111111;
g_digits [11] =  134; //B10000110;
g_digits [12] =  219; //B11011011;
g_digits [13] =  207; //B11001111;
g_digits [14] =  230; //B11100110;
g_digits [15] =  237; //B11101101;
g_digits [16] =  253; //B11111101;
g_digits [17] =  135; //B10000111;
g_digits [18] =  255; //B11111111;
g_digits [19] =  231; //B11100111;

g_digits [20] =  97; //B01100001; //C B00111001 с B01100001
g_digits [21] =  115; //B01110011; //P
g_digits [22] =  0; //B00000000; // не горит
*/
}

void loop() {
  DS18B20();
  if (timerDSB==1 && flagD==0) {
  Disp();
  flagD=1; }
  a_w = celsW; //получаем целые градусы
  
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
timerDR++; //таймер переключения показаний температуры
}  

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;
   }/*
Serial.print("  Temperature = ");
Serial.print(celsW);
Serial.println("  Temp = ");
Serial.print(a_w);
*/
}

void Disp() {//показания температуры на дисплей, на 74HC595 
    byte a, b, c; 
    byte z, y, x, w; 
    a=a_w/10; //десятки
    b=a_w-a*10; //единицы
    c= celsW*10 - a_w*10; //десятые
    if (a_w >0) w=20;
    else w=22; 
    if (a_w>0 && a_w<10) z=a+10;
    else z=a;
    if (a_w<100 && a_w>9) y=b+10;
    else y=b;
    x=c;
 
    digitalWrite(latchPin, 0); //записываем с конца индикации
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[w]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[x]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[y]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[z]); 
    digitalWrite(latchPin, 1);
}

есть такой код, тоже все хорошо работает

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

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

mrtester
Offline
Зарегистрирован: 26.02.2015
#include <OneWire.h>

#define nSLEEP 21
#define DALLAS 41 //
#define STEPPER_STEP 44 //STEP Pin
#define STEPPER_DIR 45 // DIR Pin
#define nENBL 46

unsigned int motor_running = 13000; // полный ход
unsigned int steps_of_motor = 12500; // рабочее положение, начальное
unsigned int is_steps_of_motor = 0;  // текущее положение
unsigned int bars;
boolean t=0, closed=1;
byte timerST;
OneWire  ds(DALLAS);
volatile float celsW;
byte a_w; //температура датчика целая 
byte timerDSB=0; //таймер датчика температуры
byte timerDR=0; //таймер переключения показаний температуры
boolean flagD=0, flagDR=0; //флаги
byte g_digits [23] = {63,6,91,79,102,109,125,7,127,103,191,134,219,207,230,237,253,135,255,231,97,115,0};
//74HC595
const byte  latchPin = 38; //STB
const byte  clockPin = 39; //SLK
const byte  dataPin = 40; //S_IN

void setup() {
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 pinMode (latchPin, OUTPUT); // 
 pinMode (clockPin, OUTPUT); // 
 pinMode (dataPin, OUTPUT); // 
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    
    closed=0;// полностью закрываем
    bars=0;
    while (bars < motor_running){ 
    digitalWrite (nENBL, 0);
    digitalWrite(STEPPER_DIR, closed);}
    digitalWrite (nENBL, 1);
    //delay(3000);  
}

void loop() {
   DS18B20();
  if (timerDSB==1 && flagD==0) {
  Disp();
  flagD=1; }
  a_w = celsW; //получаем целые градусы
  if (t==0) {
    closed=1; //открывает, положение начального запуска
    is_steps_of_motor = steps_of_motor; //где стоит
    Step();
    t=1; }
 if (timerST==20) { 
  closed=0; //закрывает
  Step();
 }
  if (timerST==40) { 
  closed=1; //открываем
  Step();
  timerST=0;}
}

ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}

void Step() {
  bars=0;
  while (bars < is_steps_of_motor){
    digitalWrite(STEPPER_DIR, closed);
    digitalWrite (nENBL, 0);}
  digitalWrite (nENBL, 1);
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
timerDR++; //таймер переключения показаний температуры
timerST++;
} 

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;
   }
}

void Disp() {//показания температуры на дисплей, на 74HC595 
    byte a, b, c; 
    byte z, y, x, w; 
    a=a_w/10; //десятки
    b=a_w-a*10; //единицы
    c= celsW*10 - a_w*10; //десятые
    if (a_w >0) w=20;
    else w=22; 
    if (a_w>0 && a_w<10) z=a+10;
    else z=a;
    if (a_w<100 && a_w>9) y=b+10;
    else y=b;
    x=c;
 
    digitalWrite(latchPin, 0); //записываем с конца индикации
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[w]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[x]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[y]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[z]); 
    digitalWrite(latchPin, 1);
}

 

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

может кто то объяснить в чем проблемма

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

блокировать начинает с строк 43-48, пробовал с for то же самое

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот и я об этом. Если в видео один мужик голый- то это эротика, а если одна баба ,то тоже эротика. А вот если вместе то блин порнуха выходит. Здесь нужны уже другие стандарты. Так и у вас.

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

из цикла выходит

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

qwone пишет:

Вот и я об этом. Если в видео один мужик голый- то это эротика, а если одна баба ,то тоже эротика. А вот если вместе то блин порнуха выходит. Здесь нужны уже другие стандарты. Так и у вас.

Ну слава богу, хоть кто-то сравнил программазм с порнухой!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

mykaida.Так тут идет сплошная парнуха начина с Джереми Блума "Онанизм для начинающих". https://arduino.ua/docs/AOU164.pdf

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

похоже умные бухают, а красивые сидят здесь

С праздником!!!

пойду за умного попробую, может получится

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

mrtester пишет:

пойду за умного попробую, может получится

Пральна! 

Тут сэдмен недавно правильно сказал "Тут все тупые". Ну, почти правильно. Совсем правильно было бы "все, кроме ворот".

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

mrtester, а что дума закон приняла, чтоб каждое предложение в отдельном посте? Или это указ президента?

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

mrtester пишет:

#include <OneWire.h>

#define nSLEEP 21
#define DALLAS 41 //
#define STEPPER_STEP 44 //STEP Pin
#define STEPPER_DIR 45 // DIR Pin
#define nENBL 46

unsigned int motor_running = 13000; // полный ход
unsigned int steps_of_motor = 12500; // рабочее положение, начальное
unsigned int is_steps_of_motor = 0;  // текущее положение
unsigned int bars;
boolean t=0, closed=1;
byte timerST;
OneWire  ds(DALLAS);
volatile float celsW;
byte a_w; //температура датчика целая 
byte timerDSB=0; //таймер датчика температуры
byte timerDR=0; //таймер переключения показаний температуры
boolean flagD=0, flagDR=0; //флаги
byte g_digits [23] = {63,6,91,79,102,109,125,7,127,103,191,134,219,207,230,237,253,135,255,231,97,115,0};
//74HC595
const byte  latchPin = 38; //STB
const byte  clockPin = 39; //SLK
const byte  dataPin = 40; //S_IN

void setup() {
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 pinMode (latchPin, OUTPUT); // 
 pinMode (clockPin, OUTPUT); // 
 pinMode (dataPin, OUTPUT); // 
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    
    closed=0;// полностью закрываем
    bars=0;
    while (bars < motor_running){ 
    digitalWrite (nENBL, 0);
    digitalWrite(STEPPER_DIR, closed);}
    digitalWrite (nENBL, 1);
    //delay(3000);  
}

void loop() {
   DS18B20();
  if (timerDSB==1 && flagD==0) {
  Disp();
  flagD=1; }
  a_w = celsW; //получаем целые градусы
  if (t==0) {
    closed=1; //открывает, положение начального запуска
    is_steps_of_motor = steps_of_motor; //где стоит
    Step();
    t=1; }
 if (timerST==20) { 
  closed=0; //закрывает
  Step();
 }
  if (timerST==40) { 
  closed=1; //открываем
  Step();
  timerST=0;}
}

ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}

void Step() {
  bars=0;
  while (bars < is_steps_of_motor){
    digitalWrite(STEPPER_DIR, closed);
    digitalWrite (nENBL, 0);}
  digitalWrite (nENBL, 1);
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
timerDR++; //таймер переключения показаний температуры
timerST++;
} 

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;
   }
}

void Disp() {//показания температуры на дисплей, на 74HC595 
    byte a, b, c; 
    byte z, y, x, w; 
    a=a_w/10; //десятки
    b=a_w-a*10; //единицы
    c= celsW*10 - a_w*10; //десятые
    if (a_w >0) w=20;
    else w=22; 
    if (a_w>0 && a_w<10) z=a+10;
    else z=a;
    if (a_w<100 && a_w>9) y=b+10;
    else y=b;
    x=c;
 
    digitalWrite(latchPin, 0); //записываем с конца индикации
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[w]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[x]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[y]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[z]); 
    digitalWrite(latchPin, 1);
}

 

строки 48 и 83 выполняет, мотор останавливает

значит из цикла выходит?

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

qwone пишет:

mykaida.Так тут идет сплошная парнуха начина с Джереми Блума "Онанизм для начинающих". https://arduino.ua/docs/AOU164.pdf

а всю книгу можно

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

mrtester, главное в жизни не зацикливаться. Как только зациклишься на одном деле, то все писец другие дела по боку. Лучше делать все дела по чуть-чуть. То там то там и все будешь успевать.  И программу пишите с таким же подходом и структурируйте, а то в винигрете сложно ковыряться. Это картошечка, а это горошек, а это камушек. Кто бросил камушек в винигрет. Никто. Ясно же когда готовил еду так свалися.

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

mrtester пишет:

а всю книгу можно

Вам нужна книга Блума? Или что?

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

ЕвгенийП пишет:

mrtester пишет:

а всю книгу можно

Вам нужна книга Блума? Или что?

да, Блума

mrtester
Offline
Зарегистрирован: 26.02.2015
#include <OneWire.h> // датчик температуры
#define DALLAS 41 // датчик температуры пин
// DRV8825 
#define nSLEEP 21 //сон вкл 0
#define STEPPER_STEP 44 //STEP такты
#define STEPPER_DIR 45 // DIR в какую сторону крутить
#define nENBL 46 // разрешение на работу вкл 0

unsigned int motor_running = 13000; // полный ход, от одгого упора до другово
unsigned int steps_of_motor = 12500; // рабочее положение, начальное
unsigned int is_steps_of_motor = 0;  // текущее положение
unsigned int bars; // такты
boolean t=0, closed=1; // установка рабочего положения, в какую сторону крутить, открыта или закрыто
byte timerST; // таймер работы
OneWire  ds(DALLAS);
volatile float celsW; //температура датчика с сотыми
byte a_w; //температура датчика целая 
byte timerDSB=0; //таймер датчика температуры
byte timerDR=0; //таймер переключения показаний температуры
boolean flagD=0, flagDR=0; //флаги
byte g_digits [23] = {63,6,91,79,102,109,125,7,127,103,191,134,219,207,230,237,253,135,255,231,97,115,0};
//74HC595
const byte  latchPin = 38; //STB
const byte  clockPin = 39; //SLK
const byte  dataPin = 40; //S_IN

void setup() {
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 pinMode (latchPin, OUTPUT); // 
 pinMode (clockPin, OUTPUT); // 
 pinMode (dataPin, OUTPUT); // 
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    
    closed=0;// полностью закрываем
    bars=0; //обнулили таймер
    while (bars < motor_running){ // сколько оборотов
    digitalWrite (nENBL, 0); // разрешили работу мотора
    digitalWrite(STEPPER_DIR, closed);} // в какую сторону
    digitalWrite (nENBL, 1); // запретили работу мотора
    
     /*//без точки 
g_digits [0] =  63; //B00111111;
g_digits [1] =  6; //B00000110;
g_digits [2] =  91; //B01011011;
g_digits [3] =  79; //B01001111;
g_digits [4] =  102; //B01100110;
g_digits [5] =  109; //B01101101;
g_digits [6] =  125; //B01111101;
g_digits [7] =  7; //B00000111;
g_digits [8] =  127; //B01111111;
g_digits [9] =  103; //B01100111;

//с точкой
g_digits [10] =  191; //B10111111;
g_digits [11] =  134; //B10000110;
g_digits [12] =  219; //B11011011;
g_digits [13] =  207; //B11001111;
g_digits [14] =  230; //B11100110;
g_digits [15] =  237; //B11101101;
g_digits [16] =  253; //B11111101;
g_digits [17] =  135; //B10000111;
g_digits [18] =  255; //B11111111;
g_digits [19] =  231; //B11100111;

g_digits [20] =  97; //B01100001; //C B00111001 с B01100001
g_digits [21] =  115; //B01110011; //P
g_digits [22] =  0; //B00000000; // не горит
*/
}

void loop() {
   DS18B20();
  if (timerDSB==1 && flagD==0) {
  Disp();
  flagD=1; }
  a_w = celsW; //получаем целые градусы
  if (t==0) {
    closed=1; //открывает, положение начального запуска
    is_steps_of_motor = steps_of_motor; //где стоит
    Step();
    t=1; }
 if (timerST==20) { 
  closed=0; //закрывает
  Step();
 }
  if (timerST==40) { 
  closed=1; //открываем
  Step();
  timerST=0;}
}

ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}

void Step() {
  bars=0;
  while (bars < is_steps_of_motor){
    digitalWrite(STEPPER_DIR, closed);  // в какую сторону
    digitalWrite (nENBL, 0);} // разрешили работу мотора
  digitalWrite (nENBL, 1); // запретили работу мотора
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
timerDR++; //таймер переключения показаний температуры
timerST++; //таймер вместо delay
} 

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;
   }
}

void Disp() {//показания температуры на дисплей, на 74HC595 
    byte a, b, c; 
    byte z, y, x, w; 
    a=a_w/10; //десятки
    b=a_w-a*10; //единицы
    c= celsW*10 - a_w*10; //десятые
    if (a_w >0) w=20;
    else w=22; 
    if (a_w>0 && a_w<10) z=a+10;
    else z=a;
    if (a_w<100 && a_w>9) y=b+10;
    else y=b;
    x=c;
 
    digitalWrite(latchPin, 0); //записываем с конца индикации
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[w]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[x]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[y]);
    shiftOut(dataPin, clockPin, MSBFIRST, g_digits[z]); 
    digitalWrite(latchPin, 1);
}


добавил комментарии

 

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

mrtester пишет:

ЕвгенийП пишет:

Вам нужна книга Блума? Или что?

да, Блума

И что, Вы не можете найти, где её скачать? Странно как-то, она на каждом углу валяется. Ну, держите - https://drive.google.com/open?id=0B9r7cRXQ4DU4XzVLeUVkNHdiaVU

bwn
Offline
Зарегистрирован: 25.08.2014

Фи, Евгений Петрович, почто каку детям раздаете?))))

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

:)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А бедный Блум писал, старалса...

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

и всё, больше нечего писать, ответить ни кто не может

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

mrtester пишет:

и всё, больше нечего писать, ответить ни кто не может

"Ни кто" :(

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Тебе, родной, ещё в посте #6 все ответили. 

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

тогда почему мотор останавливается четко по тактам?

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

убираем строки с 86 по 98 и 106 по 112, оставляем строки только в setup с 43 по 48. Нога nENBL после цикла переходит в 5 вольт

дальше while нет в коде и все равно не работает

я в коде это проблему пешил, мне интересно в теории что я не понял

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

mrtester пишет:

убираем строки с 86 по 98 и 106 по 112, оставляем строки только в setup с 43 по 48. Нога nENBL после цикла переходит в 5 вольт

дальше while нет в коде и все равно не работает

ну ты думаешь кто-то будет сидеть и убирать-добавлять строки, как ты командуешь? - почисти код, оставь в нем 30-40 строчек так, чтобы проблема была видна - и выложи. Тогда, может, кто и снизойдет.

mrtester
Offline
Зарегистрирован: 26.02.2015
#include <OneWire.h> // датчик температуры
#define DALLAS 41 // датчик температуры пин
// DRV8825 
#define nSLEEP 21 //сон вкл 0
#define STEPPER_STEP 44 //STEP такты
#define STEPPER_DIR 45 // DIR в какую сторону крутить
#define nENBL 46 // разрешение на работу вкл 0
unsigned int motor_running = 13000; // полный ход, от одгого упора до другово
unsigned int bars; // такты
boolean closed=1; // в какую сторону крутить, открыта или закрыто
OneWire  ds(DALLAS);
volatile float celsW; //температура датчика с сотыми 
byte timerDSB=0; //таймер датчика температуры
boolean flagDR=0; //флаги

void setup() {
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 digitalWrite (nENBL, 1); // запретили работу мотора
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    closed=0;// полностью закрываем
    bars=0; //обнулили таймер
    while (bars < motor_running){ // сколько оборотов
    digitalWrite (nENBL, 0); // разрешили работу мотора
    digitalWrite(STEPPER_DIR, closed);} // в какую сторону
    digitalWrite (nENBL, 1); // запретили работу мотора
    Serial.begin(9600);
}
void loop() {
   DS18B20();
 }
ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
} 
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 (); }
  celsW =((data[1] << 8) | data[0]) /16.0; //  Пересчитываем в температуру
  timerDSB=0; flagDR=0;
  Serial.print("  Temperature = ");
  Serial.println(celsW);}
}

 

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

если убрать строчку 29 по 34 в сериал показывает температуру, если оставить, мотор отрабатывает 1 раз и выкл

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

А если описать bars как volatile?

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

тоже самое

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

Давайте свежий код. И заодно поставьте печать чего-нибудь (хоть Hello, world") после строки 35 и скжите печатается или нет, ну когда while на месте.

mrtester
Offline
Зарегистрирован: 26.02.2015
Serial.begin(9600);
    Serial.print("  Temperature = ");

 

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

работает

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

дальше нет ни чего

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mrtester пишет:

дальше нет ни чего

А код, Евгений Петрович просил самый свежий код

mrtester
Offline
Зарегистрирован: 26.02.2015
#include <OneWire.h> // датчик температуры
#define DALLAS 41 // датчик температуры пин
// DRV8825 
#define nSLEEP 21 //сон вкл 0
#define STEPPER_STEP 44 //STEP такты
#define STEPPER_DIR 45 // DIR в какую сторону крутить
#define nENBL 46 // разрешение на работу вкл 0
unsigned int motor_running = 13000; // полный ход, от одгого упора до другово
volatile int bars; // такты
boolean closed=1; // в какую сторону крутить, открыта или закрыто
OneWire  ds(DALLAS);
volatile float celsW; //температура датчика с сотыми 
byte timerDSB=0; //таймер датчика температуры
boolean flagDR=0; //флаги

void setup() {
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 digitalWrite (nENBL, 1); // запретили работу мотора
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    closed=0;// полностью закрываем
    bars=0; //обнулили таймер
    while (bars < motor_running){ // сколько оборотов
    digitalWrite (nENBL, 0); // разрешили работу мотора
    digitalWrite(STEPPER_DIR, closed);} // в какую сторону
    digitalWrite (nENBL, 1); // запретили работу мотора
    Serial.begin(9600);
    Serial.print("  Temperature = ");
   // delay(3000);  
}
void loop() {
   DS18B20();
 }
ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
} 
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 (); }
  celsW =((data[1] << 8) | data[0]) /16.0; //  Пересчитываем в температуру
  timerDSB=0; flagDR=0;
  Serial.print("  Temperature = ");
  Serial.println(celsW);}
}

 

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

36 строку печатает

mrtester
Offline
Зарегистрирован: 26.02.2015
#include <OneWire.h> // датчик температуры
#define DALLAS 41 // датчик температуры пин
// DRV8825 
#define nSLEEP 21 //сон вкл 0
#define STEPPER_STEP 44 //STEP такты
#define STEPPER_DIR 45 // DIR в какую сторону крутить
#define nENBL 46 // разрешение на работу вкл 0
unsigned int motor_running = 13000; // полный ход, от одгого упора до другово
volatile int bars; // такты
boolean closed=1; // в какую сторону крутить, открыта или закрыто
OneWire  ds(DALLAS);
volatile float celsW; //температура датчика с сотыми 
byte timerDSB=0; //таймер датчика температуры
boolean flagDR=0; //флаги

void setup() {
 
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 digitalWrite (nSLEEP, 1);
 digitalWrite (nENBL, 1); // запретили работу мотора
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    closed=0;// полностью закрываем
    bars=0; //обнулили таймер
    while (bars < motor_running){ // сколько оборотов
    digitalWrite (nENBL, 0); // разрешили работу мотора
    digitalWrite(STEPPER_DIR, closed);} // в какую сторону
    digitalWrite (nENBL, 1); // запретили работу мотора
    Serial.begin(9600);
    Serial.print("  Temperature = ");
   // delay(3000);
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды  
}
void loop() {
   DS18B20();
 }
ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
} 
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 (); }
  celsW =((data[1] << 8) | data[0]) /16.0; //  Пересчитываем в температуру
  timerDSB=0; flagDR=0;
  Serial.print("  Temperature = ");
  Serial.println(celsW);}
}

вот так работает

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

похоже while использовает сторежевой таймер

mrtester
Offline
Зарегистрирован: 26.02.2015
#include <OneWire.h> // датчик температуры
#define DALLAS 41 // датчик температуры пин
// DRV8825 
#define nSLEEP 21 //сон вкл 0
#define STEPPER_STEP 44 //STEP такты
#define STEPPER_DIR 45 // DIR в какую сторону крутить
#define nENBL 46 // разрешение на работу вкл 0
unsigned int motor_running = 13000; // полный ход, от одгого упора до другово
unsigned int is_steps_of_motor = 0;  // текущее положение
unsigned int steps_of_motor = 12500; // рабочее положение, начальное
byte timerST; // таймер работы
unsigned int bars; // такты
boolean closed=1; // в какую сторону крутить, открыта или закрыто
OneWire  ds(DALLAS);
volatile float celsW; //температура датчика с сотыми 
byte timerDSB=0; //таймер датчика температуры
boolean t=0, flagDR=0; //флаги

void setup() {
 
 pinMode(STEPPER_DIR, OUTPUT);
 pinMode(STEPPER_STEP, OUTPUT);
 pinMode(nENBL, OUTPUT); 
 pinMode(nSLEEP, OUTPUT);
 pinMode(13, OUTPUT);
 digitalWrite (nSLEEP, 1);
 pinMode(13, OUTPUT);
 digitalWrite (nENBL, 1); // запретили работу мотора
 TCCR5A = 0;
 TCCR5B = (1<<WGM52) | (1<<CS51) | (1<<CS50);    // Режим работы таймера CTC со сбросом счетчика + предделитель 64
 TIMSK5 = 1<<OCIE5A;  // Разрешение прерывания по сравнению 
 OCR5A = 10;   // Частота прерываний будет = Fclk/(N*(1+OCR1A)) где N - коэф. предделителя (1, 8, 64, 256 или 1024) 
    closed=0;// полностью закрываем
    bars=0; //обнулили таймер
    while (bars < motor_running){ // сколько оборотов
    digitalWrite (nENBL, 0); // разрешили работу мотора
    digitalWrite(STEPPER_DIR, closed);} // в какую сторону
    digitalWrite (nENBL, 1); // запретили работу мотора
    Serial.begin(9600);
    Serial.print("  Temperature = ");
   // delay(3000);
 WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты
 WDTCSR=(1<<WDIE)| (1<<WDP2); // разрешение прерывания + выдержка 1/4 секунды  
}
void loop() {
   DS18B20();
    if (t==0) {
    closed=1; //открывает, положение начального запуска
    is_steps_of_motor = steps_of_motor; //где стоит
    Step();
    t=1; }
 if (timerST==20) { 
  closed=0; //закрывает
  Step();
 }
  if (timerST==40) { 
  closed=1; //открываем
  Step();
  timerST=0;}

 }
ISR (TIMER5_COMPA_vect) {
  digitalWrite(STEPPER_STEP, !digitalRead(STEPPER_STEP));
  bars ++;
  
}
ISR (WDT_vect){ //вектор прерывания WD
timerDSB++; // таймер датчика температуры
digitalWrite(13, !digitalRead(13));
timerST++;
} 
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 (); }
  celsW =((data[1] << 8) | data[0]) /16.0; //  Пересчитываем в температуру
  timerDSB=0; flagDR=0;
  Serial.print("  Temperature = ");
  Serial.println(celsW);}
}
void Step() {
  bars=0;
  while (bars < is_steps_of_motor){
    digitalWrite(STEPPER_DIR, closed);  // в какую сторону
    digitalWrite (nENBL, 0);} // разрешили работу мотора
  digitalWrite (nENBL, 1); // запретили работу мотора
}


 

даже вот так заработала

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

а если строчки 37 и 38 (код сообщения #41) поставить до while ?

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

А, ну поставьте после строки 49 кода из #39 печать переменной  timerDSB и flagDR. Думаю, всё поймёте. У Вас условие в лупе не выполняется никогда.

Если вочдог срабатывает раньше первого прохода loop, то timerDSB  становится 1, а flagDR остаётся нулём и всё - приплыли.

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

после выполнения строки 54 температуру перестает выдавать

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

Я говорю о коде из №39, не пудрите мозг строкой 54

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

ЕвгенийП пишет:

 У Вас условие в лупе не выполняется никогда.

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

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

Если повезёт :)

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

согласен

все что в ISR не работает