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.
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.
@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.
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.