Sekrety POKEY-a• AUDF - rejestr częstotliwości, wartość tu wpisana będzie określała stopień podziału zegara bazowego. • AUDC - rejestr sterujący natężeniem i zniekształceniami dźwięku, nas on nie interesuje. • AUDCTL - najważniejszy dla nas rejestr sterujący, kolejne bity mają następujące znaczenie: Bit 0 - wybór zegara bazowego (0=64kHz, l=15kHz) Bit 1 i 2 - włącza filtry górnoprzepustowe Bit 3 - włączony scala liczniki 3 i 4 w jeden dzielnik 16-bitowy Bit 4 - jak bit 3, ale dla liczników 1 i 2 Bit 5 - ustawiony przełącza zegar bazowy licznika 3 na 2.217MHz Bit 6 - przełącza zegar licznika l na 2.217 MHz Bit 7 - przełącza 17-bitowy rejestr przesuwający na rejestr 9-bitowy dla uzyskania dodatkowych sposobów zniekształcania dźwięku, nas nie interesuje. Na wstępie należy się pewne wyjaśnienie. Wszystkie wartości częstotliwości zegara bazowego są podane z pewnym przybliżeniem. Niestety w dostępnej mi literaturze nie odnalazłem dokładnych wartości dla systemu PAL. Czas na kawałek programu. 
* POMIAR CZASU PRZY POMOCY PRZERWAN
* LICZNIKOW POKEY
         OPT %0010110
AUDCTL   EQU   $D208
AUDC1    EQU   $D201
AUDF1    EQU   $D200
IRQEN    EQU   $D20E 
IRQENS   EQU   $0010
VTIMR1   EQU   $0210
STIMER   EQU   $D209
PORTA    EQU   $D300
         ORG  $0600
LICZNIK  DTA B($00),B(00)  ;LICZNIK GLOWNY 
LICZ_l   DTA B($00),B(00)  ;REJESTRY POMIAROW
         DTA B($00),B(00)  ;POSREDNICH
STATUS   DTA B($00)        ;WSK. PRZEPELNIENIA
* OBSLUGA PRZERWANIA LICZNIKA 
STOPER   INC LICZNIK       ;LICZNIK=LICZNIK+1
         BNE STOP_1
         INC LICZNIK+1     ;PRZENIESIENIE 
         BNE STOP_1
         LDA #$FF          ;PRZEPELNIENIE
         STA STATUS
STOP_l   PLA
         RTI
* KONIEC PRZERWANIA POKEY
* USTALENIE PARAMETROW PRZERWANIA POKEY
INIT     PLA            ;WYWOŁANIE Z BASICA
         LDA 
   
Dwa bajty licznika pozwalają na odmierzenie co najwyżej 64 s. Przepełnienie licznika sygnalizowane jest wpisaniem liczby $FF do komórki STATUS. Dwa dwubajtowe rejestry pozwalają na zapis wyników pośrednich.Program start - i nic? Oczywiście trzeba jeszcze w komórce określającej zezwolenie na przerwanie (IRQEN) ustawić odpowiedni bit. Ale to później. No dobrze, mamy stoper - ale po co ? Zastosowania mogą być różne. Poniższy przykład może służyć jako inspiracja do własnych poszukiwań. Zbudujmy układ czterech fotokomórek, ustawmy na równi pochyłej i już na lekcji fizyki sprawdzamy czy wzory opisujące przyspieszenie są prawdziwe. Zostawiając oczywiście margines błędu na tarcie i tym podobne złośliwości. Schemat przykładowego układu pokazany jest na rysunku. Szczegółów nie będę opisywał, a kto nie wie jak to zrobić, niech się lepiej poradzi bardziej doświadczonego kolegi. Dodam tylko, że diody emitujące bezpieczniej będzie zasilać z zewnętrznego źródła ze względu na dość duży pobór prądu. Do połączenia układu z komputerem wykorzystamy wejście joysticka 1. I kolejny fragment programu: 
CZAS_STR PLA            ;WYWOLANIE Z BASICA 
         LDA #$00       ;ZEROWANIE
         LDX #$6        ;LICZNIKOW,REJESTROW 
ZERUJ    STA LICZNIK,X  ;ORAZ WSK. PRZEPELNIENIA
         DEX      
         BPL ZERUJ
         LDA #%00000001
CZEK_1   BIT PORTA      ;CZEKAJ NA
         BNE CZEK_l     ;1 FOTOKOMORKE
         PHA            ;ZAPAMIETAJ MASKE
         LDA IRQENS     ;ODCZYT IRQ
         ORA #$01       ;ZEZW. NA PRZERWANIE
                        ;TIMER1
         STA IRQENS     ;START CZAS
         STA IRQEN
         LDX #$4        ;WSKAZNIK
CZEK_3   LDY #$80       ;FILTR ANTY-ZAKLOCENIOWY
AAA      DEY
         BNE AAA
         PLA
         ASL @          ;MASKA W LEWO
CZEK_3   BIT PORTA      ;CZEKAJ NA KOLEJNA
         BNE CZEK_2     ;FOTOKOMORKE
         DEX
         BMI CZEK_4
         PHA            ;PRZECHOWAJ MASKE
         SEI            ;ZAKAZ PRZERWAN
         LDA LICZNIK+1  ;NA CZAS PRZEPISYWANIA
         STA LICZ_1,X   ;WARTOSCI LICZNIKA
         DEX            ;DO REJESTROW POSREDNICH
         LDA LICZNIK
         STA LICZ_l,X
         CLI
         JMP CZEK_3
CZEK_4   LDA IRQENS     ;LICZNIKI STOP
         AND #$FE
         STA IRQENS
         STA IRQEN
         RTS
         END
![]() Teraz trochę komentarza. Pierwsza fotokomórka uruchamia stoper, zezwalając na przerwanie TIMER-a 1. Dwa kolejne sygnały z fotokomórek 213 spowodują przepisanie wartości licznika do rejestrów pośrednich. Sygnał z czwartej fotokomórki zatrzymuje stoper. Program nie posiada tzw. wyjścia awaryjnego. Będzie czekał w nieskończoność na kolejne sygnały. Takie awaryjne wyjście każdy może sobie dopisać, albo po prostu wyłączyć zasilanie układu. A teraz przykładowy pragram w BASIC-u. 10 FOR I=1536 TO 1663:READ A:POKE I,A: NEXT I 20 LICZ=1536:STAT=1542 30 OPEN #1,4,0,"K:" 40 INIT=USR(1560) 50 PRINT "S-START";:GET #1,A:IF A<>83 THEN CLOSE #1:END 60 PRINT :PRINT 70 START=USR(1590) 80 IF PEEK(STAT)<>0 THEN PRINT "PRZEPE LNIENIE":PRINT :GOTO 50 90 T1=(PEEK(LICZ+4)+PEEK(LICZ+5)*256)/ 1000 100 T2=(PEEK(LICZ+2)+PEEK(LICZ+3)*256) /1000 110 T3=(PEEK(LICZ+0)+PEEK(LICZ+1)*256) /1000 120 PRINT "T1=";T1;" s" 130 PRINT "T2=";T2;" s" 140 PRINT "T3=";T3;" s" 150 PRINT :GOTO 50 1000 DATA 0,0,0,0,0,0,0,238,0,6,208,10 ,238,1,6,208 1010 DATA 5,169,255,141,6,6,104,64,104 ,169,7,141,16,2,169,6 1020 DATA 141,17,2,169,0,141,8,210,169 ,64,141,0,210,169,0,141 1030 DATA 1,210,141,9,210,96,104,169,0 ,162,6,157,0,6,202,16 1040 DATA 250,169,1,44,0,211,208,251,7 2,165,16,9,1,133,16,141 1050 DATA 14,210,162,4,160,128,136,208 ,253,104,10,44,0,211,208,251 1060 DATA 202,48,19,72,120,173,1,6,157 ,2,6,202,173,0,6,157 1070 DATA 2,6,88,76,84,6,165,16,41,254 ,133,16,141,14,210,96Na koniec pewna refleksja. Jak już było powiedziane, licznik TIMER generuje przerwanie po dojściu do zera. Więc gdyby ustawić częstotliwość zegara bazowego na 2.217 MHz, przerwania można by wywoływać co jeden cykl procesora. Oczywiście wtedy komputer odmówi współpracy. Ci, co lubią eksperymenty niech sami spróbują określić maksymalną częstotliwość takich przerwań. Ja tylko dodam, że już przy przerwaniach co 0.5 ms widać wyraźnie spowolnienie komputera. Życzę udanych eksperymentów i ostrożności, której nigdy nie za mało. Roman Zwiejski 
 |