Andersom, de MARDEC is nu DR5000 compatibel Het werkt ja, maar het is niet "netjes". Ik wil de komende dagen toch nog wat tests uitvoeren om te achterhalen waarom de MARDEC buiten de NMRA-specificaties werkt.
Mannen...even Nederlands. Ik kan goed schaken, mijn huis schilderen, snel fietsen en een modeltreinbaan bouwen. Bovendien krijg ik 21 wissels met de arduino aan de praat.Ik wil eigenlijk over stappen van de intellibox naar de DR5000.Maar vanaf post 106 begrijp ik er geen (........) meer van.Kan ik dat ding nu ongestraft kopen of niet. Als dat gedonder oplevert van ga ik gewoon door met mijn intelliboxje Kreten als: NMRA library, Als "#define kONE_Max" 68 of hoger is, Ik heb 2x Serial.print() in het servo-deel ge-comment, dus het heeft geen invloed op het programma gehad.Dit is toch een forum voor Dummy modelspoorders....................................of niet.Frans
Dit is toch een forum voor Dummy modelspoorders....................................of niet.
Dit is een "0":(126 uS)
Dit is een "1":Citaat van: Servé (61 uS)Allemaal netjes binnen de NMRA specificaties. Het wordt dus toch graven in de MARDEC-code...Hmm... dat zou beter 2uS minder kunnen zijn Maar idd nog ruim binnen de specs.
(61 uS)Allemaal netjes binnen de NMRA specificaties. Het wordt dus toch graven in de MARDEC-code...
Bedoel je te zeggen dat de waarde van 64 voor kONE_Max voldoende zou moeten zijn omdat je 61 uS gemeten hebt?Dan is het eventueel graven in DCC_Decoder.cpp maar niet in de MARDEC.ino lijkt me.
Vraagje.Als je waarde toch op 80 zet kan dat dan 'gevaar' voor de wat minder snelle centrales?M'n DaisyII doet het overigens ook prima op die 80.
Code: [Selecteer]//------------------------------------------------------------------------// DCC Receive Routine//// Howto: uses two interrupts: a rising edge in DCC polarity triggers INTx// in INTx handler, Timer0 CompareB with a delay of 80us is started.// On Timer0 CompareB Match the level of DCC is evaluated and// parsed.//// INTx triggers on falling edge, bit-sampling always based upon the just ELAPSED period.// and then restarts the time measurement//// ISR(TIMER0_COMPB_vect) only samples the current line status when match occurs.// timing is based upon the well-defined 58us half-period-time// of a DCC '1' bit, with a maximum 64us for a valid '1'. // The '0' bit is NOT well defined.//// |<------116us----->|// |<-58us->|//// DCC 1: XXXXXXXXX__________XXXXXXXXXX__________XXXXXXXXXX_________// ^-INTx// |---64us--->|// ^Timer-INT: reads one//// DCC 0: XXXXXXXXX____________________XXXXXXXXXXXXXXXXXXXX__________________// ^-INTx// |---------->|// ^Timer-INT: reads zero// //------------------------------------------------------------------------// The Timer0 prescaler is hard-coded in wiring.c #define TIMER_PRESCALER 64// for a 16MHz cpu: TIMER_PRESCALER * 1000000L / F_CPU = 4. Hence every 4us we receive a 'tick'#define us2ticks(us) (us / (TIMER_PRESCALER * 1000000L / F_CPU))#define DCC_BIT_SAMPLE_PERIOD us2ticks(64)
//------------------------------------------------------------------------// DCC Receive Routine//// Howto: uses two interrupts: a rising edge in DCC polarity triggers INTx// in INTx handler, Timer0 CompareB with a delay of 80us is started.// On Timer0 CompareB Match the level of DCC is evaluated and// parsed.//// INTx triggers on falling edge, bit-sampling always based upon the just ELAPSED period.// and then restarts the time measurement//// ISR(TIMER0_COMPB_vect) only samples the current line status when match occurs.// timing is based upon the well-defined 58us half-period-time// of a DCC '1' bit, with a maximum 64us for a valid '1'. // The '0' bit is NOT well defined.//// |<------116us----->|// |<-58us->|//// DCC 1: XXXXXXXXX__________XXXXXXXXXX__________XXXXXXXXXX_________// ^-INTx// |---64us--->|// ^Timer-INT: reads one//// DCC 0: XXXXXXXXX____________________XXXXXXXXXXXXXXXXXXXX__________________// ^-INTx// |---------->|// ^Timer-INT: reads zero// //------------------------------------------------------------------------// The Timer0 prescaler is hard-coded in wiring.c #define TIMER_PRESCALER 64// for a 16MHz cpu: TIMER_PRESCALER * 1000000L / F_CPU = 4. Hence every 4us we receive a 'tick'#define us2ticks(us) (us / (TIMER_PRESCALER * 1000000L / F_CPU))#define DCC_BIT_SAMPLE_PERIOD us2ticks(64)
void ExternalInterruptHandler(void){ TIFR0 |= (1<<OCF0B); // Clear Timer0 Compare Match B Flag OCR0B = TCNT0 + DCC_BIT_SAMPLE_PERIOD ; // reload compare register TIMSK0 |= (1<<OCIE0B); // Enable Timer0 Compare Match B Interrupt