Помогите прописать сброс счетчика

здравствуйте , прошу помощи , как прописать кнопку сброса одного канала х,

//**********************//

[details="Спойлер"]
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> 
#include <U8glib.h> 
#include "rus6x10.h" // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=717&download=1
U8GLIB_ST7920_128X64 u8g(13,11, 10, U8G_PIN_NONE); // настройка пинов

//***** My settings *****//
int Skrew_X_Pitch = 400;      // Шаг винта X, в сотках, 1.0mm = 100
int Enc_X_Line = 360;         // Энкодер X, линий/оборот
float Skrew_X_Corr = 1.0000;  // Коррекция неточности X винта, 1.0000 = 0.0000%
int Skrew_Y_Pitch = 400;      // Шаг винта Y, в сотках, 1.5mm = 150
int Enc_Y_Line = 100;         // Энкодер Y, линий/оборот
float Skrew_Y_Corr = 1.0000;  // Коррекция неточности Y винта, 1.0000 = 0.0000%
int Skrew_Z_Pitch = 400;      // Шаг винта Y, в сотках, 1.5mm = 150
int Enc_Z_Line = 100;         // Энкодер Y, линий/оборот
float Skrew_Z_Corr = 1.0000;  // Коррекция неточности Y винта, 1.0000 = 0.0000%

// ***** Scale *****
#define Port_D_Init()         DDRD=B00000011          // D2,D3 вход ch_X_A/ch_Y_A, D6,D7 вход SCALE DATA, D4 вход ,
#define Read_X_A()        (PIND & B00000100)         // PD2   энкодеры
#define Read_X_B()        (PIND & B01000000)         // PD6
#define Read_Y_A()        (PIND & B00001000)         // PD3
#define Read_Y_B()        (PIND & B10000000)         // PD7
#define Read_Z_A()        (PIND & B00010000)         // PD4
#define Read_Z_B()        (PIND & B00100000)         // PD5

int Enc_X_Tick = Enc_X_Line * 2;
//
long Scale_val_x = 0;
//
long value_x_array[16];
byte x = 0;
long sum_x = 0;
//
//long ABS_button_shift_x = 0;
//long INC_button_shift_x = 0;
long button_shift_x = 0;
long zero_shift_x = 0;
long ABS_zero_shift_x = 0;
long INC_zero_shift_x = 0;
long tmp_value_x = 0;
long print_value_x = 0;

/////////////////////////////////////////////
int Enc_Y_Tick = Enc_Y_Line * 2;
//
long Scale_val_y = 0;
//
long value_y_array[16];
byte y = 0;
long sum_y = 0;
//
//long ABS_button_shift_y = 0;
//long INC_button_shift_y = 0;
long button_shift_y = 0;
long zero_shift_y = 0;
long ABS_zero_shift_y = 0;
long INC_zero_shift_y = 0;
long tmp_value_y = 0;
long print_value_y = 0;

/////////////////////////////////////////////
int Enc_Z_Tick = Enc_Z_Line * 2;
//
long Scale_val_z = 0;
//
long value_z_array[16];
byte z = 0;
long sum_z = 0;
                     const int button = 14;
                      int val = 0;
                        byte state = 0; // переменная состояния
//
//long ABS_button_shift_z = 0;
//long INC_button_shift_z = 0;
long button_shift_z = 0;
long zero_shift_z = 0;
long ABS_zero_shift_z = 0;
long INC_zero_shift_z = 0;
long tmp_value_z = 0;
long print_value_z = 0;

int b = 1;

// ***** Mode *****
//enum Mode
//{
  //Mode_DRO,
  //Mode_Set_x,
  //Mode_Set_y,
 // Mode_Set_z
//};
//byte Mode = Mode_DRO;

                                                                                                       //boolean mode_ABS_x = true;
                                                                                                       //boolean mode_ABS_y = true;
                                                                                                       //boolean mode_ABS_z = true;
char sign_x = ' ';
char sign_y = ' ';
char sign_z = ' ';

byte Blink_Timer = 0;
boolean Blink = false;
byte SetMode_Timer = 0;


void setup() {

      pinMode( button, INPUT );
       


 
 cli();
  Port_D_Init();        // порт подключения энкодеров
  DDRB=B11111110;
//  Button_Init();
  PORTD=B11111100;
  PORTC=B00001111;
  PORTB=B00000001;      // порт подключения дисплея
  
  EIMSK = (1 << INT0) | (1 << INT1);    // Enable INT0,INT1
  EICRA = (1 << ISC00) | (1 << ISC10);  // INT0,INT1 Any logical change

    PCMSK2 = (1 << PCINT20);  // set PCINT20 to trigger an interrupt on state change
    PCICR = (1 << PCIE0) | (1 << PCIE2);    // set PCIE0 to enable PCMSK2 scan
    
 sei();
}
 
void draw(){
  u8g.setRot180();
  u8g.setFont(rus6x10);
  u8g.drawStr(30, 10, "КООРДИНАТЫ");
  u8g.setFont(rus6x10);
  u8g.drawStr(5, 25, "ОСЬ Х=");
 
 u8g.setPrintPos( 45, 25);   
    u8g.print(sign_x);  
   
   u8g.setPrintPos( 55, 25);   
    u8g.println(print_value_x);
    u8g.setFont(rus6x10);
  u8g.drawStr(5, 35, "ОСЬ Y=");
  u8g.setPrintPos( 45, 25);   
    u8g.print(sign_y); 
  u8g.setPrintPos( 55, 35);
     u8g.println(print_value_y);
  u8g.setFont(rus6x10);
  u8g.drawStr(5, 45, "ОСЬ Z=");
  u8g.setPrintPos( 45, 25);   
    u8g.print(sign_z); 
  u8g.setFont(rus6x10);
     u8g.setPrintPos( 55, 45);
    u8g.println(print_value_z);
  
}

 
void loop(){

                           
    


  
  
  // ***** x-Axis ***************************************************************
                                                                         // if (mode_ABS_x == true) {zero_shift_x = ABS_zero_shift_x; button_shift_x = ABS_button_shift_x;}
                                                                         // else                    {zero_shift_x = INC_zero_shift_x; button_shift_x = INC_button_shift_x;}
  
  if (++x > 15) {x = 0;}
  sum_x = sum_x - value_x_array[x];
  value_x_array[x] = Scale_val_x;
  sum_x = sum_x + Scale_val_x;
  
  tmp_value_x = (long)((float)((sum_x / 16) - zero_shift_x) * Skrew_X_Pitch / Enc_X_Tick / Skrew_X_Corr + button_shift_x);
  
 if (tmp_value_x < 0) { sign_x = '-'; }
  else                 { sign_x = ' '; } 
      print_value_x = abs(tmp_value_x);
  
  // ***** y-Axis ******************************************************************
                                                                          // if (mode_ABS_y == true) {zero_shift_y = ABS_zero_shift_y; button_shift_y = ABS_button_shift_y;}
                                                                          // else                    {zero_shift_y = INC_zero_shift_y; button_shift_y = INC_button_shift_y;}
  
  if (++y > 15) {y = 0;}
  sum_y = sum_y - value_y_array[y];
  value_y_array[y] = Scale_val_y;
  sum_y = sum_y + Scale_val_y;
  
  tmp_value_y = (long)((float)((sum_y / 16) - zero_shift_y) * Skrew_Y_Pitch / Enc_Y_Tick / Skrew_Y_Corr + button_shift_y);
  
  if (tmp_value_y < 0) { sign_y = '-'; }
  else                 { sign_y = ' '; }
  print_value_y = abs(tmp_value_y);
  // ***** z-Axis ****************************************************************** 
                                                                         // if (mode_ABS_z == true) {zero_shift_z = ABS_zero_shift_z; button_shift_z = ABS_button_shift_z;}
                                                                         // else                    {zero_shift_z = INC_zero_shift_z; button_shift_z = INC_button_shift_z;}
  
  if (++z > 15) {z = 0;}
  sum_z = sum_z - value_z_array[z];
  value_z_array[z] = Scale_val_z;
  sum_z = sum_z + Scale_val_z;
  
  tmp_value_z = (long)((float)((sum_z / 16) - zero_shift_z) * Skrew_Z_Pitch / Enc_Z_Tick / Skrew_Z_Corr + button_shift_z);
  
  if (tmp_value_z < 0) { sign_z = '-'; }
  else                 { sign_z = ' '; }
  
  print_value_z = abs(tmp_value_z);

  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
}


ISR(INT0_vect)
{
   if (!Read_X_A())                        // если канал А=0
   {  
      if (!Read_X_B()) Scale_val_x++;     // если канал B=0
      else Scale_val_x--;                  // если канал B=1
   }
   else                                   // если канал А=1
   {  
      if (!Read_X_B()) Scale_val_x--;     // если канал B=0
      else Scale_val_x++;                  // если канал B=1
   }
}

ISR(INT1_vect)
{
   if (!Read_Y_A())
   {  
      if (!Read_Y_B()) Scale_val_y++;
      else Scale_val_y--;
   }
   else
   {  
      if (!Read_Y_B()) Scale_val_y--;
      else Scale_val_y++;
   }
}

ISR(PCINT2_vect)
{
   if (!Read_Z_A())
   {  
      if (!Read_Z_B()) Scale_val_z++;
      else Scale_val_z--;
   }
   else
   {  
      if (!Read_Z_B()) Scale_val_z--;
      else Scale_val_z++;
   }
}
[/details]

я долго этот скетч правил, кое как сделал как мне надо, прошу подскажите как прописать кнопку сброса результата счета (print_value_x);

#define buttonResetPin  12  // Номер пина, куда подключена кнопка (подключается на пин и GND)

setup () {
  pinMode(buttonResetPin, INPUT_PULLUP);
}

loop () {
  if (!digitalRead(buttonResetPin)) {
    print_value_x = 0;
  }
}

очень благодарен спасибо, сейчас попробую

Пробуй ))

А как же подавление дребезга контактов ?

Насколько долго выполняется этот цикл ?

Считаю, что оба эти вопроса не уместны в данной теме ))

1 лайк

что то , не сбрасывает, подставлял разные переменные , не получается, я прочитал кучу литературы но пишут помигать , переключить , а вот как сбросить нигде нет

А кнопка куда подключена ?

уно 14 контакт т.е на плате 8

может порт сконфигурировать на вход

print_value_x у вас вычисляется и сбрасывать его нет смысла - сбрасывать надо видимо tmp_value_x

вы в предложенном вам коде номер кнопки поменяли на свой ???

Кнопочный? Писец!

кнопку поменял, и подставлял tmp_value_x не сбрасывает и sum_x и value_y_array[x ] и Scale_val_x ; подставлял

Покажите какой код получился после правки, только спрячьте под СПОЙЛЕР и в первом сообщении тоже !

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

введите или вставьте сюда код
```не могу найти как спрятать

Т.е. вы не понимаете, где в вашем коде что сохраняется?

Выделяете, нажимаете шестеренку и выбираете Скрыть под спойлер