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

/********************************************************************************
 * DCC Wagen Decoder Software V1.1						*
 * Copyright 2011 Toralf Wilhelm						*
 *										*
 * private Nutzung erwünscht, gewerbliche Nutzung erfordert zwingend meine Zustimmung!	*
 * Datei:	LoadEEdaten.inc							*
 * Kontakt:	toralfwilhelm@web.de						*
 * Webseite:	www.toralfwilhelm.de						*
 * Version:	01/2011 Version 1 Start						*
 *		01/2013 Fehler beim laden langer Adressen beseitigt		*
 * Beschreibung: EEProm Daten in die Arbeitsregister laden			*
 ********************************************************************************/
#include "definitionen.h"

EEpromDatenlesen:

/*****************************
 * bei mega8 OSCCAL einlesen *
 *****************************/
#ifdef __AVR_ATmega8__
        ldi	w,EEOSCCAL	// hole Oszillator Calibrierung NUR bei mega8 nötig
	sts	EE_Adresse,w
	rcall	eepromlesen
	out	OSCCAL,w
#endif

/*****************************
 * auf Softwareupdate testen *
 *****************************/
	ldi	w,EEsoftup	// auf Bootloader ein -> Softwareupdate ein testen
	sts	EE_Adresse,w
	rcall	eepromlesen

	tst	w		// auf Null testen
	breq	1f		// wenn Null normal weiter
0:	nop
	rjmp	0b		// auf WDR Reset und Sprung zum Bootloader warten
#ifdef __AVR_ATmega8__
1:	// Kein SoftwareUpdate
	// WDR ausschalten (nachBootloader)
	WDR
				// Write logical one to WDCE and WDE
	in	w, WDTCR
	ori	w, (1<<WDCE)|(1<<WDE)
	out	WDTCR, w
	// Turn off WDT
	ldi	w, (0<<WDE)
	out	WDTCR, w

#endif

/***************************
 * Grundparameter einlesen *
 ***************************/
	ldi	w,EEAdresse	// hole Dekoder Adresse (kurze Adresse)
	sts	EE_Adresse,w
	rcall	eepromlesen
	mov	Adresse,w

DATEN_NEU_EINLESEN:

/****************************
 * AUX FKT und EFF einlesen *
 ****************************/
	ldi	YL,lo8(AUX_Funktion)
	ldi	YH,hi8(AUX_Funktion)
	ldi	ZL,lo8(AUX_Status)
	ldi	ZH,hi8(AUX_Status)
	ldi	w2,EE_AUX_FKT
0:
	sts	EE_Adresse,w2
	rcall	eepromlesen
	mov	w3,w		// bit 0-2 -> nach Funktion bit 0-2
	cbr	w3,0b11111000
	st	y+,w3
	swap	w		// bit 5-7 -> nach Status bit 0-2
	lsr	w
	cbr	w,0b11111000
	st	z+,w
	inc	w2
	cpi	w2,(EE_AUX_FKT+ANZAHL_AUX)	// alle Werte eingelesen?
	brne	0b		// wenn nicht nächsten holen

	ldi	YL,lo8(AUX_Effekte)
	ldi	YH,hi8(AUX_Effekte)
	ldi	w2,EE_AUX_EFF
0:
	sts	EE_Adresse,w2
	rcall	eepromlesen
	st	y+,w
	inc	w2
	cpi	w2,(EE_AUX_EFF+ANZAHL_AUX)	// alle Werte eingelesen? (kupplung und licht haben keine effekte)
	brne	0b		// wenn nicht nächsten holen

/*****************
 * CV29 einlesen *
 *****************/
	ldi	w,EEcv29	// Konfig bits holen
	sts	EE_Adresse,w
	rcall	eepromlesen
	bst	DCCreg,keinDCC
	bld	w,keinDCC	// bit6+7 (KeinDCC+Richtung) kommen nicht aus CV29,
	bst	DCCreg,richtung	// diese Bits beibehalten damit nach POM der Dekoder weiterläuft
	bld	w,richtung
	mov	DCCreg,w

/*********************************
 * CV31/32 U_LED / Lipo einlesen *
 *********************************/
	ldi	w,EE_U_LED
	sts	EE_Adresse,w
	rcall	eepromlesen
	mov	U_LED,w
	ldi	w,EE_Lipo
	sts	EE_Adresse,w
	rcall	eepromlesen
	sbrc	w,0
	 sbr	flag,(1<<Lipo)

/**************************
 * lange Adresse einlesen *
 **************************/
	sbrs	DCCreg,erwAdresse	// wenn erweiterte (lang) Adresse an 1x springen
	 ret	// lange adresse holen überspringen
	ldi	w,EElanghigh	// erweiterte Adresse holen
	sts	EE_Adresse,w
	rcall	eepromlesen
	mov	Adresse,w
	ldi	w,EElanglow
	sts	EE_Adresse,w
	rcall	eepromlesen
	sts	AdresseLow,w
	ret

/*************************
 * CV Register im eeprom *
 *************************/
.section .eeprom,"a",@progbits

EEAdresse:.byte	3	//CV1 Dekoderaddresse 1-127
	.space	4,0xFF
	.byte	0xFF	//CV6
	.byte	43	//CV7 Software-Version
	.byte	0x0D	//CV8 Herstellerkennung
	.byte	0xFF
	.byte	0xFF	//CV10
	.byte	0xFF	//CV11
	.byte	0xFF	//CV12
EECV13:	.byte	0b00000111	//CV13 Analogmodus aktive FL/0 = 1 ein F1 = 2 ein bis F7 = 255 ein
	.byte	0xFF	//CV14
	.byte	0xFF	//CV15
	.byte	0xFF	//CV16
EElanghigh:	.byte	192	//CV17 Erweiterte Adresse Höherwertiges Byte der langen Adresse plus 192
EElanglow:	.byte	100	//CV18 Erweiterte Adresse Niederwertiges Byte der langen Adresse
	.byte	0xFF	//CV19 Consist-Adresse wird nicht unterstützt!
	.byte	0xFF	//CV20
	.byte	0xFF	//CV21
	.byte	0xFF	//CV22
	.byte	0xFF	//CV23
	.byte	0xFF	//CV24
	.byte	0xFF	//CV25
	.byte	0xFF	//CV26
	.byte	0xFF	//CV27
	.byte	0xFF	//CV28
EEcv29:	.byte	6	//CV29 Konfiguration nach DCC-Norm
	//        +1:Fahr-Richtung umgekehrt
	//        +2:28/128 Fahrstufen, sonst 14
	//        +4:automatisch Analog/Digital-Erkennung, sonst nur Digitalbetrieb
	//        +32:Erweiterte (lange) Adresse (CV17 und CV18), sonst CV1
EEsoftup: .byte	0	//CV30 gleich 1 Softwareupdate ein
EE_U_LED: .byte	205	//CV31 U_LED 4,2V -> ca. 205 (je nach AVR da die int. rev. unterschiedlich)
EE_Lipo:  .byte	1	//CV32 1 = Lipobetrieb -> AUX17 = Lipo GND Anschluß!
EE_AUX_FKT:
	.byte	0b00100001	//CV33 AUX_1_FKT
	//     bit0-2 welcher Funktion ist dieser AUX zugeordnet
	//         +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 von 000 bis 111 (Achtung ist nicht linear) 

	.byte	0b00100010	//CV34 AUX_2_FKT
	.byte	0b00100010	//CV35
	.byte	0b00100010	//CV36
	.byte	0b00100010	//CV37
	.byte	0b00100010	//CV38
	.byte	0b00100010	//CV39
	.byte	0b00100001	//CV40
	.byte	0b11100011	//CV41 -> AUX_9 im Nachtmodus AUX_2 zugeordnet
	.byte	0b11100011	//CV42 -> AUX_10 im Nachtmodus AUX_3 zugeordnet
	.byte	0b11100011	//CV43 -> AUX_11 im Nachtmodus AUX_4 zugeordnet
	.byte	0b11100011	//CV44 -> AUX_12 im Nachtmodus AUX_5 zugeordnet
	.byte	0b11100011	//CV45 -> AUX_13 im Nachtmodus AUX_6 zugeordnet
	.byte	0b11100011	//CV46 -> AUX_14 im Nachtmodus AUX_7 zugeordnet
	.byte	0b11100000	//CV47 AUX_15 Schlußicht hinten und
	.byte	0b11100000	//CV48 AUX_16 Schlußlicht vorn
	//     bit0-2 immer 0 (F0/FL)
	//     bit3-4 reserviert
	//     bit5-7 Dimmer
	.byte	0b00100111	//CV49 AUX_17 Kupplung_1 und
	.byte	0b11100111	//CV50 AUX_18 Kupplung_2
	//     bit0-2 welcher Funktion ist dieser AUX zugeordnet
	//         +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 Zeit bis AUX wieder abschaltet in Sekunden (0-7)
	//        +32 = 1
	//        +64 = 2
	//       +128 = 4
EE_AUX_EFF:
	.byte	0b00000001	//CV51 AUX_1_EFF
	//         +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 um, bei Nachtmodus nur 1x (mit 1/2/4/8 kombinierbar)
	//        +64 = AUX rückwärts aus
	//       +128 = AUX vorwärts aus
	.byte	2	//CV52 AUX_2_EFF
	.byte	2	//CV53
	.byte	2	//CV54
	.byte	2	//CV55
	.byte	2	//CV56
	.byte	2	//CV57
	.byte	1	//CV58
	.byte	2	//CV59 -> AUX_9 im Nachtmodus AUX_2 zugeordnet
	.byte	2	//CV60 -> AUX_10 im Nachtmodus AUX_3 zugeordnet
	.byte	2	//CV61 -> AUX_11 im Nachtmodus AUX_4 zugeordnet
	.byte	2	//CV62 -> AUX_12 im Nachtmodus AUX_5 zugeordnet
	.byte	2	//CV63 -> AUX_13 im Nachtmodus AUX_6 zugeordnet
	.byte	2	//CV64 -> AUX_14 im Nachtmodus AUX_7 zugeordnet
	.byte	65	//CV65 Schlußlicht hinten
	.byte	129	//CV66 Schlußlicht vorn
	.byte	16	//CV67 Kupplung 1
	.byte	16	//CV68 Kupplung 2

	.space	31,0xFF
EEOSCCAL:.byte	0x9E	// Speicherplatz OSCCAL bei Tiny44/45 nicht nötig!
Detected encoding: UTF-80