Forum: Mikrocontroller und Digitale Elektronik Super Nintendo / SNES Controller attiny


von Daniel J. (theend)


Angehängte Dateien:

Lesenswert?

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?

von Daniel J. (theend)


Lesenswert?

Code hat funktioniert. Lag an meiner Stromversorgung.
Auch sollte man die zeile
If Pinb.0 = 1 Then
ersetzen durch
If Pinb.0 = 0 Then

Die taste ist auch nicht "oben" sondern "unten"

Und am ende vor loop eventuell ein Portb.4 = 0 und waitms

Der Fertige Code sieht dann so aus.
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 "unten"
43
If Pinb.0 = 0 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 100                                                  '100 milisekunde warten, und nochmal abfragen.
63
Portb.4 = 0
64
65
Loop
66
End

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.