ich habe mein erstes etwas längeres Programm in assembler geschrieben.
Es ist zur Ansteuerung einer 3x3 LED Matrix mit einem ATtiny2313
Ich habe 2 Timer verwendet. Einer für das Multiplexing der Spalten
und einer für das durchschalten der einzelnen Komplettbilder.
Die Bilder sind so im Programmspeicher abgelegt
1 | bilder:
|
2 | .db 0b00000011 ;3 Bilder
|
3 | bild0:
|
4 | .db 0b00100000
|
5 | .db 0b00010010
|
6 | .db 0b00001000
|
7 |
|
8 | .db 0b00100000
|
9 | .db 0b00010010
|
10 | .db 0b00001000
|
11 |
|
12 | .db 0b00100010
|
13 | .db 0b00010101
|
14 | .db 0b00001010
|
am Anfang des Programmes wird dann der Wert an der Stelle bilder in
einem Register gespeichert.
1 | ldi ZH,LOW(bilder*2) ;Low-Byte der Adresse von bilder in ZL
|
2 | ldi ZH,HIGH(bilder*2) ;High-Byte der Adresse von bilder in ZH
|
3 | lpm
|
4 | mov bilderanzahl,r0
|
In einem weiteren REgister ist die nr. des aktuellen Bildes gespeichert.
Im Interrupt Handler Für den Bilder Timer wird dieser Wert dann mit der
gesamtanzahl der Bilder verglichen und bei Bedarf wieder auf null
gesetzt.
Und am ende um 1 erhöht.
1 | cp nextbild,bilderanzahl ;nextbild mit Anzahl Bilder vergeleichen
|
2 | brne next
|
3 | mov nextbild,zero
|
4 | next:
|
Das funktioniert leider nicht. Es sieht so aus als ob weiter als 3
gezählt wird.
Wenn ich aber
nehem funktioniert es wie gewünscht
muss ich da evtl. einen anderen Vergleichsbefehl oder eine andere
Sprungbedingung nehmen?
Das komplette Programm ist hier zu finden
http://pastebin.com/ebNeXcN2
p.s.:
ich beschäftige mich erst seit gut 1-2 Wochen mit der µC Programmierung.