I wanted to spare your eyes from my low-level code but I completely understand that it is better to see it. I am gonna upload the code I have in front of me right now so pardon the comments in Czech and the lack of them. The void loop() is "split in two" by selector switch. Now I am talking about the while(TIG == true)
The main problem is that for some reason the variable "MaxAmps" is being decremented by the ISR "Encoder" even when I don't want it to. It's being decremented everytime the program goes into the while(digitalRead(Led) == LOW && digitalRead(HF) == LOW)
Once again sorry for the mess below 
#include <Wire.h>
//Hodnoty
#define MaxA 190 //Maximálnà proud svářečky
#define MinA 10 //Minimálnà proud svářečky
#define PulseW 2000 //Ĺ ĂĹ™ka pulsu v mikrosekundách
#define DebounceEnc 50 //Debounce čas v ms pro enkodér
#define DebounceCal 50 //Debounce ÄŤas v ms pro kalibraci
#define UpdateInterval 600000 //Čas, po kterém se bude aktualizovat hodnota v EEPROM
#define Hystereze 2 //Hystereze
//Vstupy
#define EncA 2 //Vstup enkodér A
#define EncB 4 //Vstup enkodér B
#define Led A0 //Vstup stavu LED pro nastavovánà proudu
#define HF 3 //Vstup zapalovánà oblouku
#define Cal 8 //Vstup kalibraÄŤnĂho panelovĂ©ho spĂnaÄŤe
#define Syn 9 //Vstup panelovĂ©ho spĂnaÄŤe mĂłdu synchronizace minima
#define Mod 5 //Vstup nastavenĂ mĂłdu MMA/TIG
#define Pot A6 //Vstup potenciometru dálkovĂ©ho ovládánĂ
//Výstupy
#define OutA A2 //Výstup enkodér A
#define OutB A3 //Výstup enkodér B
#define OutG A1 //Výstup pro odpojenà reference enkodéru (GND)
#define OutHF 10 //Výstup pro zapálenà oblouku
#define LedCal 6 //Led u spĂnaÄŤe kalibrace
#define LedSyn 7 //Led u spĂnaÄŤe synchronizace
//Hodnoty EEPROM
#define Address 0x50 //Adresa EEPROM
#define AddressON 0 //Adresa počtu zapnutà (přeteče na 50)
#define AddressA 1 //Adresa nastavené hodnoty proudu pro TIG
#define AddressTIGMaxMSB 2 //Adresa maximálnà hodnoty z potenciometru pro mód TIG
#define AddressTIGMaxLSB 3
#define AddressTIGMinMSB 4 //Adresa minimálnà hodnoty z potenciometru pro mód TIG
#define AddressTIGMinLSB 5
#define AddressMMAMaxMSB 6 //Adresa maximálnà hodnoty z potenciometru pro mód MMA
#define AddressMMAMaxLSB 7
#define AddressMMAMinMSB 8 //Adresa minimálnà hodnoty z potenciometru pro mód MMA
#define AddressMMAMinLSB 9
byte ON = 0; //poÄŤĂtadlo zapnutĂ
volatile byte Amps = 0; //Aktuálnà proud
volatile int MaxAmps = 0; //Maximum proudu
byte VarAmps = 0; //NastavenĂ˝ proud
byte delta = 0; //RozdĂl nastavenĂ© a aktuálnĂ hodnoty - pro hysterezi
byte LSB = 0;
unsigned int MSB = 0;
unsigned int pot = 0; //hodnota analogového vstupu
unsigned int MIN = 1023; //minimálnà hodnota analogového vstupu
volatile unsigned int MAX = 0; //maximálnà hodnota analogového vstup
unsigned long CalMillis = 0; //Hodnota millis() pro proces kalibrace
volatile unsigned long EncMillis = 0; //Hodnota millis() pro enkodér
unsigned long UpdMillis = 0; //Hodnota millis() pro update
unsigned long LastUpdMillis = 0;
unsigned long LastRegMillis = 0;
unsigned long RegMillis = 0;
bool TIG = false; //proměnná pro indikaci módu
bool MMA = false; //promenná pro indikaci módu
bool LastCalState = true; //PoslednĂ hodnota HF vstupu pro proces kalibrace
bool regulation = false; //KontrolnĂ bit pro Ăşlohy v regulaci
volatile bool show = false; //Kontrolnà bit pro signalizaci maximálnà hodnoty proudu
bool setzero = false; //KontrolnĂ bit "donulovánĂ"
void setup() {
pinMode(EncA, INPUT);
pinMode(EncB, INPUT);
pinMode(Led, INPUT);
pinMode(HF, INPUT_PULLUP);
pinMode(Cal, INPUT_PULLUP);
pinMode(Syn, INPUT_PULLUP);
pinMode(Mod, INPUT);
pinMode(OutA, OUTPUT);
pinMode(OutB, OUTPUT);
pinMode(OutG, OUTPUT);
pinMode(OutHF, OUTPUT);
pinMode(LedCal, OUTPUT);
pinMode(LedSyn, OUTPUT);
if (digitalRead(Mod) == LOW) {
TIG = true;
MMA = false;
}
else if (digitalRead(Mod) == HIGH) {
TIG = false;
MMA = true;
}
Wire.begin(); //Inicializace I2C
ON = ReadEEPROM(AddressON);
if (ON == 48) {
ON = 0;
}
if (ON == 0) {
ON++;
Kalibrace();
}
else {
ON++;
}
delay(5);
WriteEEPROM(AddressON, ON);
delay(5);
Nulovani();
MaxAmps = ReadEEPROM(AddressA);
MaxAmps = 33;
}
void loop() {
while (TIG == true) { //MĂłd TIG
MSB = ReadEEPROM(AddressTIGMinMSB);
LSB = ReadEEPROM(AddressTIGMinLSB);
MSB = MSB << 8;
MIN = MSB + LSB;
MSB = ReadEEPROM(AddressTIGMaxMSB);
LSB = ReadEEPROM(AddressTIGMaxLSB);
MSB = MSB << 8;
MAX = MSB + LSB;
UpdMillis = millis();
if (UpdMillis - LastUpdMillis > UpdateInterval) {
UpdateEEPROM(AddressA, MaxAmps);
LastUpdMillis = millis();
}
if (show == false) {
ShowMax();
show = true;
}
while (digitalRead(Led) == LOW && digitalRead(HF) == LOW) {
regulation = true;
if (setzero == false) {
SetZero();
setzero = true;
}
digitalWrite(OutHF, HIGH);
digitalWrite(OutG, LOW);
Regulace();
}
if (regulation == true) {
digitalWrite(OutHF, LOW);
digitalWrite(OutG, HIGH);
show = false;
regulation = false;
}
if (digitalRead(Cal) == LOW) {
Kalibrace();
}
} //Konec mĂłdu TIG
while (MMA == true) {
detachInterrupt(digitalPinToInterrupt(EncA));
MSB = ReadEEPROM(AddressMMAMinMSB);
LSB = ReadEEPROM(AddressMMAMinLSB);
MSB = MSB << 8;
MIN = MSB + LSB;
MSB = ReadEEPROM(AddressMMAMaxMSB);
LSB = ReadEEPROM(AddressMMAMaxLSB);
MSB = MSB << 8;
MAX = MSB + LSB;
MaxAmps = MaxA;
while (digitalRead(Led) == LOW) {
digitalWrite(OutG, LOW);
Regulace();
}
if (digitalRead(Led) == HIGH) {
digitalWrite(OutG, HIGH);
}
if (digitalRead(Cal) == LOW) {
Kalibrace();
}
} //Konec mĂłdu MMA
}
int ReadEEPROM(int address) { //ÄŤtenĂ z EEPROM
Wire.beginTransmission(Address);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(Address, 1);
if (Wire.available()) {
int Read = Wire.read();
return Read;
}
delay(5);
} //Konec ReadEEPROM
void WriteEEPROM(int address, int Write) { //zápis na EEPROM
Wire.beginTransmission(Address);
Wire.write(address);
Wire.write(Write);
Wire.endTransmission();
delay(5);
} //Konec WriteEEPROM
void AmpsMinus() {
digitalWrite(OutA, HIGH);
delayMicroseconds(PulseW / 2);
digitalWrite(OutB, HIGH);
delayMicroseconds(PulseW / 2);
digitalWrite(OutA, LOW);
delayMicroseconds(PulseW / 2);
digitalWrite(OutB, LOW);
Amps--;
} //Konec AmpsMinus
void AmpsPlus() {
digitalWrite(OutB, HIGH);
delayMicroseconds(PulseW / 2);
digitalWrite(OutA, HIGH);
delayMicroseconds(PulseW / 2);
digitalWrite(OutB, LOW);
delayMicroseconds(PulseW / 2);
digitalWrite(OutA, LOW);
Amps++;
} //Konec AmpsPlus
void Kalibrace() {
while (digitalRead(Cal) == HIGH) {
digitalWrite(LedCal, HIGH);
delay(250);
digitalWrite(LedCal, LOW);
delay(250);
}
digitalWrite(LedCal, HIGH);
while (digitalRead(Cal) == LOW) {
pot = analogRead(Pot);
CalMillis = millis();
if (digitalRead(HF) != LastCalState && TIG == true ) {
long CurrCalMillis = millis();
if (CurrCalMillis - CalMillis < DebounceCal) {
MIN = pot;
LastCalState = !LastCalState;
}
}
if (pot > MAX) {
MAX = pot;
}
if (pot < MIN && MMA == true) {
MIN = pot;
}
}
if (TIG == true) {
MSB = MAX >> 8;
LSB = MAX;
WriteEEPROM(AddressTIGMaxMSB, MSB);
WriteEEPROM(AddressTIGMaxLSB, LSB);
MSB = MIN >> 8;
LSB = MIN;
WriteEEPROM(AddressTIGMinMSB, MSB);
WriteEEPROM(AddressTIGMinLSB, LSB);
}
if (MMA == true) {
MSB = MAX >> 8;
LSB = MAX;
WriteEEPROM(AddressMMAMaxMSB, MSB);
WriteEEPROM(AddressMMAMaxLSB, LSB);
MSB = MIN >> 8;
LSB = MIN;
WriteEEPROM(AddressMMAMinMSB, MSB);
WriteEEPROM(AddressMMAMinLSB, LSB);
}
digitalWrite(LedCal, LOW);
} //Konec Kalibrace
void Nulovani() {
detachInterrupt(digitalPinToInterrupt(EncA));
digitalWrite(OutG, LOW); //Odpojenà panelového enkodéru
while (digitalRead(Led) == HIGH) {
delay(200);
}
for (int i = 0; i < (MaxA + MaxA); i++) {
AmpsMinus();
}
MaxAmps = MinA;
Amps = MinA;
digitalWrite(OutG, HIGH);
attachInterrupt(digitalPinToInterrupt(EncA), Encoder, FALLING);
} //Konec Nulovani
void ShowMax() {
digitalWrite(OutG, LOW);
detachInterrupt(digitalPinToInterrupt(EncA));
while (Amps < MaxAmps) {
AmpsPlus();
}
digitalWrite(OutG, HIGH);
attachInterrupt(digitalPinToInterrupt(EncA), Encoder, FALLING);
} //Konec ShowMax
void SetZero() {
detachInterrupt(digitalPinToInterrupt(EncA));
digitalWrite(OutG, LOW);
while (Amps > MinA) {
AmpsMinus();
}
Amps = MinA;
attachInterrupt(digitalPinToInterrupt(EncA), Encoder, FALLING);
} //Konec SetZero
void Regulace() {
detachInterrupt(digitalPinToInterrupt(EncA));
pot = analogRead(Pot);
VarAmps = map(pot, MIN, MAX, MinA, MaxAmps);
delta = VarAmps - Amps;
if (abs(delta) >= Hystereze) {
while (VarAmps > Amps) {
AmpsPlus();
}
while (VarAmps < Amps) {
AmpsMinus();
}
}
else if (abs(delta) == 1) {
RegMillis = millis();
if ((RegMillis - LastRegMillis) > 100) {
while (VarAmps > Amps) {
AmpsPlus();
}
while (VarAmps < Amps) {
AmpsMinus();
}
}
LastRegMillis = RegMillis;
}
attachInterrupt(digitalPinToInterrupt(EncA), Encoder, FALLING);
} //Konec Regulace
void Encoder() { //ISR pro enkodér
long CurrEncMillis = millis();
if ((CurrEncMillis - EncMillis) > DebounceEnc && digitalRead(Led) == LOW) {
if (digitalRead(EncB) == LOW && MaxAmps < MaxA && regulation == false) {
MaxAmps++;
}
if (digitalRead(EncB) == HIGH && MaxAmps > MinA && regulation == false) { //OdÄŤĂtánĂ
MaxAmps--;
digitalWrite(LedSyn, HIGH);
}
}
EncMillis = millis();
} //Konec Encoder
void UpdateEEPROM(int address, int Write) { //update EEPROM
int Read = 0;
Wire.beginTransmission(Address);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(Address, 1);
if (Wire.available()) {
Read = Wire.read();
}
if (Read = ! Write) {
Wire.beginTransmission(Address);
Wire.write(address);
Wire.write(Write);
Wire.endTransmission();
}
} //Konec UpdateEEPROM