Не считывать с порта если идет подсчет или есть сигнал на пинах

Mcr
Offline
Зарегистрирован: 31.07.2012

Здравствуйте!

Такая проблема, мне нужно пока есть сигнал на пинах или идет подсчет импульсов, то нужно закрыть порт для чтения, пока не пройдет подсчет или сигнал. У меня получается так, когда я отправляю данные в порт вовремя пересчета, то у меня значение сбивается на столько импульсов сколько раз я послал в порт значений.

Помогите решить данную проблему.

Вот мой код

void loop()
{ 
  prirost();
 
   if(digitalRead(btn)==LOW && digitalRead(btnOUT)==LOW){ 
    in++;
    out++;
    delay(100);
  } else if(digitalRead(btn)==LOW && digitalRead(btnOUT)==HIGH){
    in++;
  delay(100);
  }else if (digitalRead(btnOUT)==LOW && digitalRead(btn)==HIGH)
  { 
    out++;
    delay(100);
  }
//в этом месте нужно условие чтобы не сработала нижняя часть кода если едет подсчет в верхней части
  if(Serial.available())
  {
    Serial.setTimeout(100);
    port = Serial.parseInt();
    if(port == portB)
    {
 
   vivod();
  }
  }
  }

Пробовал флагами и pulseIn() но все не то, в первом и втором случае подсчет идет неправильно.

Araris
Offline
Зарегистрирован: 09.11.2012

Это уже третья Ваша тема, посвященная одному и тому же. Напрасно так делаете.

Radjah
Offline
Зарегистрирован: 06.08.2014
Mcr
Offline
Зарегистрирован: 31.07.2012

Я вот пробую вот так

volatile int in=0;
volatile int out = 0;
volatile int dif=0;
volatile int btn = 2;
volatile int btnOUT = 3;
int buttonState = 0;

byte portB=0;
byte port=0;
int x=5;

volatile int flag=0;

void setup(){
DDRB = 0b00000000;    //All pins in PORTD are inputs
PORTB = 0b00011111; 
pinMode(btn,INPUT);
pinMode(x,OUTPUT);
pinMode(btnOUT, OUTPUT);
pinMode(btnOUT, OUTPUT);
digitalWrite(btnOUT,HIGH);
digitalWrite(btn,HIGH);
digitalWrite(x,HIGH);
attachInterrupt(0, printed, CHANGE);
attachInterrupt(1, printed, CHANGE);
Serial.begin(9600);
}

void loop()
{ 
  prirost();
  printed();

        if(flag==0){
    if(Serial.available()){
    Serial.setTimeout(100);
    port = Serial.parseInt();
if (port==portB)
    vivod();
    
    }
        }
  
}
 void printed(){
    flag=1;
      if(digitalRead(btn)==LOW && digitalRead(btnOUT)==LOW){ 
    in++;
    out++;
    delay(100);
  } else if(digitalRead(btn)==LOW && digitalRead(btnOUT)==HIGH){
    in++;
  delay(100);
  }else if (digitalRead(btnOUT)==LOW && digitalRead(btn)==HIGH)
  { 
    out++;
    delay(100);
  }else
 {
flag=0;
    } 
 }

void vivod(){
 // Serial.print("in=");
  Serial.print(in);
  Serial.print(",");
//  Serial.print("out=");
  Serial.print(out);
  Serial.print(",");
  //Serial.print("  Raznica=");
Serial.println(in-out);
}

void prirost()
{
  int b=digitalRead(x);
  if(b==1)
  {
  portB = PINB+32;
  }
  else
  {
    portB = PINB;
  }
}

Но ничего не получается, а не должно во время счета принимать данные потому как идет потеря (сколькоя обратился раз столько  едениц и потерял) 
Я уже запутался, объясните пожалуйста

 

Araris
Offline
Зарегистрирован: 09.11.2012

Довольно путано все, "принимать данные" - это из Serial имеется в виду ? Если да, то принимайте данные в любом случае (чтобы буфер очистить), но работайте с ними только если пересчет закончился (критерий окончания пересчета мне тоже не совсем понятен), а иначе игнорируйте принятое.

Coolerr
Offline
Зарегистрирован: 30.06.2014

Serial.end() ещё есть.

Araris
Offline
Зарегистрирован: 09.11.2012

Serial.begin() и Serial.end() постоянно дергать ? Как-то некошерно это IMHO.

Radjah
Offline
Зарегистрирован: 06.08.2014

А в прерывании delay разве работает?

Coolerr
Offline
Зарегистрирован: 30.06.2014

Araris А чем это плохо?

Araris
Offline
Зарегистрирован: 09.11.2012

Coolerr пишет:

Araris А чем это плохо?

Я не утверждаю, что это плохо, просто в своих поделках стараюсь без необходимости периферию не дергать (инициализация-закрытие в виду имеется). Пытался сейчас найти в Тырнете время выполнения Serial.begin и Serial.end - не нашел, самому измерить - лень, да и непринципиально это.

Mcr
Offline
Зарегистрирован: 31.07.2012

Coolerr пишет:

Serial.end() ещё есть.

Вот пытаюсь дергать но не получается.

когда у меня идет счетчик то я отключаюсь от порта Serial.end(); а потом соединение не возвращается. Хотя пишу Serial.begin(9600); можно ли как-то это исправить.

Вот код

void setup(){
DDRB = 0b00000000;    //All pins in PORTD are inputs
PORTB = 0b00011111; 
pinMode(btn,INPUT);
pinMode(x,OUTPUT);
pinMode(btnOUT, OUTPUT);
pinMode(btnOUT, OUTPUT);
digitalWrite(btnOUT,HIGH);
digitalWrite(btn,HIGH);
digitalWrite(x,HIGH);
Serial.begin(9600);
 
}
 
void loop()
{ 
 
  prirost();
if(Serial.available())
  {
    Serial.setTimeout(100);
    port = Serial.parseInt();
    if(port == portB)
    {
   vivod();
  }
  }
  if(digitalRead(btn)==LOW && digitalRead(btnOUT)==HIGH){
   Serial.end();
    in++;
  }else if(digitalRead(btn)==HIGH && digitalRead(btnOUT)==HIGH)
  {
    Serial.begin(9600);
  }

 

Coolerr
Offline
Зарегистрирован: 30.06.2014
volatile int in=0;
volatile int out = 0;
volatile int dif=0;
volatile int btn = 2;
volatile int btnOUT = 3;
int buttonState = 0;

byte portB=0;
byte port=0;
int x=5;

volatile int flag=0;

void setup(){
DDRB = 0b00000000;    //All pins in PORTD are inputs
PORTB = 0b00011111; 
pinMode(btn,INPUT);
pinMode(x,OUTPUT);
pinMode(btnOUT, OUTPUT);
pinMode(btnOUT, OUTPUT);
digitalWrite(btnOUT,HIGH);
digitalWrite(btn,HIGH);
digitalWrite(x,HIGH);
attachInterrupt(0, printed, CHANGE);
attachInterrupt(1, printed, CHANGE);
//Serial.begin(9600);
}

void loop()
{ 
  prirost();
  printed();

        if(flag==0){
здесь инициализируй
    if(Serial.available()){
    Serial.setTimeout(100);
    port = Serial.parseInt();
if (port==portB)
    vivod();
    
    }
        }
  
}
 void printed(){
Здесь отключай
    flag=1;
      if(digitalRead(btn)==LOW && digitalRead(btnOUT)==LOW){ 
    in++;
    out++;
    delay(100);
  } else if(digitalRead(btn)==LOW && digitalRead(btnOUT)==HIGH){
    in++;
  delay(100);
  }else if (digitalRead(btnOUT)==LOW && digitalRead(btn)==HIGH)
  { 
    out++;
    delay(100);
  }else
 {
flag=0;
    } 
 }

void vivod(){
 // Serial.print("in=");
  Serial.print(in);
  Serial.print(",");
//  Serial.print("out=");
  Serial.print(out);
  Serial.print(",");
  //Serial.print("  Raznica=");
Serial.println(in-out);
}

void prirost()
{
Здесь отключай
  int b=digitalRead(x);
  if(b==1)
  {
  portB = PINB+32;
  }
  else
  {
    portB = PINB;
  }
}

 

Mcr
Offline
Зарегистрирован: 31.07.2012

Неа, вообще нет связи с портом.

Coolerr
Offline
Зарегистрирован: 30.06.2014

в самом начале основного цикла инициализируй

Mcr
Offline
Зарегистрирован: 31.07.2012

Coolerr пишет:

в самом начале основного цикла инициализируй

Сделал, резудбтат тот же(

volatile int in=0;
volatile int out = 0;
volatile int dif=0;
volatile int btn = 2;
volatile int btnOUT = 3;
int buttonState = 0;

byte portB=0;
byte port=0;
int x=5;

volatile int flag=0;

void setup(){
DDRB = 0b00000000;    //All pins in PORTD are inputs
PORTB = 0b00011111; 
pinMode(btn,INPUT);
pinMode(x,OUTPUT);
pinMode(btnOUT, OUTPUT);
pinMode(btnOUT, OUTPUT);
digitalWrite(btnOUT,HIGH);
digitalWrite(btn,HIGH);
digitalWrite(x,HIGH);
attachInterrupt(0, printed, CHANGE);
attachInterrupt(1, printed, CHANGE);

}

void loop()
{ Serial.begin(9600);
  prirost();
 printed();

        if(flag==0){
    if(Serial.available()){
    Serial.setTimeout(100);
    port = Serial.parseInt();
if (port==portB)
vivod();
    
    }
        }
  
}
 void printed(){
    Serial.end();
    flag=1;
      if(digitalRead(btn)==LOW && digitalRead(btnOUT)==LOW){ 
    in++;
    out++;
    delay(100);
  } else if(digitalRead(btn)==LOW && digitalRead(btnOUT)==HIGH){
    in++;
  delay(100);
  }else if (digitalRead(btnOUT)==LOW && digitalRead(btn)==HIGH)
  { 
    out++;
    delay(100);
  }else
 {
flag=0;
    } 
 }

void vivod(){
 // Serial.print("in=");
  Serial.print(in);
  Serial.print(",");
//  Serial.print("out=");
  Serial.print(out);
  Serial.print(",");
  //Serial.print("  Raznica=");
Serial.println(in-out);
}

void prirost()
{
Serial.end();
  int b=digitalRead(x);
  if(b==1)
  {
  portB = PINB+32;
  }
  else
  {
    portB = PINB;
  }
}