странная работа while или for
- Войдите на сайт для отправки комментариев
Сб, 23/02/2019 - 15:27
#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++;
}
есть такой код, все замечательно работает
#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); }есть такой код, тоже все хорошо работает
когда объединяешь два кода while блокирует работу датчика температуры и дисплея, остальное работает
#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); }может кто то объяснить в чем проблемма
блокировать начинает с строк 43-48, пробовал с for то же самое
http://arduino.ru/Reference/While
Вот и я об этом. Если в видео один мужик голый- то это эротика, а если одна баба ,то тоже эротика. А вот если вместе то блин порнуха выходит. Здесь нужны уже другие стандарты. Так и у вас.
из цикла выходит
Вот и я об этом. Если в видео один мужик голый- то это эротика, а если одна баба ,то тоже эротика. А вот если вместе то блин порнуха выходит. Здесь нужны уже другие стандарты. Так и у вас.
Ну слава богу, хоть кто-то сравнил программазм с порнухой!
mykaida.Так тут идет сплошная парнуха начина с Джереми Блума "Онанизм для начинающих". https://arduino.ua/docs/AOU164.pdf
похоже умные бухают, а красивые сидят здесь
С праздником!!!
пойду за умного попробую, может получится
пойду за умного попробую, может получится
Пральна!
Тут сэдмен недавно правильно сказал "Тут все тупые". Ну, почти правильно. Совсем правильно было бы "все, кроме ворот".
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 выполняет, мотор останавливает
значит из цикла выходит?
mykaida.Так тут идет сплошная парнуха начина с Джереми Блума "Онанизм для начинающих". https://arduino.ua/docs/AOU164.pdf
а всю книгу можно
mrtester, главное в жизни не зацикливаться. Как только зациклишься на одном деле, то все писец другие дела по боку. Лучше делать все дела по чуть-чуть. То там то там и все будешь успевать. И программу пишите с таким же подходом и структурируйте, а то в винигрете сложно ковыряться. Это картошечка, а это горошек, а это камушек. Кто бросил камушек в винигрет. Никто. Ясно же когда готовил еду так свалися.
а всю книгу можно
Вам нужна книга Блума? Или что?
а всю книгу можно
Вам нужна книга Блума? Или что?
да, Блума
#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); } добавил комментарииВам нужна книга Блума? Или что?
да, Блума
И что, Вы не можете найти, где её скачать? Странно как-то, она на каждом углу валяется. Ну, держите - https://drive.google.com/open?id=0B9r7cRXQ4DU4XzVLeUVkNHdiaVU
Фи, Евгений Петрович, почто каку детям раздаете?))))
:)
А бедный Блум писал, старалса...
и всё, больше нечего писать, ответить ни кто не может
и всё, больше нечего писать, ответить ни кто не может
"Ни кто" :(
Тебе, родной, ещё в посте #6 все ответили.
тогда почему мотор останавливается четко по тактам?
убираем строки с 86 по 98 и 106 по 112, оставляем строки только в setup с 43 по 48. Нога nENBL после цикла переходит в 5 вольт
дальше while нет в коде и все равно не работает
я в коде это проблему пешил, мне интересно в теории что я не понял
убираем строки с 86 по 98 и 106 по 112, оставляем строки только в setup с 43 по 48. Нога nENBL после цикла переходит в 5 вольт
дальше while нет в коде и все равно не работает
ну ты думаешь кто-то будет сидеть и убирать-добавлять строки, как ты командуешь? - почисти код, оставь в нем 30-40 строчек так, чтобы проблема была видна - и выложи. Тогда, может, кто и снизойдет.
#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);} }если убрать строчку 29 по 34 в сериал показывает температуру, если оставить, мотор отрабатывает 1 раз и выкл
А если описать bars как volatile?
тоже самое
Давайте свежий код. И заодно поставьте печать чего-нибудь (хоть Hello, world") после строки 35 и скжите печатается или нет, ну когда while на месте.
Serial.begin(9600); Serial.print(" Temperature = ");работает
дальше нет ни чего
дальше нет ни чего
А код, Евгений Петрович просил самый свежий код
#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);} }36 строку печатает
#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);} }вот так работает
похоже while использовает сторежевой таймер
#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); // запретили работу мотора }даже вот так заработала
а если строчки 37 и 38 (код сообщения #41) поставить до while ?
А, ну поставьте после строки 49 кода из #39 печать переменной timerDSB и flagDR. Думаю, всё поймёте. У Вас условие в лупе не выполняется никогда.
Если вочдог срабатывает раньше первого прохода loop, то timerDSB становится 1, а flagDR остаётся нулём и всё - приплыли.
после выполнения строки 54 температуру перестает выдавать
Я говорю о коде из №39, не пудрите мозг строкой 54
У Вас условие в лупе не выполняется никогда.
ну уж прям-таки "никогда" :) там размерность счетчика всего байт. Если иметь терпение - сработает :)
Если повезёт :)
согласен
все что в ISR не работает