MezData-Logo

Muster auf LED-Zeile ausgeben mit Assembler

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.

Muster1

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:

  1. Bei einem besonderen Symbol z.B. 0 ist die Liste zu Ende vgl. C-Strings -ausgeben bis 0 kommt
  2. Eine Marke wird nach der Liste gesetzt und der Zeiger auf die Liste mit dieser Marke verglichen (die hier gewählte Lösung)
  3. Ein Zähler läuft mit und ein Vergleich mit der Länge der Liste (musterEnd-muster) *2

Programmablaufplan

 

Quellcode [musterausgeben.asm]
; *** 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
 
 

Ventilator mit Schrift

Ventilator mit Schrift