Forum: Mikrocontroller und Digitale Elektronik NES Controller (wer findet den Fehler in meinem Programm)


von e-noob (Gast)


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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Arbeitest du mit dem STK500 oder einer externen Taktquelle? An sind je 
manche Pins mit Sonderfunktionen belegt... 
Beitrag "ATmega8 PORTB als Ausgang schalten"

von e-noob (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

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.

von e-noob (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

ich könnte mir vorstellen, das durch das out die Flanken gleichzeitig 
kommen, und das der baustein nicht so gerne mag. zudem braucht cbi/sbi 
zwei takte gegenüber einem von out, also ggf auch nen timing problem.

von e-noob (Gast)


Lesenswert?

Ersteres könnte ich mir vorstellen, zweites aber nicht, da ich auch 
schon Code für den Gamepad hatte, bei dem ich nahezu jeden Takt gezählt 
hatte.

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.