Не считывать с порта если идет подсчет или есть сигнал на пинах
- Войдите на сайт для отправки комментариев
Втр, 21/10/2014 - 19:21
Здравствуйте!
Такая проблема, мне нужно пока есть сигнал на пинах или идет подсчет импульсов, то нужно закрыть порт для чтения, пока не пройдет подсчет или сигнал. У меня получается так, когда я отправляю данные в порт вовремя пересчета, то у меня значение сбивается на столько импульсов сколько раз я послал в порт значений.
Помогите решить данную проблему.
Вот мой код
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() но все не то, в первом и втором случае подсчет идет неправильно.
Это уже третья Ваша тема, посвященная одному и тому же. Напрасно так делаете.
http://arduino.ru/Reference/AttachInterrupt
Я вот пробую вот так
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; } }Но ничего не получается, а не должно во время счета принимать данные потому как идет потеря (сколькоя обратился раз столько едениц и потерял)
Я уже запутался, объясните пожалуйста
Довольно путано все, "принимать данные" - это из Serial имеется в виду ? Если да, то принимайте данные в любом случае (чтобы буфер очистить), но работайте с ними только если пересчет закончился (критерий окончания пересчета мне тоже не совсем понятен), а иначе игнорируйте принятое.
Serial.end() ещё есть.
Serial.begin() и Serial.end() постоянно дергать ? Как-то некошерно это IMHO.
А в прерывании delay разве работает?
Araris А чем это плохо?
Araris А чем это плохо?
Я не утверждаю, что это плохо, просто в своих поделках стараюсь без необходимости периферию не дергать (инициализация-закрытие в виду имеется). Пытался сейчас найти в Тырнете время выполнения Serial.begin и Serial.end - не нашел, самому измерить - лень, да и непринципиально это.
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); }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; } }Неа, вообще нет связи с портом.
в самом начале основного цикла инициализируй
в самом начале основного цикла инициализируй
Сделал, резудбтат тот же(
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; } }