18-05-2017, 09:18
(Ten post był ostatnio modyfikowany: 19-05-2017, 10:35 przez Robson Kerman.)
Popatrzmy na kod...
int n = digitalRead(xyz);
W tej linii zmienna n przybiera wartość 0 lub 1, w zależności od stanu pinu "xyz".
for ( n =0 ; n<4 ; n++)
W tej zaś linii, zmienna n przybiera wartość 0 i dla tej wartości wykonywany jest kod:
lcd.setCursor(7,0);
lcd.print(pozycja_x+(obsluga_enc ()));
break;
Teraz następuje inkrementacja (n++), n przybiera wartość 1 i wykonywana jest instrukcja dla case 1
i tak dalej, aż warunek n<4 stanie się fałszem.
Jesteśmy w funkcji loop() więc znowu int n = digitalRead(xyz);
Dla każdego n jeszcze wyskakujesz do obsługi enkodera, ale to i tak nie ma znaczenia na tym etapie.
Mógłbyś napisać coś w tym stylu:
Deklaracje zmiennych globalnych
int iOs=0; //oś którą chcesz sterować
int axis=0// zmienna pomocnicza
W funkcji loop
int n = digitalRead(xyz);
if (n==LOW) {
iOs=wyborOsi(); //wykonujemy funkcję wyborOsi()
};
//tutaj możesz sobie dać tą swoją funkcję switch ... case
switch(iOs)
{
case 0:
lcd.setCursor(7,0);
lcd.print(pozycja_x+(obsluga_enc ()));
break;
..................itd.itd...............
I napisać funkcję wyboru osi.
Coś w tym stylu:
int wyborOsi() {
// wartość początkowa zmiennej axis przechowującej numer osi wynosi 0, co oznacza że mamy wybraną oś X
if (axis==0) axis=1;
else if (axis==1) axis=2;
else axis=3;
return axis;
}
A dla czego enkoder nie działa prawidłowo?
Wykorzystaj gotową bibliotekę do jego obsługi, albo dodaj jakąś pauzę aby wyeliminować drgania styków, albo obsługuj go w przerwaniu.
Zresztą w przerwaniu było by najpewniej, ale musisz enkoder podpiąć pod piny z przerwaniem int0 oraz int1.
int n = digitalRead(xyz);
W tej linii zmienna n przybiera wartość 0 lub 1, w zależności od stanu pinu "xyz".
for ( n =0 ; n<4 ; n++)
W tej zaś linii, zmienna n przybiera wartość 0 i dla tej wartości wykonywany jest kod:
lcd.setCursor(7,0);
lcd.print(pozycja_x+(obsluga_enc ()));
break;
Teraz następuje inkrementacja (n++), n przybiera wartość 1 i wykonywana jest instrukcja dla case 1
i tak dalej, aż warunek n<4 stanie się fałszem.
Jesteśmy w funkcji loop() więc znowu int n = digitalRead(xyz);
Dla każdego n jeszcze wyskakujesz do obsługi enkodera, ale to i tak nie ma znaczenia na tym etapie.
Mógłbyś napisać coś w tym stylu:
Deklaracje zmiennych globalnych
int iOs=0; //oś którą chcesz sterować
int axis=0// zmienna pomocnicza
W funkcji loop
int n = digitalRead(xyz);
if (n==LOW) {
iOs=wyborOsi(); //wykonujemy funkcję wyborOsi()
};
//tutaj możesz sobie dać tą swoją funkcję switch ... case
switch(iOs)
{
case 0:
lcd.setCursor(7,0);
lcd.print(pozycja_x+(obsluga_enc ()));
break;
..................itd.itd...............
I napisać funkcję wyboru osi.
Coś w tym stylu:
int wyborOsi() {
// wartość początkowa zmiennej axis przechowującej numer osi wynosi 0, co oznacza że mamy wybraną oś X
if (axis==0) axis=1;
else if (axis==1) axis=2;
else axis=3;
return axis;
}
A dla czego enkoder nie działa prawidłowo?
Wykorzystaj gotową bibliotekę do jego obsługi, albo dodaj jakąś pauzę aby wyeliminować drgania styków, albo obsługuj go w przerwaniu.
Zresztą w przerwaniu było by najpewniej, ale musisz enkoder podpiąć pod piny z przerwaniem int0 oraz int1.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.