Счетчик импульсов

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Добрый день, Подскажите как в пару строк сделать счётчик импульсов. Суть в том что просто при изменении положения с 1 на 0 на пине 8 (например) перременная i будет ++, и эта переменная не должна сбрасываться. То что я "написал" я даже выкладывать не буду... 

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

godForgottenBeginner пишет:
Подскажите как

Используйте аппаратное прерывание на 2 или 3 пине, в котором наращивайте глобальную переменную "ай".

Цитата:
в пару строк

Как видите, я уложился в одну строку.

Цитата:
я даже выкладывать не буду

Всё настолько  просто, что и я тоже выкладывать не буду...

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

OlegK пишет:

Всё настолько  просто, что и я тоже выкладывать не буду...

 :)))))))))))))))

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Обоснованная критика. Просто бывает надо что то сделать, а настроения нет тяжело перебароть себя. Буду признателен за помощь.

Я немного разобрался и вот что у меня получилось:

const int buttonPin = 2;     // номер вывода с кнопкой
int i = 0;   // глобальная переменная

void setup() 
{
  pinMode(buttonPin, INPUT);
  // прикрепить прерывание к вектору ISR
  attachInterrupt(0, pin_ISR, CHANGE);
}

void loop() 
{
  Serial.begin(9600);
  Serial.println(i);
  delay(500);
}

void pin_ISR() 
{
i=i++;
} 
godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Я последовал Вашему совету, если не трудно посмотрите пожалуйста код.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

godForgottenBeginner

 
 

1. Переменная i используется в прерывании, лучше, что бы она была объявлена, как volatile, т.е.
volatile int i. Зачем это?
2. Serial.begin-у не место в основном цикле, уберите в сетап.
3. С аргументом CHANGE ваше прерывание будет отрабатывать и нажатие и отпускание кнопки. Если нужно что-то одно, то используйте RISING или FALLING, взависимости от включения кнопки (кстати, как она подключена?).
4. "i = i++" так не нужно. Просто оставьте i++ или i += 1

godForgottenBeginner
Offline
Зарегистрирован: 12.09.2017

Моё почтение, заработал. Правда когда ставиш сериалпринт в сетап то он ни чего не показывает, просто 0 выводит. Приходиться его ставить в функцию прерывания...

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

godForgottenBeginner пишет:
Правда когда ставиш сериалпринт в сетап то он ни чего не показывает

Невнимательно читаете...
Я говорил перенести только инициализацию - Serial.begin().
Нахрена порт всё время инициализировать-то?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Нельзя в прерывании вывод в сериал делать, это долгая процедура, которая сама использует прерывания. 

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Так ТС просит помощи, а чего говорят не делает, и наоборот ))

Человек сам кузнец 3.14здец своего счастья...