Forum: Mikrocontroller und Digitale Elektronik avr assembler frage


von M. S. (sadmarvin)


Lesenswert?

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
1
cpi nextbild,3
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.

von MWS (Gast)


Lesenswert?

M. S. schrieb:
> ldi ZH,LOW(bilder*2)

Du musst das LB auch in's ZL laden...

von Spess53 (Gast)


Lesenswert?

Hi

>Du musst das LB auch in's ZL laden...

Genau.

> lpm
>  mov bilderanzahl,r0

Das kannst du dir auch sparen

  lpm bilderanzahl,Z

Oder besser

  lpm bilderanzahl,Z+

dann zeigt Z gleich auf den naächsten Wert.

MfG Spess

von M. S. (sadmarvin)


Lesenswert?

MWS schrieb:
>> ldi ZH,LOW(bilder*2)
>
> Du musst das LB auch in's ZL laden...
ups, das habe ich ganz übersehen, war wohl ein Tippfehler ;)
danke

von Steffen (Gast)


Lesenswert?

Ich vermute mal, dass das Register "bilderanzahl" noch irgendwo anders 
mit genutzt wird. Um welches Register handelt es sich denn?

von M. S. (sadmarvin)


Lesenswert?

r22

aber der Fehler war wie gesagt, dass ich

ldi ZH,LOW(bilder*2)

statt

ldi ZL,LOW(bilder*2)

da stehen hatte. Jetzt funktioniert es.

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.