NES Controller (wer findet den Fehler in meinem Programm)

Gast #855638
Lesenswert?

Hallo, ich bin hier neu und hätte eine Frage zu einem von mir 
geschriebenen Programm.

Es hadelt sich um Folgendes:
Ich wollte meinen Nintendo (NES) Gamepad als Steuerung für allerlei 
Dinge verwenden unter anderem auch für den PC. Nun habe ich mir mir 
einen Atmega8 gekauft und folgendes Programm dafür geschrieben:
1
;-----INCLUDE-----
2
.include "../inc/m8def.inc"
3
.include "../inc/stack.inc"
4
.include "../inc/delay.inc"
5

6
;-----DEF-----
7
.DEF btnNR = r18
8
.DEF outreg = r17
9

10
;-----INIT-----
11
  ;1 = OUT
12
  ;0 = IN
13
  ;PD0 = Serial Data = Red
14
  ;PD1 = Latch = Orange
15
   ;PD2 = Clock = Yellow
16
   ldi r16, 0b00000110
17
  out DDRD, r16
18
  ;PB6 = Schick los Btn
19
  ldi r16, 255
20
  ;LED-Ausgabe
21
  out DDRB, r16
22
  clr r16
23
  clr r20
24
  rjmp main
25

26
main:
27
  ;neuer Zyklus
28
  clr outreg
29
  ;setze Latch und Clock auf 1
30
  ;setze latch auf 1
31
  ori r20, 0b00000110
32
  out PORTD, r20
33

34
  ;warte 12us
35
  rcall delay6us
36
  rcall delay6us
37

38
  ;setze latch low
39
  ldi r20, 0b00000100
40
  out PORTD, r20
41
  
42
  ;ab hier vielleicht noch ein paar Takte weg
43
  ;8 x SerialData lesen
44
  ldi btnNR,8
45
again:
46
  dec btnNR
47
  ;warte 6us
48
  rcall delay6us
49
  
50
  ;setze clock und latch low
51
  clr r20
52
  out PORTD, r20
53

54
  ;warte 6us
55
  rcall delay6us
56

57
  ;lese port ein
58
  ;Schiebe Bit nach links
59
  lsl outreg
60
  in r23, PIND
61
  or outreg, r23
62
  
63
  ;setze clock auf 1
64
  ori r20, 0b00000100
65
  out PORTD, r20
66
  
67
  ;Wenn alle SerialData 
68
  ;durchgeschoben ...
69
  cpi btnNR, 0
70
  ;springe zum Output
71
  breq output
72
  rjmp again
73
output:
74
  ;Complementiert outreg
75
  com outreg
76
  out PORTB, outreg
77

78
  ;warte 17 ms
79
  delay 75, 1
80

81
  rjmp main
82

83
;-----PRODZEDUREN-----
84
delay6us:
85
  nop nop nop nop nop nop nop nop
86
  nop nop nop nop nop nop nop nop
87
  nop
88
ret
89

90
.EXIT

An PORT B hängen Dioden und sollten beim drücken der Taste aufleuchten 
(später werden die Dioden natürlich durch ein Interface zum PC 
getauscht).
Das Programm an sich funktioniert es gibt nur einen Bug den ich einfach 
nicht entfernen kann. Ich schaffe es nur die ersten vier Bit (also die 
Befehle des Steuerkreuzes) an den Pins auszugeben. (delay 75, 1 ist nur 
ein Makro, was nicht weiter beachtet werden soll)

Das Protokoll für die SNES-Controller ist das gleiche wir für die 
NES-Controller mit dem Unterschied, dass beim SNES die Anzahl der zu 
übertragenden Knöpfe 16 und beim NES 8 sind, außerdem ist die 
reihenfolge der Knopfzustände beim Nes etwas anders. (NES Reihenfolge: 
A, B, SELECT, START, UP, DOWN, LEFT, RIGHT). Das Protokoll für die 
Kommunikation der SNES finde man hier 
http://www.gamesx.com/controldata/snesdat.htm


Die Quelle http://www.raphnet.net/electronique/snes_nes_usb/index_en.php 
habe ich schon durchsucht und mir den Programmcode in C (nes.c, ein 
USB-Version möchte ich erstmal nicht erstellen) auch schon angesehen 
jedoch sehe ich keinen unterschied zu meinem Programm.

Hat jemand eine Idee woran es liegt? Ich bin für alle Vorschläge offen.
Gast #855705
Lesenswert?

Die einzigen FUSES die ich gesetzt habe sind: SPIEN (ISP, soweit ich 
weis), BOOTSZ1, BOOTSZ0, SUTO, und CKSEL3, CKSEL2 um die internen 4MHz 
Taktquelle zu nutzen. Ich benutze den gleichen Programmer wie 
http://s-huehn.de/elektronik/ (RSR232-variante).

Ich habe noch etwas ausprobiert und zwar invertiere ich ja kurz vor dem 
Ende des Programmcodes die erhaltenen Zustände der Tasten (com outreg) 
umd das richtige Ergebnis zu bekomme, lasse ich dies jedoch weg, dann 
leuchten ja alle Dioden (wenn ich nichts drücke) und beim drücken auf 
die Tasten gehen sie dann jeweils aus.

Das Interessante ist jedoch, dass die Dioden die auf Tastendruck mit der 
Invertierung nicht geläuchtet haben nun jetzt ausgehen (also gewünschter 
effekt) jedoch nach kurzer Zeit ein wenig Flackern und dann wieder 
ausgehen und dann wieder Flackern und so weiter.

Ich habe überhaupt keine Ahnung woran das liegt.
Persönliche Seite #855897
Lesenswert?

Ich sehe jezt so auf den erstenblick nix, aber ich habe auch mal nen NES 
Controller folgendermaßen ausgelesen:
1
decode_NES_keys:
2
  /* 
3
     Decodiert den Tastenstatus auf einem NES Controller
4
     ---------------------------------------------------
5
     Stack: 3bytes
6
     Ergebnis: temp
7
     bit_muster bleibt nach verlassen auf altem wert.
8
     SREG wird gesichert und vor verlassen zurückgeschrieben
9
  */
10
  push bit_muster
11
  in temp, SREG
12
  push temp
13
  
14
  ldi temp, 0
15
  sbi CONTROLLER, LATCH      ; Strobe HIGH
16
  cbi CONTROLLER, LATCH      ; Strobe LOW
17
  ldi bit_muster, 0b00000001    ; Bit Muster laden Wird gleichzeitig als Schleifenzähler verwendet
18

19
  _data:
20
    nop              ; Etwas Zeit lassen bis die Daten anliegen
21
    nop              ; noch etwas
22
    sbis CONTROLLER_PIN, DATA  ; Pin Status prüfen
23
    or temp, bit_muster      ; Pin als gedrückt setzen
24
    lsl bit_muster        ; Bitmuster shiften
25
    sbi CONTROLLER, CLK      ; CLK HIGH
26
    cbi CONTROLLER, CLK      ; CLK LOW
27
    tst bit_muster        ; Bitmuster auf 0 testen
28
  brne _data
29
  pop bit_muster
30
  out SREG, bit_muster
31
  pop bit_muster
32
ret

Im ANhang mein komplette Testroutine.
Angehängte Dateien:
Gast #856547
Lesenswert?

@Läubi
Danke für das Beispielprogramm

Mit sbi und cbi geht es, wieso dass so ist weis ich aber nicht. Habe 
gestern auch noch was daran geändert (weis im Moment nicht was), jedoch 
nicht mehr getestet.

Wenn es jemand schafft mir den Unterschied zu den beiden Programmen zu 
erklären wäre ich dankbar.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren