; ****************************************************************
; * Testprogramm 3 - schaltet durch Steuerung einer Taste an PD5
; *                  eine LED (die gegen Vcc liegt) ein und aus
; * Projektname: test3.asm
; * 
; * **************************************************************

; Wir declarieren einige Variablen und Ports
; (wie man sieht leitet ein Semikolon einen Komentar ein)

.include "tn2313def.inc"

.equ led_ddr   = ddrd 	; Die LED hängt am PORTD
.equ led_port  = portd	; 
.equ LED       = 4		; Nummer der Portleitung ist 4
						; wir setzten sowas immer am Beginn des Programms
						; das schafft viel mehr Übersicht
.equ taste_ddr = ddrd	; die Taste wird auch an PORTD abgefragt
.equ taste_pin = pind	; Tasteninformation über PIND einlesen
.equ taste_port = portd ; Leitung für internen Pullup
.equ taste 	   = 5		; an der Portleitung 5 ist die Taste angeschlossen

.org 0x0000
	rjmp start

.org 0x001A ;erste Programmposition hinter der IRQ-Sprung-Tabelle
start:
	ldi r16, ramend		; lade R16 mit der letzten Adresse des SRAM-Bereichs
	out spl, r16		; schreibe den Wert in das SFR (Special function register) SPL
						; SPL = Stack Pointer Low
						; Stack: Ram-Speicherbereich, der vom Ende des RAM-Bereichs nach 
						; unten wächst und in dem Zwischenwerte gemerkt werden.
						; im SPL-Register steht immer die Nummer der nächsten freien 
						; Speicherstelle
						; Verwaltung des SPL-Registers erfolgt fortan automatisch (CPU)
	sbi led_ddr, led	; Setze das Bit, dessen Nummer in LED steht im DDR für die LED
						; mache die Portleitung zum Ausgang
	sbi	led_port, led	; setze das Bit, dessen Nummer in LED steht im PORT für die LED
						; = schalte die LED aus indem beide Enden an 5 V gelegt werden
	cbi taste_ddr, taste; Schalte die Leitung, an der die Taste hängt als Eingang
	sbi taste_port, taste; internen Pullup einschalten

loop:
	in  r16, taste_pin
	sbrc r16, taste		; überspringe den nächsten Befehl, wenn das Bit mit der Nummer in TASTE
						; gelöscht ist.
						; dann ist der Bitwert auf 0 und die Taste damit gedrückt, denn die
						; legt den Eingang auf Masse und bewirkt eine Null im Bit 
	rjmp loop			; Weil die Taste nicht gedrückt ist, warte weiter bis das der Fall ist.
	ldi r19, 10
blinken:	
						; jetzt war das Bit für die Taste = 0, dieselbe also gedrückt, der "rjmp"-
						; Befehl wurde somit übersprungen und so sind wir hier
	cbi led_port, led	; LED anschalten
						; wir warten ein Weilchen 
	rcall warten		; und lassen zählen
	sbi led_port, led	; LED aus
	rcall warten
	dec r19
	brne blinken

weiter:
	sbi led_port, led	; und schalten die LED wieder aus
	
	rjmp loop			; die selbe Sache gleich noch einmal


; Unterprogramme
 		
warten:
	ldi r18, 42			; 2 Takte
loop0:
	ldi r16, 0			; 2 Takte
loop1:
	ldi r17, 0			; 2 Takte
loop2:	
	dec r17				; 1 Takt
	brne loop2			; 2 Takte bei Verzweigung, 1 Takt, wenn r17 = 0
						; 255 mal 3 Takte + 1 mal 2 Takte = 767 Takte
	dec r16				; 1 Takt
	brne loop1			; 2 Takte bei Verzweigung, 1 Takt, wenn r16 = 0
						; 255 mal 772 Takte (innere Schleife plus äußere) + 2 + 767 + 2 +2 = 197.633 Takte
						; 197633 Takte mal 1:8000000 sec = 0,025 Sek
    dec r18
	brne loop0			; alles mal 256 = ca. 6,3 sec
	ret					; zurück vom warten
