Grundprinzip
An PB eines ATtiny2313 mit 1MHz Systemtakt soll nach Druck auf eine Taste an PD0 eine Folge von Mustern nacheinander auf der LED-Zeile ausgegeben werden.
Die LED leuchten bei log. 0 (neg. Logik)
Die Zeit zwischen den Mustern (200 ms) soll mit Warteschleife realisiert werden.
Die Musterfolge wird am Ende des Programms im Programm-Speicher abgelegt und mit indirekter Adressierung ausgelesen:
muster: ; Muster in den Programmspeicher
.db 0, 0b10000001, 0b01000010, 0b00100100, 0b00011000,0
musterEnd: ; Endemarke
.db 0
Eine Schwierigkeit besteht darin, zu erkennen wann die Musterfolge zu Ende ist. Drei mögliche Strategien sind denkbar:
- Bei einem besonderen Symbol z.B. 0 ist die Liste zu Ende vgl. C-Strings -ausgeben bis 0 kommt
- Eine Marke wird nach der Liste gesetzt und der Zeiger auf die Liste mit dieser Marke verglichen (die hier gewählte Lösung)
- Ein Zähler läuft mit und ein Vergleich mit der Länge der Liste (musterEnd-muster) *2
; *** Muster auf LED-Zeile ausgeben 1.1 (c) Oliver Mezger 21.6.2012 .include "tn2313def.inc" .def tmp= R16 .def wi = R18 ; Warteschleife innen .def wa = R19 ; Warteschleife aussen init: ldi tmp, low(RAMEND) ; Stackpointer initialisieren out SPL, tmp ldi tmp,$ff out PORTB,tmp ; Ausgaenge auf 1 setzen damit nix leuchtet out DDRB,tmp ; PB aus Ausgang main: sbic PIND,0 ; ist PD0 = 1 rjmp main ; dann weiter abfragen ldi ZH, high(muster * 2) ; Z initialisieren ldi ZL, low(muster * 2) musterAusgeben: lpm tmp, Z+ ; lade aus Flash und erhoehe Z com tmp ;negieren des Musters (wegen negativer logik) out PORTB, tmp rcall warte cpi ZL,low(musterEnd*2) ; auf Ende pruefen brne musterAusgeben ; nicht am Ende cpi ZH,high(musterEnd*2) ; brne musterAusgeben rjmp main ; Warteschleife wa * 1000 +7 Takte warte: ; rcall 3 Takte ldi wa, 100 ; Wartezeit in ms @ 1MHz (+7 Takte UP-Aufruf) warteaussen: ldi wi,249 ; (249 * 4) + 4 = 1000 Takte nop warteinnen: nop dec wi brne warteinnen dec wa brne warteaussen ret ; 4 Takte muster: ; Muster in den Programmspeicher .db 0, 0b10000001, 0b01000010, 0b00100100, 0b00011000,0 musterEnd: ; Endemarke .db 0