Super Nintendo / SNES Controller attiny

OP #3099969
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?
Angehängte Dateien:
OP #3100672
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.