Auteur Topic: Pendelautomaat voor digitale treinen  (gelezen 14834 keer)

Offline Geert

  • Forumlid
  • Berichten: 1.642
    • Homepage
  • Voornaam: Geert
Pendelautomaat voor digitale treinen
« Gepost op: 06 september 2013, 21:52:28 pm »
Pendelautomaat voor maximaal 4 Nieuw Marklin Motorola locomotieven

Inhoud:

Doel en gebruikt formaat

Marklin Motorola puls generator

Terugmelders

Vermogen deel (Booster)

Opdracht code

Servo's aansturen

Voorbeeld filmpje servo aansturing

Digitale uitgangen (LED uitgangen)

Filmpje met twee digitale treinen met geluidfuncties

Link tussen OPCODE en assembler program

Doel:

Door middel van één microcontroller (µC) en enkele eenvoudige randcomponenten. Een treinbaan aan te sturen waarop maximaal vier Nieuw Marklin Motorola digitale locomotieven kunnen rondrijden volgens een vastgelegd patroon.  Dit patroon bepaal je zelf via enkele instructies (opcodes).  Een pendelautomaat in strikte zin is een toestel dat een Loc heen en weer laat rijden tussen 2 punten op je baan, eventueel met tussenstops. Bij dit pendelautomaat hoeft dat niet zo zeer. Ook rondjes rijden op je baan kan. Bovendien kan deze ook 8 wissels aansturen via servo’s  en heeft dit apparaat 8 digitale uitgangen om bijvoorbeeld 8 seinen aan te sturen. Treindetectie gebeurd via stroomdetectie midden rail. Waarom stroomdetectie en geen massadetectie?  Het is de bedoeling deze automaat mutiprotocol te maken dus ook DCC.  Dit pendelautomaat heeft geen digitale centrale en/of PC nodig om te werken, wel een PC om de reeks instructies eenmalig door te sturen. Later daar meer over, maar eerst even de basis van het Marklin Motorola protocol opfrissen.  De wijze waarop ik de werking van dit protocol uitleg wordt ook door mij zo in het µC programma toegepast, en het werkt ;)

Oud Marklin Motorola formaat: (Oud MM)

Dit data formaat bestaat uit 18 data bits waarbij bit 1 eerst wordt doorgestuurd, gevolgd door bit 2 tot en met  bit 18. Bekijk dit als een schuifregister van 18 bits. Deze 18 data bits worden twee keer onveranderd na elkaar doorgestuurd voor overdracht fout controle in de Loc.


Tabel1

-Waarbij bits 8…1 respectievelijk 8 adres bits A8…A1 van de Loc zijn. Deze adres bits kunnen per  paar drie logische toestanden  voorstellen.  Zoals paar A2 en A1 = 00; 11 of 01, ook trinaire toestanden genoemd. Hetzelfde hebben we voor trinair paar A4 en A3, trinair paar A6 en A5 en trinair paar A8 en A7. Hoe je van een decimaal adres overgaat naar een trinair adres staat al genoeg beschreven op het internet.  Waarom trinair? Toen Marklin begon met digitale treinen was er een decoder chip op de markt die o.a. gebruikt werd in afstandsbedieningen namelijk Motorola MC145027 chip. De adressering van deze chip gebeurd door op elk van 4 adrespinnen als volgt spanning te schakelen: verbinden met positieve spanning: trinair 11; deze te verbinden met negatieve spanning: trinair 00 of deze gewoon open te houden: trinair 01 (eigenlijk is deze laatste 10, maar ik noteer ze zoals deze door de schuifregister wordt doorgestuurd dus als 01) Doordat elk van die 4 pinnen 3 mogelijke toestanden kunnen inlezen kan je via dit protocol 3x3x3x3= 81 loc adressen instellen. En het gebruik van deze chip verklaart ook waarom dit Marklin Motorola formaat wordt genoemd.
 
-Waarbij bit 10=L1’ en bit 9=L1 de lichtfunctie aanstuurt van de Loc. Dit paar heeft samen maar twee mogelijk toestanden of ze zijn beide 00 dan is de lichtfunctie uit, of ze zijn beide 11 dan is de lichtfunctie aan.

-Waarbij bits 18…11, gecombineerd in paar S4’ S4; paar S3’ S3; paar S2’ S2 en paar S1’ S1 de snelheid van de loc voorstelen. Elk paar heeft maar 2 mogelijke toestanden ofwel 00 of 11. De snelheid van de Loc wordt volgens volgende tabel doorgestuurd :


Tabel2

Bij REVERSE keert de rijrichting van de Loc om.

Nieuw Marklin Motorola formaat:

Afgekort als Nieuw MM of ook als MM2 formaat. Ook bij dit formaat worden 18 bits doorgestuurd volgens volgende vorm:


Tabel3

-Waarbij A8…A1  hetzelfde blijft  zoals bij Oud MM formaat.

-Waarbij paar L1’ en L1 hetzelfde blijft  zoals bij Oud MM formaat.

-De snelheid bits volgens Oud MM formaat namelijk paar S4’ S4; S3’ S3; S2’ S2 en S’1 S1 worden opgesplitst in vier snelheid bits S4 S3 S2 en S1. Bits S4’ S3’ S2’ en S1’ worden nu respectievelijk 4 code bits:  C4 C3 C2 en C1

Bits S4 S3 S2 en S1 geven ook nu de snelheid aan, en kunnen uit de tabel2 gehaald worden.  De REVERSE functie namelijk bits  S4 S3 S2 S1 =  0 0 0 1 bestaat niet in het Nieuw MM formaat, zie verder waarom.

Hoe zit het nu met die codes. We moeten het volgende goed in gedachte houden: de combinatie van C4 S4; C3 S3; C2 S2 en C1 S1 mogen nooit deze zijn die ergens voorkomen in tabel 2: Oud MM formaat! Anders denkt de decoder in de Loc dat hij met het Oud MM formaat te maken heeft. Nieuw MM Locs moeten immers ook kunnen rijden op digitale centrales die enkel het Oud MM formaat kennen.

 Tabel 4 geeft de bit waarde weer van C4 C3 C2 en  C1 en de functie ervan:


Tabel4

Verklaring tabel 4:
De code voor ‘Snelheid=  +0 tot +6’ en de code voor ‘Snelheid=  +7 tot +14’ geven aan dat de snelheid bits S4..S1 positief zijn. Waarom is er verschil tussen beide codes? Om niet in conflict te komen met het Oud MM formaat. Ga maar eens na, C4 is altijd de inverse van S4 !

De code voor ‘Snelheid=  -0 tot -6’ en de code voor ‘Snelheid=  -7 tot -14’ geven aan dat de snelheid bits S4..S1 negatief zijn, of beter gezegd de andere richting dan de positieve snelheid  :) . Ook hier is C4 altijd het inverse van S4.

De codes voor ‘Functie 1 ON/OFF’ tot en met ‘Functie 4 ON/OFF’ schakelen de respectievelijke extra functie 1…4 ON/OFF in de Loc decoder.
Maar hier zitten we met overlappingen met het Old MM formaat!

Er zijn 4 overlappingen bij functie OFF:

Bij Functie 1 OFF en bij snelheid 2 krijgen we de volgende 8 bits: 00 00 11 11
bij Functie 2 OFF en bij snelheid 3 krijgen we de volgende 8 bits: 00 11 00 00
bij Functie 3 OFF en bij snelheid 5 krijgen we de volgende 8 bits: 00 11 11 00
bij Functie 4 OFF en bij snelheid 6 krijgen we de volgende 8 bits: 00 11 11 11

Er zijn 4 overlappingen bij functie ON:

bij Functie 1 ON en bij snelheid 10 krijgen we de volgende 8 bits: 11 00 11 11
bij Functie 2 ON en bij snelheid 11 krijgen we de volgende 8 bits: 11 11 00 00
bij Functie 3 ON en bij snelheid 13 krijgen we de volgende 8 bits: 11 11 11 00
bij Functie 4 ON en bij snelheid 14 krijgen we de volgende 8 bits: 11 11 11 11

Om dit probleem op te lossen kunnen we bij functie OFF in die respectievelijke 4 gevallen code C4…C1 vervangen door code ‘Uitzondering op functie OFF’. En bij functie ON in die respectievelijke 4 gevallen code C4..C1 vervangen door code ‘Uitzondering op functie ON’. Nu is er geen overlapping meer met het Old MM Formaat, zie maar:

Bij Functie 1 OFF en bij snelheid 2 krijgen we nu de volgende 8 bits: 00 10 01 11
bij Functie 2 OFF en bij snelheid 3 krijgen we nu de volgende 8 bits: 00 11 00 10
bij Functie 3 OFF en bij snelheid 5 krijgen we nu de volgende 8 bits: 00 11 01 10
bij Functie 4 OFF en bij snelheid 6 krijgen we nu de volgende 8 bits: 00 11 01 11

bij Functie 1 ON en bij snelheid 10 krijgen we nu de volgende 8 bits: 11 00 11 01
bij Functie 2 ON en bij snelheid 11 krijgen we nu de volgende 8 bits: 11 01 10 00
bij Functie 3 ON en bij snelheid 13 krijgen we nu de volgende 8 bits: 11 01 11 00
bij Functie 4 ON en bij snelheid 14 krijgen we nu de volgende 8 bits: 11 01 11 01

Volgorde databits:

Zoals al gezegd, de 18 bits worden 2 keer onveranderd na elkaar doorgezonden voor detectie overdrachtsfouten. Sommige centrales doen dat zelfs 4 keer na elkaar, maar is in principe niet nodig. Nu, de volgorde hoe deze databits  voor de diverse Locs worden doorgestuurd is als volgt:

2x (Snelheid en code rijrichting + Lichtfunctie + Adres Loc 1)
2x (Snelheid en code Functie 1 On/Off + Lichtfunctie + Adres Loc 1)
2x (Snelheid en code rijrichting + Lichtfunctie + Adres Loc 2)
2x (Snelheid en code Functie 1 On/Off + Lichtfunctie + Adres Loc 2)
2x (Snelheid en code rijrichting + Lichtfunctie + Adres Loc )
2x (Snelheid en code Functie 1 On/Off + Lichtfunctie + Adres Loc 3)
2x (Snelheid en code rijrichting + Lichtfunctie + Adres Loc 4)
2x (Snelheid en code Functie 1 On/Off + Lichtfunctie + Adres Loc 4)
2x (Snelheid en code rijrichting + Lichtfunctie + Adres Loc 1)
2x (Snelheid en code Functie 2 On/Off + Lichtfunctie + Adres Loc 1)
2x (Snelheid en code rijrichting + Lichtfunctie + Adres Loc 2)
2x (Snelheid en code Functie 2 On/Off + Lichtfunctie + Adres Loc 2)

2x (Snelheid en code Functie 4 On/Off + Lichtfunctie + Adres Loc 4)
terug naar begin

De snelheid en rijrichting van elke Loc wordt 4 keer meer doorgestuurd dan de functie ervan.

Logische bit (databit):

Een logische bit 1 bestaat uit een positieve puls van 182µs gevolgd door een negatieve puls van 26µs, totaal dus 208µs.
Een logische bit 0 bestaat uit een positieve puls van 26µs gevolgd door een negatieve puls van 182µS, samen ook 208µs.
18 databits heeft zo een totale lengte van 18x208µs = 3744µs.

Pauzes tussen databits (18bits)

Tussen elk reeks van  dezelfde databits (18bits) wordt een  pauze genomen die gelijk is 6 keer de lengte van 1 logische bit = negatieve puls van 6x208µs=1248µs. De Pauze tussen een blok van 2 dezelfde reeksen databits is 20 keer de lengte van 1 logische bit = negatieve puls van 20x208µs=4160µs. Dit is zo vastgelegd, en komt nog uit de tijd dat decoders werkte met het Motorola decoder MC145027 chip.

zo dit was deel1

Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet In/Output

Offline Havoc

  • Forumlid
  • Berichten: 6.275
  • Voornaam: Johan
Re: Pendelautomaat voor digitale treinen
« Reactie #1 Gepost op: 07 september 2013, 21:25:18 pm »
Alvast bedankt om dit interessante stukje eruit te lichten. Ik zal het later eens grondig lezen want de komende 2 weken vrees ik dat er niet veel tijd gaat zijn voor internet.
Expert in non-working solutions.

Offline Geert

  • Forumlid
  • Berichten: 1.642
    • Homepage
  • Voornaam: Geert
Re: Pendelautomaat voor digitale treinen
« Reactie #2 Gepost op: 09 september 2013, 16:17:03 pm »
Marklin Motorola puls generator.
 
Ik ga hier een stukje hardware en software beschrijven die in een PIC µC zit en gebruikt wordt om de digitale pulsen zoals hiervoor beschreven fysiek op te wekken.

Hiervoor gebruik ik de Puls Width Modulation mode (PWM) die in sommige PIC µC standaard hardware matig ingebakken zit. Op de volgende tekening is deze module vereenvoudigd voorgesteld. Al het blauwe deel is hardware, het gele deel software. De module bestaat uit 3 registers A,B en C. Register A wordt zo ingesteld dat deze telt tussen 0µs tot 208µs en dit oneindig lang, telkens terug beginnende van 0µs.
Register A wordt continue vergeleken met de waarde van register B. Is B groter dan A, dan zal uitgangspin RC2 hoog zijn. Is deze lager, dan zal pin RC2 laag zijn.

Wat doet deze module nog verder, telkens als register A 0µs wordt, dan zal automatisch register B de waarde overnemen van register C.  Ook start er dan een interrupt programma. Dit interrupt programma onderbreekt het hoofdprogramma. Dit is het gele software gedeelte. Het interrupt programma heeft nu 208µs de tijd, wat veel is in µC termen, om in register C een nieuwe waarde te zetten. Deze waarde is afkomstig van een 18 bit schuifregister. Afhankelijk het doorgeschoven bit, met als logische waarde 0 of 1 wordt respectievelijk register C geladen met 26µs of 182µS. De software houd ook bij hoeveel bits er zo al zijn doorgeschoven. Zijn er 18 bits doorgeschoven, dan moet de software  rekening houden of er nu een pauze moet volgen tussen 2 keer dezelfde reeks databits, of er een pauze moet komen voor een nieuwe reeks databits. In het eerste geval zal de software 6 keer na elkaar 0µs laden in register C. Als register B register C heeft overgenomen op het moment dat register A 0µs is, zal voorwaarde B > A nooit waar zijn, er komt geen puls op uitgang RC2. Bij een pauze tussen een nieuwe reeks databits, zal het interrupt programma een vlagje zetten om zo aan het hoofdprogram duidelijk te maken een nieuwe reeks van 18 databits klaar te zetten. Hiervoor heeft het hoofdprogramma 20x208µs= 4160µs de tijd, dit is echt een eeuwigheid in µC termen. :)



Nu is deze techniek niet direct toe te passen bij DCC puls opwekking. Voor zij die DCC formaat wat kennen weten dat de pulsbasis ook variabel is. Het interrupt program moet dan ook ingrijpen in register A, maar onmogelijk is het niet. En bij  Mfx…, daar zwijgen we best over om dit zo te doen, hierbij komt er ook nog eens faseverschuiving, zodat je niet altijd start met een positieve puls, deze kan ook starten met een negatieve puls.
 
Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet In/Output

Offline dani

  • Forumlid
  • Berichten: 5.813
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Pendelautomaat voor digitale treinen
« Reactie #3 Gepost op: 09 september 2013, 20:21:09 pm »
heel interessante materie waar ik zo'n &nderhalf jaar geleden ook mijn hoofd over gebroken heb om het allemaal uit te vissen.
De manier waarop je het uitlegt en beschrijft is zeer duidelijk en simpel, dat is een pak makkelijker te lezen dan het gebrabbel dat je op het  "tinternet" vindt .

Interessant om te volgen, ik ga mee :-)
QUICK...  Switch off that fan, before something brown hits it !

Offline Geert

  • Forumlid
  • Berichten: 1.642
    • Homepage
  • Voornaam: Geert
Re: Pendelautomaat voor digitale treinen
« Reactie #4 Gepost op: 10 september 2013, 17:16:45 pm »
Terugmelders:
 
We kunnen al een loc aansturen, het vermogensdeel moet nog wel besproken worden. Terugmelders zijn belangrijk om te weten waar je locs zich op de baan bevinden. Zo kunnen we deze laten afremmen en deze juist te laten stoppen. Net voor een stootblok bijvoorbeeld.
 
Nu de bedoeling is een pendelautomaat te bouwen met µC en een minimaal aan onderdelen. Dat gaan we dan ook doen, en dan het liefst nog betrouwbaar, storingsongevoelig en snel. Ook voor terugmeldingen met stroomdetectie hebben we maar enkel basiscomponenten nodig.


 
In de PIC µC die we gaan gebruiken zijn 14 ingangen voorzien die je kan gebruiken om analoge metingen (spanning) uit te voeren. Maar dit kan maar één voor één uitgevoerd worden. De software zal één van de 14 ingangen naar een AD (Analoog naar Digitaal) convertor leiden, zie tekening. Maar welke spanning gaan we meten? Een positieve spanningsval over een diode, in ons geval de goedkoopste een Si-diode. Maar omdat het digitaal signaal een wisselspanning is (zie later) moet we er voor zorgen dat ook het negatieve signaal de loc bereikt. Daarom schakelen we een bijkomende diode anti parallel over de andere. De spanningsval over de diode zal er pas zijn als deze geleid omdat er stroom doorvloeit.  Nu zijn er twee manieren hoe dat kan:
 
De eerste is via een verbinding met een gescheiden deel in  de midden geleider van een drierail systeem. Als de sleper over een gescheiden deel  komt, en zijn stroom moet afnemen via beide diodes, dan zal er afhankelijk van de polariteit van het digitaal signaal een positieve spanningsval staan van +0,6V over de ene dioden of een negatieve spanningsval van -0.6V over de andere diode. Omdat de AD convertor in de µC enkel positieve spanningen kan meten tussen 0 en +5V. Moet deze weten wanneer er een positieve polariteit op de treintafel staat. Gelukkig weet de µC dat, want hij wekt ze zelf op.  ;)
 
De tweede manier is via een onderbreking in één van de rails. Deze onderbreking wordt  verbonden met een weerstand van 10k met de dioden. Als er een wiel (wel een wiel die doorverbonden is via de as) een sluiting veroorzaakt met de ander rail, zal via R 10k een stroom vloeien door de diode die weer die spanningsval veroorzaakt van +0,6V.
 
Je zou kunnen zeggen dat deze schakeling zowel stroomdetectie als massadetectie kan uitvoeren, wat ook zo is… Nu echte massadetectie is dit niet, want als je de tekening bekijkt, is rode draad met de massa en de middenrail verbonden. En op de bruine draad, deze van de rails staat het digitaal signaal tussen -18 en +18V. Dit is zo uitgevoerd om stroomdetectie te kunnen uitvoeren. Later meer over het versterkte digitale signaal.
 
Nu, de AD convertor heeft aan zijn ingang al of niet een spanning van ongeveer 0,6V staan (bij gebruik Si-diode). Deze spanning wordt omgezet door de AD convertor naar een binair getal. Dit getal wordt softwarematig verder verwerkt.
 
Nu is stroomdetectie, gevoelig aan al of niet stroomafname door de loc of slecht wielcontact, wat er voor kan zorgen dat er net geen spanning op de ingang van de AD convertor staat.  Ook stoorsignalen kunnen er voor zorgen dat er even 0,6V staat die er eigenlijk niet hoort te zijn. Daarvoor is er een stukje software geschreven die er voor zorgt dat 60% van de metingen minstens een spanningsval moet zijn van meer dan 0,5V Dan alleen zal een meldercontact (M1) logisch 1 worden.  Andersom moet er 30% van de metingen minder dan 0,5V meten om de melder M1 terug uit te schakelen.  Gelukkig is de AD conversie ongelooflijk snel. En voor elk van  de 14 ingangen zullen 20 metingen nog altijd maar een fractie van een seconde duren.

Het spreekt voor zich dat op de tekening hierboven niet alle diodes en weerstanden per ingang getekend zijn. Ook de software in de µC is sterk vereenvoudigd.


Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet In/Output

Offline Havoc

  • Forumlid
  • Berichten: 6.275
  • Voornaam: Johan
Re: Pendelautomaat voor digitale treinen
« Reactie #5 Gepost op: 10 september 2013, 21:55:08 pm »
Wow zeg, dat is zowaar een hele cursus! Niet direct bruikbaar voor waar ik mee bezig ben maar de achterliggende gedachtengang is toch wel goed om weten.
Expert in non-working solutions.

Offline Geert

  • Forumlid
  • Berichten: 1.642
    • Homepage
  • Voornaam: Geert
Re: Pendelautomaat voor digitale treinen
« Reactie #6 Gepost op: 13 september 2013, 12:10:06 pm »
Vermogen deel: (Booster)

Hier kan ik kort over zijn. Deze heb ik niet zelf ontworpen. Ik gebruik het schema zoals beschreven in de link MR Direct van Marco Roede, onder link Booster en 'eenvoudige zelfbouw booster'.  Deze Booster wordt aangestuurd door de Com Poort  van een PC, dus pulsen tussen -10V en +10V. De µC kan enkel pulsen uitsturen tussen 0 en +5V. Geen probleem want er waren nog wat vrije ingangen over op een MAX232 convertor (zie schema hieronder)  die gebruikt gaat worden om de EEPROM van de µC te uploaden.  0V wordt zo +10V en +5V wordt zo -10V. Jawel de MAX232 inverteert het digitale signaal ook nog is, net wat ik nodig had om stroomdetectie te kunnen uitvoeren via de midden geleider rails….


Platte grondje van pendelautomaat


Zelf bouw booster in testopstelling


Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet In/Output

Offline philippe_007

  • Forumlid
  • Berichten: 2.502
  • Märklin Digitaal - K-spoor - NMBS (Stoom - Diesel)
    • MSC Het Spoor
  • Voornaam: Philippe
Re: Pendelautomaat voor digitale treinen
« Reactie #7 Gepost op: 13 september 2013, 17:06:36 pm »
Zeer interessant, blijf ik zeker volgen.

Geert,
heb je zo'n idee wat het ongeveer zal kosten om een trein te laten pendelen tussen punt A en B?

mvg,
Philippe

Offline argilla

  • Forumlid
  • Berichten: 3.108
  • Voornaam: Marc-Laurent
Re: Pendelautomaat voor digitale treinen
« Reactie #8 Gepost op: 13 september 2013, 17:18:23 pm »
wat opvalt bij Geert is het minimum aantal elektronische componenten . Heb zo een booster open geprutst van Roco ( was heel goed verzegeld en afgeplakt schrik voor namaak door Chinezen ?) daar zat heel wat meer in. Wat pleit ten goede voor Geert zijn aanpak.  :D
Blijf het volgen.
argilla
H0, On30, 1/29, Gn15

Offline conducteur

  • Forumlid
  • Berichten: 6.018
  • As a finishing touch, God created the dutch!
    • http://www.treinbaanrian.be
  • Voornaam: Rian
Re: Pendelautomaat voor digitale treinen
« Reactie #9 Gepost op: 13 september 2013, 18:10:10 pm »
Ziet er zeer goed uit!
Rian 2-Rail DCC NMBS TPIII
Grote Modeltreinruilbeurs Blankenberge Pasen 2016
Zaal Forum

Offline Geert

  • Forumlid
  • Berichten: 1.642
    • Homepage
  • Voornaam: Geert
Re: Pendelautomaat voor digitale treinen
« Reactie #10 Gepost op: 13 september 2013, 20:04:31 pm »


Geert,
heb je zo'n idee wat het ongeveer zal kosten om een trein te laten pendelen tussen punt A en B?

mvg,
Philippe

Daar vraag je wat. De gebruikte microcontroller is wel eentje die heel veel kan met heel veel uitgangen. Het kan ook goedkoper, maar deze die ik gebruik kost ongeveer drie euro. Met een beetje randelektronica komt daar nog eens vijf euro bij. So wat, afgerond tien euro (zonder transfo). Ik kan best begrijpen dat dit duur is  ;)  Nee dus, gewoon goedkoop en ik wil best helpen bij de programmatie van de µC...

Maar laat mijn verhaal eerst afmaken, ik probeer nu een filmpje te maken met mijn pendelautomaat.  8)

Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet In/Output

Offline philippe_007

  • Forumlid
  • Berichten: 2.502
  • Märklin Digitaal - K-spoor - NMBS (Stoom - Diesel)
    • MSC Het Spoor
  • Voornaam: Philippe
Re: Pendelautomaat voor digitale treinen
« Reactie #11 Gepost op: 13 september 2013, 22:45:21 pm »
Ik zal dit zeker volgen tot het einde, en wie weet zelf ook eens uitproberen....
Laat maar komen al die nuttige info

Offline Geert

  • Forumlid
  • Berichten: 1.642
    • Homepage
  • Voornaam: Geert
Re: Pendelautomaat voor digitale treinen
« Reactie #12 Gepost op: 14 september 2013, 10:08:21 am »
Opdracht code

De opdracht code, vanaf nu ‘opcode’ genoemd, zijn een reeks  instructies die de µC gebruikt om opdrachten uit te voeren. Dit is niet de machinecode die de µC verstaat, het is wel een zelf verzonnen code die de µC ontleed, stap voor stap, en er iets nuttig mee doet. Deze opcode is een binaire code bestaande uit 2 bytes. Het is deze binaire code die de µc analyseert. Maar om die instructies rechtsreeks te programmeren in binaire code, is onbegonnen werk, en fouten zijn zo snel gemaakt.
 
Om die binaire instructies eenvoudig op te stellen,  heb ik een Exel programma geschreven die een iets leesbare instructie omzet naar een binaire opcode. Hieronder heb ik een printscreen gemaakt van dit Exel programma. Het rode gedeelte is wat de gebruiker invoert. Het groene gedeeld moet, voorlopig toch, via copy paste in het ASM-program gekopieerd worden. Daarna wordt het assembler program geassembleerd en als binaire code in de µC overgeladen. Zeer omslachtig natuurlijk. De bedoeling is wel ooit deze code via een hogere programmeertaal,  Visual BASIC?, om te zetten naar die binaire code. En dan rechtstreeks  via COM of USB poort te uploaden in de EEPROM van de µC. De nodige hardware is al voorzien daarvoor, mijn kennis van hogere programmeertalen spijtig genoeg nog niet. (niet meer eigenlijk…)
 

 
We gaan die tabellen eens ontleden en zien wat er gebeurd met de sturing.  Achter Lok1 tot en met Lok4 in het rode tabelletje (loknr) voer je het decimale adres in van de Lok.  Deze wordt automatisch omgezet naar een trinair bit-adres.  Ook al gebruiken we maar één lok, toch moeten er dan nog drie fictieve bijkomende adressen ingevuld worden. Is dit een tekortkoming?, eigenlijk niet, dit maakte het assembler programma  eenvoudiger te schrijven.
 
In de tweede rode tabel  (tabel A B en C) voeren we min of meer leesbare instructies in, die stap voor stap zo worden uitgevoerd.
 
In tabel A , komen de voorwaarden in om een stap verder te mogen.  Deze voorwaarde moet altijd ‘1‘ zijn om de tabellen B en C te mogen uitvoeren. We verklaren even deze voorwaarden:
 
SS: hier beginnen we altijd mee dit is een fysieke Start/Stop  schakelaar die eerst op Start ‘1’ moet gezet worden voordat het programma kan beginnen opcodes uit te voeren. Heel belangrijk om weten is, indien je tijdens het afloop van deze opcodes  je de schakelaar op STOP zet ‘0’, het programma toch blijft doorlopen totdat deze terug herbegint bij de eerste regel. Dit is zo uitgevoerd omdat de Loks altijd in een bepaalde begintoestand moeten staan. Laat je de schakelaar op Start staan, dan herbegint de µC terug bij opdrachtregel 1. Wil je wel direct stoppen, dan is er wel een Noodstop voorzien.

T1: Dit is een Timer functie. Als de Timer loopt, dan zal deze een logische waarde ‘0’ hebben. Pas als de timer afloopt, zal deze logisch ‘1’ worden.
 
M1 tot M14: terugmelder 1 tot 14. Deze voorwaarde wordt pas ‘1’ als er een lok over rijd.
 
In tabel B staat wie een opdracht moet uitvoeren. Dit kan Lok1 tot Lok4 (L1 tot L4) zijn; of Timer T1. Maar kan ook één van de 8 servo uitgangen, of één van de 8 binaire uitgangen zijn (later meer daar over).
 
In tabel C staat de opdracht zelf:

-Bij een Lok hebben we de volgende opdrachten: +0 tot +14: nieuwe positieve snelheid;  -0  tot -14 nieuwe negatieve snelheid; en Functie F. Deze Functie wordt als volgt voorgesteld FXXXXX, waarbij elke X een binaire ‘1’ of ‘0’ kan zijn.  De eerste bit na F is F0 van de lok, meestal de lichtfunctie. De 2de  tot 5de  bit achter F is respectievelijk F1 tot F4 van de lok. Een combinatie hiervan kan tegelijkertijd meerder functie ON/OFF zetten. Bijvoorbeeld F10100 = Zet licht aan en geluid aan (bij deze lok toch)

-Bij Timer functie staat in tabel C het aantal seconden die de timer er over moet doen om af te lopen.  (max 255 seconden) Bij het setten met een nieuwe timer waarde zal de logische waarde van T1 zelf logisch ‘0’ worden tot deze afloopt en logisch ‘1’ wordt.
 
Er zijn nog meer mogelijkheden bij de afhandeling van de opcodes die hier nog niet besproken zijn. Zo is het mogelijk meerdere opcodes tegelijkertijd uit te voeren, handig als meerdere loks aan het rijden zijn op je baan, en deze moeten ooit ergens stoppen bij een terugmeld contact.

Nu een filmpje maken met een eenvoudig testbaantje waar twee loks met geluid en lokfluit functie afwisselend rijden...


Geert
Schaal HO - digitaal zelfbouw - Favoriete Lok: V200 DB
Huidig project: LocoNet In/Output

Offline jakke

  • Forumlid
  • Berichten: 443
  • Voornaam: Jan
Re: Pendelautomaat voor digitale treinen
« Reactie #13 Gepost op: 14 september 2013, 11:24:34 am »
Knap hoor Geert , zo'n systeem uitdenken, programmeren en de gepaste hardware samen-puzzelen.
Wisselstromer via computer ,met belangstelling voor Belgische modellen

Offline dani

  • Forumlid
  • Berichten: 5.813
  • Game over. Insert coin.
  • Voornaam: Dani
Re: Pendelautomaat voor digitale treinen
« Reactie #14 Gepost op: 14 september 2013, 11:57:01 am »
dit is een heel leerrijk projectje, waar veel mensen nog wat kunnen van op steken, en dan ook nog eens in  "jip-en-janneke-taal" neergeschreven.

TOPPIE !
QUICK...  Switch off that fan, before something brown hits it !