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);
}
}
Na tej samej zasadzie można wysterować i więcej silników. Nie wiem tylko czy windows nie wprowadzi zakłóceń do takiego sterowania.