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