Hallo, ich versuche einen SNES controller auszulesen, sollte ja
eigentlich nicht so schwer sein. Es handelt sich um ein bzw 2
Schieberegister. Auf dem Bild im Anhang kann man sehen wie man den
Controller anspricht.
Ich versuche das mit dem ATTiny13 und verwende Bascom. Bisher habe ich
folgendes.
1 | $regfile = "attiny13.dat"
|
2 | $crystal = 1200000
|
3 | $framesize = 10
|
4 | $swstack = 10
|
5 | $hwstack = 10
|
6 |
|
7 |
|
8 | ' Um das Register auszulesen muss der SNES Controller zunächst initialisiert werden:
|
9 |
|
10 | Config Portb.2 = Output 'clock
|
11 | Config Portb.1 = Output 'Latch
|
12 | Config Pinb.0 = Input 'Data
|
13 | Config Portb.4 = Output 'led
|
14 | Portb.0 = 1 'Pullup Widerstand ein
|
15 | Portb.2 = 1 'clock grundstellung
|
16 | Portb.1 = 0 'latch grundstellung
|
17 | Dim I As Integer
|
18 |
|
19 |
|
20 | ' ---------------------------------------------------------
|
21 | ' --------------------- Hauptprogramm ---------------------
|
22 | ' ---------------------------------------------------------
|
23 |
|
24 | Do
|
25 |
|
26 | ' Die Datenübertragung muss initialisiert werden.
|
27 | ' Dieser Schritt muss bei jedem Auslesen des Registers durchgeführt werden.
|
28 |
|
29 | Portb.1 = 1 'latch high
|
30 | Waitus 12 'für controller das
|
31 | Portb.1 = 0 'zeichen zu beginnen
|
32 |
|
33 | ' Nun können die 16 Bit des Registers wie folgt ausgelesen werden
|
34 | ' (folgendes also 16 Mal wiederholen)
|
35 |
|
36 | For I = 0 To 15 '16 bit wobei 4 unbesetzt
|
37 |
|
38 | Waitus 6
|
39 | Portb.2 = 0
|
40 |
|
41 | ' test
|
42 | If I = 5 Then ' 5 = taste "oben"
|
43 | If Pinb.0 = 1 Then 'wenn gedrückt
|
44 | Portb.4 = 1 'led an
|
45 | End If
|
46 | End If
|
47 | ' test
|
48 |
|
49 | Waitus 6
|
50 | Portb.2 = 1 'clock wieder grundstellung
|
51 |
|
52 |
|
53 | Next I
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | ' ---------------------------------------------------------
|
59 | ' ------------------ Hauptprogramm Ende -------------------
|
60 | ' ---------------------------------------------------------
|
61 |
|
62 | Waitms 1000 '1 sekunde warten, und nochmal abfragen.
|
63 |
|
64 |
|
65 | Loop
|
66 | End
|
Meine frage, kann ich zb "waitus 6" angeben, und es werden wirklich 6 us
gewartet, oder muss der code dazwischen "weggerechnet werden". Da der
ATTiny bei zb 1Mhz pro sekunde 1 millionen takte gibt, der Controller
aber auf 6us high und 6us low abwechselnd wartet, weiß ich nicht ob das
so funktioniert.
Aufjedenfall passiert so bei mir garnichts. Egal welche taste ich
drücke, nichts geht.
Sollte es so funktionieren?