Forum: Mikrocontroller und Digitale Elektronik Probleme mit 8x8 LED Aufbau


von Holger S. (capa)


Angehängte Dateien:

Lesenswert?

Ich habe eine kleine 8x8 "LED-Anzeige" gebastelt und so wie im 
angehängten Bild angeschlossen. Nun wollte ich ein kleines "Bild" 
realisieren, es sollte ein X auf der Anzeige angezeigt werden.

-xxxxxx-
x-xxxx-x
xx-xx-xx
xxx--xxx
xxx--xxx
xx-xx-xx
x-xxxx-x
-xxxxxx-

Allerdings will das ganze nicht so wie ich will, immo leuchten alle 
LED's.  Wie auch beim LED-Cube soll ja immer nur eine leuchten.
1
.include "m32def.inc"
2
  
3
  // Variablen //
4
  .def temp       = r16
5
  .def temp1      = r17
6
  .def temp2      = r18
7
8
  .equ PortPlus   = PORTC
9
  .equ PortMinus  = PORTD
10
  .equ DDRPlus    = DDRC
11
  .equ DDRMinus   = DDRD
12
  // Variablen //
13
  
14
  // Stack-Pointer //
15
  ldi temp, LOW(RAMEND)
16
  out SPL, temp
17
  ldi temp, HIGH(RAMEND)
18
  out SPH, temp
19
  // Stack-Pointer //
20
21
  // Ausgaenge einstellen //
22
  ldi temp, 0xFF
23
  out DDRPlus, temp
24
  out DDRMinus, temp
25
  // Ausgaenge einstellen //
26
27
init:
28
  ldi ZH, HIGH(2*Bild1)
29
  ldi ZL, LOW(2*Bild1)
30
31
main:
32
33
  lpm     temp1, Z+
34
  tst temp1
35
  breq init
36
  lpm     temp2, Z+
37
  out PortPlus, temp1
38
  out PortMinus, temp2
39
    rjmp main
40
41
Bild1:
42
  .db 0b00000001,0b00000001
43
  .db 0b00000010,0b00000010
44
  .db 0b00000100,0b00000100
45
  .db 0b00001000,0b00001000
46
  .db 0b00010000,0b00010000
47
  .db 0b00100000,0b00100000
48
  .db 0b01000000,0b01000000
49
  .db 0b10000000,0b10000000
50
  .db 0b00000001,0b10000000
51
  .db 0b00000010,0b01000000
52
  .db 0b00000100,0b00100000
53
  .db 0b00001000,0b00010000
54
  .db 0b00010000,0b00001000
55
  .db 0b00100000,0b00000100
56
  .db 0b01000000,0b00000010
57
  .db 0b10000000,0b00000001

Er soll quasi dauerhaft das X anzeigen, Hatte auch schon eine andere 
variante des Codes was etwas umfangreicher war. Da ist aber noch weniger 
passiert, daher wollt ich ne kürzere Methode testen, um zu schauen ob 
irgendwas kaputt ist oder obs am code lag, naja was soll ich sagen liegt 
immernoch am code :/

von MaWin (Gast)


Lesenswert?

>   ldi ZH, HIGH(2*Bild1)
>   ldi ZL, LOW(2*Bild1)

Wieso 2* ?

Desweiteren:

Du solltest den LEDs auch Zeit geben zu leuchten,
also vor rjmp mein ein delay.

Es ist etwas ungewöhnlich, 8 LED Reihen mit 1:16 zu multiplexen

  .db 0b00000001,0b10000001
  .db 0b00000010,0b01000010
  .db 0b00000100,0b00100100
  .db 0b00001000,0b00011000
  .db 0b00010000,0b00011000
  .db 0b00100000,0b00100100
  .db 0b01000000,0b01000010
  .db 0b10000000,0b10000001
  .db 0

wäre einfacher (und es fehlt nicht die 0 als Sentinel)

von Holger S. (capa)


Lesenswert?

Habs umgeschrieben und getestet leider sind nur 3 LED's ausgegangen, der 
rest leuchtet immernoch munter weiter. :/ Hab sogar noch nen "Alles Aus" 
Befehl an den anfang gesetzt mit delay. Oder ist die wartezeit immernoch 
zu kurz ?
1
.include "m32def.inc"
2
  
3
  ;// Variablen //
4
  .def temp       = r16
5
  .def temp1      = r17
6
  .def temp2      = r18
7
8
  .equ PortPlus   = PORTC
9
  .equ PortMinus  = PORTD
10
  .equ DDRPlus    = DDRC
11
  .equ DDRMinus   = DDRD
12
  ;// Variablen //
13
  
14
  ;// Stack-Pointer //
15
  ldi temp, LOW(RAMEND)
16
  out SPL, temp
17
  ldi temp, HIGH(RAMEND)
18
  out SPH, temp
19
  ;// Stack-Pointer //
20
21
  ;// Ausgänge einstellen //
22
  ldi temp, 0xFF
23
  out DDRPlus, temp
24
  out DDRMinus, temp
25
  ;// Ausgänge einstellen //
26
27
init:
28
  ldi ZH, HIGH(Bild1)
29
  ldi ZL, LOW(Bild1)
30
31
main:
32
  ldi temp, 0x00
33
  out PortPlus, temp
34
  out PortMinus, temp
35
36
  ldi temp, 100
37
delay:
38
  dec temp
39
  brne delay
40
41
  lpm     temp1, Z+
42
  tst temp1
43
  breq init
44
  lpm     temp2, Z+
45
  out PortPlus, temp1
46
  out PortMinus, temp2
47
48
  ldi temp, 200
49
delay_1:
50
  dec temp
51
  brne delay_1
52
53
    rjmp main
54
55
Bild1:
56
  .db 0b00000001,0b10000001
57
  .db 0b00000010,0b01000010
58
  .db 0b00000100,0b00100100
59
  .db 0b00001000,0b00011000
60
  .db 0b00010000,0b00011000
61
  .db 0b00100000,0b00100100
62
  .db 0b01000000,0b01000010
63
  .db 0b10000000,0b10000001
64
  .db 0

von Holger S. (capa)


Lesenswert?

ka wieso aber hab die delayzeit höher gestellt, das *2 wieder 
reingemacht und temp1 und temp2 bei PortPlus und PortMinus vertauscht 
und nun gehts :D
werd mal morgen schauen obs an dem tausch +/- lag oder an dem *2 ich 
denke an dem Porttausch aber mal schauen was morgen bei raus kommt ^^

Danke dir auf jedenfall für deine Hilfe :)
1
.include "m32def.inc"
2
  
3
  ;// Variablen //
4
  .def temp       = r16
5
  .def temp1      = r17
6
  .def temp2      = r18
7
8
  .equ PortPlus   = PORTC
9
  .equ PortMinus  = PORTD
10
  .equ DDRPlus    = DDRC
11
  .equ DDRMinus   = DDRD
12
  ;// Variablen //
13
  
14
  ;// Stack-Pointer //
15
  ldi temp, LOW(RAMEND)
16
  out SPL, temp
17
  ldi temp, HIGH(RAMEND)
18
  out SPH, temp
19
  ;// Stack-Pointer //
20
21
  ;// Ausgaenge einstellen //
22
  ldi temp, 0xFF
23
  out DDRPlus, temp
24
  out DDRMinus, temp
25
  ;// Ausgaenge einstellen //
26
27
init:
28
  ldi ZH, HIGH(Bild1*2)   ; geändert auf *2
29
  ldi ZL, LOW(Bild1*2)    ; geändert auf *2
30
31
main:
32
  ldi temp, 0x00
33
  out PortPlus, temp
34
  out PortMinus, temp
35
36
  ldi temp, 200           ; auf 200 gestellt
37
delay:
38
  dec temp
39
  brne delay
40
41
  lpm     temp1, Z+
42
  tst temp1
43
  breq init
44
  lpm     temp2, Z+
45
  out PortPlus, temp2     ; von temp1 auf temp2 gestellt
46
  out PortMinus, temp1    ; von temp2 auf temp1 gestellt
47
48
  ldi temp, 255           ; auf 255 gestellt
49
delay_1: 
50
  dec temp
51
  brne delay_1
52
53
    rjmp main
54
55
Bild1:
56
  .db 0b00000001,0b10000001
57
  .db 0b00000010,0b01000010
58
  .db 0b00000100,0b00100100
59
  .db 0b00001000,0b00011000
60
  .db 0b00010000,0b00011000
61
  .db 0b00100000,0b00100100
62
  .db 0b01000000,0b01000010
63
  .db 0b10000000,0b10000001
64
  .db 0

von Holger S. (capa)


Lesenswert?

Hier ist der bereits erwähnte umfangreichere Source, hab die sachen von 
dem kleinen Source übernommen allerdings  zeigt der mir nur 1 Bild an 
und schaltet nicht wie gehofft zwischen den bildern hin und her. Hab nun 
schon mehrere Sachen versucht aber ohne erfolg :/
1
/*
2
 * AVRAssembler12.asm
3
 *
4
 *  Created: 29.02.2012 17:16:07
5
 *   Author: Capa
6
 */ 
7
8
.include "m32def.inc"
9
  
10
  // Variablen //
11
  .def temp       = r16
12
  .def temp1      = r17
13
  .def temp2      = r18
14
  .def counter    = r20
15
  .def counter2   = r21
16
  .def counter3   = r22
17
  .def waittimer1 = r23
18
  .def waittimer2 = r24
19
  .def waittimer3 = r25
20
 
21
  .equ PortPlus   = PORTC
22
  .equ PortMinus  = PORTD
23
  .equ DDRPlus    = DDRC
24
  .equ DDRMinus   = DDRD
25
26
.cseg
27
.org 0x00
28
29
Reset:  
30
  ldi counter, 2
31
  ldi counter2, 2
32
  ldi counter3, 2
33
  // Variablen //
34
  
35
  // Stack-Pointer //
36
  ldi temp, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
37
  out SPL, temp
38
  ldi temp, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
39
  out SPH, temp
40
  // Stack-Pointer //
41
42
  // Ausgänge einstellen //
43
  ldi temp, 0xFF
44
  out DDRPlus, temp
45
  ldi temp, 0xFF
46
  out DDRMinus, temp
47
  // Ausgänge einstellen //
48
49
50
    rjmp init
51
52
  // Lade die Daten der Bilder //
53
LoadBild1:
54
  ldi ZL, LOW(Bild1*2)         ; Adresse des Strings in den
55
  ldi ZH, HIGH(Bild1*2)        ; Z-Pointer laden
56
  rjmp main
57
LoadBild2:
58
  ldi ZL, LOW(Bild2*2)         ; Adresse des Strings in den
59
  ldi ZH, HIGH(Bild2*2)        ; Z-Pointer laden
60
  rjmp main
61
LoadBild3:
62
  ldi ZL, LOW(Bild3*2)         ; Adresse des Strings in den
63
  ldi ZH, HIGH(Bild3*2)        ; Z-Pointer laden
64
  rjmp main
65
  // Lade die Daten der Bilder //
66
67
68
init:
69
  ldi waittimer1, 255
70
  ldi waittimer2, 100
71
  ldi waittimer3, 10
72
  dec counter
73
  brne LoadBild1
74
  dec counter2
75
  brne LoadBild2
76
  dec counter3
77
  brne LoadBild3
78
79
main:
80
  ldi temp, 0x00
81
  out PortPlus, temp
82
  out PortMinus, temp
83
84
  ldi temp, 200
85
delay:
86
  dec temp
87
  brne delay
88
89
  lpm     temp1, Z+
90
  tst temp1
91
  breq Reset
92
  lpm     temp2, Z+
93
  out PortPlus, temp2
94
  out PortMinus, temp1
95
96
  ldi temp, 200
97
delay_1:
98
  dec temp
99
  brne delay_1
100
101
102
  dec waittimer1
103
  brne main
104
  dec waittimer2
105
  brne main
106
  dec waittimer3
107
  brne main
108
    rjmp init
109
110
111
Bild1:
112
  .db 0b00000001, 0b10000001
113
  .db 0b00000010, 0b01000010
114
  .db 0b00000100, 0b00100100
115
  .db 0b00001000, 0b00011000
116
  .db 0b00010000, 0b00011000
117
  .db 0b00100000, 0b00100100
118
  .db 0b01000000, 0b01000010
119
  .db 0b10000000, 0b10000001
120
  .db 0
121
122
Bild2:
123
  .db 0b10000000, 0b00000101
124
  .db 0b01000000, 0b00000101
125
  .db 0b00100000, 0b00000101
126
  .db 0b00010000, 0b00000101
127
  .db 0b00001000, 0b00000101
128
  .db 0b00000100, 0b00000101
129
  .db 0b00000010, 0b00000101
130
  .db 0b00000001, 0b00000101
131
  .db 0b10000000, 0b01010000
132
  .db 0b01000000, 0b01010000
133
  .db 0b00100000, 0b01010000
134
  .db 0b00010000, 0b01010000
135
  .db 0b00001000, 0b01010000
136
  .db 0b00000100, 0b01010000
137
  .db 0b00000010, 0b01010000
138
  .db 0b00000001, 0b01010000
139
  .db 0
140
141
Bild3:
142
  .db 0b00000101, 0b10000000
143
  .db 0b00000101, 0b01000000
144
  .db 0b00000101, 0b00100000
145
  .db 0b00000101, 0b00010000
146
  .db 0b00000101, 0b00001000
147
  .db 0b00000101, 0b00000100
148
  .db 0b00000101, 0b00000010
149
  .db 0b00000101, 0b00000001
150
  .db 0b01010000, 0b10000000
151
  .db 0b01010000, 0b01000000
152
  .db 0b01010000, 0b00100000
153
  .db 0b01010000, 0b00010000
154
  .db 0b01010000, 0b00001000
155
  .db 0b01010000, 0b00000100
156
  .db 0b01010000, 0b00000010
157
  .db 0b01010000, 0b00000001
158
  .db 0

von Holger S. (capa)


Lesenswert?

ich glaub ich hab den fehler gefunden allerdings stellt sich jetzt die 
frage wie stelle ich Z wieder auf anfang :/ so das er wieder von vorne 
anfängt mit zählen.
1
  lpm     temp1, Z+
2
  tst temp1
3
  breq Reset

Reset ist das falsche er müsste auf Main zurück aber gleichzeitig Z 
wieder auf 0 setzen so das er wieder anfängt vom anfang der tabelle zu 
lesen.

Kann mir da vielleicht jemand sagen wie ich das anstelle ? suche gerade 
schon ne ganze weile im inet danach aber werd nicht wirklich fündig.

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.