To o co pytasz jest niezależne od języka programowania. Rozumiesz operacje logiczne, ale widzę że nie do końca potrafisz z nich skorzystać.
Bufor inaczej pośrednik - w tym przypadku to zmienna typu byte. Jest to potrzebne, bo jak zaczniesz operować bezpośrednio na bitach portu, to każda zmiana pojedyńczych bitów będzie widoczna zaraz po wprowadzeniu, a przy sterowaniu silnikami raczej zależy nam żeby to było wszystko razem zgrane (jedno CLK jest dla wszystkich).
Nie piszę w c++, ale język jest tu sprawą drugorzędną. Wiesz jak sterować portem, a to jest najważniejsze, teraz to już tylko zwykłe programowanie.
Ja bym to zrobił tak:
Załóżmy sobie, że piny masz przypisane na stałe, żeby na początek nie komplikować programu.
CLK - bit 0
dirX - bit 1 = 1-> +, = 0 -> -
enaX - bit 2 = 1 -> aktywny
dirY - bit 3 = 1-> +, = 0 -> -
enaY - bit 4 = 1 -> aktywny
Bufor - zmienna typu byte - przechowuje stan bufora
Robisz funkcję wektor( dX, dY ) - wektor przesunięcia. Funkcja powinna wyglądać mniej więcej tak:
Kod: Zaznacz cały
void function wektor (int dX, int dY)
{
bufor=0 ; ustawiamy 0 lub 1 (zależy, które zbocze wyzwala sterownik)
if(dX>0) bufor=bufor | 2 ; (Bufor OR 2 lub można dodać 2)ustawiamy bit 1 - kier. na +
if(dY>0) bufor=bufor | 8 ; (Bufor OR 8 lub można dodać 8) ustawiamy bit 4
if(dX<0) dX=-dX ; wartość bezwzględna nie wiem czy od ręki w c++ jest ABS()
if(dY<0) dY=-dY
if(dX=0 and dY>0) ; sprawdzamy czy ruch tylko w osi y
{
clkX=0 ; wyłącz oś
clkY=1 ; włącz oś y co 1 cykl zegara
kroki=dY ; ustaw ilość kroków
}
if(dY=0 && dX>0) ; spr. czy ruch tylko w x
{
clkX=1
clkY=0
kroki=dX
}
if(dX>dY && kroki>0) ; sprawdzamy czy
{
clkX=1
clkY=dX/dY ; oblicz co ile cykli zegara ma się zmieniać y
; ważne: wynik musi być całkowity
; ale jeśli clkY będzie typu int to powinno być ok
kroki=dX
}
if(dY>dX && kroki>0)
{
clkX=dY/dX ; oblicz co ile cykli zegara ma się zmieniać x
clkY=1
kroki=dY
}
cx=0
cy=0
for(a=0; a<kroki ; a++)
{
cx++
cy++
if(cx=clkX)
{
bufor = bufor | 4 ; ustaw bit 2 - enaX
cx=0
}
else bufor = bufor & 251 ; wyzeruj bit 2
if(cy=clkY)
{
bufor = bufor | 16 ; ustaw bit 4 - enaY
cy=0
}
else bufor = bufor & 239 ; wyzeruj bit 4
// tu musi być jakaś pętla opóźniająca
// bo sygnał CLK musi być nadawany
// z taką częstotliwością, aby silniki
// mogły nadążyć (tu można też wprowadzić
// rampę przyspieszenia/opóźnienia)
bufor = bufor ^ 1 ; robimy exor 1 na buforze czyli zamieniamy bit 0 na przeciwny
OutPort(0x378,bufor);
// pętla opóźniająca - w celu ustalenia stanu na CLK
bufor = bufor ^ 1 ; ponownie zamieniamy bit 0 na przeciwny
OutPort(0x378,bufor);
}
}
Wszystkie zmienne użyte w programie to liczby całkowite, musisz sam je poprawnie zdeklarować. Napisałem to z palca więc trzeba to sprawdzić w praktyce i poprawić ew. błędy. W pętli opóźniającej warto dać jakąś detekcję klawiszy, bo jak wrzucisz jakiś duży wektor (lub clkX, clkY nie będą całkowite) to program się zawiesi czasowo lub całkowicie.
Na tej samej zasadzie można wysterować i więcej silników. Nie wiem tylko czy windows nie wprowadzi zakłóceń do takiego sterowania.