Hier werden nach und nach die Programme der Würfelplatine aus der Gruppe Microcontroller für Kids der EBG aufgelistet und beschrieben. Im Moment aber verweise ich noch auf die Website des „Projektleiters”, Hartwig Harm: mydarc.de/dh2mic/mikroprozessor/
Das Programm erzeugt einen Ton (ca. 1,5 kHz)
.include "tn13def.inc"
.org $0000
rjmp Start ; Jump vom "Reset"-Vektor zum Programmanfang
.org $000A
Start:
sbi DDRB, 0 ; PB0 ist Ausgang
cbi PORTB, 0 ; Low Pegel an PB0 → Piezo piepst
rcall Wait ; halbe Dauer des 0-Pegels
rcall Wait
sbi PORTB, 0 ; High Pegel an PB0 → Piezo wieder leise
rcall Wait
rcall Wait
rjmp Start ; eine Schwingung ist beendet. Nächste bitte!
Wait:
ldi r18, 40
Wait1:
dec r18
brne Wait1 ; Sprung, wenn r18 noch nicht Null ist
ret
Das Programm morst die Zeichen 1, 6 und 4 mit ca. 1,5kHz
.include "tn13def.inc"
; Langer Ton (Strich) ist 3x so lang wie kurzer Ton (Punkt)
; Nullen stehen für Punkte, Einsen für Striche
; erst alles nach dem Startbit (erste Eins) wird ausgegeben
.equ eins = 0b00101111 ; 1x kurz, 4x lang
.equ zwei = 0b00100111 ; 2x kurz, 3x lang
.equ drei = 0b00100011 ; 3x kurz, 2x lang
.equ vier = 0b00100001 ; 4x kurz, 1x lang
.equ fuenf = 0b00100000 ; 5x kurz
.equ sechs = 0b00110000 ; 1x lang, 4x kurz
.org $0000
rjmp Start ; Jump vom "Reset"-Vektor zum Programmanfang
.org $000A
Start:
ldi r23, eins ; schreibe das Bitmuster für eine Eins ins Register r23
rcall Auslesen
ldi r23, sechs
rcall Auslesen
ldi r23, vier
rcall Auslesen
rjmp Start ; Endlosschleife
Auslesen:
ldi r24, 8
Auslesen1:
dec r24
rol r23 ; Schiebt alle Bits eine Stelle nach links, 7tes Bit ins Carry Flag
brcc Auslesen1 ; wiederhole, wenn eine Null im Carry Flag steht
Auslesen2: ; wird aufgerufen, nachdem Startbit gesetzt
sbrc r23, 7 ; nächsten Befehl überspringen, wenn 7tes Bit eine Null
rcall DoppelTon ; wird nur bei langem Ton aufgerufen: Doppelton + Ton = 3x-Ton
rcall Ton
rol r23
rcall Pause ; Pause zwischen Punkten und Strichen
dec r24
brne Auslesen2
rcall LangePause ; Pause zwischen Morsezeichen
ret
DoppelTon:
rcall Ton ; Nach Aufruf läuft er nochmal in Ton hinein → Doppelton
Ton:
ldi r22, 120
Schwingung:
sbi DDRB, 0 ; PB0 ist Ausgang
cbi PORTB, 0 ; Low Pegel an PB0
rcall Wait ; halbe Dauer des 0-Pegels
sbi PORTB, 0 ; High Pegel an PB0
rcall Wait ; Dauer abwarten (wie oben)
; eine Schwingung ist beendet. Nächste bitte!
dec r22 ; Anzahl der Schwingungen wird dekrementiert
brne Schwingung ; wenn Schwingungen noch nicht null, noch eine
ret ; zurück zum Hauptprogramm
LangePause: ; 7x so lang wie Pause (6x + hineinlaufen)
rcall Pause
rcall Pause
rcall Pause
rcall Pause
rcall Pause
rcall Pause
Pause:
ldi r22, 240
Pause1:
rcall Wait
dec r22
brne Pause1
ret
Wait:
ldi r18, 90 ; mit 90 ist der Ton nahe an der Resonanz
; 80 und 100 sind deutlich leiser
Wait1:
dec r18
brne Wait1 ; Sprung, wenn r18 noch nicht Null ist
ret