Matryca LED

0

Chciałbym podłączyć do komputera matrycę LED o wielkości 7x5. Wymyśliłem, że mogłaby ona być podłączona do portu LPT w następujący sposób: 7 pinów steruje kolumnami, pozostały pin steruje jakimś rejestrem przesuwnym, który ustawia się na poszczególnych wierszach. No i teraz pytania:

  • Czy możliwe jest (pod windowsem) tak szybkie zmienianie wyjścia rejestru przesuwnego, że będzie to dawać złudzenie zapalenia wszystkich wierszy? Generalnie chodzi o to, czy najmniejszy windowsowy timer będzie miał wystarczająco małe odstępy czasowe, aby obraz nie migał.
  • Czy da się wytworzyć impuls o takim czasie trwania (no i kształcie), żeby wartość rejestru przesuwnego zmieniła się dokładnie o 1?
  • Czy ogólnie da się to zrobić przy tak małych kosztach i umiejętnościach w dziedzinie elektroniki?

Za odpowiedzi na te pytania, wszelkie pomysły i wskazówki będę bardzo wdzieczny.

0

No to po koleii :
Najkrótszy interwał Timera jest pod windozami NT (i popchodnymi) - 10ms, czyli sto razy na sekundę. Powinno być dobrze.

Impuls da się wytworzyć. Oczywiście będzie to przebieg prostakątny (jak to w cyfrówce bywa). Wystarczy do portu wpisać liczbę, w której bit powiązany z linią sterującą rejestrem będzie jedynką, a nastepnie kolejną, w której ten bit będzie zerem (zabawa z logiką - or, and itp.). Spowoduje to krótkotrwałe pojawienie się napięcia na linii i zmianę stanu rejestru.

No pewnie, że się da. Najdroższa w tym wszystkim będzie matryca LED.
Pewnie oprócz tego będą ze dwa scalaki po jakiejś złotówce sztuka.

0

Niestety interval 10 ms jest zdecydowanie za duży :(. przy 2 wierszach nie widać migania, ale przy 5 bardzo. Widziałem kiedyś komponenty do delphi, które podobno były timerami z odstępem do iluś mikrosekund. Jeśli ktoś miałby namiary na takie cudo, mógłby je tu dać :).

//Dopisane
A może jakieś kondensatorki by załatwiły sprawę?

//Dopisane
Ściągnąłem komponent TZTimer, który posobno ma mniejsze odstępy czasowe, ale powoduje on błędy uprawnień

//Dopisane
Czy jest w takim razie jakieś rozwiązanie? Bardzo zależy mi na prostocie układu, a pomysły typu mikrokontroler to już zupełnie nie dla mnie.

0

Hehe mozna napisac samemu taki timerek w asmie uzywajac generatorka od odswierzania pamieci/timera/glosniczka ale to raczej nie pojdzie na windach typu nt/xp. W takim timerze masz max ponizej 1us.

0

A czy próbowałeś może Timera z DelphiX. Ten z kolei najkrótszy czas ma 1 ms, a więc 10x szybciej, chociaż domyslam się, że to też może być zbyt wolne.

Co do mikrosekund - jest coś takiego jak zegar wysokiej dokładności (HPT), obsługiwany dwiema funkcjami (mam nadzieje, że nie poplątam nazw) :

QueryPerformanceFraquency(var x:Int64)
i QueryPerformanceCounter(var x:Int64)

Jest to licznik uzupełniany z dużą częstotliwością. Na płycie pod pentium (stary) jest to ponad 1MHz. Bardzo zależy od sprzętu.
Pierwsza funkcja (poprzez x) podaje właśnie tą częstotliwość, druga aktualny stan licznika. Mając te dwie dane można liczyć czasy i to rzędu mikrosekund.
Nie bardzo wyobrażam sobie natomiast zrobienie na tym czegoś w rodzaju OnTimer. W prawdzie można odczytać aktualny stan licznika, obliczyć jaki będzie za kilka us i następnie w pętli sprawdzać stan, czy zgadza się z obliczonym, ale coś takiego zatrzyma cały program, aż do wyjścia z pętli. No można by pokombinować z wątkami.

0

a nie da się tego zrobić bez czekania? Znaczy walić włącz; wyłącz; ustaw kolumny; włącz; wyłącz; ustaw kolumny; .... i tak w pętli?
Wtedy króciutkie mrugnięcie mogłoby wystarczyć, żeby do następnego "dojechania" do tej linijki zostało wyświetlone. Albo układzik, któryby "zapamiętywał" ostatnie ustawienia i dopiero po następnej zmianie by włączał/wyłączał piksla?

0

Kilka poprawek dp powyzszych wypowiedzi :

  1. WM_TIMER maxymalnie jest wysylany 18 razy na sekunde
    gdyz takie jest max na co pozwala mu BIOS-owe przerwanie 8h(jesli sie nie myle).
    To daje natomiast najmniejszy przedzial 55milisekund !!!!
    To sie tyczy Windowsow 9x na NT maxymalnie moze byc wysylany 10x na sek..
  2. Co do funkcji Query to niewatpliwie najbardziej nadaja sie do tego celu
    i wcale nie musza zawieszac(unieruchamiac) programu :
    <cpp>
    //przyklad z Winapi nie wplywajacy na normalne dzialanie progsa
    for (;;) {
    if (PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) {
    if ( msg.message == WM_QUIT ) {
    break;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    } else {
    //tutaj sprawdzaj wartosci timera
    }
    }
    <cpp>
    w przypadku czystego C to niewatpliwie beda potrzebne watki - jesli ten
    program ma jeszcze cos robic ?!
0

Może tak na początek co to ma robićza bajerek czy jakiś wskaźnik bo jak wskaźnik to trochę ciężko ale sie da....

0

Kilka poprawek dp powyzszych wypowiedzi :

  1. WM_TIMER maxymalnie jest wysylany 18 razy na sekunde
    gdyz takie jest max na co pozwala mu BIOS-owe przerwanie 8h(jesli sie nie myle).
    To daje natomiast najmniejszy przedzial 55milisekund !!!!
    To sie tyczy Windowsow 9x na NT maxymalnie moze byc wysylany 10x na sek..
  2. Co do funkcji Query to niewatpliwie najbardziej nadaja sie do tego celu
    i wcale nie musza zawieszac(unieruchamiac) programu :

Proponuję sobie poczytać lub sprawdzić jak jest w rzeczywistości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1