Здравей :)
едно питане относно: "Оригиналните колооси бяха с две изолирани колела от осите и ги смених с такива, с едно изолирано колело, за да може токоснемането да работи."
колелата които си сложил с ос 24мм. и диаметър 11мм. са ???
имам същия вагон и не мога да намеря такива колела ...
А тук търсил ли си?
http://blaetterkatalog.weinert-modellbau.de/#page_66
#include <NmraDcc.h> // Библиотека за DCC декодер - необходима за правилната работа на програмата
//#define debug_cvchange // Генерира код за дебъгване ако се махнат двете наклонени черти в началото на реда;
//#define debug_ack // нужно е само на автора на програмата
//#define debug_speed
//#define debug_functions
//#define debug_mapping
//#define debug_effects
#define debug_defaults
#define dump_CVs_enabled // uncomment to enable CV change readback and CV dump to serial
#if defined(debug_cvchange) or defined(debug_ack) or defined(debug_speed) or defined(debug_functions) or defined(debug_mapping) or defined(debug_effects) or defined(debug_defaults) or defined(dump_CVs_enabled)
#define debug_main
#endif
// ---------------- Константи за нормалната работа на програмата - да не се променят!!! ----------------
#define mfrID 13
#define mfrVer 11
#define mfrSubver 1
#define defaultAddress 3 // default decoder address
#define defaultLongAddress 128 // default long address
// ---------------------------------- Задаване функциите на изводите: ----------------------------------
#define dccPin 2 // Вход за DCC сигнала; стойност 2 или 3;
// да не се използват други стойности!!!
#define motorPwm 14 // Изход за ШИМ на мотора
#define motorDir 13 // Изход за посока на мотора
// FA0f FA0r FA1 FA2 FA3 FA4 FA5 FA6 FA7 FA8
const byte foPin[] = { 3, 5, 6, 9, 10, 11, 12, 8, 7, 4}; // Изводи за управление на функциите.
// Първите 6 извода да не се променят
// и да няма дублиране с dccPin!!!
const int outs = sizeof(foPin) / sizeof(foPin[0]);
byte foPol[outs]; // "Поляритет" на изводите - виж cvFAPolLo и cvFAPolHi:
// 0 - активно ниско ниво
// 1 - активно високо ниво
// -------------- Още константи за нормалната работа на програмата - да не се променят!!! --------------
#define maxFuncs 13
#define pwmTime 20 // time in µs for PWM counter increment
#define pwmStep 8 // PWM counter increment step
#define stopped false
#define moving true
#define reverse 0
#define forward 2
#define off 0
#define on 255
#define momentumConst 900000UL
// ------------------------------------- Променливи на програмата: -------------------------------------
struct throttleStruct {byte Value; byte Dir;};
throttleStruct throttle = {0, forward};
throttleStruct intThrottle = {0, forward};
byte locoDirFwd = DCC_DIR_FWD;
byte vMin = 1;
byte vMid = 85;
byte vMax = 255;
byte doMotorFlag = false;
unsigned long accelCount = momentumConst;
unsigned long decelCount = momentumConst;
unsigned long accelCounter = 0;
unsigned long decelCounter = 0;
unsigned long truePwmTime = pwmTime;
int deltaThrottle = 0;
byte stateF[maxFuncs];
byte stateFA[outs];
byte oldStateFA[outs];
byte pwmFA[outs];
byte effectFA[outs];
byte outPwm[outs];
unsigned long effectMillis[outs];
int cEff[outs];
byte doFunctions = true;
byte throttleReq = false;
byte cvChanged = false;
// CCCC VV VV
// CC CC VV VV SSS
// CC VV VV SS
// CC VV VV SSS
// CC CC VVV SS
// CCCC V SSS
// -------------------------------------------- ID and reset to defaults CVs -------------------------------------------
#define cvMfr 8 // manufacturer ID
#define cvVer 7 // decoder type and code
#define cvSub 65 // decoder software version
#define cvDef 11 // reset to defaults: write 11 to reset all CVs to defaults
// --------------------------------------- address and decoder configuration CVs ---------------------------------------
#define cvShortAddress 1 // decoder short address
#define cvLongAddressHi 17 // decoder long address high byte
#define cvLongAddressLo 18 // decoder long address low byte
#define cvConfig1 29 // decoder configuration I bits
// ----------------------------------------------- speed and momentum CVs ----------------------------------------------
#define cvStartV 2 // minimum motor PWM
#define cvMaxV 5 // maximum motor PWM
#define cvMidV 6 // motor PWM @63 throttle
#define cvAccel 3 // acceleration time from min to max motor PWM in 0.9s
#define cvDecel 4 // deceleration time from max to min motor PWM in 0.9s
#define cvMomReduction 124 // momentum reduction:
// 255 = no reduction
// 192 = reduced to 75%
// 128 = reduced to 50%
// 64 = reduced to 25%
// 0 = no momentum
#define cvHalfSpeedKey 155 // speed reduction key:
// 0 = no key assigned
// 1 - 28 = active when F1 - F28 (if supported) key on
// 29 = active when F0 key on
// 101 - 128 = active when F1 - F28 (if supported) key off
// 129 = active when F0 key off
#define cvMomentumKey 156 // momentum reduction key - same key assignment as cvHalfSpeedKey
// ------------------------------------------------- motor control CVs -------------------------------------------------
#define cvMotorFreq 9 // motor control frequency FUTURE IMPLEMENTATION
#define cvMotorPI 56 // motor control P and I FUTURE IMPLEMENTATION
#define cvMotorVref 57 // motor control reference voltage FUTURE IMPLEMENTATION
#define cvMotorBEMF 58 // motor control BEMF intensity FUTURE IMPLEMENTATION
// ------------------------------- "NMRA" (F0f-FA6) key-to-output mapping (no shift) CVs -------------------------------
#define cvF0f 33 // F0f key
#define cvF0r 34 // F0r key
#define cvF1 35 // F1 key
#define cvF2 36 // F2 key
#define cvF3 37 // F3 key
#define cvF4 38 // F4 key
#define cvF5 39 // F5 key
#define cvF6 40 // F6 key
#define cvF7 41 // F7 key
#define cvF8 42 // F8 key
#define cvF9 43 // F9 key
#define cvF10 44 // F10 key
#define cvF11 45 // F11 key
#define cvF12 46 // F12 key
// ----------------------------------- extended (FA7-FA14) key-to-output mapping CVs -----------------------------------
#define cvF0fe 133 // F0f key
#define cvF0re 134 // F0r key
#define cvF1e 135 // F1 key
#define cvF2e 136 // F2 key
#define cvF3e 137 // F3 key
#define cvF4e 138 // F4 key
#define cvF5e 139 // F5 key
#define cvF6e 140 // F6 key
#define cvF7e 141 // F7 key
#define cvF8e 142 // F8 key
#define cvF9e 143 // F9 key
#define cvF10e 144 // F10 key
#define cvF11e 145 // F11 key
#define cvF12e 146 // F12 key
// --------------------------------------------- function output effect CVs --------------------------------------------
#define cvF0fEffect 125 // F0f output effect
#define cvF0rEffect 126 // F0r output effect
#define cvFA1Effect 127 // FA1 output effect
#define cvFA2Effect 128 // FA2 output effect
#define cvFA3Effect 129 // FA3 output effect
#define cvFA4Effect 130 // FA4 output effect
#define cvFA5Effect 131 // FA5 output effect
#define cvFA6Effect 132 // FA6 output effect
#define cvFA7Effect 159 // FA7 output effect
#define cvFA8Effect 160 // FA8 output effect
#define cvFA9Effect 161 // FA9 output effect
#define cvFA10Effect 162 // FA10 output effect
#define cvFA11Effect 163 // FA11 output effect
#define cvFA12Effect 164 // FA12 output effect
#define cvFA13Effect 165 // FA13 output effect
#define cvFA14Effect 166 // FA14 output effect
// -------------------------------------------------- effect selectors -------------------------------------------------
#define outEffDir 3 // output direction mask
#define outEffBidir 0 // xxxxxx00 - active in both directions
#define outEffFwd 1 // xxxxxx01 - active only forward
#define outEffRev 2 // xxxxxx10 - active only in reverse
#define outEffMask 252 // output effect mask
#define outEffNone 0 // 000000xx - no effect (except direction)
#define outEffMars 4 // 000001xx - mars light
#define outEffRandom 8 // 000010xx - random flicker
#define outEffFlash 12 // 000011xx - flashing light
#define outEffStrobe1 16 // 000100xx - single pulse strobe
#define outEffStrobe2 20 // 000101xx - double pulse strobe
#define outEffBeacon 24 // 000110xx - rotary beacon
#define outEffGyra 28 // 000111xx - gyralite
#define outEffDitch1R 32 // 001000xx - ditch light 1, right
#define outEffDitch1L 36 // 001001xx - ditch light 1, left
#define outEffDitch2R 40 // 001010xx - ditch light 2, right
#define outEffDitch2L 44 // 001011xx - ditch light 2, left
#define outEffCoupler 48 // 001100xx - coupler per cv115
#define outEffSoft 52 // 001101xx - soft start per cv63
#define outEffBrake 56 // 001110xx - auto brake light FUTURE IMPLEMENTATION
#define outEffStand 60 // 001111xx - output active at standstill only
#define outEff5min 64 // 010000xx - output off after 5 minutes
#define outEff10min 68 // 010001xx - output off after 10 minutes
#define outEffSSmoke 72 // 010010xx - speed dependent steam smoke FUTURE IMPLEMENTATION
#define outEffLowVin 76 // 010011xx - relay protection for servos, off at low input voltage FUTURE IMPLEMENTATION
#define outEffDSmoke 80 // 010100xx - driving dependent diesel smoke FUTURE IMPLEMENTATION
#define outEffFade 88 // 010110xx - fade-in per cv190, fade-out per cv191
#define outEffFluo 92 // 010111xx - fluorescent lamp effect
#define outEffSparks 96 // 011000xx - sparks with heavy braking FUTURE IMPLEMENTATION
// --------------------------------------------------- available CVs ---------------------------------------------------
#define cv47Available 47 // available FUTURE IMPLEMENTATION
// to
#define cv53Available 53 // available FUTURE IMPLEMENTATION
// ------------------------------------------------- effect control CVs ------------------------------------------------
#define cvMarsMin 54 // mars and gyralite effect minimum PWM
#define cvRandMin 55 // random flicker effect minimum PWM
#define cvMars 59 // mars and gyralite effect cycle time in 0.1s
#define cvFlash 60 // flashing effect:
// hundreds and tens - flasher cycle time in 0.2s
// 0x = 0.2s cycle (5 times per second)
// 1x = 0.4s cycle (2.5 times per second)
// 2x = 0.6s cycle (1.7 times per second)
// . . . . . . . .
// 24x = 5.0s cycle
// ones digit xx0 = 10% on time
// xx1 = 20% on time
// . . . . . . . .
// xx9 = 100% on time
#define cvStrobe 61 // strobe effect:
// hundreds digit - strobe flash duration in 0.035s
// 0xx = 0.035s
// 1xx = 0.070s
// 2xx = 0.105s
// tens digit - strobe cycle time in 0.2s
// x0x = 0.2s
// x1x = 0.4s
// . . . . . . . .
// x9x = 2.0s
// ones digit - pause between double strobes in 0.05s
// xx0 = 0.05s
// xx1 = 0.10s
// . . . . . . . .
// xx9 = 0.50s
#define cvBeacon 62 // rotary beacon cycle time in 0.1s
#define cvSoftSt 63 // soft start effect time in 0.1s
#define cvDitch 64 // ditch lights:
// hundreds digit - low PWM pause:
// 0xx = 10% of cycle time
// 1xx = 20% of cycle time
// tens digit - minimum PWM:
// x0x = 0% (completely off)
// x1x = 5%
// . . . . . . . .
// x9x = 42%
// ones digit - cycle time:
// xx0 = 0.5s
// xx1 = 0.6s
// . . . . . . . .
// xx9 = 1.4s
#define cvCoupler 115 // coupler settings:
// hundreds and tens - max PWM time in 0.2s:
// 0x = 0.0s
// 1x = 0.2s
// 2x = 0.4s
// . . . . . . . .
// 24x = 4.8s
// ones digit - holding PWM:
// xx0 = 0%
// xx1 = 10%
// . . . . . . . .
// xx9 = 90%
#define cvFadeIn 190 // fade-in effect time in 0.1s
#define cvFadeOut 191 // fade-out effect time in 0.1s
// --------------------------------------------------- available CVs ---------------------------------------------------
#define cv147Available 147 // available FUTURE IMPLEMENTATION
// to
#define cv154Available 154 // available FUTURE IMPLEMENTATION
#define cv192Available 192 // available FUTURE IMPLEMENTATION
// to
#define cv199Available 199 // available FUTURE IMPLEMENTATION
// ---------------------------------------------- function output PWM CVs ----------------------------------------------
#define cvF0fPwm 209 // F0f PWM
#define cvF0rPwm 210 // F0r PWM
#define cvFA1Pwm 211 // FA1 PWM
#define cvFA2Pwm 212 // FA2 PWM
#define cvFA3Pwm 213 // FA3 PWM
#define cvFA4Pwm 214 // FA4 PWM
#define cvFA5Pwm 215 // FA5 PWM
#define cvFA6Pwm 216 // FA6 PWM
#define cvFA7Pwm 217 // FA7 PWM
#define cvFA8Pwm 218 // FA8 PWM
#define cvFA9Pwm 219 // FA9 PWM
#define cvFA10Pwm 220 // FA10 PWM
#define cvFA11Pwm 221 // FA11 PWM
#define cvFA12Pwm 222 // FA12 PWM
#define cvFA13Pwm 223 // FA13 PWM
#define cvFA14Pwm 224 // FA14 PWM
// -------------------------------------- function output memory and polarity CVs --------------------------------------
#define cvMem 200 // function state storage; uses 8 bytes for 29 inputs:
// +0 to +3 contain function state masks set by user
// +4 to +7 store function states saved by firmware on state change
#define cvFAPolLo 225 // F0f - FA6 output polarity: 0 - active low; 1 - active high
#define cvFAPolHi 226 // FA7 - FA14 output polarity as described above
// --------------------------------------------------- available CVs ---------------------------------------------------
#define cv227Available 227 // available FUTURE IMPLEMENTATION
// to
#define cv249Available 249 // available FUTURE IMPLEMENTATION
// ----------------------------------------------------- other CVs -----------------------------------------------------
#define cvDump 256 // write any non-zero value to this CV to dump CV values to serial
struct cvPair {int cv; byte value;};
byte defsCVCnt = 0;
int setCVInd = 0;
byte setCVVal = 0;
unsigned long cvChangeMillis = 0;
int getCVInd = 0;
int marsStep = 1;
unsigned long marsMillis = 0;
byte marsMin = 32;
byte randMin = 32;
unsigned long flashOnMillis = 0;
unsigned long flashOffMillis = 0;
unsigned long strobeOnMillis = 0;
unsigned long strobeOffMillis = 0;
unsigned long strobe2Millis = 0;
int beaconStep = 1;
unsigned long beaconMillis = 0;
int ditchCounter = 0;
int ditchStep = 1;
unsigned long ditchMillis = 0;
unsigned long oldDitchMillis = 0;
byte ditchMin = 32;
byte ditchPause = 25;
byte ditchFlag = 0;
unsigned long couplerMillis = 0;
word couplerPwm = 0;
int softStStep = 1;
unsigned long softStMillis = 0;
int fadeInStep = 1;
int fadeOutStep = 1;
unsigned long fadeInMillis = 0;
unsigned long fadeOutMillis = 0;
unsigned long pwmMicros = 0; // PWM µs storage
byte pwmCounter = 0; // PWM counter
cvPair factoryDefaults[] = { // default CV values table
{cvShortAddress, defaultAddress},
{cvLongAddressHi, CALC_MULTIFUNCTION_EXTENDED_ADDRESS_MSB(defaultLongAddress)},
{cvLongAddressLo, CALC_MULTIFUNCTION_EXTENDED_ADDRESS_LSB(defaultLongAddress)},
{cvConfig1, 6}, {cvSub, mfrSubver}, {cvDef, 0},
{cvStartV, 1}, {cvMaxV, 1}, {cvMidV, 1}, {cvAccel, 5}, {cvDecel, 5},
{cvMotorFreq, 95}, {cvMotorPI, 55}, {cvMotorVref, 0}, {cvMotorBEMF, 255},
{cvMomReduction, 0}, {cvHalfSpeedKey, 0}, {cvMomentumKey, 0},
{cvF0f, 1}, {cvF0r, 2}, {cvF1, 4}, {cvF2, 8},
{cvF3, 16}, {cvF4, 32}, {cvF5, 64}, {cvF6, 128},
{cvF7, 0}, {cvF8, 0}, {cvF9, 0}, {cvF10, 0},
{cvF11, 0}, {cvF12, 0},
{cvF0fe, 0}, {cvF0re, 0}, {cvF1e, 0}, {cvF2e, 0},
{cvF3e, 0}, {cvF4e, 0}, {cvF5e, 0}, {cvF6e, 0},
{cvF7e, 1}, {cvF8e, 2}, {cvF9e, 4}, {cvF10e, 8},
{cvF11e, 0}, {cvF12e, 0},
{cvF0fEffect, 0}, {cvF0rEffect, 0}, {cvFA1Effect, 0}, {cvFA2Effect, 0},
{cvFA3Effect, 0}, {cvFA4Effect, 0}, {cvFA5Effect, 0}, {cvFA6Effect, 0},
{cvFA7Effect, 0}, {cvFA8Effect, 0}, {cvFA9Effect, 0}, {cvFA10Effect, 0},
{cvFA11Effect, 0}, {cvFA12Effect, 0}, {cvFA13Effect, 0}, {cvFA14Effect, 0},
{cvMarsMin, 32}, {cvRandMin, 32}, {cvMars, 15}, {cvFlash, 53},
{cvStrobe, 57}, {cvBeacon, 30}, {cvSoftSt, 15}, {cvDitch, 35},
{cvCoupler, 0}, {cvFadeIn, 8}, {cvFadeOut, 8},
{cvF0fPwm, 160}, {cvF0rPwm, 160}, {cvFA1Pwm, 160}, {cvFA2Pwm, 160},
{cvFA3Pwm, 160}, {cvFA4Pwm, 160}, {cvFA5Pwm, 160}, {cvFA6Pwm, 160},
{cvFA7Pwm, 160}, {cvFA8Pwm, 160}, {cvFA9Pwm, 160}, {cvFA10Pwm, 160},
{cvFA11Pwm, 160}, {cvFA12Pwm, 160}, {cvFA13Pwm, 160}, {cvFA14Pwm, 160},
{cvFAPolLo, 0}, {cvFAPolHi, 0},
{cvMem + 0, 255}, {cvMem + 1, 255}, {cvMem + 2, 255}, {cvMem + 3, 255},
{cvMem + 4, 0}, {cvMem + 5, 0}, {cvMem + 6, 0}, {cvMem + 7, 0},
{cvDump, 0}
};
NmraDcc Dcc;
void setup() { // program setup
pinMode(motorPwm, OUTPUT);
pinMode(motorDir, OUTPUT);
for (int i = 0; i < outs; i++) { // initialize all function outputs
stateFA[i] = 0; // initialize output state
oldStateFA[i] = 0;
effectFA[i] = 0; // and effects (no effects)
effectMillis[i] = 0;
cEff[i] = 0;
} // for i
for (int i = 1; i < maxFuncs; i++) stateF[i] = 0; // initialize all function input states
stateF[0] = 1;
#ifdef digitalPinToInterrupt
Dcc.pin(dccPin, 1);
#else
Dcc.pin(0, dccPin, 1);
#endif
Dcc.init(mfrID, mfrVer, FLAGS_MY_ADDRESS_ONLY | FLAGS_AUTO_FACTORY_DEFAULT, 0); // initialize DCC library
if (Dcc.getCV(cvSub) != mfrSubver) Dcc.setCV(cvSub, mfrSubver); // set sub version CV value
if (Dcc.getCV(cvDef) != 0) Dcc.setCV(cvDef, 0); // reset factory defaults CV value
if (Dcc.getCV(cvDump) != 0) Dcc.setCV(cvDump, 0); // reset dump CV value
getVvalues();
getMomentumValues();
getCouplerValues();
marsMin = Dcc.getCV(cvMarsMin); // load mars light minimum PWM
randMin = Dcc.getCV(cvRandMin); // load random flicker minimum PWM
getEffectMillis(cvMars, 43);
getEffectMillis(cvFlash, 43);
getEffectMillis(cvStrobe, 43);
getEffectMillis(cvBeacon, 43);
getEffectMillis(cvDitch, 43);
getEffectMillis(cvSoftSt, 43);
getEffectMillis(cvFadeIn, 128);
getEffectMillis(cvFadeOut, 43);
getLocoDir();
#ifdef debug_main // send decoder info if debug mode is enabled
Serial.begin(115200); // set up UART; needed for dumpCVs
Serial.println();
Serial.println("--- Function DCC Decoder --- Ivan Cankov ---");
Serial.print("Mfr ID: ");
Serial.print(Dcc.getCV(cvMfr));
Serial.print("; Version: ");
Serial.print(Dcc.getCV(cvVer));
Serial.print(".");
Serial.print(Dcc.getCV(cvSub));
Serial.print("; Address: ");
Serial.print(Dcc.getAddr());
Serial.print("; CV");
Serial.print(cvConfig1);
Serial.print(": ");
Serial.println(Dcc.getCV(cvConfig1));
Serial.println();
#endif
byte c = cvFAPolLo;
byte p = 1;
for (int i = 0; i < outs; i++) {
pwmFA[i] = Dcc.getCV(cvF0fPwm + i); // load output PWMs
foPol[i] = (Dcc.getCV(c) & p) ? 1 : 0;
digitalWrite(foPin[i], !foPol[i]); // deactivate function output
pinMode(foPin[i], OUTPUT); // initialize function output
if ((i & 7) == 7) {
c++;
p = 1;
} else p *= 2;
} // for i
c = cvMem;
p = 1;
for (int i = 0; i < maxFuncs; i++) { // read enabled function states from cvMem
stateF[i] = (Dcc.getCV(c) & Dcc.getCV(c + 4) & p) ? 1 : 0;
if ((i & 7) == 7) {
c++;
p = 1;
} else p *= 2;
} // for i
randomSeed(analogRead(A7));
if (Dcc.getAddr() > 9983) defsCVCnt = sizeof(factoryDefaults) / sizeof(cvPair); // make defsCVCnt non-zero and equal to number
// of CVs to be reset to flag the loop()
// function reset to factory defaults is needed
} // setup
void loop() { // main cycle
Dcc.process();
if (doFunctions || throttleReq) {
for (int i = 0; i < outs; i++) stateFA[i] = 0; // reset all function output states
for (int i = 0; i < maxFuncs; i++) doMapping(i); // apply function mapping to output states
doOutputs(); // check output states and apply effects as needed
doFunctions = false;
throttleReq = false;
} // if doFunctions
checkEffectInProgress();
if (doMotorFlag) doMotor();
if (defsCVCnt && Dcc.isSetCVReady()) { // check if factory reset of CVs was requested
defsCVCnt--; // decrement from initial size of array
Dcc.setCV(factoryDefaults[defsCVCnt].cv, factoryDefaults[defsCVCnt].value);
#ifdef debug_defaults
Serial.print("Load Factory Defaults: CV");
Serial.print(factoryDefaults[defsCVCnt].cv);
Serial.print(": ");
Serial.println(factoryDefaults[defsCVCnt].value);
#endif
if (!defsCVCnt) asm("jmp 0"); // done with factory defaults, restart program; comment if restart is not desired
// if (!defsCVCnt) requestFunctionCheck(); // uncomment if restart is not desired
} // if defsCVCnt
if (setCVInd && Dcc.isSetCVReady() && (millis() - cvChangeMillis > 63)) { // CV needs to reset immediately
Dcc.setCV(setCVInd, setCVVal); // after its value has been set
if (setCVInd == cvDump) dumpCVs(); // dump CVs if dump CV changed
setCVInd = 0; // clear request
} // if setCVInd
#ifdef dump_CVs_enabled
if (getCVInd && !setCVInd) { // check for CV readback to serial request
Serial.print("CV"); // CV readback to serial requested
Serial.print(getCVInd); // send CV to serial
Serial.print(",");
Serial.println(Dcc.getCV(getCVInd));
getCVInd = 0; // clear request
} // if getCVInd
#endif
} // loop
void notifyDccCVChange(unsigned int cv, byte value) { // called when DCC packet changes CV value
#ifdef debug_cvchange
Serial.print("notifyDccCVChange: CV");
Serial.print(cv);
Serial.print(": ");
Serial.println(value);
#endif
switch (cv) {
case cvDef: // factory defaults CV has changed
if (value == cvDef) // change to reset to factory defaults
defsCVCnt = sizeof(factoryDefaults) / sizeof(cvPair); // make defsCVCnt non-zero and equal to number
// of CVs to be reset to flag the loop()
// function reset to factory defaults is needed
break;
case cvSub: // subversion has been changed
setCVInd = cvSub; // flag the loop() to restore it
setCVVal = mfrSubver;
break;
case cvStartV:
case cvMaxV:
case cvMidV:
getVvalues();
case cvAccel:
case cvDecel:
getMomentumValues();
break;
case cvMarsMin: // mars light minimum PWM value changed
marsMin = Dcc.getCV(cv); // load mars light minimum PWM
break;
case cvRandMin: // random flicker minimum PWM value changed
randMin = Dcc.getCV(cv); // load random flicker minimum PWM
break;
case cvMars: // mars light value changed
case cvFlash: // flash value changed
case cvStrobe: // strobe value changed
case cvBeacon: // rotary beacon value changed
case cvDitch: // ditch lights value changed
case cvSoftSt: // fade-in value changed
case cvFadeOut: // fade-out value changed
getEffectMillis(cv, 43);
break;
case cvFadeIn: // fade-in value changed
getEffectMillis(cv, 128);
break;
case cvCoupler:
getCouplerValues();
break;
#ifdef dump_CVs_enabled
case cvDump: // CV dump is requested
setCVInd = cvDump; // flag the loop() to reset the value
setCVVal = 0; // and dump the CVs to serial
break;
#endif
default:
cvChanged = cv;
requestFunctionCheck();
break;
} // switch cv
if ((cv == cvFAPolLo) || (cv == cvFAPolHi)) { // output polarity value changed
byte c = cvFAPolLo;
byte p = 1;
for (int i = 0; i < outs; i++) {
foPol[i] = (Dcc.getCV(c) & p) ? 1 : 0;
if ((i & 7) == 7) {
c++;
p = 1;
} else p *= 2;
} // for i
} // if cv
if ((cv >= cvF0fPwm) && (cv < cvF0fPwm + outs))
for (int i = 0; i < outs; i++)
pwmFA[i] = Dcc.getCV(cvF0fPwm + i); // load output PWMs
cvChangeMillis = millis(); // get current millis for CV change blocking
getCVInd = cv; // flag the loop() to send a CV readback to serial
} // notifyDccCVChange
void notifyCVAck(void) { // called when ACK needs to be sent for a CV read
#ifdef debug_ack
Serial.println("notifyCVAck") ;
#endif
digitalWrite(motorPwm, on);
delay(8);
digitalWrite(motorPwm, off);
} // notifyCVAck
void notifyDccSpeed(unsigned int a, DCC_ADDR_TYPE at, byte s, DCC_DIRECTION d, DCC_SPEED_STEPS ss) { // called when a DCC speed packet with decoder address is received
byte ts = (s <= 1) ? stopped : moving;
byte td = (d == locoDirFwd) ? forward : reverse;
throttleReq = ((throttle.Dir + (throttle.Value > 0)) != (td + ts));
doMotorFlag = ((throttle.Value != s) || (throttle.Dir != td));
if (s) s--;
else {
digitalWrite(motorPwm, off);
intThrottle.Value = s;
intThrottle.Dir = td;
accelCounter = 0;
decelCounter = 0;
} // if s
if (s) {
byte hs = ss >> 1;
if (s < hs) s = map(s, 1, hs, vMin, vMid);
else s = map(s, hs, ss, vMid, vMax);
} // if s
throttle.Value = s;
throttle.Dir = td;
#ifdef debug_speed
Serial.print("notifyDccSpeed: Address: ");
Serial.print(a);
Serial.print((at == DCC_ADDR_SHORT) ? "-S" : "-L");
Serial.print("; Speed: ");
Serial.print(s);
Serial.print((d == DCC_DIR_FWD) ? "-F" : "-R" );
Serial.print("; Steps: ");
Serial.print(ss);
Serial.print("; State: ");
Serial.print((ts == moving) ? "Moving " : "Stopped ");
Serial.print((throttle.Dir == forward) ? "forward" : "in reverse");
Serial.println();
#endif
} // notifyDccSpeed
void notifyDccFunc(unsigned int a, DCC_ADDR_TYPE aType, FN_GROUP fGroup, byte fState) { // called when a DCC function packet with decoder address is received
#ifdef debug_functions
Serial.print("notifyDccFunc: Address: ");
Serial.print(a);
Serial.print((aType == DCC_ADDR_SHORT) ? "-S" : "-L");
Serial.print("; Function Group: ");
switch (fGroup) {
case FN_0_4: Serial.print(" F0-F4: "); break;
case FN_5_8: Serial.print(" F5-F8: "); break;
case FN_9_12: Serial.print(" F9-F12: "); break;
case FN_13_20: Serial.print("F13-F20: "); break;
case FN_21_28: Serial.print("F21-F28: "); break;
} // switch fGroup
#endif
switch (fGroup) {
case FN_0_4:
stateF[0] = (fState & FN_BIT_00) ? 1 : 0;
#ifdef debug_functions
Serial.print(stateF[0]);
#endif
setFuncState(FN_BIT_01, fState, 1, 4); break;
case FN_5_8: setFuncState(FN_BIT_05, fState, 5, 8); break;
case FN_9_12: setFuncState(FN_BIT_09, fState, 9, 12); break;
case FN_13_20: setFuncState(FN_BIT_13, fState, 13, 20); break;
case FN_21_28: setFuncState(FN_BIT_21, fState, 21, 28); break;
} // switch fGroup
#ifdef debug_functions
Serial.println();
#endif
doFunctions = 1;
byte m = 0;
byte p = 1;
byte c = cvMem + 4;
for (int i = 0; i < maxFuncs; i++) { // store input states to cvMem
m += (stateF[i]) ? p : 0;
if ((i == 7) || (i == maxFuncs - 1)) {
if (Dcc.getCV(c) != m) Dcc.setCV(c, m);
m = 0;
p = 1;
c++;
} else p *= 2;
} // for i
} // notifyDccFunc
void getVvalues() {
byte b = Dcc.getCV(cvStartV);
vMin = (b < 2) ? 1 : ((b > 252) ? 252 : b);
b = Dcc.getCV(cvMaxV);
vMax = (b < 2) ? 255 : ((b < (vMin + 3)) ? (vMin + 3) : b);
b = Dcc.getCV(cvMidV);
vMid = (b < 2) ? ((vMax - vMin) / 3 + vMin) : ((b < (vMin + 1)) ? (vMin + 1): ((b > (vMax - 2)) ? (vMax - 2) : b));
#ifdef debug_speed
Serial.print(vMin);
Serial.print(" - ");
Serial.print(vMid);
Serial.print(" - ");
Serial.println(vMax);
#endif
doMotorFlag = true;
} // getVvalues
void getMomentumValues(){
accelCount = momentumConst * Dcc.getCV(cvAccel) / (vMax - vMin);
decelCount = momentumConst * Dcc.getCV(cvDecel) / (vMax - vMin);
} // getMomentumValues
// ---------------------------------------------------------------------------- doMotor ----------------------------------------------------------------------------
void doMotor() {
if ((!accelCounter) || (!decelCounter)) {
byte f = false;
byte tv = throttle.Value;
byte mr;
byte hsk = Dcc.getCV(cvHalfSpeedKey);
byte k = hsk % 100;
if (k) {
if (k == 29) k = 0;
if (k < maxFuncs) {
f = stateF[k];
if (hsk / 100 == 1) f = !f;
if (f) tv = tv >> 1;
} // if hsk
} // if hsk
f = false;
hsk = Dcc.getCV(cvMomentumKey);
k = hsk % 100;
if (k) {
if (k == 29) k = 0;
if (k < maxFuncs) {
f = stateF[k];
if (hsk / 100 == 1) f = !f;
if (f) mr = Dcc.getCV(cvMomReduction);
} // if hsk
} // if hsk
int accel = 0; // constant speed
if (!intThrottle.Value) {
intThrottle.Dir = throttle.Dir;
throttleReq = true;
} // if !intThrottle.Value
if (intThrottle.Dir == throttle.Dir) {
if (intThrottle.Value < tv) accel = 1; // accelerating
else if (intThrottle.Value > tv) accel = -1; // decelerating
} else accel = -1; // decelerating
if (((accel > 0) && (!accelCounter)) || ((accel < 0) && (!decelCounter))) {
intThrottle.Value += accel;
throttleReq = true;
deltaThrottle = (intThrottle.Dir == throttle.Dir) ? tv : -tv;
deltaThrottle -= intThrottle.Value;
if (intThrottle.Value != tv) {
if (accel > 0) {
accelCounter = expo(accelCount, intThrottle.Value, true) / truePwmTime;
if (f) accelCounter = (accelCounter * mr) >> 8;
} // if accel > 0
else if (accel < 0) {
decelCounter = expo(decelCount, intThrottle.Value, true) / truePwmTime;
if (f) decelCounter = (decelCounter * mr) >> 8;
} // if accel < 0
} else if (!intThrottle.Value) {
intThrottle.Dir = throttle.Dir;
throttleReq = true;
} // if !intThrottle.Value
} // if accel
} // if intThrottle.Dir
digitalWrite(motorDir, intThrottle.Dir);
digitalWrite(motorPwm, intThrottle.Value > pwmCounter);
// analogWrite(motorPwm, intThrottle.Value);
doMotorFlag = false;
} // doMotor
void getEffectMillis(word cv, byte d) {
int s;
unsigned long m;
byte b = Dcc.getCV(cv);
switch (cv) {
case cvFlash:
m = b / 10 + 1;
m *= 20;
b %= 10;
flashOnMillis = m * (1 + b);
flashOffMillis = m * (9 - b);
return;
case cvStrobe:
m = b / 100;
strobeOnMillis = 35 * (1 + m);
m = (b / 10) % 10;
strobeOffMillis = 200 * (1 + m) - strobeOnMillis;
m = b % 10;
strobe2Millis = 50 * (1 + m);
return;
case cvDitch:
ditchPause = (b / 100 + 1) * 25;
ditchMin = ((b / 10) % 10) * 12;
b %= 10;
b += 5;
default:
b = max(b, 1);
s = int(d / b);
s = max(s, 1);
m = (unsigned long)(s * b / 2.56);
break;
} // switch cv
switch (cv) {
case cvMars: marsStep = s; marsMillis = m; break;
case cvBeacon: beaconStep = s; beaconMillis = m; break;
case cvDitch: ditchStep = s; ditchMillis = m; break;
case cvSoftSt: softStStep = s; softStMillis = m; break;
case cvFadeIn: fadeInStep = s; fadeInMillis = m; break;
case cvFadeOut: fadeOutStep = s; fadeOutMillis = m; break;
} // switch cv
} // getEffectMillis
void getCouplerValues() {
unsigned long l = Dcc.getCV(cvCoupler);
couplerMillis = (l / 10) * 200;
couplerPwm = (l % 10) * 25;
} // getCouplerValues
unsigned long expo(unsigned long m, byte c, byte t) {
if (t) {
if (c < 10) return (m * 8);
if (c < 25) return (m * 4);
} // if t
if (c < 51) return (m * 2);
if (c < 102) return (m * 1.290);
if (c < 153) return (m * 0.831);
if (c < 240) return (m * 0.535);
return (m * 0.345);
} // expo
void requestFunctionCheck() {
doFunctions = true;
throttleReq = true;
getLocoDir();
} // requestFunctionCheck
byte getFAEffectIndex(byte cv) { // returns the function output index based on output effect CV
for (int i = 0; i < outs; i++) {
byte j = ((i < 8) ? cvF0fEffect : (cvFA7Effect - 8)) + i; // check all output effects
if (cv == (((i < 8) ? cvF0fEffect : (cvFA7Effect - 8)) + i)) return (i);
} // for i
return (outs);
} // getFAEffectIndex
void dumpCVs() { // dump all CVs to serial
#ifdef dump_CVs_enabled
Serial.println("--- CV Dump Start ---");
Serial.println("CV,Value");
for (int i = 1; i <= 256; i++) { // cycle thru all (256 supported) CVs
int p = ((i == cvVer) || (i == cvMfr)) ? i : 0; // CV7 and CV8 are not in defaults array
if (!p)
for (int c = 0; c < sizeof(factoryDefaults) / sizeof(cvPair); c++)
if (i == factoryDefaults[c].cv) p = i; // get index if CV in defaults array
if (p) { // check if CV found
Serial.print("CV"); // send CV to serial
Serial.print(p);
Serial.print(",");
Serial.println(Dcc.getCV(p));
} // if p
} // for i
Serial.println("---- CV Dump End ----");
#endif
} // dumpCVs
void getLocoDir() {locoDirFwd = (Dcc.getCV(cvConfig1) & CV29_LOCO_DIR) ^ DCC_DIR_FWD;} // get direction from CV29.0
void setFuncState (byte g, byte s, byte b, byte e) {
byte m = g;
for (int c = b; c <= min(e, maxFuncs - 1); c++) {
stateF[c] = (s & m) ? 1 : 0;
m *= 2;
#ifdef debug_functions
Serial.print(stateF[c]);
#endif
} // for c
} // setFuncState
// --------------------------------------------------------------------------- doMapping ---------------------------------------------------------------------------
void doMapping(int i) {
byte m = Dcc.getCV((i) ? (cvF0r + i) : ((intThrottle.Dir == forward) ? cvF0f : cvF0r)); // get function mapping CV value
for (int c = 0; c < outs; c++) { // check all mapping
if ((c < outs) && (m & 1)) {
if (stateF[i]) stateFA[c] = stateF[i]; // output is controlled by input - store "new" state
#ifdef debug_mapping
Serial.print("State of F");
if (i) Serial.print(i); else Serial.print((intThrottle.Dir == forward) ? "0f" : "0r");
Serial.print(": ");
Serial.print(stateF[i]);
Serial.print("; Mask: ");
Serial.print(m);
Serial.print("; State of FA");
Serial.print(c);
Serial.print(": ");
Serial.println(stateFA[c]);
#endif
} // if c
if ((c & 7) == 7) m = Dcc.getCV((i != 0) ? (cvF0re + i) : ((intThrottle.Dir == forward) ? cvF0fe : cvF0re)); else m /= 2;
} // for c
} // doMapping
// --------------------------------------------------------------------------- doOutputs ---------------------------------------------------------------------------
void doOutputs() { // apply output effects if any
unsigned long m;
for (int i = 0; i < outs; i++) { // cycle through all function outputs
if ((stateFA[i] != oldStateFA[i]) || throttleReq) { // check if output or throttle status has changed
byte j = ((i < 8) ? cvF0fEffect : (cvFA7Effect - 8)) + i; // check all output effects
byte d = Dcc.getCV(j);
effectFA[i] = d & outEffMask; // get non-directional effect
d &= outEffDir; // get directional effect
byte td = intThrottle.Dir; // get direction from throttle state
if (((d == outEffFwd) && (td == reverse)) || // output on forward only, throttle is in reverse or
((d == outEffRev) && (td == forward))) // output on in reverse only, throttle is forward:
stateFA[i] = 0; // turn off output state
#ifdef debug_effects
Serial.print("Output Effects: Index: ");
Serial.print(i);
Serial.print("; CV");
Serial.print(j);
Serial.print(": ");
Serial.print(Dcc.getCV(j));
Serial.print(" - ");
switch (effectFA[i]) {
case outEffNone: Serial.println("None"); break;
case outEffMars: Serial.println("Mars"); break;
case outEffRandom: Serial.println("Flicker"); break;
case outEffFlash: Serial.println("Flasher"); break;
case outEffStrobe1: Serial.println("Single Strobe"); break;
case outEffStrobe2: Serial.println("Dual Strobe"); break;
case outEffBeacon: Serial.println("Beacon"); break;
case outEffGyra: Serial.println("Gyralite"); break;
case outEffDitch1R: Serial.println("RH Ditch 1"); break;
case outEffDitch1L: Serial.println("LH Ditch 1"); break;
case outEffDitch2R: Serial.println("RH Ditch 2"); break;
case outEffDitch2L: Serial.println("LH Ditch 2"); break;
case outEffCoupler: Serial.println("Coupler"); break;
case outEffSoft: Serial.println("Soft Start"); break;
case outEffBrake: Serial.println("Brake Light"); break;
case outEffStand: Serial.println("Standing Only"); break;
case outEff5min: Serial.println("Off in 5 min"); break;
case outEff10min: Serial.println("Off in 10 min"); break;
case outEffFade: Serial.println("Fade-in/out"); break;
case outEffFluo: Serial.println("Fluorescent"); break;
case outEffSparks: Serial.println("Brake Sparks"); break;
default: Serial.println("Undefined (None)"); break;
} // switch effectFA
#endif
if (cvChanged) {
if (i == getFAEffectIndex(cvChanged)) {
oldStateFA[i] = !stateFA[i];
cvChanged = 0;
} // if i
} // if cvChanged
switch (effectFA[i]) {
case outEffFlash: // flashing light effect
if (stateFA[i] == oldStateFA[i]) break; // do nothing if output state has not changed
outPwm[i] = (stateFA[i]) ? on : off; // apply state to output
if (!stateFA[i]) { // check if output state is off
effectMillis[i] = 0; // no effect on turn off
break;
} // if !stateFA
effectMillis[i] = millis() + flashOnMillis; // get next time to check output effect
cEff[i] = 0; // clear output counter
break;
case outEffStrobe1: // single pulse strobe
case outEffStrobe2: // double pulse strobe
if (stateFA[i] == oldStateFA[i]) break; // do nothing if output state has not changed
outPwm[i] = (stateFA[i]) ? on : off; // apply state to output
if (!stateFA[i]) { // check if output state is off
effectMillis[i] = 0; // no effect on turn off
break;
} // if !stateFA
effectMillis[i] = millis() + strobeOnMillis; // get next time to check output effect
cEff[i] = 0; // clear output counter
break;
case outEffStand: // output on standing, off moving
if (intThrottle.Value) stateFA[i] = 0; // turn off output state if moving
outPwm[i] = (stateFA[i]) ? on : off; // apply state to output
break;
case outEff5min: // turn off output after 5 minutes
case outEff10min: // turn off output after 10 minutes
if (stateFA[i] == oldStateFA[i]) break; // do nothing if output state has not changed
outPwm[i] = (stateFA[i]) ? on : off; // apply state to output
if (!stateFA[i]) { // check if output state is off
effectMillis[i] = 0; // no effect on turn off
break;
} // if !stateFA
effectMillis[i] = millis(); // get current time
effectMillis[i] += (effectFA[i] == outEff5min) ? 300000 : 600000; // add 5 or 10 minutes (300,000µs or 600,000µs)
break;
case outEffCoupler: // coupler control per cvCoupler
if (intThrottle.Value) stateFA[i] = 0; // turn off output state if moving
case outEffDitch1R: // ditch light 1, right
case outEffDitch1L: // ditch light 1, left
case outEffDitch2R: // ditch light 2, right
case outEffDitch2L: // ditch light 2, left
case outEffMars: // mars light effect
case outEffRandom: // random flicker effect
case outEffBeacon: // rotary beacon effect
case outEffGyra: // gyralite effect
case outEffSoft: // soft start per cvSoft [0.1s]
if (!stateFA[i]) { // check if output state is off
outPwm[i] = off; // turn off output
effectMillis[i] = 0; // no effect on turn off
cEff[i] = 0; // clear output counter
break;
} // if !stateFA
case outEffFade: // fade-in per cvFadeIn, fade-out per cvFadeOut [0.1s]
if (stateFA[i] == oldStateFA[i]) break; // do nothing if output state has not changed
effectMillis[i] = millis(); // get current time for input
break;
case outEffFluo: // fluorescent light startup
if (stateFA[i] == oldStateFA[i]) break; // do nothing if output state has not changed
outPwm[i] = (stateFA[i]) ? on : off; // apply state to output
if (!stateFA[i]) { // check if output state is off
effectMillis[i] = 0; // no effect on turn off
break;
} // if !stateFA
effectMillis[i] = millis() + random(50, 300); // get next time to check output effect
cEff[i] = random(1, 4) << 1; // get random number of flickers
break;
default: // no effect
outPwm[i] = (stateFA[i]) ? on : off; // apply state to output
break;
} // switch effectFA
oldStateFA[i] = stateFA[i]; // output status has changed, store status
} // if stateFA
} // for i
} // doOutputs
// --------------------------------------------------------------------- checkEffectInProgress ---------------------------------------------------------------------
void checkEffectInProgress() {
byte f;
unsigned long m = micros();
truePwmTime = m - pwmMicros;
if (truePwmTime > pwmTime) {
pwmMicros = m;
pwmCounter += pwmStep;
doMotorFlag = true;
if (accelCounter) accelCounter--;
if (decelCounter) decelCounter--;
} // if micros
m = millis();
ditchFlag = (m - oldDitchMillis > ditchMillis);
if (ditchFlag) {
oldDitchMillis = m;
ditchCounter += ditchStep;
} // if oldDitchMillis
for (int i = 0; i < outs; i++) {
if (effectMillis[i]) {
byte eff = effectFA[i] & outEffMask;
switch (eff) {
case outEffMars: // mars light effect
f = cEff[i] << 2;
if (cEff[i] & 64) f = ~f;
if (millis() - effectMillis[i] < expo(marsMillis, f, false)) break;
effectMillis[i] = millis();
cEff[i] += marsStep;
f = cEff[i] << 2;
if (cEff[i] & 64) f = ~f;
if (cEff[i] & 128) f = f / 3;
outPwm[i] = max(f, marsMin);
break;
case outEffRandom: // random flicker effect
if (millis() < effectMillis[i]) break; // do nothing if time has not elapsed
cEff[i]++;
if (!cEff[i]) break;
cEff[i] = random(randMin, on);
f = random(0, 120);
outPwm[i] = (f > 80) ? randMin : cEff[i];
effectMillis[i] = millis() + f;
break;
case outEffFlash: // flashing light effect
if (millis() < effectMillis[i]) break; // do nothing if time has not elapsed
cEff[i]++;
if (cEff[i] & 1) {
outPwm[i] = off;
effectMillis[i] = millis() + flashOffMillis; // get next time to check output effect
break;
} // if cEff
outPwm[i] = on;
effectMillis[i] = millis() + flashOnMillis; // get next time to check output effect
break;
case outEffStrobe1: // single pulse strobe effect
case outEffStrobe2: // double pulse strobe effect
if (millis() < effectMillis[i]) break; // do nothing if time has not elapsed
cEff[i]++;
if (cEff[i] & 1) {
outPwm[i] = off;
m = (((cEff[i] & 2) == 0) && ((effectFA[i] & outEffMask) == outEffStrobe2)) ? strobe2Millis : strobeOffMillis;
effectMillis[i] = millis() + m; // get next time to check output effect
break;
} // if cEff
outPwm[i] = on;
effectMillis[i] = millis() + strobeOnMillis; // get next time to check output effect
break;
case outEffBeacon: // rotary beacon effect
f = cEff[i] << 2;
if (cEff[i] & 64) f = ~f;
if (millis() - effectMillis[i] < expo(beaconMillis, f, false)) break;
effectMillis[i] = millis();
cEff[i] += beaconStep;
if (cEff[i] & 128) {
outPwm[i] = off;
break;
} // if cEff
f = cEff[i] << 2;
if (cEff[i] & 64) f = ~f;
outPwm[i] = f;
break;
case outEffGyra: // gyralite effect
if (millis() - effectMillis[i] < marsMillis) break;
effectMillis[i] = millis();
cEff[i] += marsStep;
if (cEff[i] & 128) {
outPwm[i] = marsMin;
break;
} // if cEff
f = cEff[i] << 2;
if (cEff[i] & 64) f = ~f;
outPwm[i] = max(f, marsMin);
break;
case outEffDitch1R: // ditch light 1, right
case outEffDitch1L: // ditch light 1, left
case outEffDitch2R: // ditch light 2, right
case outEffDitch2L: // ditch light 2, left
if (!ditchFlag) break;
f = ditchCounter << 1;
if (eff & 4) f = ~f;
if (ditchCounter & 128) f = ~f;
if (f < ditchMin + ditchPause) f = ditchMin;
outPwm[i] = f;
break;
case outEff5min: // turn off output after 5 minutes
case outEff10min: // turn off output after 10 minutes
if (millis() < effectMillis[i]) break; // do nothing if time has not elapsed
outPwm[i] = off; // time has elapsed, turn off output
effectMillis[i] = 0;
break;
case outEffCoupler: // coupler control per cvCoupler
outPwm[i] = (millis() - effectMillis[i] < couplerMillis) ? on : couplerPwm;
break;
case outEffSoft: // soft start per cvSoft [0.1s]
if (millis() - effectMillis[i] < expo(softStMillis, cEff[i], false)) break;
effectMillis[i] = millis();
cEff[i] += softStStep;
if (cEff[i] > 255) {
outPwm[i] = on;
cEff[i] = 255;
effectMillis[i] = 0;
break;
} // if cEff
outPwm[i] = cEff[i];
break;
case outEffFade: // fade-in per cvFadeIn [0.1s]
f = stateFA[i]; // fade-out per cvFadeOut [0.1s]
m = (f) ? fadeInMillis : expo(fadeOutMillis, cEff[i], false);
if (millis() - effectMillis[i] < m) break;
effectMillis[i] = millis();
cEff[i] += (f) ? fadeInStep : -fadeOutStep;
if ((cEff[i] < 0) || (cEff[i] > 255)) {
outPwm[i] = (f) ? on : off;
cEff[i] = (f) ? 255 : 0;
effectMillis[i] = 0;
break;
} // if cEff
outPwm[i] = cEff[i];
break;
case outEffFluo: // fluorescent ligh start up effect
m = millis(); // get current time
if (m < effectMillis[i]) break; // do nothing if not time yet
cEff[i]--; // decrement effect counter
outPwm[i] = (cEff[i] & 1) ? off : on; // turn on/off output based on even/odd counter
effectMillis[i] = (cEff[i]) ? (m + ((cEff[i] & 1) ? random(400, 1000) : random(50, 300))) : 0; // get time for next event
break; // or 0 if counter expired
default:
effectMillis[i] = 0;
break;
} // switch effectFA
} // if effectMillis
f = highByte((unsigned int)outPwm[i] * (unsigned int)pwmFA[i]); // apply max PWM
if (!foPol[i]) f = ~f; // invert output if set as inverted
if (i <= 5)
analogWrite(foPin[i], f); else // apply hardware PWM to outputs if supported
digitalWrite(foPin[i], f > pwmCounter); // apply software PWM to outputs with no hardware PWM
} // for i
} // checkEffectInProgress
// ---------------------------------- Задаване функциите на изводите: ----------------------------------
#define dccPin 2 // Вход за DCC сигнала; стойност 2 или 3;
// да не се използват други стойности!!!
#define motorPwm 14 // Изход за ШИМ на мотора
#define motorDir 13 // Изход за посока на мотора
// FA0f FA0r FA1 FA2 FA3 FA4 FA5 FA6 FA7 FA8
const byte foPin[] = { 3, 5, 6, 9, 10, 11, 12, 8, 7, 4}; // Изводи за управление на функциите.
// Първите 6 извода да не се променят
// и да няма дублиране с dccPin!!!
Тази школа, няма как да се развие при младите хобисти!!!
Благодарско Иване - за споделеното и то до край!!!
:hi: :clapping: :hi: :clapping: :hi: :clapping: &bgflag
CV | Заводска стойност | Описание |
CV8 | 13 | Идентификация на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене |
CV7 | 11 | Вид на декодера; твърдо зададен с константа в програмата на декодера, т.е. само за четене |
CV65 | 1 | Версия на програмата на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене |
CV11 | 0 | Зареждане на "заводските" стойности в CV-тата при запис на стойност 11 в CV11 |
CV | Заводска стойност | Описание |
CV1 | 3 | Къс адрес на декодера; стойности от 1 до 127; активира се от CV29 |
CV17 | 192 | Дълъг адрес на декодера, старша част, активира се от CV29 |
CV18 | 128 | Дълъг адрес на декодера, младша част, активира се от CV29 Дългият адрес се формира по формулата (CV17 - 192) * 256 + CV18 Формулата за изчисляване на CV17 и CV18 при желан дълъг адрес е CV17 = адрес / 256 + 192 CV18 = остатъкът от разделянето на адреса на 256 = адрес по модул 256 = адрес - 256 * цялата часта от(адрес / 256) |
CV29 | 6 | Основна конфигурация на декодера бит 0 - тегло 1 - посока на движение - 0 = напред; 1 = назад бит 1 - тегло 2 - брой стъпки на тротъла - 0 = 14 стъпки; 2 = 128 стъпки бит 2 - тегло 4 - аналогов режим - 0 = аналоговият режим е забранен; 4 = аналоговият режим е разрешен битове 3 и 4 - тегла 8 и 16 - не се използват бит 5 - тегло 32 - вид адрес - 0 = къс адрес, зададен от CV1; 32 = дълъг адрес, зададен с (CV17 - 192) * 256 + CV18 битове 6 и 7 - тегла 64 и 128 - не се използват Стойността на CV29 се образува, като се съберат стойностите на всички битове, например: бит 0: посока на движение напред = 0 бит 1: 128 стъпки на тротъла = 2 бит 2: разрешен аналогов режим = 4 бит 5: къс адрес според CV1 = 0 ----------------------------------------------------------- 0 + 2 + 4 + 0 = 6 - това записваме в CV29 (този пример е за заводската стойност на CV-то) Ако искаме посока назад (1), 128 стъпки (2), забранен аналогов режим (0) и дълъг адрес (32), в CV29 трябва да запишем 1 + 2 + 0 + 32 = 35 |
CV | Заводска стойност | Описание | |||||||||||||||
CV2 | 1 | Минимален ШИМ на мотора (при тротъл = 1); стойност от 1 до CV6 - 1 | |||||||||||||||
CV5 | 1 | Максимален ШИМ на мотора (при тротъл = 100%); стойност от CV6 + 1 до 255; 1 = 255 | |||||||||||||||
CV6 | 1 | ШИМ на мотора при тротъл = 50%; стойност от CV2 + 1 до CV5 - 1; 1 = 1/3 от обхвата, зададен от CV2 и CV5 | |||||||||||||||
CV3 | 5 | Време за ускорение от покой до максимална скорост в 0,9 секунди; стойност от 0 до 255; 0 = 0 сек.; 255 = 230 сек. | |||||||||||||||
CV4 | 5 | Време за спиране от максимална скорост до покой в 0,9 секунди; стойност от 0 до 255; 0 = 0 сек.; 255 = 230 сек. | |||||||||||||||
CV124 | 0 | Намаляване на времената, зададени от CV3 и CV4 при активиране на бутона, зададен от CV156:
| |||||||||||||||
CV155 | 0 | Бутон за активиране на намалена до 50% скорост на движение (маневрен режим или режим "Депо"):
| |||||||||||||||
CV156 | 0 | Бутон за активиране на намаляването на времената, зададени от CV3 и CV4; Намаляването на времената е според CV124, описано по-горе; Задаването на бутона е идентично с описаното за CV155 по-горе |
CV | Заводска стойност | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||
CV33 | 1 | Изходи, управлявани от бутона F0 в посока напред:
Стойността на CV33 се образува, като се съберат стойностите на всички битове, например: Искаме бутон F0 в посока напред да управлява изходи F0f (= 1) и FA1 (= 4), 1 + 4 = 5, което записваме в CV33 Втори пример - бутонът управлява изходи FA1 (= 4), FA2 (= 8 ) и FA3 (= 16): в CV33 записваме 28 (4 + 8 + 16) | ||||||||||||||||||||||||||||||||||||||||||||||||
CV34 | 2 | Изходи, управлявани от бутона F0 в посока назад; задаването на изходите е еднакво с това за CV33 по-горе | ||||||||||||||||||||||||||||||||||||||||||||||||
CV35 | 4 | Изходи, управлявани от бутона F1; аналогично на CV33 и CV34, но за бутон F1 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV36 | 8 | Изходи, управлявани от бутона F2; като CV33 - CV35, но за бутон F2 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV37 | 16 | Изходи, управлявани от бутона F3; като CV33 - CV36, но за бутон F3 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV38 | 32 | Изходи, управлявани от бутона F4; като CV33 - CV37, но за бутон F4 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV39 | 64 | Изходи, управлявани от бутона F5; като CV33 - CV38, но за бутон F5 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV40 | 128 | Изходи, управлявани от бутона F6; като CV33 - CV39, но за бутон F6 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV41 | 0 | Изходи, управлявани от бутона F7; като CV33 - CV40, но за бутон F7 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV42 | 0 | Изходи, управлявани от бутона F8; като CV33 - CV41, но за бутон F8 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV43 | 0 | Изходи, управлявани от бутона F9; като CV33 - CV42, но за бутон F9 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV44 | 0 | Изходи, управлявани от бутона F10; като CV33 - CV43, но за бутон F10 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV45 | 0 | Изходи, управлявани от бутона F11; като CV33 - CV44, но за бутон F11 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV46 | 0 | Изходи, управлявани от бутона F12; като CV33 - CV45, но за бутон F12 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV133 | 0 | Втора група изходи, управлявани от бутона F0 в посока напред:
Стойността на CV133 се образува, като се съберат стойностите на всички битове, както това е описано за CV33 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV134 | 0 | Втора група изходи, управлявани от бутона F0 в посока назад; задаването на изходите е еднакво с това за CV133 по-горе | ||||||||||||||||||||||||||||||||||||||||||||||||
CV135 | 0 | Втора група изходи, управлявани от бутона F1; аналогично на CV133 и CV134, но за бутон F1 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV136 | 0 | Втора група изходи, управлявани от бутона F2; като CV133 - CV135, но за бутон F2 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV137 | 0 | Втора група изходи, управлявани от бутона F3; като CV133 - CV136, но за бутон F3 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV138 | 0 | Втора група изходи, управлявани от бутона F4; като CV133 - CV137, но за бутон F4 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV139 | 0 | Втора група изходи, управлявани от бутона F5; като CV133 - CV138, но за бутон F5 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV140 | 0 | Втора група изходи, управлявани от бутона F6; като CV133 - CV139, но за бутон F6 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV141 | 1 | Втора група изходи, управлявани от бутона F7; като CV133 - CV140, но за бутон F7 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV142 | 2 | Втора група изходи, управлявани от бутона F8; като CV133 - CV141, но за бутон F8 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV143 | 4 | Втора група изходи, управлявани от бутона F9; като CV133 - CV142, но за бутон F9 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV144 | 8 | Втора група изходи, управлявани от бутона F10; като CV133 - CV143, но за бутон F10 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV145 | 0 | Втора група изходи, управлявани от бутона F11; като CV133 - CV144, но за бутон F11 | ||||||||||||||||||||||||||||||||||||||||||||||||
CV146 | 0 | Втора група изходи, управлявани от бутона F12; като CV133 - CV145, но за бутон F12 |
CV | Заводска стойност | Описание |
CV125 | 0 | Ефект на изход F0f |
CV126 | 0 | Ефект на изход F0r |
CV127 | 0 | Ефект на изход FA1 |
CV128 | 0 | Ефект на изход FA2 |
CV129 | 0 | Ефект на изход FA3 |
CV130 | 0 | Ефект на изход FA4 |
CV131 | 0 | Ефект на изход FA5 |
CV132 | 0 | Ефект на изход FA6 |
CV159 | 0 | Ефект на изход FA7 |
CV160 | 0 | Ефект на изход FA8 |
CV | Заводска стойност | Описание | |||||||||||||||||||||||||||||||||
CV54 | 32 | Минимален ШИМ на Марс и Gyralite светлините (ефекти 4 и 28) | |||||||||||||||||||||||||||||||||
CV55 | 32 | Минимален ШИМ на произволно мигащата светлина (ефект 8 ) | |||||||||||||||||||||||||||||||||
CV59 | 15 | Период на Марс и Gyralite светлините (ефекти 4 и 28) в 0,1 секунди | |||||||||||||||||||||||||||||||||
CV60 | 53 | Мигаща светлина (ефект 12): Стотици и десетици - период на мигането в 0,2 секунди:
| |||||||||||||||||||||||||||||||||
CV61 | 57 | Стробоскопичен ефект (ефекти 16 и 20): Стотици - продължителност на светенето в 0,035 секунди:
| |||||||||||||||||||||||||||||||||
CV62 | 30 | Период на "въртене на буркана" (ефект 24) в 0,1 секунди | |||||||||||||||||||||||||||||||||
CV63 | 15 | Време за плавно светване (ефект 52) в 0,1 секунди | |||||||||||||||||||||||||||||||||
CV64 | 35 | Мигащи светлини (ditch lights), ефекти 32, 36, 40 и 44; стойности от 0 до 199: Стотици - пауза при минимален ШИМ в % от периода:
| |||||||||||||||||||||||||||||||||
CV115 | 0 | Управление на електрически теглич (ефект 48): Стотици и десетици - времетраене на максималния ШИМ в 0,2 секунди:
| |||||||||||||||||||||||||||||||||
CV190 | 8 | Време за плавното включване на изхода (ефект 88) в 0,1 секунди | |||||||||||||||||||||||||||||||||
CV191 | 8 | Време за плавното изключване на изхода (ефект 88) в 0,1 секунди |
CV | Заводска стойност | Описание |
CV209 | 160 | ШИМ на изход F0f |
CV210 | 160 | ШИМ на изход F0r |
CV211 | 160 | ШИМ на изход FA1 |
CV212 | 160 | ШИМ на изход FA2 |
CV213 | 160 | ШИМ на изход FA3 |
CV214 | 160 | ШИМ на изход FA4 |
CV215 | 160 | ШИМ на изход FA5 |
CV216 | 160 | ШИМ на изход FA6 |
CV217 | 160 | ШИМ на изход FA7 |
CV218 | 160 | ШИМ на изход FA8 |
CV | Заводска стойност | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||
CV200 | 255 | Запазване на състоянието на функциите, зададени от бутони F0 до F6
Стойността на CV200 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV33. | ||||||||||||||||||||||||||||||||||||||||||||||||
CV201 | 255 | Запазване на състоянието на функциите, зададени от бутони F7 до F12
Стойността на CV201 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV133. | ||||||||||||||||||||||||||||||||||||||||||||||||
CV204 | 255 | Памет на състоянието на F0 до F6; програмата сама пише в това CV | ||||||||||||||||||||||||||||||||||||||||||||||||
CV205 | 255 | Памет на състоянието на F7 до F12; и тук програмата сама пише в това CV |
CV | Заводска стойност | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CV225 | 255 | Активно ниво на изходите F0f до FA6:
Стойността на CV225 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV33. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CV226 | 255 | Активно ниво на изходите FA7 до FA10:
Стойността на CV226 се образува, като се съберат стойностите на всички битове, както е описано в предното ми мнение за CV133. |
CV | Заводска стойност | Описание |
CV256 | 0 | При запис в това CV на стойност различна от нула, стойностите на всички CV-та, дефинирани в програмата, се предават по серийния порт |
Браво,но ми се струва сложно и май няма да се спрсвя. :unsure:
Кое ти се струва сложно? Когато на мен нещо ми изглежда сложно, разделям го на по-прости части. Изпълнявам всяка част и така изпълнявам цялата задача. ...
Иван
. . .
Според каталога 11 мм диаметър за Брава (23 мм ос) са 9746 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Weinert%2D9746/gb/modell_70357.html) с RP-25 профил и ги има налични на Липето. А Fine-25 еквивалента за Брава са 97460 (https://www.modellbahnshop-lippe.com/Accessories/Accessories/Weinert%2D97460/gb/modell_70358.html) но са с резервация.
Иван
Бях поръчал колооси 9743 и 9746 на Weinert за багажния вагон 45415 на Брава, които пристигнаха днес. 9746 би трябвало да са за Брава вагони (с оси дълги 23 мм), но не стават на този вагон, защото осите им са прекалено къси. Да припомня, че оригиналните колооси са с дължина 23,8 мм. Колоосите 9746 не изпадат от буксите, но са с прекалено голям страничен луфт.
Колоосите 9743 са уж за Флайшман, с 24 мм-ови оси. Тези стават на багажния вагон - по всички размери отговарят на оригиналните колооси на вагона - диаметър и ширина на бандажите, височина на реборда и дължина на оста (ле-е-еко по-дълга с 0,2 мм).
Та ако имате багажния вагон 45415 на Брава, НЕ купувайте за него колооси 9746 на Weinert, a 9743.
Иван
. . .
Пробвали ли сте с "Conductive Adhesive Glue Silver", примерно това:https://www.modellbahnshop-lippe.com/Accessories/Electric+Accessories/Weinert-90344/gb/modell_262983.html (https://www.modellbahnshop-lippe.com/Accessories/Electric+Accessories/Weinert-90344/gb/modell_262983.html), да намажете изолацията на едното колело?
. . .
А тези от РОКО дали също не вършат работа:
(https://i.ebayimg.com/images/g/DE4AAOSw8Fxhs3~U/s-l1600.jpg)
. . .
Не съм пробвал, но със сигурност няма да стане на оригиналните колооси на багажния вагон, защото те са с пластмасови тръбички в средата, в които са набити къси оси на колелата.
С други думи, колоосите приличат на тези, към които си дал линка и картинката:
. . .
Не съм сигурен дали платката ще може да се използва във вагона 74801, който е комбиниран 1-ва - 2-ра класа, тъй като такъв вагон нямам и не мога да проверя, дали разположението на светодиодите ще отговаря на разположението на купетата в този вагон.
. . .
:100000008316FF239000E328A500030E8301A600BA
:10001000B330810020080B1D1E28820716281528E2
:10002000742892287B2894280000A00105080B1052
:100030000B11260E8300A50E250E090082077828D5
:100040009028162815288F28152896282108A206FA
:10005000031D1528851D9A285914D9109C2858105D
:10006000581A392A300EA800280C073982070800D0
:10007000D929E229E429F129FE29102A272A9C22DC
:100080003039103A031D4628B31B5B28303A031D54
:100090004B28B31F5B289C22C039403A031D5428CB
:1000A00033087E39031D5B28C03A031D60283308DE
:1000B0007E39031D6028162300302523A801A42AB9
:1000C0009C22073982079F2AB42AAA2AAE2AFE2A2E
:1000D000042B0A2B102B8207013402340434083419
:1000E00010342034403480342B30A300A2018A28FD
:1000F0001630A4009228A00AA40B1628A31D1528C8
:100100000408A7002308840021088000A206A30A8F
:10011000270884000930A4000330A0001628A0148A
:10012000A40B1628A00A1628031097280314A10D63
:1001300004308D285910D914A9012B080319DC2883
:10014000F039703A0319C528D81358122B08AB1F81
:10015000D41AB5285106031D15282C08B0002D0807
:10016000B1002E08B200581415285206AB1B031D0F
:1001700015282C085306D41A031D15282D08B00085
:100180002E08B1002F08B200B328D81FD928581F55
:10019000D72858135816D81123082D3A031DD815FF
:1001A0002B08B0002C08B1002D08B200B328581756
:1001B0001528D81358131528D81358122C08031DC6
:1001C000AD28D817DA2896158830810083120730B9
:1001D00099008F011014203084008001840A60305F
:1001E0000406031DED28D32388308B000230BA00AB
:1001F000BB00BC0A58182F20D81F0C1CFA28550821
:100200008E0056088F000C103C08F039031D46295B
:10021000B801341AD121DA0A3418D121DA0AB41813
:10022000D121DA0A3419D121DA0AB419D121DA0A32
:100230003518D121DA0AB518D121DA0A3519D121B8
:10024000DA0AB519D121DA0A351AD121DA0AB51A32
:10025000D121DA0A351BD121DA0AB51BD121DA0AFC
:100260003618D121DA0AB618D121DA0A3619D12185
:10027000DA0AB619D121DA0A361AD121DA0AB61AFF
:10028000D121DA0A361BD121DA0A9229703A031DEC
:100290009229B61BD121DA0A3718D121DA0AB71808
:1002A000D121DA0A3719D121DA0AB719D121DA0AAC
:1002B000371AD121DA0AB71AD121DA0A371BD1212C
:1002C000DA0AB71BD121DA0A33087E39031DDA0AAC
:1002D000D12159187E30D9187F30591CD918D62110
:1002E0003808B906391C7829381C42173818C21743
:1002F000B91C7E29B81C4317B818C317391D8429A7
:10030000381D44173819C417B91D8A29B81D451757
:10031000B819C517391E9029381E4617381AC6173E
:10032000B900DA018022D70A1030BC07A8013C08C6
:100330003D070318A8163C083E07031828163C087A
:100340003F07031828143C0840070318A8143C086A
:10035000410703182815280960225419A90BFA2807
:10036000A9168230851D0230DE210C306D23A800D5
:100370000F39B400280E0F39B5000D306D23A800D9
:10038000B31B281CC4293416B31FA81CC829341653
:10039000A80D280DF039B504B601B7015910D910D0
:1003A000FA280310B31F03145A0D403E6D23B804FE
:1003B000080030083F3A031D080031085418803AFD
:1003C000B30008000030E5298030DE2130081F39F5
:1003D000D41C0F39B304D41808003412301A341660
:1003E0000800D418ED21F030B40530080F39B404FA
:1003F00012306D233405DE001630722B301E052AB4
:10040000F030B50530080F39092A0F30B505300E28
:10041000F039B50413306D233505DE001730722B2B
:100420003008DE3A031D1C2A3108B60014306D2353
:100430003605DE001830722B013A031D0800310822
:10044000B70015306D233705DE001930722B581FA9
:10045000372A58133208DE00EC303006031D08003E
:1004600031084C23D81808005819862B4C2A5817E5
:100470000800D81D08003208DE00B01C3018080043
:1004800031084C23D8180800B019482A301D08003C
:10049000301D662AB01D512A5819862B7223552209
:1004A000D32B6D233206031D080000306022063076
:1004B000A8000030FF3E031D5A2AA80B5A2AFF301D
:1004C0000838850083168500831208006D23DE003E
:1004D0005E308400073032056B20321E772AB21955
:1004E0008004FF3AB21D800531084C234C2A0005D8
:1004F00003197D2AB219552A0800B21D552A080091
:100500005708FB3E031C3F28073A031D0800FF3035
:10051000D700BA0B922A3130D91932306D23BA0084
:100520000830D906BB0B08003330591A34306D231C
:10053000BB001030D90608005708203E6D2B16234B
:100540000030801B2F23A8003D3057078400280867
:10055000800008001623031DC22AB22A1623031D99
:10056000C22A80160016B72A1623031DC22A00309D
:10057000801FA32A212336230739033E42230A3052
:100580004723A22A013A031DDC2A4A23800B0800D4
:100590004523800BCD2A2123A22A57083D3E840003
:1005A0002F238006031DD82A36231F39143E472BDC
:1005B00036230739063E472B033A031DEC2A001E5B
:1005C000A22A362307390A3E47233030422321230B
:1005D000801EA22A1030A32A4523800B0800303049
:1005E00042234A23800B0800013025233623073994
:1005F000053E42230A3047230030A32A1623003049
:10060000801BD91DA32AA22A16230030801BD919CA
:10061000A32AA22A16230030801B591EA32AA22A2D
:1006200016230030801B591AA32AA22A1C23001B60
:10063000003080000F39080042305707840000085E
:1006400008005708423E8400000A0F39A8005708E6
:10065000423E8400F03080052808800408005708D6
:10066000253E6D23DE005E0E0F3808002A080E02BC
:1006700003191330A800A80CA80EA806A80C2A0C71
:10068000AA000800A8004730A52A47301D2BA80063
:100690004C30A52A4C301D2BD8105811A800A81F8B
:1006A000281B5E2B063A0319D814013A0319581572
:1006B00028080A3A0319D81428080800893E031CA0
:1006C000D814C03E0318D814803E0800DD005F082F
:1006D0007223DF0ADD0B672B080083169B001C14B6
:1006E0001A08842B6D235E06031908005E08831622
:1006F0009A001C158B1355309D00AA309D009C1448
:100700008B171C119C18822B831208003208083AA0
:10071000031D08000930DE002530DF0005306623A8
:10072000C030DE0010307223DE0E3130DF000430C6
:1007300066238030DE00113072230230DE001C3070
:1007400072230830DE004430DF00023066231030B0
:10075000DE004630DF0002306623FF30DE0012305C
:10076000DF0008306623DE010C3072232030DF000A
:10077000053066234830DF0038306623DE0A40301B
:100780007223DE0A41307223DE0A003072230D30FC
:100790007223DE0A4230DF00023066230930DE00B9
:1007A00008307223552200306D23D10010306D23A4
:1007B000D20011306D23D3001C306D23D4000830DB
:1007C0006D231F39A800A80EF0302805D5000F3082
:1007D0002805FD3ED60016306D23B40017306D237A
:1007E000B50018306D23B60019306D23B70008002E
:02400E00C431BB
:104200000300FF00FF00FF00FF00FF0000000D00A3
:104210000900FF000100FF0000000300FF00FF0095
:10422000C0008000FF00FF00FF00FF00FF00FF0054
:10423000FF00FF00FF00FF000200FF00FF00FF0083
:10424000000002000100040006000000090009004F
:1042500009000900FF00FF00FF00FF00FF00FF0052
:10426000FF0005005F00C3000500FF00FF00FF0026
:104270004900430061006E00200036003200390022
:1042800001000200040004000800080010001000F3
:10429000000000000000000000000000080008000E
:1042A000000000000000000000000000000000000E
:1042B00000000000000000000000000000000000FE
:1042C00000000000000000000000000000000000EE
:1042D00000000000000000000000000000000000DE
:1042E00000000000000000000000000000000000CE
:1042F00000000000000000000000000000000000BE
:00000001FF
CV | Обхват | Заводска стойност | Описание |
CV8 | - | 13 | Идентификация на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене Зареждане на "заводските" стойности в CV-тата при запис на стойност 8 в CV8 |
CV7 | - | 0 | Вид на декодера; твърдо зададен с константа в програмата на декодера, т.е. само за четене |
CV11 | - | 1 | Версия на програмата на декодера; твърдо зададена с константа в програмата на декодера, т.е. само за четене |
CV | Обхват | Заводска стойност | Описание |
CV1 | 1 - 127 | 3 | Къс адрес на декодера; активира се от бит 5 в CV29 (0) |
CV17 | 192 - 231 | 192 | Дълъг адрес на декодера, старша част, активира се от бит 5 в CV29 (32) |
CV18 | 0 - 255 | 128 | Дълъг адрес на декодера, младша част, активира се от бит 5 в CV29 (32) Дългият адрес се формира по формулата (CV17 - 192) * 256 + CV18 Формулата за изчисляване на CV17 и CV18 при желан дълъг адрес е CV17 = адрес / 256 + 192 CV18 = остатъкът от разделянето на адреса на 256 = адрес по модул 256 = адрес - 256 * цялата часта от(адрес / 256) |
CV29 | 0 - 39 | 2 | Конфигурация на декодера: |
Бит: | --------------- | ||
0 | 0 | Посока на движение: напред (0); назад (1) | |
1 | 2 | Брой стъпки на тротъла: 14 стъпки (0); 28/128 стъпки (2) | |
2 | 0 | Аналогов режим: забранен (0); разрешен (4) | |
3 - 4 | 0 | Не се използват (0) | |
5 | 0 | Вид адрес: къс (0); дълъг (32) | |
6 - 7 | 0 | Не се използват (0) |
CV | Заводска стойност | Описание | |
CV13 | 0 - 255 | 0 | Бутони F1 до F8 в аналогов режим: |
Бит: | --------------- | ||
0 | 0 | Бутон F1 в аналогов режим: изключен (0); включен (1) | |
1 | 0 | Бутон F2 в аналогов режим: изключен (0); включен (2) | |
2 | 0 | Бутон F3 в аналогов режим: изключен (0); включен (4) | |
3 | 0 | Бутон F4 в аналогов режим: изключен (0); включен (8 ) | |
4 | 0 | Бутон F5 в аналогов режим: изключен (0); включен (16) | |
5 | 0 | Бутон F6 в аналогов режим: изключен (0); включен (32) | |
6 | 0 | Бутон F7 в аналогов режим: изключен (0); включен (64) | |
7 | 0 | Бутон F8 в аналогов режим: изключен (0); включен (128) | |
CV14 | 0 - 63 | 3 | Бутони F0f, F0r и F9 до F12 в аналогов режим: |
Бит: | --------------- | ||
0 | 1 | Бутон F0f в аналогов режим: изключен (0); включен (1) | |
1 | 2 | Бутон F0f в аналогов режим: изключен (0); включен (2) | |
2 | 0 | Бутон F9 в аналогов режим: изключен (0); включен (4) | |
3 | 0 | Бутон F10 в аналогов режим: изключен (0); включен (8 ) | |
4 | 0 | Бутон F11 в аналогов режим: изключен (0); включен (16) | |
5 | 0 | Бутон F12 в аналогов режим: изключен (0); включен (32) | |
6 - 7 | 0 | Не се използват (0) |
CV | Заводска стойност | Описание | |
CV120 | 0 - 31 | 1 | Изходи, управлявани от бутона F0 в посока напред: |
Бит: | --------------- | ||
0 | 1 | Управление на изход FA от бутона: не (0); да (1) | |
1 | 0 | Управление на изход FB от бутона: не (0); да (2) | |
2 | 0 | Управление на изход FC от бутона: не (0); да (4) | |
3 | 0 | Управление на изход FD от бутона: не (0); да (8 ) | |
4 | 0 | Управление на изход FE от бутона: не (0); да (16) | |
5 - 7 | 0 | Не се използват (0) | |
CV | Обхват | Заводска стойност | Описание |
CV121 | 0 - 31 | 2 | Изходи, управлявани от бутона F0 в посока назад - като CV120 |
CV122 | 0 - 31 | 4 | Изходи, управлявани от бутона F1 в посока напред - като CV120 |
CV123 | 0 - 31 | 4 | Изходи, управлявани от бутона F1 в посока назад - като CV120 |
CV124 | 0 - 31 | 8 | Изходи, управлявани от бутона F2 в посока напред - като CV120 |
CV125 | 0 - 31 | 8 | Изходи, управлявани от бутона F2 в посока назад - като CV120 |
CV126 | 0 - 31 | 16 | Изходи, управлявани от бутона F3 в посока напред - като CV120 |
CV127 | 0 - 31 | 16 | Изходи, управлявани от бутона F3 в посока назад - като CV120 |
CV128 | 0 - 31 | 0 | Изходи, управлявани от бутона F4 в посока напред - като CV120 |
CV129 | 0 - 31 | 0 | Изходи, управлявани от бутона F4 в посока назад - като CV120 |
CV130 | 0 - 31 | 0 | Изходи, управлявани от бутона F5 в посока напред - като CV120 |
CV131 | 0 - 31 | 0 | Изходи, управлявани от бутона F5 в посока назад - като CV120 |
CV132 | 0 - 31 | 0 | Изходи, управлявани от бутона F6 в посока напред - като CV120 |
CV133 | 0 - 31 | 0 | Изходи, управлявани от бутона F6 в посока назад - като CV120 |
CV134 | 0 - 31 | 0 | Изходи, управлявани от бутона F7 в посока напред - като CV120 |
CV135 | 0 - 31 | 0 | Изходи, управлявани от бутона F7 в посока назад - като CV120 |
CV136 | 0 - 31 | 0 | Изходи, управлявани от бутона F8 в посока напред - като CV120 |
CV137 | 0 - 31 | 0 | Изходи, управлявани от бутона F8 в посока назад - като CV120 |
CV138 | 0 - 31 | 0 | Изходи, управлявани от бутона F9 в посока напред - като CV120 |
CV139 | 0 - 31 | 0 | Изходи, управлявани от бутона F9 в посока назад - като CV120 |
CV140 | 0 - 31 | 0 | Изходи, управлявани от бутона F10 в посока напред - като CV120 |
CV141 | 0 - 31 | 0 | Изходи, управлявани от бутона F10 в посока назад - като CV120 |
CV142 | 0 - 31 | 0 | Изходи, управлявани от бутона F11 в посока напред - като CV120 |
CV143 | 0 - 31 | 0 | Изходи, управлявани от бутона F11 в посока назад - като CV120 |
CV144 | 0 - 31 | 0 | Изходи, управлявани от бутона F12 в посока напред - като CV120 |
CV145 | 0 - 31 | 0 | Изходи, управлявани от бутона F12 в посока назад - като CV120 |
CV146 | 0 - 31 | 0 | Изходи, управлявани от бутона F13 в посока напред - като CV120 |
CV147 | 0 - 31 | 0 | Изходи, управлявани от бутона F13 в посока назад - като CV120 |
CV148 | 0 - 31 | 0 | Изходи, управлявани от бутона F14 в посока напред - като CV120 |
CV149 | 0 - 31 | 0 | Изходи, управлявани от бутона F14 в посока назад - като CV120 |
CV150 | 0 - 31 | 0 | Изходи, управлявани от бутона F15 в посока напред - като CV120 |
CV151 | 0 - 31 | 0 | Изходи, управлявани от бутона F15 в посока назад - като CV120 |
CV152 | 0 - 31 | 0 | Изходи, управлявани от бутона F16 в посока напред - като CV120 |
CV153 | 0 - 31 | 0 | Изходи, управлявани от бутона F16 в посока назад - като CV120 |
CV | Обхват | Заводска стойност | Описание |
CV154 | 0 - 31 | 0 | Изходи, управлявани от бутона F17 в посока напред - като CV120 |
CV155 | 0 - 31 | 0 | Изходи, управлявани от бутона F17 в посока назад - като CV120 |
CV156 | 0 - 31 | 0 | Изходи, управлявани от бутона F18 в посока напред - като CV120 |
CV157 | 0 - 31 | 0 | Изходи, управлявани от бутона F18 в посока назад - като CV120 |
CV158 | 0 - 31 | 0 | Изходи, управлявани от бутона F19 в посока напред - като CV120 |
CV159 | 0 - 31 | 0 | Изходи, управлявани от бутона F19 в посока назад - като CV120 |
CV160 | 0 - 31 | 0 | Изходи, управлявани от бутона F20 в посока напред - като CV120 |
CV161 | 0 - 31 | 0 | Изходи, управлявани от бутона F20 в посока назад - като CV120 |
CV162 | 0 - 31 | 0 | Изходи, управлявани от бутона F21 в посока напред - като CV120 |
CV163 | 0 - 31 | 0 | Изходи, управлявани от бутона F21 в посока назад - като CV120 |
CV164 | 0 - 31 | 0 | Изходи, управлявани от бутона F22 в посока напред - като CV120 |
CV165 | 0 - 31 | 0 | Изходи, управлявани от бутона F22 в посока назад - като CV120 |
CV166 | 0 - 31 | 0 | Изходи, управлявани от бутона F23 в посока напред - като CV120 |
CV167 | 0 - 31 | 0 | Изходи, управлявани от бутона F23 в посока назад - като CV120 |
CV168 | 0 - 31 | 0 | Изходи, управлявани от бутона F24 в посока напред - като CV120 |
CV169 | 0 - 31 | 0 | Изходи, управлявани от бутона F24 в посока назад - като CV120 |
CV170 | 0 - 31 | 0 | Изходи, управлявани от бутона F25 в посока напред - като CV120 |
CV171 | 0 - 31 | 0 | Изходи, управлявани от бутона F25 в посока назад - като CV120 |
CV172 | 0 - 31 | 0 | Изходи, управлявани от бутона F26 в посока напред - като CV120 |
CV173 | 0 - 31 | 0 | Изходи, управлявани от бутона F26 в посока назад - като CV120 |
CV174 | 0 - 31 | 0 | Изходи, управлявани от бутона F27 в посока напред - като CV120 |
CV175 | 0 - 31 | 0 | Изходи, управлявани от бутона F27 в посока назад - като CV120 |
CV176 | 0 - 31 | 0 | Изходи, управлявани от бутона F28 в посока напред - като CV120 |
CV177 | 0 - 31 | 0 | Изходи, управлявани от бутона F28 в посока назад - като CV120 |
CV178 | 0 - 31 | 0 | Изходи, задействани в покой и избрана посока напред - като CV120 |
CV179 | 0 - 31 | 0 | Изходи, задействани в покой и избрана посока назад - като CV120 |
CV180 | 0 - 31 | 0 | Изходи, задействани в движение и избрана посока напред - като CV120 |
CV181 | 0 - 31 | 0 | Изходи, задействани в движение и избрана посока назад - като CV120 |
CV182 | 0 - 31 | 0 | Изходи, задействани при активна фаза A на DCC сигнала - като CV120 |
CV183 | 0 - 31 | 0 | Изходи, задействани при активна фаза B на DCC сигнала - като CV120 |
CV | Обхват | Заводска стойност | Описание |
CV19 | 0 - 255 | 255 | Запазване на състоянието на функциите, зададени от бутони F0 до F4 |
Бит: | --------------- | ||
0 | 1 | Запазване състоянието на бутона F1: не (0); да (1) | |
1 | 2 | Запазване състоянието на бутона F2: не (0); да (2) | |
2 | 4 | Запазване състоянието на бутона F3: не (0); да (4) | |
3 | 8 | Запазване състоянието на бутона F4: не (0); да (8 ) | |
4 | 16 | Запазване състоянието на бутона F0: не (0); да (16) | |
5 - 7 | 224 | Не се използват (224) | |
CV20 | 0 - 255 | 255 | Запазване на състоянието на функциите, зададени от бутони F5 до F12 |
Бит: | --------------- | ||
0 | 1 | Запазване състоянието на бутона F5: не (0); да (1) | |
1 | 2 | Запазване състоянието на бутона F6: не (0); да (2) | |
2 | 4 | Запазване състоянието на бутона F7: не (0); да (4) | |
3 | 8 | Запазване състоянието на бутона F8: не (0); да (8 ) | |
4 | 16 | Запазване състоянието на бутона F9: не (0); да (16) | |
5 | 32 | Запазване състоянието на бутона F10: не (0); да (32) | |
6 | 64 | Запазване състоянието на бутона F11: не (0); да (64) | |
7 | 128 | Запазване състоянието на бутона F12: не (0); да (128) | |
CV21 | 0 - 255 | 255 | Запазване на състоянието на функциите, зададени от бутони F13 до F20 |
Бит: | --------------- | ||
0 | 1 | Запазване състоянието на бутона F13: не (0); да (1) | |
1 | 2 | Запазване състоянието на бутона F14: не (0); да (2) | |
2 | 4 | Запазване състоянието на бутона F15: не (0); да (4) | |
3 | 8 | Запазване състоянието на бутона F16: не (0); да (8 ) | |
4 | 16 | Запазване състоянието на бутона F17: не (0); да (16) | |
5 | 32 | Запазване състоянието на бутона F18: не (0); да (32) | |
6 | 64 | Запазване състоянието на бутона F19: не (0); да (64) | |
7 | 128 | Запазване състоянието на бутона F20: не (0); да (128) | |
CV22 | 0 - 255 | 255 | Запазване на състоянието на функциите, зададени от бутони F21 до F28 |
Бит: | --------------- | ||
0 | 1 | Запазване състоянието на бутона F21: не (0); да (1) | |
1 | 2 | Запазване състоянието на бутона F22: не (0); да (2) | |
2 | 4 | Запазване състоянието на бутона F23: не (0); да (4) | |
3 | 8 | Запазване състоянието на бутона F24: не (0); да (8 ) | |
4 | 16 | Запазване състоянието на бутона F25: не (0); да (16) | |
5 | 32 | Запазване състоянието на бутона F26: не (0); да (32) | |
6 | 64 | Запазване състоянието на бутона F27: не (0); да (64) | |
7 | 128 | Запазване състоянието на бутона F28: не (0); да (128) | |
CV23 | - | 255 | Памет за състоянието на бутоните F0 до F4; програмата сама пише в това CV |
CV24 | - | 255 | Памет за състоянието на бутоните F5 до F12; програмата сама пише в това CV |
CV25 | - | 255 | Памет за състоянието на бутоните F13 до F20; програмата сама пише в това CV |
CV26 | - | 255 | Памет за състоянието на бутоните F21 до F28; програмата сама пише в това CV |
CV | Обхват | Заводска стойност | Описание |
CV38 | 0 - 15 | 9 | ШИМ на изхода FA |
CV39 | 0 - 15 | 9 | ШИМ на изхода FB |
CV40 | 0 - 15 | 9 | ШИМ на изхода FC |
CV41 | 0 - 15 | 9 | ШИМ на изхода FD |
CV42 | 0 - 15 | 9 | ШИМ на изхода FE |
CV | Обхват | Заводска стойност | Описание |
CV9 | 0 - 31 | 9 | Честота на ШИМ на изходите (приблизителна): |
0: 80 Hz | |||
9: 100 Hz (заводска стойност) | |||
16: 120 Hz | |||
21: 140 Hz | |||
27: 180 Hz | |||
31: 210 Hz |
CV | Обхват | Заводска стойност | Описание |
CV33 | 0 - 255 | 0 | Ефект на изхода FA: |
0: Лампа с нажежаема жичка, т.е. няма ефект | |||
1: Луминисцентна лампа | |||
2: Дефектираща луминисцентна лампа | |||
3: Дефектна луминисцентна лампа | |||
4: Мигаща светлина A, фаза 1 | |||
5: Мигаща светлина A, фаза 2 | |||
6: Мигаща светлина B, фаза 1 | |||
7: Мигаща светлина B, фаза 2 | |||
Добавки за посока и в покой или в движение: | |||
0: Изходът е активен и в двете посоки | |||
16: Изходът е активен само в посока напред | |||
32: Изходът е активен само в посока назад | |||
0: Изходът е активен както в покой, така и в движение | |||
64: Изходът е активен само в покой | |||
128: Изходът е активен само в движение | |||
CV34 | 0 - 255 | 0 | Ефект на изхода FB - като CV33 |
CV35 | 0 - 255 | 0 | Ефект на изхода FC - като CV33 |
CV36 | 0 - 255 | 0 | Ефект на изхода FD - като CV33 |
CV37 | 0 - 255 | 0 | Ефект на изхода FE - като CV33 |
CV | Обхват | Заводска стойност | Описание |
CV50 | 0 - 255 | 12 | Продължителност на включеното състояние на мигаща светлина A в 8 милисекунди |
CV51 | 0 - 255 | 12 | Продължителност на изключеното състояние на мигаща светлина A в 8 милисекунди |
CV52 | 0 - 255 | 12 | Продължителност на включеното състояние на мигаща светлина B в 8 милисекунди |
CV53 | 0 - 255 | 12 | Продължителност на изключеното състояние на мигаща светлина B в 8 милисекунди |