Dawno, dawno temu, gdy urodziła się Amiga 500, zobaczyłem co to jest myszka. Wówczas pracowałem ostro na ZX Spectrum+ (dzisiaj też). Pomyślałem sobie, że mi się też przyda myszka, więc zacząłem prząść program. Najpierw zrobiłem ruchomą strzałkę sterowaną klawiszami komputerka, a potem rozebrałem myszkę z amigi i okazało się że jest zrobiona na LM 339! (4 komparatory napięcia), czyli do komputera trzebabyło podłączyć owe 4 przewody, 2 przewody od przycisków i zasilanie do lm339.
Po kilku dniach zmagań z ulepszaniem odczytu danych z lm 339 (też dwubitowy kod Graya) i doszedłem do maksymalnego wykożystania tegoż kodu:
Każda zmiana kodu w kierunku zgodnym z ostatnim odczytanym powodowała zmianę jednego z liczników (softwarowych - pozycja kursora na ekranie)
Jedna zmiana w kierunku wstecznym od ostatniej odczytanej nie powodowała nic
dwie zmiany w kierunku wstecznym zmieniała na stałe kierunek ruchu kursora.
Programik chodził niespełna 1M instrukcji na sekundę, odczytywanie kodu z myszy było w pętli, a zmiana pozycji kursora na ekranie występowała na przerwaniach chyba 10 razy na sekundę. Przy szybkim ruchu myszą program już nie wyrabiał.
Mozna to zrobic prosciej: jeden z sygnałów podłączyć do wejścia INTx, to przerwanie nastawić żeby reagowało na zbocze, a w obsłudze przerwania odczytanie drugiego sygnału można przyjąć tak: stan 1 to ruch gałą w prawo, a stan 0 - w lewo.
Ten ostatni sposób jest bardzo wrażliwy na niestabilność sygnałów wejściowych, jeśli wyjście z komparatora napięcia z optyki niema dorego układu schmitta, to nastawienie gały na 'progu' spowoduje wieczne podawanie przerwań! (takim szajsem jest właśnie lm339 i z nim długo walczyłem, dopuki nie dodałem martwego odczytu, czyli cyfrowej histerezy)
czyli tak: jeden sygnał jest podłączony do INT0, a drugi do p1.7
obsługa przerwania:
push psw ;+ inne używane rejestry, to samo w pop ale odwrotnie
mov c,p1.7
mov stan,#0 ; zaznaczenie że była zmiana na impulsatorze
jc wprawo
[tutaj procedurka zmniejszająca jakiś licznik] ; ruch gałą w lewo
koniec:
pop psw
reti
wprawo:
[tutaj procedurka zwiększająca jakiś licznik]; ruch gałą w prawo
sjmp koniec
teraz trzeba co jakiś czas sprawdzić czy licznik się zmienił:
mov a,stan
mov stan,#255 ; zaznaczenie że odczytano stan
jnz bezzmian
[tutaj np. wysłanie nowego licznika na LCD, albo cośtam]
bezzmian:
[dalszy ciąg programu albo RET]
Program jest naprawdę bardzo prosty co wiąże się z marnotrawstwem impulsów: co czwarta zmiana kodu z impulsatora powoduje reakcję.
Ale od czegoś trzeba zacząć! Może jest tu zdolny programista, który wykożysta każdą zmianę kodu graya do zmiany licznika?