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

/****************************************************************************************
 * DCC Wagen Decoder Software V4.3							*
 * Copyright 2012 Toralf Wilhelm							*
 *											*
 * private Nutzung erwünscht, gewerbliche Nutzung erfordert zwingend meine Zustimmung!	*
 * Datei:	DCC_Decoder.asm                                                         *
 * Kontakt:	toralfwilhelm@web.de                                                    *
 * Webseite:	www.toralfwilhelm.de                                                    *
 * Version:	04/2012 Version 4.2 Start                                               *
 *		01/2013 Fehler in LoadEEdaten.inc und DCC_Decder.inc beseitigt		*
 * Beschreibung: DCC Lichtdecoder Software für Platine von Christoph Schörner		*
 *		Softwareupdate über Hagens Bootloader möglich, 1-wire Mode 3 (Einsprung *
 *		über WDR Reset) dazu in CV30 eine 1 schreiben, dann wartet der Dekoder  *
 *		auf den WDR Reset (http://www.mikrocontroller.net/topic/95839#new)      *
 ****************************************************************************************/
/* Hardware:	AVR ATmega8 TQFP32 mit 8 MHz internem RC-Oszillator
	   ╔══════════════════════╗
RESET	29 ╢ RESET/PC6   ADC5/PC5 ╟ 28	AUX_16
AUX_15	30 ╢ RXD/PD0     ADC4/PC4 ╟ 27	AUX_18
AUX_14	31 ╢ TXD/PD1     ADC3/PC3 ╟ 26	AUX_17
AUX_13	32 ╢ INT0/PD2    ADC2/PC2 ╟ 25	DCC2
AUX_12	1  ╢ INT1/PD3    ADC1/PC1 ╟ 24	1-wire/ACK
AUX_11	2  ╢ TO/PD4      ADC0/PC0 ╟ 23	DCC1
GND	3  ╢ GND             ADC7 ╟ 22
+UB	4  ╢ VCC              GND ╟ 21	GND
GND	5  ╢ GND             AREF ╟ 20	100nF -> GND
+UB	6  ╢ VCC             ADC6 ╟ 19	U_LED_Mess
AUX_10	7  ╢ XTAL1/PB6       AVCC ╟ 18	10µH -> +UB
AUX_9	8  ╢ XTAL2/PB7    SCK/PB5 ╟ 17	AUX_1
AUX_8	9  ╢ T1/PD5      MISO/PB4 ╟ 16	AUX_2
AUX_7	10 ╢ AIN0/PD6    MOSI/PB3 ╟ 15	AUX_3
AUX_6	11 ╢ AIN1/PD7    OC1B/PB2 ╟ 14	AUX_4
AUX_5	12 ╢ ICP1/PB0    OC1A/PB1 ╟ 13	StepDownTreiber
	   ╚══════════════════════╝
*/
 
#include "definitionen.h"	// bindet Daten, Definitionen und Macros ein

.section .signature,"",@progbits
	.byte	SIGNATURE_2,SIGNATURE_1,SIGNATURE_0 
	
.section .fuse,"",@progbits
#ifdef __AVR_ATmega8__
	.byte	0b10000100	// Low Byte
	.byte	0b11011011	// High Byte
#endif
/*
RSTDISBL:	nein(1)	RESET Pin mit RESET Funktion
WDTON:		nein(1)	WDT beim Start aus
SPIEN:		ja(0)	serial programmieren erlaubt
CKOPT:		nein(1)
EESAVE:		nein(1)	eeprom wird bei chiperase auch gelöscht
BOOTSZ:	  512 Byte (11)	Größe Urlader
BOOTRST		nein(1)	Reset auf 0x0000 (kein Bootloader)
BODLEVEL:		BOD bei ca 2,7V VCC
BODEN:		ja(0)	BOD ein
SUT/CKSEL:		8MHz interner RC Osc SUT 6CK+0ms

Mit Urlader:
BOOTRST:	ja(0)	Reset auf 0x7E00
Fuse-Definition dann hinfällig da durch Urlader festgelegt und nicht änderbar

ab hier Programmcode
*/

.section .vectors

/*********************************
 * Reset- und Interrupt-Vektoren *
 *********************************/

#ifdef __AVR_ATmega8__
	rjmp	Reset		// Reset Handler
	reti;	EXT_INT0	// IRQ0 Handler
	reti;	EXT_INT1	// IRQ1 Handler
	rjmp	TIM2_COMP	// Timer2 Compare Handler
	reti;	TIM2_OVF	// Timer2 Overflow Handler
	reti;	TIM1_CAPT	// Timer1 Capture Handler
	reti;	TIM1_COMPA	// Timer1 CompareA Handler
	reti;	TIM1_COMPB	// Timer1 CompareB Handler
	reti;	TIM1_OVF	// Timer1 Overflow Handler
	reti;	TIM0_OVF	// Timer0 Overflow Handler
	reti;	SPI_STC	// SPI Transfer Complete Handler
	reti;	USART_RXC	// USART RX Complete Handler
	reti;	USART_UDRE	// UDR Empty Handler
	reti;	USART_TXC	// USART TX Complete Handler
	rjmp	ADC_Complete	// ADC Conversion Complete Handler
	reti;	EE_RDY	// EEPROM Ready Handler
	reti;	ANA_COMP	// Analog Comparator Handler
	reti;	TWSI	// Two-wire Serial Interface Handler
	reti;	SPM_RDY	// Store Program Memory Ready Handler
#endif

.text

#if debug
# include "debugmode.inc"	// bindet die rs232 zum debuggen ein
#endif

/*****************
 * Hauptprogramm *
 *****************/

DCCreset:
	clr	flag		// wenn Reset über DCC Befehl, dann Flag setzen
	sbr	flag,(1<<resetbit)
	rjmp	1f		// und 1x springen
Reset:	clr	flag		// wenn Reset nicht per Befehl, kein Flag setzen
1:	ldi	w,hi8(RAMEND)	// StackPointer setzen
	out	SPH,w
	ldi	w,lo8(RAMEND)
	out	SPL,w

#include "init.inc"	// Hardware und Register initialisieren

	sbrc	flag, Lipo	// wenn nicht Lipobetrieb 1x springen
	 sbi	AUX_17_port,AUX_17_pin	// ansonsten Lipo einschalten
// ab hier normale Dekoderschleife
0:	sbrc	flag,neuerBefehl	// auf neue DCC Daten warten
	 rcall	DCC_DECODER	// neue Daten prüfen und Übergabe
	rcall	OUT_SET		// Motor und Out Pins setzen
	rcall	ANALOG_FAHRT	// DCC/analog Betrieb umschalten
		
	// Decoder Power Managemant
	sbic	UBport, UBpin	// wenn keine Decoderspannung 1x springen
	 rjmp	1f		// Decoderspannung_vorhanden
//Keine_Decoderspannung_vorhanden:
	sbr	flag, (1<<noUB)	// wenn nich Flag setzen
	rcall	StepDown_ausschalten	// und StepDown_ausschalten
	rjmp	0b
//Decoderspannung_vorhanden:
1:	cbr	flag, (1<<noUB)
	lds	w,Funktionen	// wenn eine Funktion an, stepdown einschalten, sonst aus
	tst	w
	breq	0b
	rcall	StepDown_einschalten

	rjmp	0b		// Endlosschleife

/*****************
 * Daten im SRAM *
 *****************/
.section .bss

EE_Adresse:	.space 2	// 2 Byte für EEPROM Adresse zum EEPROM lesen/schreiben
analog_sw:	.space 1	// 1 Byte für analog Umschalter zählt alle 2,54 ms ohne DCC Impuls eins weiter
analog_Richtung: .space 2	// 2 Byte für Enprellung Richtungswechsel bei Analogfahrt
analog_Ri_Zaehler: .space 1

UB_test:	.space 1	// Zähler zur Abschaltung ohne Betriebsspannung

AdresseLow:	.space 1	// 1 Byte für lange Adresse LowByte reservieren

ProgTest:	.space 1	// zum vergleichen beim CV schreiben
Funktionen:	.space 1	// Bit0 = F0 (Licht),Bit1 = F1 usw. 1 = Funktion an
// Blöd: Normalerweise macht man array-of-struct, nicht struct-of-array
AUX_Status:	.space 18	// Status von AUX_1-18

AUX_Funktion:	.space 18	// Funktion von AUX_1-18

AUX_Effekte:	.space 18	// Effekte für AUX_1-18
  
AUX_Timer:	.space 18	// Timer für AUX_1-18

Pz:		.space 3	// 3x 1 Byte für Pseudozufallsbyte
Detected encoding: UTF-80