Waar zijn we nu mee bezig ? Microcontrollers

Gestart door ToThePoint, 13 januari 2012, 10:27:28 AM

PeterC

citaat:
Geplaatst door Gerolf

citaat:
Geplaatst door PeterC
Ik bak patatjes.  Patatje per patatje omkeren en laten bakken (hoofdroutine - main loop).  De bel gaat! Interrupt!  Ik ga naar de voordeur en ontvang de post.  Ik keer terug naar mijn fornuis (RETI - return from interrupt)
Maar je kan toch ook in je hoofdlus "af en toe" luisteren naar de bel en dan een routine starten - of even onthouden dat je zo dadelijk naar de voordeur gaat? Wat is het voordeel?



Om het interrupt-verhaal verder te zetten: die bel!  Dat is de interrupt!

Ik kan het ook als volgt vertellen om in Gerolf's verhaal te komen:

Patatjes bakken, pan even van het vuur, naar de voordeur gaan en kijken.  De postbode is er nog niet.  Terug naar het fornuis, patatjes bakken.  Als ieder patatje gekeerd is (vast punt in de routine) terug patatjes van het vuur, terug naar de voordeur,...

Verschil: met een interrupt verlies ik veel minder tijd.  Moeder gaat niet zagen dat de patatjes nog niet klaar zijn en dat ik blijf aperitieven [^] want ik ga enkel naar de voordeur als de postbode er daadwerkelijk is; de kans bestaat ook dat hij in het geheel niet komt terwijl ik aan het bakken ben en dan heeft moeder veel te lang op haar honger gezeten terwijl dit niet nodig was... [;)]


Groetjes, Peter


Geert

citaat:
Geplaatst door Gerolf

Ik heb een wat algemene vraag voor mensen die al eens met een ?C gepuzzeld hebben:
Gebruiken jullie interrupts of niet?




Nu vraag je wel iets over een onderwerp dat meestal veel later aan bod komt als je met ?C begint. Zoals hiervoor al aangehaald, interrupts gebruik je heel vaak in tijdskritische situaties.  Maar als je het slim aanpak,  vereenvoudigd dit ook je programmeerwerk.  Zeker als je werkt met meerdere bronnen van interrupts.

Geert



Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

mini-bs

wanneer pic's als DCC-decoder gebruikt worden blijken ze ook met interrupts te werken. DCC (en waarschijnlijk ook de Motorola-familie) zit immers in een vast periodestramien dat toelaat om 1'n en 0'n van elkaar te onderscheiden.
Een techniek die blijkbaar gebruikt wordt is om bij een opgaande flank van de blokgolf een sequentie te starten en 87 microsecs later via een interrupt een meting te doen op het signaal. Is dat signaal op dat moment nog hoog dan wordt een 0 gemeten, is het signaal dan alweer laag dan hebben we een 1 te pakken.



bron= bahn-in-haan.de

Het zou allicht interessant kunnen zijn om de werking en programmering van pic's als decodertje in een ander draadje te behandelen want hier zou het wat te ver leiden van het eigenlijke onderwerp, nl programmeren van PIC's in het algemeen, maar ik meld het toch even als voorbeeld.
 

Geert

citaat:
Geplaatst door mini-bs

wanneer pic's als DCC-decoder gebruikt worden blijken ze ook met interrupts te werken. DCC (en waarschijnlijk ook de Motorola-familie) zit immers in een vast periodestramien dat toelaat om 1'n en 0'n van elkaar te onderscheiden.
Een techniek die blijkbaar gebruikt wordt is om bij een opgaande flank van de blokgolf een sequentie te starten en 87 microsecs later via een interrupt een meting te doen op het signaal. Is dat signaal op dat moment nog hoog dan wordt een 0 gemeten, is het signaal dan alweer laag dan hebben we een 1 te pakken.




Deze techniek wordt algemeen gebruikt. Bij MM protocol is het wel zo dat een lange puls een 1 is en een korte puls een 0.

Bij Mfx is deze techniek niet zo bruikbaar. Elke bit begint bij een ompoling van het digitale signaal. Dit kan van min naar plus zijn of andersom. Het belangrijkste is hetgeen de volgende 100?s gebeurd. Indien na 50?s er terug een ompoling is van het digitale signaal, dan is het bit een logische '1' (inclusief de resterende 50?s om zo tot 100?s te komen).  Gebeurd dat pas na 100?s, dan is het bit een logische '0' .

Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

Klaas Zondervan

citaat:
Geplaatst door Geert

Bij MM protocol is het wel zo dat een lange puls een 1 is en een korte puls een 0.
Iets precieser: twee lange pulsen vormen een 1, twee korte pulsen een 0, en een lange en een korte achter elkaar een z.g. indifferent of open bit. In de nieuwe versie van MM kennen we nog een vierde toestand, gevormd door eerst een korte en dan een lange puls.

Let wel dat het MM protocol polariteitsgevoelig is. Als je het verkeerdom aansluit zal er iets heel anders uit komen. De moderne decoders weten dat wel weer "rechtop" te zetten, maar de decodering wordt dan wel een pak ingewikkelder.

Geert

Ik beschouw het MM protocol als een zuivere binaire code waar de data paar-gewijs (per twee) gecodeerd wordt. Als je blijft denken in trinaire data dan blijft het ingewikkeld...

Het MM protocol is polariteitsgevoelig, maar bij 3 rail kan dit nooit een probleem zijn. Je decodeerd altijd het signaal van de sleper t.o.v. de wielen (massa)

Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

Klaas Zondervan

Als je MM beschouwt als binair, dan moet je toch het oorspronkelijke idee van Motorola vertalen? Of zie ik het nu te somber?

Op 3-rail is MM inderdaad geen probleem, zolang je de draadjes correct aansluit. Maar er zijn ook 2-railers die MM gebruiken. En daarvoor zijn die decoders bedacht die het signaal uit zichzelf terug omkeren als ze zien dat het "ondersteboven" staat.

PeterC

citaat:
Geplaatst door Klaas Zondervan

Op 3-rail is MM inderdaad geen probleem, zolang je de draadjes correct aansluit. Maar er zijn ook 2-railers die MM gebruiken. En daarvoor zijn die decoders bedacht die het signaal uit zichzelf terug omkeren als ze zien dat het "ondersteboven" staat.



Kijk naar de lange pauze na de twee bijeenhorende pulstreinen: als die 0 is, zit je goed, is die 1, dan staat je signaal 'ondersteboven'.
Het principe van die (om)poling wordt door Sven Brandt (http://www.digital-bahn.de) uitvoerig beschreven.
Als je voor een decoder een optocoupler zet, inverteer je het signaal ook.  Als de software in de decoder daar niet op ontworpen is, doet de decoder niets.
Groetjes, Peter


Geert

Iets anders nu:

Ooit eens een keerlusmodul program geschreven in en 14 pins PIC ?C nl. 16F684. Het principe is gelijkaardig aan de conventionele keelusmodules die werken met spanningsval over diodes. Echter deze spanningsval stuurt geen opto couplers aan, maar wordt gemeten door een PIC ?C.  De spanningsval over een GE-diode van 0,3V is ruim voldoende.
De truc hierbij is dat de ?C enkel positieve spanningen kan meten. Vandaar dat deze ook het digitale signaal moet inlezen. (niet decoderen) Enkel bij positieve pulsen een A/D-Conversie uitvoeren.  

Dit programma is getest op MPLAB simulator. Ik heb wel ??n groot probleem. Ik kan deze ,voorlopig althans, niet praktisch uittesten op een 2 rail systeem .[:(] --> ik ben een 3 railer



voor de duideljkheid, alles in dat blauwe kader zit in de ?C...

update: duidelijkere tekening geplaatst

Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

Klaas Zondervan

citaat:
Geplaatst door Geert

Ik kan deze ,voorlopig althans, niet praktisch uittesten op een 2 rail systeem .[:(] --> ik ben een 3 railer
Wel opmerkelijk dat je dan toch de moeite neemt om zoiets te ontwerpen.[:)]
Om het te testen heb je overigens niet zo veel nodig. Een metertje recht spoor (kan je desnoods maken van c-rail of K-rail) en een wagentje dat stroom afneemt.

Geert

Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

Dreha

@Gerolf en andere:

Het grote verschil tussen een interrupt en polling (regelmatig naar een ingang gaan kijken). Is dat een externe interrupt bijna altijd flank gestuurd is (d.w.z. bij een overgang van 0 naar 1 of andersom) en niet niveau gestuurd ('0' of '1').

Bij polling zie je enkel of een bepaalde ingang hoog of laag is maar je weet niet hoelang dat al zo is. Zeer snelle variaties in een ingangssignaal kunnen zo ook verloren gaan doordat je ze gewoon gemist hebt in je polling lus.[B)]

Dan zijn er ook nog de interne interrupts, die kunnen je bv verwittigen dat er data is toegekomen in de USART (voor RS-232 bv) of wanneer een interne teller overgelopen is of .....

Bij DCC-decodering bv. ga je het DCC signaal aansluiten op een externe interrupt ingang. Bij een dalende flank ga je meteen een interne teller laten tellen (hij meet als het ware de tijd die verstrijkt) na bv. 80?s is deze teller teneinde en genereert ook hij een interrupt. Nu kijk je onmiddellijk naar de ingang met het DCC signaal als de ingang '1' is was er een '1' verstuurd en als hij '0' is was er een '0' verstuurd. zie ook http://nl.wikipedia.org/wiki/Digital_Command_Control
Zonder interrupts is dit niet haalbaar. Tussen de interrupts door kan de ?controller dan rustig de bits verwerken.[;)]

Ik hoop dat het een beetje duidelijk was anders probeer ik het graag nog eens op een andere manier, want ook mijn leerlingen hebben het vaak moeilijk met dit onderdeel.

Grts, Harald

PeterC

citaat:
Geplaatst door Dreha

...Ik hoop dat het een beetje duidelijk was anders probeer ik het graag nog eens op een andere manier, want ook mijn leerlingen hebben het vaak moeilijk met dit onderdeel.



En niet alleen je leerlingen...  Trial and error, vallen en opstaan daarmee...   ...vandaar ook mijn 'simplistsche uitleg' van de 'patatjes bakken'.
Groetjes, Peter


ToThePoint

citaat:
Geplaatst door Dreha

@Gerolf en andere:

Het grote verschil tussen een interrupt en polling (regelmatig naar een ingang gaan kijken). Is dat een externe interrupt bijna altijd flank gestuurd is (d.w.z. bij een overgang van 0 naar 1 of andersom) en niet niveau gestuurd ('0' of '1').

Bij polling zie je enkel of een bepaalde ingang hoog of laag is maar je weet niet hoelang dat al zo is. Zeer snelle variaties in een ingangssignaal kunnen zo ook verloren gaan doordat je ze gewoon gemist hebt in je polling lus.[B)]

Dan zijn er ook nog de interne interrupts, die kunnen je bv verwittigen dat er data is toegekomen in de USART (voor RS-232 bv) of wanneer een interne teller overgelopen is of .....

Bij DCC-decodering bv. ga je het DCC signaal aansluiten op een externe interrupt ingang. Bij een dalende flank ga je meteen een interne teller laten tellen (hij meet als het ware de tijd die verstrijkt) na bv. 80?s is deze teller teneinde en genereert ook hij een interrupt. Nu kijk je onmiddellijk naar de ingang met het DCC signaal als de ingang '1' is was er een '1' verstuurd en als hij '0' is was er een '0' verstuurd. zie ook http://nl.wikipedia.org/wiki/Digital_Command_Control
Zonder interrupts is dit niet haalbaar. Tussen de interrupts door kan de ?controller dan rustig de bits verwerken.[;)]

Ik hoop dat het een beetje duidelijk was anders probeer ik het graag nog eens op een andere manier, want ook mijn leerlingen hebben het vaak moeilijk met dit onderdeel.

Grts, Harald



Is klaar en duidelijk Harald.
Zo heb ik dus ook de decoder sequentie gamaakt.
Het knipperen van de leds bij tegenspoorbeeld is bijzaak en niet tijd kritisch. Het ontvangen van het dcc signaal en het samenstellen van de gedecodeerd informatie in de registers is wat ten alle tijde op de eerste plaats komt. Het samenstellen van de seinbeelden vanuit die registers is bijzaak (uiteraard wel het uiteindelijke doel) en gebeurt in afwachting van nieuwe informatie. Of het seinbeeld nu in een fractie van een seconde geplaatst is of na een seconde is niet aan de orde. Beter na een seconde, dan heeft koploper alle tijd om op de 4 adressen de nodige informatie te versturen.
Als u kijkt zoals u altijd keek zal u steeds zien wat u altijd zag. "BOEDDHA"
Now you're just somebody that I used to know "GOTYE"
Spoor HO, HOe, N, Z, digitaal, EP: I, II, III, IV, V, VI

PeterC

Omdat de ene servo de andere niet is en ik graag weet bij welke pulslengte ze wat doen, heb ik een oud projectje van onder het stof gehaald: een servotester/calibratie - gebaseerd op een PIC 16F877.  De gekozen processor was wat overkill voor dergelijk projectje (destijds had ik geen andere voorhanden) en nu wil ik terug een servotestertje opbouwen (opnieuw vanaf nul) maar deze keer met een iets meer bescheiden processor: een PIC 16F684 (14 pens - 8 bits - spotgoedkoop).

Omdat ik nu voor de eerste keer volledig (en uitsluitend) gebruik maak van de (open-source) JAL-bibliotheken en ik mezelf ook terug wat moet inwerken, wil ik jullie wel over de schouder laten meekijken met mijn vorderingen (en valkuilen).

Het eerste deel van het project is heel simpel: op een 16F684 heb ik via een voorschakelweerstand (470 ohm, te groot, maar lag toevallig binnen handbereik) een ledje op een als uitgang geconfigureerde poort gezet en laat die ??n seconde aan en daarna ??n seconde uit.  de 'loop' wordt herhaald tot...  ...de spanning eraf gehaald wordt.

Zoals bij al mijn 'experimenten' is de schakeling op een breadboard opgebouwd:



Het is het schakelingetje links onderaan (rechts bovenaan staat een 18F2550 met daarin een USB-I2C omzetter die voor 99% naar mijn zinnen werkt, maar die code is een ander paar mouwen - bij 100% plaats ik het schema en de code op mijn site).

Bij interesse wil ik wel laten zien hoe ik van een eenvoudige knipperlichtschakeling naar een servotester kom (met uitlezing op een 16 karakter alfa-numeriek LCD display).

Het 16F684-project

Groetjes, Peter