/********************************************************************************
* 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-8 | 0
|