Modelspoormagazine forum

Modelspoor, praktijk => Modelspoor-elektronica met microcontrollers => Topic gestart door: Geert op 06 september 2013, 21:52:28 PM

Titel: Pendelautomaat voor digitale treinen
Bericht door: Geert op 06 september 2013, 21:52:28 PM
Pendelautomaat voor maximaal 4 Nieuw Marklin Motorola locomotieven

Inhoud:

Doel en gebruikt formaat (http://forum.modelspoormagazine.be/index.php/topic,18599.msg225509.html#msg225509)

Marklin Motorola puls generator (http://forum.modelspoormagazine.be/index.php/topic,18599.msg225907.html#msg225907)

Terugmelders (http://forum.modelspoormagazine.be/index.php/topic,18599.msg226051.html#msg226051)

Vermogen deel (Booster) (http://forum.modelspoormagazine.be/index.php/topic,18599.msg226431.html#msg226431)

Opdracht code (http://forum.modelspoormagazine.be/index.php/topic,18599.msg226539.html#msg226539)

Servo's aansturen (http://forum.modelspoormagazine.be/index.php/topic,18599.msg226959.html#msg226959)

Voorbeeld filmpje servo aansturing (http://forum.modelspoormagazine.be/index.php/topic,18599.msg227085.html#msg227085)

Digitale uitgangen (LED uitgangen) (http://forum.modelspoormagazine.be/index.php/topic,18599.msg227216.html#msg227216)

Filmpje met twee digitale treinen met geluidfuncties (http://forum.modelspoormagazine.be/index.php/topic,18599.msg227424.html#msg227424)

Link tussen OPCODE en assembler program (http://forum.modelspoormagazine.be/index.php/topic,18599.msg229421.html#msg229421)

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.

(http://users.telenet.be/RedDeBist/MBAAN/tabel1.png)
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 :

(http://users.telenet.be/RedDeBist/MBAAN/tabel2.png)
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:

(http://users.telenet.be/RedDeBist/MBAAN/tabel3.png)
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:

(http://users.telenet.be/RedDeBist/MBAAN/tabel4.png)
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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Havoc 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.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert 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. :)

(http://users.telenet.be/RedDeBist/MBAAN/new%20marklin%20motorola%20generator.png)

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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani 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 :-)
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert 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.

(http://users.telenet.be/RedDeBist/MBAAN/ad%20covertor%20stroomdetectie.png)

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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Havoc 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.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert 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 (http://www.mrdirect.nl/) 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....

(http://users.telenet.be/RedDeBist/MBAAN/pendelautomaat.png)
Platte grondje van pendelautomaat

(http://users.telenet.be/RedDeBist/MBAAN/booster.JPG)
Zelf bouw booster in testopstelling


Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: philippe_007 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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: argilla 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.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: conducteur op 13 september 2013, 18:10:10 PM
Ziet er zeer goed uit!
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 13 september 2013, 20:04:31 PM
Citaat van: philippe_007 op 13 september 2013, 17:06:36 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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: philippe_007 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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert 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...)

(http://users.telenet.be/RedDeBist/MBAAN/opcode.png)

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
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: jakke op 14 september 2013, 11:24:34 AM
Knap hoor Geert , zo'n systeem uitdenken, programmeren en de gepaste hardware samen-puzzelen.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani 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 !
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 14 september 2013, 12:13:32 PM
Citaat van: dani 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.


:D

Wacht maar totdat ik het programma in assembler ga beschrijven, dan zullen er veel afhaken denk ik   :(

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Havoc op 14 september 2013, 12:19:39 PM
Als je er eerst een flowchart of met wat commentaar uitlegt wat er gebeurt is dat geen probleem denk ik. Tenslotte gaan diegenen die jouw project nabouwen ofwel hetzelfde gebruiken als jij (en dus gewoon overnemen) ofwel toch een andere µcontroller gebruiken (en die weten waarschinlijk wel waar ze mee bezig zijn).

Naar aanleiding van wat hier in dit stuk van het forum gebeurt heb ik besloten om toch ook maar eens iets met die dingen te proberen. De processoren zijn besteld...
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani op 14 september 2013, 13:06:14 PM
met een ATMel microcontroller zou je in principe hetzelfde kunnen doen (arduino) en voor DCC bestaan daar zelfs al library files voor om het rekenwerk en het "bit-fucken" te vermijden en het makkelijker t emaken   Of dit voor Märklin-Motorola protocol bestaat weet ik niet, maar misschien is daar een mogelijkheid om je werk de wijde wereld in te sturen, Geert !!   The   GMMTL module.   (Geert's Marklin Motorola Train Library).
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani op 14 september 2013, 13:08:47 PM
correctie : het bestaat zo te zien al ;

http://code.google.com/p/railuino/
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 14 september 2013, 13:17:23 PM
Eigenlijk is dit projectje maar een onderdeel van een groter project: een digitale zelfbouw centrale. Dan heb ik wel S88-bussen, CAN-bussen enzovoort nodig. Hierover heb ik redelijk al wat beschreven op mijn site. Maar die digitale zelfbouwcentrale is een persoonlijke uitdaging die ik niet ga beschrijven op dit forum, ik steek nu al redelijk wat tijd om dit project uit te leggen.... Hiervoor heb ik wel een zeer krachtige µC voor nodig, maar de basis is er al  ;)

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: PeterC op 14 september 2013, 14:33:03 PM
Geert,

Heel interessant draadje en heel uitvoerig beschreven!

Een gelijklopend project zit in mijn hoofd: op een deel van de baan een loc via een zelfbouwcentrale 'overnemen' er een lengtemeting op uitvoeren en afhankelijk van het resultaat de loc terug naar de (geautomatiseerde) baan sturen of deze naar een lift sturen.
Mijn grootste struikelblok was het opwekken van de MM pulstrein.  Jij bezorgt hier de oplossing op een dienblaadje  ;) .  Met strikt getimde softwareoplossing zou mijn µC in tijdsnood komen.  Aan de PWM module had ik niet gedacht...
Ook de oplossing met Max232 is eenvoudig en heel bruikbaar.

Bedankt voor deze heel interessante informatie!



Citaat van: Geert op 14 september 2013, 10:08:21 AM
...mijn kennis van hogere programmeertalen spijtig genoeg nog niet. (niet meer eigenlijk...)

Zoals jij tovert met ASM kan dat toch geen enkel probleem zijn?  Met Delphi kan ik je helpen.


Citaat van: Geert op 14 september 2013, 12:13:32 PM
Citaat van: dani 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.


:D

Wacht maar totdat ik het programma in assembler ga beschrijven, dan zullen er veel afhaken denk ik   :(

Geert

Ik al veel van je ASM programma's bekeken en daar er een massa commentaar is ingeschreven, blijft het voor velen 'leesbaar'.

Ik ben benieuwd naar het vervolg!

Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 14 september 2013, 20:51:40 PM
Citaat van: PeterC op 14 september 2013, 14:33:03 PM

Ik al veel van je ASM programma's bekeken en daar er een massa commentaar is ingeschreven, blijft het voor velen 'leesbaar'.

Ik ben benieuwd naar het vervolg!

Bedankt Peter,

in het µC draadje 'waar zijn we nu mee bezig' had ik al eens een link geplaatst naar de ASM -code voor de pendelautomaat. Deze is ondertussen al achterhaald, er stonden nog wat foutjes in. Binnenkort komt de huidige versie als link.

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: MickeyMouse op 14 september 2013, 21:23:59 PM
Citaat van: PeterC op 14 september 2013, 14:33:03 PM

Ik al veel van je ASM programma's bekeken en daar er een massa commentaar is ingeschreven, blijft het voor velen 'leesbaar'.

Doeme, waar is de tijd....Kilometers asm-code, daarna C maar toch nog gecombineerd met assembler voor de tijdskritische zaken, lang geleden:-) En dan die linker wijsmaken hoe alles op de correcte geheugenplaatsen gemapt dient te worden.

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 15 september 2013, 17:48:14 PM
Citaat van: MickeyMouse op 14 september 2013, 21:23:59 PM


Doeme, waar is de tijd....Kilometers asm-code

Geert

De tijd van ketting papier  ;) , bestaat dat nog zulke printers ?

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: philippe_007 op 15 september 2013, 18:12:15 PM
Deze bestaan zeker nog....
Dus je kan nog km'ers code schrijven ;-)
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Havoc op 15 september 2013, 20:14:14 PM
Zeker dat zo'n printers nog bestaan, op het werk hebben we er enkele. (maar daar lopen ze zeker 20 jaar achter, niet echt een referentie) En ik denk dat ik nog ergens een doos pyjama-papier heb staan...ergens.

Zo'n printers worden nog altijd gemaakt voor doorslagen te maken met carbonpapier.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: MickeyMouse op 15 september 2013, 20:28:56 PM
Facturen in de Makro zijn ook nog op zulke printers (oki's)

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 15 september 2013, 22:05:07 PM
Citaat van: Havoc op 15 september 2013, 20:14:14 PM
Zeker dat zo'n printers nog bestaan, op het werk hebben we er enkele. (maar daar lopen ze zeker 20 jaar achter, niet echt een referentie)


Ik wist niet dat je bij justitie werkte...

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 16 september 2013, 10:22:26 AM
Dat beloofde filmpje zal nog wat moeten wachten. :( Ben er achter gekomen dat Marklin Mfx decoders niet altijd goed reageren op MM2 digitale signalen. Vooral bij geluid functies kan er wat mis lopen. Eerst uitzoeken waar het mis gaat, maar de treinen rijden al op mijn pendelautomaat.  :) Dus kan ik mijn verhaal verder vertellen...

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 16 september 2013, 20:10:29 PM
Servo's aansturen.

Waarom servo's? gewoon handig om wissels om te zetten, of  loodspoorten en slagbomen te openen of sluiten. En niet onbelangrijk, redelijk stil en goedkoop zijn die dingen.  Zeker van die blauwe kleintjes (geen smurfen  :) ) 2€ het stuk maar (spijtig wel ineen gestoken door die gele kleintjes  :-[ ).  Deze pendelautomaat is voorzien om rechtstreeks 8 servo's aan te sturen. Hoe doe je dat, gewoon in de opcode na de voorwaarde aan te duiden welke servo S1 ... S8 je wil laten bewegen. Dat laten bewegen gaat gewoon door de referentiepuls te veranderen.

Bijvoorbeeld: M1 S1 100 = als terugmelder M1  '1' is, dan verzet servo S1 naar een referentiepuls van 1ms;  en:  M1 S1 200= ... servo naar 2ms. Ik hoop dat je weet wat een referentiepuls van 1ms betekend bij een servo? Dit zijn gewoon pulsen van 1ms die elke 20ms (50Hz) herhaalt worden, en die als referentiepuls dienen voor de interne elektronica van de servo. Een denkbeeldig voorbeeld: bij 1ms pulsen zal de servoarm 0 graden zijn, bij 2ms, 180 graden (wel graden van een hoek hé ). Nu ik gebruik servo's die werken tussen 0,5ms tot 2,5ms als referentiepuls, en te programmeren achter S1 ... S8 als 50 en 250, of er iets tussen  182 = 1,82ms bijvoorbeeld. Maar ook de meer klassieke servo's met een puls bereik tussen 1ms tot 2ms kan je zo aansturen.

Nu, servo's zijn eigenlijk niet echt zo stil, ze zoemen lichtjes als je ze continue pulsen aanbied. Ze verbruiken dan ook nog wat stroom en slijten mechanisch zo veel sneller.  Een handige eigenschap van servo's is, dat als de pulsen stoppen de servo in de laatste positie blijft staan. Mechanisch kan je deze wel verdraaien, maar daar heb je redelijk wat kracht voor nodig. Dat stoppen van die pulsen gaat de µC dan ook doen, oef.... 

Nog een eigenschap van servo's is, dat ze heel snel zijn. Van 0 graden naar 180 graden gaat in een fractie van een seconde. Dit is eigenlijk niet zo leuk als je een loodspoort wil openen of een wisseltong wil verplaatsen. Met een µC  kan het ook zo: was de laatste servo opdracht  1ms en je geeft een nieuwe opdracht om naar 2ms te gaan, dan zal de µC dit geleidelijk aan doen 1,00ms, 1,01ms 1,02ms ... 1,99ms, 2,00ms. Elke 20ms een stapje verder. Dit is al wat realistischer. (voor de Limburgers, het kan nog trager als het moet...)

(http://users.telenet.be/RedDeBist/MBAAN/servo%20uitgangen.png)

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 17 september 2013, 17:36:37 PM
Voorbeeld filmpje servo aansturing

Het volgende FILMPJE (http://youtu.be/ppwCFZqd56I) geeft een voorbeeld weer hoe het digitale pendelautomaat servo's kan aansturen. Ik stuur via opcodes elke seconde nieuwe pulsen door.  En dit komt neer als de volgende opcodes, de digitale opcodes geef ik niet weer, wel de iets meer leesbare:

....
SS S1 50     <-- start Servo 1 met pulsen van 0,5ms
T1 T1 1        <--wacht 1 seconde
T1 S1 60      <-- nieuwe positie servo 1 met pulsen van 0,6ms
T1 T1 1        <-- wacht weer 1 seconde
....                <--enz....
T1 S1 250     <-- uiteindelijk komen we aan bij pulsen voor servo 1 van 2,5ms
T1 T1 5          <-- wacht 5 seconden
T1 S1 50        <-- Ga terug naar beginpositie servo 1:  0,5ms



Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 18 september 2013, 15:47:25 PM
Digitale uitgangen (LED uitgangen)

Er zijn op het pendelautomaat 8 binaire uitgangen voorzien die aan (ON) of uit(OFF)  gezet kunnen worden, en dit via de volgende opcode achter de voorwaarde:

M1 BON 1           --> als Terugmelder  1 ='1' dan Binaire uitgang  1 ON (actief)
...
T1 BOFF 1           --> als Timer 1 afloopt dan Binaire uitgang 1 OFF

Handig om weten is dat een PIC µC zijn uitgangen van het type 'High current source/sink for direct LED drive' zijn, vrij vertaald je kan als de uitgang logisch '0' is een LED aansturen die via R verbonden is met +5V. Of je kan, als de uitgang logisch '1' is ook een LED aansturen die via R verbonden is met de massa. Wel rekening houdend dat elke uitgang maximum 25mA kan uitsturen, wat al veel is voor een LED. Als je de beide mogelijkheden combineert, kan je met één uitgang twee LED's aansturen waarvan er één oplicht, bijvoorbeeld een groene LED en een rode LED, zo bekom je een simpele sein. Op de volgende tekening kan ik zo als de uitgang BON (1) is een groene LED laten oplichten, en als de uitgang BOFF (0) is een rode LED laten oplichten.  (niet alle LED's zijn getekend) Wil je een iets realistischer sein bekomen met om ook  oranje LED's, dan heb je wel meerder uitgangen nodig.

(http://users.telenet.be/RedDeBist/MBAAN/digitale%20uitgangen.png)

Het is mogelijk, wel nog niet voorzien, dat je LED's kunt laten pinken. Handig bij overweglichten, ooit er eens bij programmeren denk ik...

Het kan zijn dat die 25mA wat weinig is, met één zeer goedkope ULN2803 kan je de 8 digitale signalen eenvoudig versterken zodat je maximum 500mA kan aansturen. Ik heb dit al eens toegepast om Marklin K rails wissels om te zetten. Met 8 versterkte digitale uitgangen kan je zo 4 wissels omzetten in een nieuwe stand. Wel rekening houden dat je de uitgang na 1 seconde terug uit zet: zo dus:

M1 BON 1           --> als terug melder 1 = ,1' dan Binaire uitgang 1 ON
M1 T1 1              --> terugmelder 1 start ook timer 1 voor 1 seconde
T1 BOFF 1           --> als timer 1 na 1 seconde afloopt dan Binaire uitgang 1 OFF

Ik ga nu niet direct uit de doeken doen hoe je een ULN2803 aansluit op een PIC µC. Ik heb dit al is eerder gedaan, en een beschrijving ervan kan je vinden op DEZE (http://users.telenet.be/RedDeBist/MBAAN/Wissels%20aansturen%20met%20maklin%20mobiel%20station%201.htm) link.

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani op 19 september 2013, 12:13:36 PM
voor wissels is 1 sekonde al ruim gerekend denk ik.   Met mijn arduino sturingen gebruik ik pulsen van 200 tot 300 mSec en dat is voldoende bij normale wisselbedieningen van Märklin.
Ik vermoed dat dat ook geldt voor andere merken.  (tenzij de speciale trage wisselbedieningen van bvb Viessmann, denk ik)
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 19 september 2013, 12:25:39 PM
Weet ik, maar mijn timerbasis is 1seconde  ;)

Goeie wisselaansturingen op basis van spoelen zouden als ze geschakeld zijn de stroom zelf al onderbreken. Denk ik tenminste...


Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani op 19 september 2013, 12:35:45 PM
juist; dat is zeker zo, behalve bij de oudere modellen.  en aangezien ik er vabn die ouwe rakkers nog flink wat heb (40-tal) heb ik de aanpassing gemaakt.  dus wat je zegt is correct, 1 sekonde moet kunnen, langer zelfs ook nog als je wissels met afschakeling hebt.

Mijhn volgende vraag daarbij dan is hoe je meerdere wissel na elkaar stuurt.  Wacht je tot je timer van 1 skonde is afgelopen en ga je dan naar de volgende of stuur je ze in parallel aan ?   bijvoorbeeld als je een "tracé" wil automatiseren waarbij je 5 wissels moet omleggen... dan is het handig als die na elkaar schakelen (om je voeding wat te kunnen  sparen kwa vermogen) maar toch niet te lang tussenpozen hebben.   Daar lag mijn compromis op 200 a 300 mSec.   Ik heb een aantal "presets" in mijn baan gebouwd zodat treinen een bepaald traject rijden naargelang hoe ik klik op het pc scherm   (ik gebruik geen standaard  out of the box software genre koploper of itrain of zo maar eigen gemaakt softwarespul)
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 19 september 2013, 13:32:13 PM
Ik kan ze enkel maar na elkaar schakelen, dus vier (maximum via deze methode) wissels omzetten duur net iets meer dan 3 seconden (de vierde seconde is enkel om de spoelbekrachtiging terug uit te schakelen, maar hij is dan al geschakeld).

Maar dit is maar bijzaak, ik kan wel 8 wissels omzetten via de servo uitgangen   :D

Bij de servo sturing is het wel zo dat er maar 1 gelijkertijd kan bewegen, deels om de voeding wat te sparen maar vooral om de software eenvoudiger te houden.

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani op 19 september 2013, 13:40:04 PM
wel, zelfs dan nog....   hoe vaak gebeurt het dat je  inderdaad meer dan 2 a 4 stuks na elkaar moet schakelen...  en je moet al  hele snelle treinen hebben om dat traject in die tijd te berijden  (of je wissels moeten vlak na elkaar liggen op een stations- f rangeerbereik).

In elk geval,  het werkt, en dat is het belangrijkst.   Ikheb hiervoor in de software   (aan de pc kant) gezorgd dat de pc de toestand van de wissels onthoudt en enkele degene schakelt die niet correct staan;  Dat scheelt ook al weer.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 19 september 2013, 18:54:03 PM
Nog een FILMPJE (http://www.youtube.com/watch?v=mWGbntJn-gg&feature=youtu.be). Hier kan ik al twee digitale treinen laten rijden op een simpel traject. Hierbij nog geen wisselaandrijving, seinen of wat dan ook. Gewoon laten zien wat dit kan. Geniet...

Let ook met het probleem dat ik nog altijd heb met de stoomlok en geluidfuncties die wegvallen. Dit zit ergens in de decoder van de loc.  >:(


Dit zijn de opcodes die je ziet:

      
      DE 0x8F, 0x10               ;SS L1 +0
      DE 0x8F, 0x94               ;SS L1 F10100
      DE 0xCF, 0x0A               ;SS T1 10
      DE 0x8E, 0x96               ;T1 L1 F10110
      DE 0xCE, 0x01               ;T1 T1 1
      DE 0x8E, 0x94               ;T1 L1 F10100
      DE 0x8E, 0x1A               ;T1 L1 +10
      DE 0xCE, 0x14               ;T1 T1 20
      DE 0x8E, 0x96               ;T1 L1 F10110
      DE 0xCE, 0x01               ;T1 T1 1
      DE 0x8E, 0x94               ;T1 L1 F10100
      DE 0xC0, 0x03               ;M1 T1 3
      DE 0x8E, 0x12               ;T1 L1 +2
      DE 0x81, 0x10               ;M2 L1 +0
      DE 0xC1, 0x05               ;M2 T1 5
      DE 0x8E, 0x80               ;T1 L1 F00000
      DE 0xCE, 0x0A               ;T1 T1 10
      DE 0xAE, 0x94               ;T1 L3 F10100
      DE 0xCE, 0x0A               ;T1 T1 10
      DE 0xAE, 0x1C               ;T1 L3 +12
      DE 0xCE, 0x05               ;T1 T1 5
      DE 0xAE, 0x96               ;T1 L3 F10110
      DE 0xCE, 0x01               ;T1 T1 1
      DE 0xAE, 0x94               ;T1 L3 F10100
      DE 0xCE, 0x04               ;T1 T1 4
      DE 0xAE, 0x96               ;T1 L3 F10110
      DE 0xCE, 0x01               ;T1 T1 1
      DE 0xAE, 0x94               ;T1 L3 F10100
      DE 0xC0, 0x02               ;M1 T1 2
      DE 0xAE, 0x12               ;T1 L3 +2
      DE 0xCE, 0x04               ;T1 T1 4
      DE 0xAE, 0x96               ;T1 L3 F10110
      DE 0xCE, 0x01               ;T1 T1 1
      DE 0xAE, 0x94               ;T1 L3 F10100
      DE 0xA2, 0x10               ;M3 L3 +0
      DE 0xC2, 0x0A               ;M3 T1 10
      DE 0xAE, 0x80               ;T1 L3 F00000
      DE 0xCE, 0x0A               ;T1 T1 10


Nu volgt de grotere uitdaging 4 treinen met wissels, seinen enz... echt laten pendelen. ;) 

Geert

Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: dani op 19 september 2013, 19:09:10 PM
1.  "Alle begin is moeilijk"
+
2. "Dit is een heel goed begin".

=   "dit komt helemaal goed",  echt respect voor wat je hier presteert in volledige zelfbouw en -ontwikkeling.
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: philippe_007 op 19 september 2013, 19:20:34 PM
Dat ziet er goed uit,
ik blijf het volgen en wie weet dat ik dit ooit wil gebruiken...
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 20 september 2013, 17:17:24 PM
Het is nog niet gedaan, maar zo ziet het pendeltoestelletje er nu uit:

(http://users.telenet.be/RedDeBist/MBAAN/testpendelautomaat.jpg)

hardwarematig nog wat werk dus...

software:
-nog altijd uitzoeken waarom de stoomlokomotief (zie filmpje (http://www.youtube.com/watch?v=mWGbntJn-gg&feature=youtu.be) zijn geluid afzwakt als de snelheid mindert?
-seriële communicatie met PC waarmee je dit pendelautomaat kunt instellen.
-via deze seriële communicatie zou het ook mogelijk moeten worden, te volgen in welke stap deze zit, en de servo's in te stellen.

Allé, dus software ook nog heel wat werk  8)

Ondertussen nog met twee andere projectjes bezig.


Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: argilla op 20 september 2013, 17:26:05 PM
Geert, mooi gedaan
Een klein vraagje. Zou het mogelijk zijn die opstelling test, filmpje, ook eens te doen met een twee rail ipv drie rail ? Thx  ;)
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 20 september 2013, 17:28:54 PM
Citaat van: argilla op 20 september 2013, 17:26:05 PM
Geert, mooi gedaan
Een klein vraagje. Zou het mogelijk zijn die opstelling test, filmpje, ook eens te doen met een twee rail ipv drie rail ? Thx  ;)

Citaat van: Geert op 20 september 2013, 17:17:24 PM

Ondertussen nog met twee andere projectjes bezig.



;)

Geert
Titel: Re: Pendelautomaat voor digitale treinen
Bericht door: Geert op 01 oktober 2013, 14:24:54 PM
Link tussen OPCODE en het assembler program:

We gaan nu een stapje verder in de link tussen de opcode en de machine taal (assembler-code die de µC echt verstaat). Die opcode is niet zomaar een verzonnen code. Er zit wat logica in, die het assembler programma vereenvoudigd. Ik ga nu een techniek bespreken die 'berekende sprongadressen' wordt genoemd. Het komt er op neer dat we de instructieteller van de µC gaan beïnvloeden door er een waarde bij te tellen. De instructieteller springt dan wat verder naar een nieuwe positie in het programma. Op deze nieuwe locatie staat een gewone sprongopdracht, een GOTO, naar een locatie in het µC programma waar de opcode verder verwerkt wordt. De waarde die bij de instructieteller wordt bijgeteld zit deels in de opcode.

Ik heb al eerder verteld dat de opcode bestaat uit 2 bytes nl. OPCODEB1 en OPCODEB2. OPCODEB1 is opgesplitst in 8 bits: B7...B0.

In de eerste 4 bits B3,B2,B1 en B0 zit een sprongadres in verwerkt naar de voorwaarde om de OPCODE te mogen uitvoeren respectievelijk voorwaarde M1;...M14; T1 en SS. Het zijn deze 4 bits die bij de instructieteller worden opgeteld om verder te springen in het programma waar een GOTO staat. Op de nieuwe locatie in het programma, nadat er via een GOTO opdracht naar toe is gesprongen ,gaat de µC na of de voorwaarde is voldaan.

Is de voorwaarde voldaan, dan gaat het programma na wie de opdracht moet uitvoeren. Deze zit verwerkt in bits B7,B6,B5 en B4 van de opcode. Ook deze 4 bits worden bij de instructieteller opgeteld om zo via een GOTO opdracht de opdracht uit te voeren.

De nieuwe locsnelheid, locfuncties, timerwaarde, servowaarde of binaire waarde zit verwerkt in OPCODEB2.

In het assembler program wordt nog veel meer gebruik gemaakt van berekende sprongadressen om het programma te vereenvoudigen. Ik weet niet of deze techniek ook bestaat in een iets hogere programmeertaal zoals C of JAL?

Voor de geïnteresseerden het ASM programma als LINK (http://users.telenet.be/RedDeBist/MBAAN/pendelautomaat_v1p1.asm). Het programma is nog niet af, werkt wel (zie filmpje hiervoor), maar maakt wel duidelijk wat ik bedoel met berekende sprongadressen.

Nu eerst het DCC protocol opwekken met dezelfde logica zoals hiervoor beschreven. Gelukkig heb ik 2 multiprotocol locomotieven, die zowel MM2 als DCC verstaan, om dit te testen  :).

Geert