Przy okazji coś się wyjaśniło...
Zacznijmy od fake-ecoder:
Kod: Zaznacz cały
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
/* setup */
DDRB = 0b00000011; // set A and B as OUTPUT
PORTB = 0b00000100; // set outputs to LOW and inputs to HIGH
/* loop */
while (1)
{
if (PINB&_BV(PB2)) // Enable on pin PB2
{
PORTB ^= _BV(PB0); // toggle A
_delay_ms(1);
PORTB ^= _BV(PB1); // toggle B
_delay_ms(1);
}
}
}
Daje piękną kwadraturę o częstotliwości około 250 Hz, stan niski na PB2 blokuje "zliczanie".
PB0/PB1 ATtiny13 podpięte pod PB6/PB7 Black Pill, PB2 ATtiny13 podpięte pod wyjście SPINDLE_ENABLE Black Pill, tu nie podaję numeru pinu, bo można go różnie skonfigurować, natomiast piny enkodera są przypisane na sztywno.
Trzeba mieć ustawione $33=1 (LATHE_MODE), inaczej G33 wywali "unsuported code" czyli "error 20".
Teraz, jeśli wrzeciono stoi (M5), to G33 Z3 K1 wywala "error 8". Sensu to nie ma żadnego, ale widocznie autor programu nie miał lepszego pomysłu...
Potem dałem M3 S1000, co zmieniło stan wyjścia SPINDLE_ENABLE i fake-encoder ruszył.
Teraz po G33 Z3 K1 wyświetla najpierw "HOLD" a potem "RUN" i jedzie... (Używam bCNC, co tutaj ma drugorzędne znaczenie).
No więc na pewno sterowanie nie używa sygnału INDEX, tylko go sobie tworzy z jakiejś wartości licznika TIM4, zliczającego impulsy enkodera.
Nie jestem w stanie sprawdzić co będzie kiedy w programie wykonamy kilka razy G33, czy się będzie synchronizować w tym samym miejscu, czy za każdym razem gdzieś indziej, ale ponieważ jest to sprawa programowa, więc na pewno da się to zrobić tak, żeby było dobrze.
Natomiast na pewno, synchronizacja po wyłączeniu zasilania zostanie utracona i po następnym włączeniu maszyny wystąpi w przypadkowym położeniu wrzeciona. Myślę że z tym to da się żyć...