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 :/
> 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)
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 ?
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
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
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.