Прошу помощи по Arduino

Vyvern
Offline
Зарегистрирован: 06.12.2016

Доброго времени суток! Помогите разобраться с проблемой. На Ардуине собрано устройство, одна из функций которого - замер скорости вращения процессорного кулера по сигналу с таходатчика. Работало и считало нормально. Вот код void rpm () { NbTopsFan++; } void setup() { TCCR1B = TCCR1B & 0b11111000 | 0x05; pinMode (HallSensor, INPUT); // Настраиваем pin на получение прерываний attachInterrupt(1, rpm, RISING); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings[thisReading] = 0; } } void RPMCalculate() { int RPMdec; NbTopsFan = 0; // Обнуляем переменную, содержащую обороты delay (500); //Ждем 1 секунду Calc = ((NbTopsFan * 120)/fanspace[fan].fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора RPMdec = Calc*0.1075; lcd.setCursor(9, 1); lcd.print ("FAN "); lcd.print (RPMdec); //Выводим рассчитанную величину в десятичном виде lcd.print (" %"); } После добавления в скетч следующего куска - перестало считать long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1062864L / result; // Back-calculate AVcc in mV return result; } Знаний, чтобы разобраться, пока не хватает. Заливал пустой скетч в ардуину, прошивал загрузчик через другую, заливал скетч без последного куска - все равно не высчитывает обороты. Помогите кто чем может

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

Это код?

Выложите нормально, пожалуйста.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

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

Выложите нормально, пожалуйста.

я запретил.

Vyvern
Offline
Зарегистрирован: 06.12.2016
void rpm () { NbTopsFan++; } 

void setup() {
 TCCR1B = TCCR1B & 0b11111000 | 0x05;
 pinMode (HallSensor, INPUT); // Настраиваем pin на получение прерываний
 attachInterrupt(0, rpm, RISING); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала
 for (int thisReading = 0; thisReading < numReadings; thisReading++)
 { readings[thisReading] = 0; }
 }

 void RPMCalculate()
 {
 int RPMdec;
 NbTopsFan = 0; // Обнуляем переменную, содержащую обороты
 delay (500); //Ждем 1 секунду
 Calc = ((NbTopsFan * 120)/fanspace[fan].fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора
 RPMdec = Calc*0.1075;
 lcd.setCursor(9, 1);
 lcd.print ("FAN ");
 lcd.print (RPMdec); //Выводим рассчитанную величину в десятичном виде
 lcd.print (" %");
 }

Прошу прощения, чет криво вставился код. Это та часть, которая поначалу работала, а теперь никак. Такое ощущение, что не срабатывает прерывания

Vyvern
Offline
Зарегистрирован: 06.12.2016
long readVcc()
 {
 long result; // Read 1.1V reference against AVcc
 ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
 delay(2); // Wait for Vref to settle
 ADCSRA |= _BV(ADSC); // Convert
 while (bit_is_set(ADCSRA,ADSC));
 result = ADCL;
 result |= ADCH<<8;
 result = 1062864L / result; // Back-calculate AVcc in mV
 return result;
 }

А вот после добавления этого куска кода - первая часть наглухо отказываться что-либо считать. Arduino UNO R3 китай с интерфейсом USB на CH340

nik182
Offline
Зарегистрирован: 04.05.2015

Сами мы не местные...  Помогите кто чем может. (С)Метро.

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

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

nik182 пишет:

Полностью код показать религия не позволяет?

я запретил.

Vyvern
Offline
Зарегистрирован: 06.12.2016

Религия тут не причем, просто впервые обращаюсь за помощью на форум. Полный код под спойлером, после добавления в код выделенного фрагмента - перестало считать обороты в функции RPMCalculate()

vvadim
Offline
Зарегистрирован: 23.05.2012

сразу в глаза бросилось

delay (500); //Ждем 1 секунду

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Строка 36

   analogWrite(13, LOW);

Во первых  в UNO 13 нога без ШИМ.

Во вторых LOW, оно, конечно, равно 0, но так никто не пишет.

=============

Вывод - ТС - врет, как сивый мерин. Этот код не от УНО и никогда не работал. Нас, господа, разводят на решение курсача ленивому недоумку.

Vyvern
Offline
Зарегистрирован: 06.12.2016

vvadim пишет:

сразу в глаза бросилось

delay (500); //Ждем 1 секунду

В следующей строке идет умножение на 120, а не на 60 как при задержке в 1000. Времянка.

 

wdrakula пишет:
Строка 36 analogWrite(13, LOW); Во первых в UNO 13 нога без ШИМ. Во вторых LOW, оно, конечно, равно 0, но так никто не пишет. ============= Вывод - ТС - врет, как сивый мерин. Этот код не от УНО и никогда не работал. Нас, господа, разводят на решение курсача ленивому недоумку.

Да, ошибка, не analogWrite, а digitalWrite - просто гашение встроенного светодиода на Ардуине.

Код от Уно и он работал. И работает все остальное, кроме подсчета оборотов. Универ я давно закончил, но к сожалению по другой специализации. Электроника и Ардуино - хобби, и не о каком курсаче в принципе не идет речь. Спасибо за понимание.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ок.

Ваш код говорите? И все работало?

1. строка 35 - настройка таймера1 на делитель 256 (частота 62.5 КГц) нахрена?

2. строку 117 объясните. Вот четко объясните.

3. сторока 140. сет курсор и все?

4. строка 004 - датчик Холла на 3 ноге. Это INT1 в UNO

противоречит строке 43 -  attachInterrupt(0, rpm, RISING)!

---------------------

так что налицо т.н. "брехня обыкновенная". Удачи!

Vyvern
Offline
Зарегистрирован: 06.12.2016

Ok!

1. Настройка таймера - только при этом делителе вентилятор не прищал при малом заполнении ШИМ (от 50 до 150).

3. Поначалу после этой строки выводились результаты измерений с аналогового входа А1, после было вынесено в отдельную функцию, забыл убрать.

4. Данная строка вообще нигде не используеться, внесено для наглядности самому себе. Первый вариант считал по 3 цифровому входу, соответственно строка 43 была attachInterrupt(1, rpm, RISING). После того, как перестал работать счетчик оборотов - пробовал считать по 2-му цифровому входу, вот отсюда и attachInterrupt(0, rpm, RISING).

2. А вот с этим и возникла проблема, точнее после добавления этой части кода в скетч. Хотел сделать измерение со входа А1 поточнее, воспользовался статьей Making accurate ADC readings on the Arduino, Majenko's Hardware Hacking Blog. После добавления кода с данной статьи - начались проблемы. Как она работает и изза чего теперь не работают прерывания - я не знаю. В этом и был собственно мой вопрос.

Vyvern
Offline
Зарегистрирован: 06.12.2016

Вопрос больше не актуален, разобрался сам. И да - все заработало. Спасибо всем за то, что не помогали. И лично для wdrakula - отдельное спасибо за оскорбления и обвинения во лжи. Вам вернеться, а мне плевать.