Doel:€250.00
Donaties:€0.00

Per saldo:€-250.00

Steun ons nu!

Laatst bijgewerkt
op 03-12-2025

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

Piko Hobby lok welke condensator er uit? door bellejt
Vandaag om 13:27:29
Roco traxx 'Eurocity': suggestie 2e nummer doorgeven door Daan!
Vandaag om 13:19:53
De (3d) knutsels van Ronald. door Eric B
Vandaag om 13:16:42
Plux12/16/22 Functiedecoder voor Roco 64205/64209 door Albert de Heer
Vandaag om 13:16:27
Ombouw/Pimpen Bolle neuzen door bollen neus
Vandaag om 12:44:51
Uit de hand gelopen hobby: Trambaan op zolder. door odaoda
Vandaag om 12:35:51
Roco 2025 door 1200blauw
Vandaag om 12:27:53
13 december modelspoorbeurs Houten door Ronald69
Vandaag om 12:23:22
Bitry Bascule in 0e, een nieuw baantje op Micromodules door Lucien
Vandaag om 11:59:18
Test van een Rapido Trains GE 44 tonner Claremont and Concord door Floris Dilz
Vandaag om 11:48:28
Da's Daz 2 door Huup
Vandaag om 11:35:54
BNLS modulebaan: Werkspoor-Kathedraal 3.5 door Sikko
Vandaag om 11:27:46
ProRail kan spoor in Nederland niet langer ’toekomstklaar’ houden door Eric B
Vandaag om 11:05:55
De Projecten van RetroJack door Jelmer
Vandaag om 11:05:45
Mijn eerste H0-modeltreinbaan in aanbouw door Jelmer
Vandaag om 11:04:47
Problemen BR10 met decoder Zimo MN330P22 Plux 22 door rhberk
Vandaag om 10:56:10
Rondom Charlois door Alewijn
Vandaag om 10:45:32
Bouw NS C 8605, BC 6012 en C 6820 door rhberk
Vandaag om 10:44:29
Toon hier je nieuwe (model-) spooraanwinst(en)... door Besselspoor
Vandaag om 10:43:31
draaistel A.C.M.E. slaaprijtuig loshalen: hoe? door Jelmer
Vandaag om 10:14:10
Diorama Memburg Klütjenfelderkai door Sven
Vandaag om 09:03:21
Polderbaan(tje) 0,3m2 door GD
Vandaag om 08:55:20
RhB modelbaan in Aanbouw die Scalettabahn Davos-Dürrboden door Sven
Vandaag om 08:13:56
Materieel verzameling van Michiel(NDS) door neudalhausenstadbahn
Vandaag om 00:32:31
Trix 22128 EETC 1200 - 175 Jaar spoorwegen DCC Sound - Decoder plots dood. door Ronald A.
10 December 2025, 22:05:51
De overeenkomst tussen een Ovaalramer en een Motorpost. door FritsT
10 December 2025, 22:01:31
Länderbahn en Reichsbahn locomotieven. door Robert vh Prutsert
10 December 2025, 21:33:56
ratelende 1300 van Electrotren door knar46
10 December 2025, 21:29:18
De bouw van mijn modelbaan in Thailand door DJV
10 December 2025, 21:10:38
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door DJV
10 December 2025, 21:04:54
  

Auteur Topic: Zelf gemaakte DCC-centrale werkt niet helemaal  (gelezen 16512 keer)

bask185

  • Offline Offline
  • Berichten: 5182
Re: Zelf gemaakte DCC-centrale werkt niet helemaal
« Reactie #45 Gepost op: 11 April 2019, 17:19:32 »
Het grappige is dat mijn programma eigenlijk zo oningewikkeld als mogelijk op gezet. Ik bedoel dit is mijn loop()
void loop() {
  readSerialBus();                           
  shortCircuit();
 
  if(packetSent) {                              // signal from ISR that last bit is transmitted on tracks
    if(nextPacket()) {                          // nextPacket returns true when the first following packet is a speed packet
      nextAddres(); }                          // select next 'active' addres
    assemblePackets();                       // assemble a new packet
    sendPacket(); } }                         // sets required variables and enables ISR                   
Nogmaals in sequentie stuur ik: speed, function1, function2 -> volgende adres
Ik kijk dus of een pakket verzonden is, dan selecteer ik de volgende pakket. Dat is een speed, function1 of function2 (F1-F4 / F5-F8) en als het een snelheids pakket betreft, dan schuif ik ook het volgende adres. Dit was naar mijn mening de makkelijkste en kortste (514 regels code inclusief wit regels en compacte{} schrijfwijze) manier om alle pakketten de deur uit te trappen. Ik denk niet dat ik het korter en makkelijker had kunnen maken.

volgens mij doet een gemiddeld pakket er ca ~3ms (14 preabmle bits, 3 bytes en 4 extra bits met 50:50 '0' : '1' bits = ~75us/bit) over om verzonden te worden.

Ik doe in grote maten al hetzelfde als MRdirect muv het feit dat ik 3 pakketten per lok de deur uit stuur.
Het ringbuffer idee heb ik al anders opgelost door inactieve decoders over te slaan. Wat ik wel interessant vind, is om alleen de laatst gewijzigde functies uit te voeren, maar dit geeft we wel weer het probleem dat ik decoders, die stroomloos geweest zijn, ook nog een herhalingspakketjes moet versturen voor alles.

Wat voor mij de volgende logische stap zou zijn, is om eerst alle snelheidspakketten te sturen, dan de function1 pakketten en als laatste de function2 pakketten. Zo stuur ik nog steeds alles naar alle actieve decoders en elke decoder krijgt niet binnen 5ms een nieuwe pakket binnen.
Train-Science.com
Train-Science github
It ain't rocket science ;-)

Patrick Smout

  • Offline Offline
  • Berichten: 455
Re: Zelf gemaakte DCC-centrale werkt niet helemaal
« Reactie #46 Gepost op: 14 April 2019, 20:41:36 »
Ook ik heb veel plezier beleefd aan het zelf bouwen van een command station.
Initiëel enkel DCC, later uitgebreid met MOTI en MOTII (new) (multi protocol centrale). Was inderdaad een hele kluif.
Initiële versie is ook gepubliceerd als een bouwproject in elektor ( https://www.elektormagazine.com/magazine/elektor-200809/18906)
Ik heb toen gekozen voor een ringbuffer die cyclisch alle pakketten ververst voor locs die recentelijk nog een opdracht ontvangen hebben, zij van het de MM of van een PC. Daarnaast maak ik gebruik van "urgent frames" die de cyclische afhandeling tijdelijk onderbreken. Elk pakket dat ontvangen wordt via PC (IB P50x) en/of MM wordt eerst verstuurd als urgent frame. Opdrachten die de snelheid van de loc verlagen worden daar bovenop nog met extra voorrang behandeld.
Loconet heeft nog lang op het lijstje gestaan maar nooit aan begonnen omdat ik voor mijn baan als S88 terugmelders had en de nodige accessory decoders.
Al bij al een leuk project.

mvg, Patrick

@ Marco, jouw aanpak is goed gevonden. Ik ben gestart met gelinkt lijsten van buffers voor diverse soorten pakketten en jouw oplossing is zelfs niet bij mij opgekomen.
Met vriendelijk groeten,

Patrick Smout

MRdirect

  • Offline Offline
  • Berichten: 242
  • Marco Roede
Re: Zelf gemaakte DCC-centrale werkt niet helemaal
« Reactie #47 Gepost op: 15 April 2019, 16:36:42 »
@ Marco, jouw aanpak is goed gevonden. Ik ben gestart met gelinkt lijsten van buffers voor diverse soorten pakketten en jouw oplossing is zelfs niet bij mij opgekomen.
Leuk te horen. Er zit natuurlijk wel meer dan 15 jaar denkwerk in en optimalisatie (pogingen) aan ten grondslag. En ik ben er voor mezelf nog steeds mee bezig, oa LocoNet implementatie. Die wekt maar bij MRdirect is het P50 protocol toch stabieler. Door het XEvent mechanisme weet je continue of de verbinding cq communicatie nog goed functioneert.

M.vr.gr. Marco
Sinds april 2020 IntelliBox 650 ipv MRdirect en via LocoNet twee Power4 boosters.
Rosoft servo-wisseldecoders, Henk Kooiman stappenmotor draaischijf mbv Peter Giling hardware en eigen ontwerp DCC-decoder.

bask185

  • Offline Offline
  • Berichten: 5182
Re: Zelf gemaakte DCC-centrale werkt niet helemaal
« Reactie #48 Gepost op: 03 May 2019, 13:25:17 »
Was vandaag nog even aan het puzzelen geweest met de code. Ik ben nu ook druk bezig met de arduino code om de wissels, bezetmelders en andere rand apparatuur aan te sturen en zodoende heb ik nog niks met MM2 gedaan. Te veel te doen in te weinig tijd...

Omdat ik met werk nogal veel bezig ben met state machines bedacht ik me dat het voor een DCC centrale ook handig kan zijn. Dus ik ging puzzelen en maakte:

De werking is als volgt:
Onder normale omstandigheden worden eerst snelheidsinstructies gestuurd naar de actieve locs, dan doe ik alle instructiebytes voor F1-F4 en als laatste komen functies F5-F8 aan bod.

Nadat een packet het spoor is opgegaan, check ik of er een nieuwe instructie is ontvangen. Indien zo, stuur ik deze nieuwe instructie 20x met 2 IDLE pakketten tussen de herhalingen.

De state machine in Code ziet er zo uit:
/***** MAIN LOOP *****/
void loop() {
  readSerialBus();                           
  shortCircuit();
 
#define State(x) break; case x: if(x ## F())
switch(state){
default:

State(assemblePacket){         state = awaitPacketSent; }

State(awaitPacketSent){
if(newInstructionFlag) state = newPacketSent;
else                   state = nextAddres; }

State(nextAddres){
if(lastAddresFlag)     state = nextPacketType;
else                   state = assemblePacket; }

State(newPacketSent){
if(newPacketSentFlag)  state = assemblePacket;
else                   state = nextPacketType; }

State(nextPacketType){  state = assemblePacket; }

break; }
#undef state
}
Ik ben niet zo'n fan van die function pointer arrays en prefereer deze methode. Ik maak gebruik van een slim truukje met een macro om een overzichtelijke structuur op te bouwen

Deze regel:
define State(x) break; case x: if(x ## F())
vervangt bijvoorbeeld
State(assemblePacket) {
door
break; case assemblePacket: if(assemblePacketF()) {

assemblePacketF()) is een van de functies die worden gecalled vanuit de switch-case. Alle functies dienen een 0 of een 1 te returnen. Pas wanneer een functie een 1 return't dan is de desbetreffende state klaar en wordt de volgende state geselecteerd.

Logisch benoemde flags reguleren de flow naar de volgende states.

Ik hoop dat ik dit weekend kan testen of dit niks stuk maakt een iets snellere responsie geeft (en wie weet wel het toeter probleem van m'n tee oplost  ::))
Train-Science.com
Train-Science github
It ain't rocket science ;-)