Source file: /~heha/basteln/m/Kram/dccrail-avrgcc.zip/binärgleich/Out_set.S

/********************************************************************************
 * DCC Wagen Decoder Software V1.0						*
 * Copyright 2011 Toralf Wilhelm						*
 *										*
 * private Nutzung erwünscht, gewerbliche Nutzung erfordert zwingend meine Zustimmung! *
 * Datei:	Out_set.S							*
 * Kontakt:	toralfwilhelm@web.de						*
 * Webseite:	www.toralfwilhelm.de						*
 * Version:	04/2012 Version 1 Start						*
 * Beschreibung: setzt die Ausgänge vom DCC Wagen Decoder			*
 ********************************************************************************/
#include "definitionen.h"

/*Variablen:

  AUX_Funktion (18x) (1-14) 
    bit0-2 welcher Funktion ist dieser AUX zugeordne
        +0 = F0/FL	-> bit0-2 = 000
        +1 = F1	-> bit0-2 = 001
        +2 = F2	-> bit0-2 = 010
        bis
        +7 = F7	-> bit0-2 = 111
    bit3-4 reserviert
    bit5-7 Dimmer
;
  AUX_Funktion (15-16) für Licht
    bit0-2 immer 0 (F0/FL)
    bit3 = 1 AUX rückwärts aus
    bit4 = 1 AUX vorwärts aus
    bit5-7 Dimmer
;
  AUX_Funktion (17-18) für Kupplungen
    bit0-2 welcher Funktion ist dieser AUX zugeordnet
        +0 = F0/FL	-> bit0-2 = 000
        +1 = F1	-> bit0-2 = 001
        +2 = F2	-> bit0-2 
        bis
        +7 = F7	-> bit0-2 = 111
    bit3-4 reserviert
    bit5-7 Zeit bis AUX wieder abschaltet in Sekunden (0-7)
       +32 = 1
       +64 = 2
      +128 = 4

  AUX_Effekte (18x)
        +0 = normales Licht
        +1 = Neonlicht (Startflackern)
        +2 = defekte Lampe (flackert nur)
        +4 = Nachtmodus (nur AUX 9-14 und dann in Verbindung mit AUX 2-7)
        +8 = Schlusslicht
       +16 = Kupplung
       +32 = Ausgang schaltet zufällig um (bei Nachtmodus nur 1x)
       +64 = Einschalten zufällig verzögert

  AUX_Status (18x)
      Bit0-2 = Dimmer/Timer (entspricht bit5-7 aus Funktionen)
      bit3 = 1 AUX rückwärts aus
      bit4 = 1 AUX vorwärts aus
      Bit5 = 1 -> AUX = aktiv
      Bit6 = 1 -> AUX PIN = ein (zum berechen des aktuellen Zustand für Effekte,Dimmer usw.)
      Bit7 = 0 -> Effekt_Start, wenn Effekt gestartet = 1

  AUX_Timer (18x)
      Timer Counter für Effekte

  Pz (1-3)
      3 Byte für Pseudozufallsbyte

  Zaehler_10us
      wird im CTC Interrupt alle 10us inkrementiert

  Zaehler_1_25ms
      wird hier alle 1,25 ms inkrementiert

*/

OUT_SET:
	ldi	w,125	// alle 1,25ms (10us*125) IO Pins setzen
	cp	Zaehler_10us,w	// wenn nicht 1,25ms vergangen
	brsh	1f
	ret			// gleich zurück
1:	clr	Zaehler_10us

	inc	Zaehler_1_25ms
	ldi	w,50
	cp	Zaehler_1_25ms,w	// sind 62,5 ms vergangen?
	brsh	1f
	rjmp	AUX_DIMMEN
1:	clr	Zaehler_1_25ms

	lds	w,analog_Ri_Zaehler	// Zähler für analog Entprellung inc
	inc	w
	sts	analog_Ri_Zaehler,w
;*************************
;* Timer Restzeit setzen *
;*************************
; hier alle 250ms Timerwerte dec damit sind Timerzeiten von 0,25sek bis 64sek möglich (250ms * 256)
//AUX_TIMER_SET:
	inc	Zaehler_62_5ms
	ldi	w,4
	cp	Zaehler_62_5ms,w	// sind 250 ms vergangen?
	brsh	1f
	rjmp	AUX_EFFEKT_WAHL
1:	clr	Zaehler_62_5ms
	ldi	ZL,lo8(AUX_Timer)
	ldi	ZH,hi8(AUX_Timer)
0:
	ld	w,z	// AUX Timer holen
	tst	w
	breq	1f
	dec	w
1:	st	z+,w
	cpi	ZL,lo8(AUX_Timer+ANZAHL_AUX)
	brne	0b

; auch alle 250ms die Betriebsspannung überwachen
	sbrc	flag, noUB	// wenn UB am Decoder anliegt 1x springen
	 rjmp	1f
//UB_ist_da:	// DCCpin oder DCC2pin ist high -> Spannung am Gleis
	lds	w, UB_test
	clr	w
	sts	UB_test, w
	sbrc	flag, noPower	// wenn vorher 64 Sek. lang keine Spannung da war, Decoder jetzt neustarten
	 rjmp	Reset
	rjmp	AUX_EFFEKT_WAHL
1:	// DCCpin und DCC2pin sind low -> keine Spannung am gleis
	lds	w, UB_test
	inc	w
;inc w
;inc w
;inc w
	tst	w
	breq	setze_keine_UB
	sts	UB_test, w
	rjmp	AUX_EFFEKT_WAHL
setze_keine_UB:
	sbr	flag, (1<<noPower)	// nach 64 sek Spannungslos Flag noPower setzen

;*****************************
;* Effekte wählen und setzen *
;*****************************
; in einer Schleife alle AUX abfragen und je die Effekte setzen
;   AUX_Effekte
;         +1 = normales Licht
;         +2 = Neonlicht (Startflackern)
;         +4 = defekte Lampe (flackert nur)
;         +8 = Nachtmodus (nur AUX 9-14 und dann in Verbindung mit AUX 2-7)
;        +16 = Kupplung
;        +32 = Ausgang schaltet zufällig ein/um (bei Nachtmodus nur 1x)
;        +64 = AUX rückwärts aus
;       +128 = AUX vorwärts aus
; 
;   AUX_Status (18x)
;	Bit0-2 = Dimmer/Timer (entspricht bit5-7 aus Funktionen)
;	Bit3 = 1 -> Nachtmodusabschaltung (AUX ist aus weil Nachtmodus_AUX an)
;	Bit4 = 1 -> Effekt_2 = 1 -> zweiter Effekt aktiv (z.B. bei Zufall und Neonlicht oder def. Lampe)
;	Bit5 = 1 -> AUX_aktiv = 1 -> zugehörige Funktion ist ein
;	Bit6 = 1 -> AUX_an = 1 -> Pin ist aktuell eingeschaltet (zum schalten für Effekte, Dimmer usw.)
;	Bit7 = 0 -> Effekt_Start = 1 -> Effekt ist gestartet

AUX_EFFEKT_WAHL:
	ldi	YL,lo8(AUX_Status)
	ldi	YH,hi8(AUX_Status)
	ldi	ZL,lo8(AUX_Effekte)
	ldi	ZH,hi8(AUX_Effekte)
	ldi	XL,lo8(AUX_Timer)
	ldi	XH,hi8(AUX_Timer)

AUX_EFFEKT_WAHL_SCHLEIFE:
; zur Übersicht Neudef. von w/r16,w2/r17,w3/r18
#define Status	r16
#define Effekt	r17
#define Timer	r18

	ld	Status,y	// in w hole Status
	ld	Effekt,z+	// in w2 hole Effekte
	ld	Timer,x	// in w3 hole Timer

	sbrs	Status,AUX_aktiv	// Verzweigen AUX aktiv/inaktiv
	 rjmp	AUX_INAKTIV

AUX_IST_AKTIV:

RICHTUNG_TESTEN:	// zuerst testen ob AUX bei dieser Fahrtrichtung an sein soll
	sbrs	DCCreg,richtung	// bei 1 = vorwärts 1x springen
	 rjmp	RICHTUNG_IST_RUECKWAERTS
RICHTUNG_IST_VORWAERTS:
	sbrs	Effekt,AUX_vorwaerts_aus; springe wenn AUX Vorwärts aus sein soll
	 rjmp	NACHTABSCHALTUNG
	cbr	Status,(1<<AUX_an)	// sonst lösche AUX
	rjmp	NAECHSTER_AUX
RICHTUNG_IST_RUECKWAERTS:
	sbrs	Effekt,AUX_rueckwaerts_aus	// springe wenn AUX Rückwärts aus sein soll
	 rjmp	NACHTABSCHALTUNG
	cbr	Status,(1<<AUX_an)	// sonst lösche AUX
	rjmp	NAECHSTER_AUX

NACHTABSCHALTUNG:	// auf Nachtabschaltung testen
	sbrs	Status,Nacht_aus
	 rjmp	EFFEKT_WAHL
	cbr	Status,(1<<AUX_an)	// sonst lösche AUX
	rjmp	NAECHSTER_AUX

EFFEKT_WAHL:	// hier Verzweigen je nach Effekt
	sbrc	Effekt,normales_Licht
	 rjmp	EFFEKT_NORMALES_LICHT
	sbrc	Effekt,Neonlicht
	 rjmp	EFFEKT_NEONLICHT
	sbrc	Effekt,defekte_Lampe
	 rjmp	EFFEKT_DEFEKTE_LAMPE
	sbrc	Effekt,Nachtmodus
	 rjmp	EFFEKT_NACHTMODUS
	sbrc	Effekt,Kupplung
	 rjmp	EFFEKT_KUPPLUNG
	rjmp	NAECHSTER_AUX 

EFFEKT_NORMALES_LICHT:
	sbrc	Effekt,schaltet_zufaellig	// wenn schaltet_zufaellig aus ist 1x springen
	 rjmp	NORMALES_LICHT_SCHALTET_ZUFAELLIG
	sbr	Status,(1<<AUX_an)	// einschalten
	rjmp	NAECHSTER_AUX	// und fertig
NORMALES_LICHT_SCHALTET_ZUFAELLIG:
	tst	Timer	// test ob Effekttimer abgelaufen
	breq	NORMALES_LICHT_ZUFALL_SETZEN
	rjmp	NAECHSTER_AUX	// sonst fertig
NORMALES_LICHT_ZUFALL_SETZEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// zuerst neue Pseudozufallszahl erstellen
	lds	w4,Pz
	mov	Timer,w4	// und damit den Effekttimer neu starten
	sbr	Timer,7	// aber mit mindestens 32 sek 
;	ldi	Timer,$FF	// Effekttimer auf max. setzen
	rcall	ZUFALLSZAHL_ERZEUGEN	// dann wieder neue Pseudozufallszahl erstellen
	lds	w4,Pz
	sbrc	w4,7	// wenn bit7 aus 1x springen
	 sbr	Status,(1<<AUX_an)	// bei an AUX einschalten
	sbrs	w4,7	// wenn bit7 an 1x springen
	 cbr	Status,(1<<AUX_an)	// bei aaus AUX ausschalten
	rjmp	NAECHSTER_AUX

EFFEKT_NEONLICHT:
	sbrs	Effekt,schaltet_zufaellig	// wenn schaltet_zufaellig an ist 1x springen
	 rjmp	NEONLICHT_STARTEN
	sbrc	Status,Effekt_2	// wenn Effekt 2 noch aus 1x springen
	 rjmp	NEONLICHT_STARTEN	// wenn an weiter mit..
NEONLICHT_SCHALTET_ZUFAELLIG:
	sbrs	Status,Effekt_Start	// nachsehen ob zuffällig starten schon läuft
	 rjmp	NEONLICHT_ZUFALL_BEARBEITEN
NEONLICHT_ZUFALL_START_SETZEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// zuerst neue Pseudozufallszahl erstellen
	lds	w4,Pz
	mov	Timer,w4	// und damit den Effekttimer neu starten
	sbr	Timer,7	// aber mit mindestens 32 sek 
;	ldi	Timer,$FF	// Effekttimer auf max. setzen
	sbr	Status,(1<<Effekt_Start); Effekt gestartet setzten
	rjmp	NAECHSTER_AUX

NEONLICHT_ZUFALL_BEARBEITEN:
	tst	Timer	// test ob Effekttimer abgelaufen
	breq	NEONLICHT_NEUEN_ZUFALL_SETZEN
	rjmp	NAECHSTER_AUX
NEONLICHT_NEUEN_ZUFALL_SETZEN:
	sbrs	Status,AUX_an	// wenn AUX an ist 1x springen
	 rjmp	NEONLICHT_STRART_TESTEN ; sonst zum Starten
NEONLICHT_ABSCHALTEN_TESTEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// neue Pseudozufallszahl erstellen
	lds	w4,Pz
	sbrs	w4,7	// wenn bit7 an 1x springen
	 rjmp	AUX_INAKTIV	// ansonsten Effekt komplett neustarten
	mov	Timer,w4	// ansonsten mit dem Pzb Effekttimer neu starten
	sbr	Timer,6	// aber mit mindestens 16 sek 
	;ldi	Timer,8	// Effekttimer auf Wert setzen
	rjmp	NAECHSTER_AUX 
NEONLICHT_STRART_TESTEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// neue Pseudozufallszahl erstellen
	lds	w4,Pz
	sbrc	w4,7	// wenn bit7 aus 1x springen
	 rjmp	NEONLICHT_EFFEKT_2_STARTEN	// wenn auf Effekt 2 schalten und Licht starten
	mov	Timer,w4	// ansonsten mit dem Pzb Effekttimer neu starten
	sbr	Timer,6	// aber mit mindestens 16 sek 
	;ldi	Timer,8	// Effekttimer auf Wert setzen
	rjmp	NAECHSTER_AUX
NEONLICHT_EFFEKT_2_STARTEN:
	cbr	Status,(1<<Effekt_Start); Effekt 2 starten
NEONLICHT_STARTEN:
	sbr	Status,(1<<AUX_an)+(1<<Effekt_2)
	sbrc	Status,Effekt_Start	// wenn Effekt läuft 1x springen
	 rjmp	NEONLICHT_LAEUFT_SCHON
	ldi	Timer,0b00000010	// w3 mit Timerwert für 0,5 sec. laden
	sbr	Status,(1<<Effekt_Start); Effekt_Start setzen
	rjmp	NAECHSTER_AUX
NEONLICHT_LAEUFT_SCHON:
	tst	Timer	// test ob Effekttimer abgelaufen
	breq	NEONLICHT_EFFEKT_1_STARTEN	// Effekt 1 wieder starten
	rcall	ZUFALLSZAHL_ERZEUGEN	// sonst zuerst neue Pseudozufallszahl erstellen
	lds	w4,Pz	// daraus ein neues bit holen (Pz bit7 nehmen wir)
	sbrs	w4,7
	 cbr	Status,(1<<AUX_an)	// sonst lösche Licht
	rjmp	NAECHSTER_AUX
NEONLICHT_EFFEKT_1_STARTEN:
	sbrc	Effekt,schaltet_zufaellig	// wenn schaltet_zufaellig aus ist 1x springen
	 cbr	Status,(1<<Effekt_2)+(1<<Effekt_Start)	// auf Effekt 1 zufällig an/aus zurückschalten
	rjmp	NAECHSTER_AUX

EFFEKT_DEFEKTE_LAMPE:
	sbrc	Effekt,schaltet_zufaellig	// wenn schaltet_zufaellig aus ist 1x springen
	 rjmp	DEFEKTE_LAMPE_SCHALTET_ZUFAELLIG
	sbr	Status,(1<<AUX_an)
	rcall	ZUFALLSZAHL_ERZEUGEN	// zuerst neue Pseudozufallszahl erstellen
	lds	w4,Pz	// daraus ein neues bit holen (Pz bit7 nehmen wir)
	sbrs	w4,7
	 cbr	Status,(1<<AUX_an)	// sonst lösche Licht
	rjmp	NAECHSTER_AUX

DEFEKTE_LAMPE_SCHALTET_ZUFAELLIG:
	tst	Timer	// test ob Effekttimer abgelaufen
	breq	DEFEKTE_LAMPE_ZUFALL_SETZEN
	sbrc	Status,Effekt_2	// wenn Effekt_2 aus 1x springen (Flackern aktiv, also erzeugen)
	 rjmp	NAECHSTER_AUX	// wenn an fertig
	sbr	Status,(1<<AUX_an)	// auf jeden Fall wieder Flackern setzen
	rcall	ZUFALLSZAHL_ERZEUGEN	// zuerst neue Pseudozufallszahl erstellen
	lds	w4,Pz	// daraus ein neues bit holen (Pz bit7 nehmen wir)
	sbrs	w4,7
	 cbr	Status,(1<<AUX_an)	// sonst lösche Licht
	rjmp	NAECHSTER_AUX
DEFEKTE_LAMPE_ZUFALL_SETZEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// zuerst neue Pseudozufallszahl erstellen
	lds	w4,Pz
	mov	Timer,w4	// und damit den Effekttimer neu starten
	sbr	Timer,7	// aber mit mindestens 32 sek 
;	ldi	Timer,$30	// Effekttimer auf max. setzen
	ldi	w4,(1<<Effekt_2)	// Effekt_2 Bit xor (umdrehen)
	eor	Status,w4	// -> wenn Effekt_2 an wird kein Flackern erzeugt (AUX bleibt auf letzten Pegel)
		// wenn aus flackert der AUX
	rjmp	NAECHSTER_AUX

EFFEKT_NACHTMODUS:
	cpi	YL,lo8(AUX_Status+8)	// bis einschließlich diesem AUX (8) gesperrt
	brlo	KEIN_NACHTMODUS_MOEGLICH	// und dann
	cpi	YL,lo8(AUX_Status+14)	// bis einschließlich diesem AUX (14) erlaubt
	brlo	NACHTMODUS_MOEGLICH
KEIN_NACHTMODUS_MOEGLICH:
	rjmp	NAECHSTER_AUX
NACHTMODUS_MOEGLICH:
	push	YL	// nachsehen ob passender AUX 2-7 an
	subi	YL,7
	ld	w4,y
	sbrs	w4,AUX_aktiv
	 rjmp	NACHTMODUS_SPERREN	// wenn nicht NACHTMODUS_SPERREN 

	sbrc	Effekt,schaltet_zufaellig	// wenn schaltet_zufaellig aus ist 1x springen
	 rjmp	NACHTMODUS_SCHALTET_ZUFAELLIG
	rjmp	NACHTMODUS_EINSCHALTEN
NACHTMODUS_SCHALTET_ZUFAELLIG:
	sbrc	Status,Effekt_Start	// nachsehen ob Effekt schon läuft
	 rjmp	NACHTMODUS_ZUFALL_SETZEN
NACHTMODUS_ZUFALL_NEU_LADEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// wenn nicht neue Pseudozufallszahl erstellen
	lds	w4,Pz
	mov	Timer,w4	// und damit den Effekttimer neu starten
;	sbr	Timer,7	// aber mit mindestens 32 sek 
;	ldi	Timer,4	// Effekttimer auf Wert setzen
	sbr	Status,(1<<Effekt_Start)
	pop	YL
	rjmp	NAECHSTER_AUX
NACHTMODUS_ZUFALL_SETZEN:
	tst	Timer
	breq	NACHTMODUS_ZUFALL_START_TEST
	pop	YL
	rjmp	NAECHSTER_AUX
NACHTMODUS_ZUFALL_START_TEST:
	rcall	ZUFALLSZAHL_ERZEUGEN	// neue Pseudozufallszahl erstellen
	lds	w4,Pz
	sbrs	w4,7	// wenn bit7 an 1x springen
	 rjmp	NACHTMODUS_ZUFALL_NEU_LADEN

NACHTMODUS_EINSCHALTEN:
	ld	w4,y
	sbr	w4,(1<<Nacht_aus)
	st	y,w4
	pop	YL
	sbr	Status,(1<<AUX_an)
	rjmp	NAECHSTER_AUX
NACHTMODUS_SPERREN:
	pop	YL
	cbr	Status,(1<<AUX_an)
	rjmp	NAECHSTER_AUX

EFFEKT_KUPPLUNG:
	sbr	Status,(1<<AUX_an)
	sbrc	Status,Effekt_Start	// wenn Effekt läuft 1x springen
	 rjmp	KUPPLUNG_EFFEKT_LAEUFT
KUPPLUNG_EFFEKT_STARTEN:
	mov	Timer,Status	// Effekzeit in Timer laden
	cbr	Timer,0b11111000
	lsl	Timer
	lsl	Timer	// Effektzeit in sec. (250ms x4)
	sbr	Status,(1<<Effekt_Start) ; Effekt_Start setzen
	rjmp	NAECHSTER_AUX
KUPPLUNG_EFFEKT_LAEUFT:
	tst	Timer	// test ob Effekttimer abgelaufen
	brne	NAECHSTER_AUX	// wenn nicht, fertig
	cbr	Status,(1<<AUX_an)	// sonst lösche AUX
	rjmp	NAECHSTER_AUX

AUX_INAKTIV:	// wenn AUX inaktiv hier ausschalten und Effekte deaktivieren

EFFEKT_NACHTMODUS_AUSSCHALTEN:	// zuerst um Nachtmodus abschalten kümmern
	cpi	YL,lo8(AUX_Status+8)	// bis einschließlich diesem AUX (8) gibt es keinen Nachtmodus
	brlo	KEIN_NACHTMODUS_AUS_MOEGLICH	// und dann
	cpi	YL,lo8(AUX_Status+14)	// bis einschließlich diesem AUX (14) erlaubt
	brlo	NACHTMODUS_AUS_MOEGLICH
KEIN_NACHTMODUS_AUS_MOEGLICH:
	rjmp	REST_INAKTIV	// kein Nactmodus möglich gleich restliche AUX abschalten

NACHTMODUS_AUS_MOEGLICH:
	sbrc	Effekt,schaltet_zufaellig	// wenn schaltet_zufaellig aus ist 1x springen
	 rjmp	NACHTMODUS_SCHALTET_ZUFAELLIG_AUS
	rjmp	NACHTMODUS_NORMAL_AUSSCHALTEN

NACHTMODUS_SCHALTET_ZUFAELLIG_AUS:
	sbrc	Status,Effekt_2	// nachsehen ob Effekt_2 schon läuft
	 rjmp	NACHTMODUS_ZUFALL_AUS_SETZEN
NACHTMODUS_ZUFALL_AUS_NEU_LADEN:
	rcall	ZUFALLSZAHL_ERZEUGEN	// wenn nicht neue Pseudozufallszahl erstellen
	lds	w4,Pz
	mov	Timer,w4	// und damit den Effekttimer neu starten
;	sbr	Timer,7	// aber mit mindestens 32 sek 
;	ldi	Timer,2	// Effekttimer auf Wert setzen
	sbr	Status,(1<<Effekt_2)
	rjmp	NAECHSTER_AUX
NACHTMODUS_ZUFALL_AUS_SETZEN:
	tst	Timer
	breq	NACHTMODUS_ZUFALL_AUS_START_TEST
	rjmp	NAECHSTER_AUX
NACHTMODUS_ZUFALL_AUS_START_TEST:
	rcall	ZUFALLSZAHL_ERZEUGEN	// neue Pseudozufallszahl erstellen
	lds	w4,Pz
	sbrs	w4,7	// wenn bit7 an 1x springen
	 rjmp	NACHTMODUS_ZUFALL_AUS_NEU_LADEN

NACHTMODUS_NORMAL_AUSSCHALTEN:
	push	YL
	subi	YL,7
	ld	w4,y
	sbrs	w4,Nacht_aus
	 rjmp	Y_WIEDERHERSTELLEN
	cbr	w4,(1<<Nacht_aus)+(1<<Effekt_Start)+(1<<AUX_an)
	sbr	w4,(1<<Effekt_2)
	st	y,w4
Y_WIEDERHERSTELLEN:
	pop	YL

REST_INAKTIV:
	cbr	Status,(1<<Effekt_Start)+(1<<AUX_an)+(1<<Effekt_2)+(1<<Nacht_aus)

NAECHSTER_AUX:
	st	y+,Status
	st	x+,Timer
	cpi	ZL,lo8(AUX_Effekte+ANZAHL_AUX)
	breq	AUX_DIMMEN
	rjmp	AUX_EFFEKT_WAHL_SCHLEIFE

;* ab hier wieder normale def. von w,w2,w3 !

;************************
;*	AUX Dimmen	*
;************************
; zum Schluß alle aktiven AUX mit ihrem Dimmwert in 8 Stufen dimmen
;	AUX_Status
;	Bit0-2 = Dimmer/Timer (entspricht bit5-7 aus Funktionen)
;	bit3 = 1 AUX rückwärts aus
;	bit4 = 1 AUX vorwärts aus
;	Bit5 = 1 -> AUX = aktiv
;	Bit6 = 1 -> AUX PIN = ein (zum berechen des aktuellen Zustand für Effekte,Dimmer usw.)
;	Bit7 = 0 -> Effekt_Start, wenn Effekt gestartet = 1

AUX_DIMMEN:
	sbrc	flag,noPower	// wenn UB da 1x springen
	 rjmp	alles_aus_64sek_keine_UB_da
	ldi	w,14
	inc	PWM_Zaehler	// Zähler für Software PWM erhöhen
	cp	PWM_Zaehler,w
	brne	1f
	clr	PWM_Zaehler

1:	ldi	YL,lo8(AUX_Status)	// lade eingeschaltete AUX Pins
	ldi	YH,hi8(AUX_Status)

	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_1_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_1_EIN
AUX_1_AUS:
	cbi	AUX_1_port,AUX_1_pin
	rjmp	1f
AUX_1_EIN:
	sbi	AUX_1_port,AUX_1_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_2_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_2_EIN
AUX_2_AUS:
	cbi	AUX_2_port,AUX_2_pin
	rjmp	1f
AUX_2_EIN:
	sbi	AUX_2_port,AUX_2_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_3_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_3_EIN
AUX_3_AUS:
	cbi	AUX_3_port,AUX_3_pin
	rjmp	1f
AUX_3_EIN:
	sbi	AUX_3_port,AUX_3_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_4_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_4_EIN
AUX_4_AUS:
	cbi	AUX_4_port,AUX_4_pin
	rjmp	1f
AUX_4_EIN:
	sbi	AUX_4_port,AUX_4_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_5_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_5_EIN
AUX_5_AUS:
	cbi	AUX_5_port,AUX_5_pin
	rjmp	1f
AUX_5_EIN:
	sbi	AUX_5_port,AUX_5_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_6_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_6_EIN
AUX_6_AUS:
	cbi	AUX_6_port,AUX_6_pin
	rjmp	1f
AUX_6_EIN:
	sbi	AUX_6_port,AUX_6_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_7_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_7_EIN
AUX_7_AUS:
	cbi	AUX_7_port,AUX_7_pin
	rjmp	1f
AUX_7_EIN:
	sbi	AUX_7_port,AUX_7_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_8_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_8_EIN
AUX_8_AUS:
	cbi	AUX_8_port,AUX_8_pin
	rjmp	1f
AUX_8_EIN:
	sbi	AUX_8_port,AUX_8_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_9_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_9_EIN
AUX_9_AUS:
	cbi	AUX_9_port,AUX_9_pin
	rjmp	1f
AUX_9_EIN:
	sbi	AUX_9_port,AUX_9_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_10_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_10_EIN
AUX_10_AUS:
	cbi	AUX_10_port,AUX_10_pin
	rjmp	1f
AUX_10_EIN:
	sbi	AUX_10_port,AUX_10_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_11_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_11_EIN
AUX_11_AUS:
	cbi	AUX_11_port,AUX_11_pin
	rjmp	1f
AUX_11_EIN:
	sbi	AUX_11_port,AUX_11_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_12_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_12_EIN
AUX_12_AUS:
	cbi	AUX_12_port,AUX_12_pin
	rjmp	1f
AUX_12_EIN:
	sbi	AUX_12_port,AUX_12_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_13_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_13_EIN
AUX_13_AUS:
	cbi	AUX_13_port,AUX_13_pin
	rjmp	1f
AUX_13_EIN:
	sbi	AUX_13_port,AUX_13_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_14_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_14_EIN
AUX_14_AUS:
	cbi	AUX_14_port,AUX_14_pin
	rjmp	1f
AUX_14_EIN:
	sbi	AUX_14_port,AUX_14_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_15_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_15_EIN
AUX_15_AUS:
	cbi	AUX_15_port,AUX_15_pin
	rjmp	1f
AUX_15_EIN:
	sbi	AUX_15_port,AUX_15_pin

1:	ld	w,y+
	sbrs	w,AUX_an
	 rjmp	AUX_16_AUS
	cbr	w,0b11111000
	sbrc	w,2
	 lsl	w
	cp	w,PWM_Zaehler
	brsh	AUX_16_EIN
AUX_16_AUS:
	cbi	AUX_16_port,AUX_16_pin
	rjmp	1f
AUX_16_EIN:
	sbi	AUX_16_port,AUX_16_pin

1:	sbrc	flag, Lipo	// wenn Lipobetrieb, AUX17 -> Lipo GND -> nicht setzen
	 rjmp	AUX_18_set

	ld	w,y+
	sbrs	w,AUX_an
	 cbi	AUX_17_port,AUX_17_pin
	sbrc	w,AUX_an
	 sbi	AUX_17_port,AUX_17_pin

AUX_18_set:
	ld	w,y+
	sbrs	w,AUX_an
	 cbi	AUX_18_port,AUX_18_pin
	sbrc	w,AUX_an
	 sbi	AUX_18_port,AUX_18_pin

	ret


alles_aus_64sek_keine_UB_da:	// alles abschalten und Strom sparen
	sbrc	flag, Lipo	// wenn Lipobetrieb aus 1x springen
	 cbi	AUX_17_port,AUX_17_pin	// ansonsten gleich Lipo abschalten -> Decoder aus
		// wenn nicht gewünscht nur Strom sparen
	cbi	AUX_1_port,AUX_1_pin	// warte auf Gleisspannung bzw DCC Signal und starte dann neu
	cbi	AUX_2_port,AUX_2_pin	// oder bis UB unter BrownOut und gehe in Reset
	cbi	AUX_3_port,AUX_3_pin
	cbi	AUX_4_port,AUX_4_pin
	cbi	AUX_5_port,AUX_5_pin
	cbi	AUX_6_port,AUX_6_pin
	cbi	AUX_7_port,AUX_7_pin
	cbi	AUX_8_port,AUX_8_pin
	cbi	AUX_9_port,AUX_9_pin
	cbi	AUX_10_port,AUX_10_pin
	cbi	AUX_11_port,AUX_11_pin
	cbi	AUX_12_port,AUX_12_pin
	cbi	AUX_13_port,AUX_13_pin
	cbi	AUX_14_port,AUX_14_pin
	cbi	AUX_15_port,AUX_15_pin
	cbi	AUX_16_port,AUX_16_pin
	cbi	AUX_17_port,AUX_17_pin
	cbi	AUX_18_port,AUX_18_pin
	rcall	StepDown_ausschalten	// stepDown abschalten
	clr	w
	out	ADCSRA,w	// ADC abschalten
	out	TCCR1B,w	// Timer1 anhalten

	ret

;****************************************
;*  Unterprogramm Zufallszahl erzeugen  *
;****************************************
; in Pz eine Pseudozufallszahl erzeugen
; als Startbytes wird die zufällige Belegung der RAM Zellen Pz genommen

ZUFALLSZAHL_ERZEUGEN:
	push	w3
	push	w4
	clr	w4
	lds	w3,Pz+2
	sbrc	w3,7		// (w3=Pz[2]) bit7 aus byte3 mit den bits1,2,5 aus byte1
	 inc	w4		// addieren das dann durch 2 teilen und das
	lds	w3,Pz 
	sbrc 	w3,5		// (w3=Pz[0]) neu ermittelte bit übers carry flag in das
	 inc	w4			// 24 bit schieberegister aus den byts pz[3]
	sbrc	w3,2		// (w3=Pz[0]) von rechts einschieben
	 inc	w4
	sbrc	w3,1		// (w3=Pz[0])
	 inc	w4
	ror 	w4		// modulo 2 Xor
	rol	w3		// (w3=Pz[0])
	sts	Pz,w3
	lds	w3,Pz+1
	rol 	w3		// (w3=Pz[1])
	sts	Pz+1,w3
	lds	w3,Pz+2
	rol	w3		// (w3=Pz[2])
	sts	Pz+2,w3
	pop	w4
	pop	w3
	ret
Detected encoding: UTF-80