Loopjes in ISR vraagstukje (Leek aan het woord)

algemene C code
Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor FTMZ » 02 Jul 2020, 22:18

Hallo mensen,

Ik heb een vraag over de werking van een stukje code.
Ik probeer alles wat te begrijpen en hulp is welkom. :-)

Het gaat om een loopje in een Interrupt.

De bedoeling is om op een poort te detecteren of een poort hoog of juist laag is, het denderen eruit te filteren en vervolgens te monitoren hoe lang de poort hoog, dan wel laag is.

Wat ik tot nu toe heb kunnen opdiepen is:
(mijn vragen staan als remark in de code)

Code: Alles selecteren
AttachInterrupt (0,Keyhit, Change)   //Als ik het goed heb, heb ik interrupt poortje 1, met de naam "Keyhit" die ingaat bij elke change van die poort.

Void Keyhit() //Dit is volgens mij de loop met de naam "Keyhit". Wat ik niet begrijp is wat er tussen de haakjes kan horen te staan, en of ik deze loop kan inrichten dat hij maar 15 loopjes maakt.

{ unsigned Char K; //een gereserveerde geheugenpositie, in mijn geval een 0 of een 1
   static int KK; // een integer van 16 posities. Ik weet niet waarom dat static moet zijn.

//dan het daadwerkelijke loopje:

K = port.0 //als ik het goed heb copieer ik de logische waarde van poort 0. Dat zal wat uitgebreider moeten, maar dat is de intentie.
KK = (KK<<1) | K // De integer KK zal 1 positie bitshiften en de waarde 1 of 0 toevoegen aan het end.
delay ms 1 // ik las hier 1mS pauze in, waarna het rondje weer verder gaat.
}


Ik weet dus niet hoe ik die loop kan inrichten dat hij 15 sequenses doet voor hij uit die loop gaat.

Er komen nog wat zaken in dat loopje, maar dat is nu even niet van belang.

Ik weet dat het onorthodox is om een delay in een loop te zetten, maar deze is zó kort en met 15x heb ik meteen een start van een andere delay, buiten die loop.

En kan ik aannemen dat de loop blijft bestaan zelfs al verander ik de voorwaarden om in die loop te komen?
Ik ben niet zo bedreven in Arduino's. In basic blijf je in de loop tot een return opdracht.
Maar hier zit de conditie in de Voip, volgens mij.

Anyway, dit zijn wat vragen waar ik even op vastloop, of die ik gewoon wil begrijpen. ;)

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor shooter » 03 Jul 2020, 09:31

welkom, en je vragen zijn allemaal terecht en vrij logisch
een arduino programma heeft een setup () en een loop () nodig de compiler maakt daar dan zijn eigen code van als main etc maar dat zie jij niet.

als je een nieuw programma start staat dat dus al in je IDE .
in setup komen dus zaken te staan als attachinterupt
daarvoor kunnen declaraties van vraiabelen staan zoals bij jou K (dat is trouwens een boolean ipv een char, het is gewoon netter als je dat soort dingen op de juiste manier schrijft) de plaats van declareren is belangrijk voor waar je de variabelen gebruikt.
static betekent dat de variabele de waarde blijft houden voor de volgende keer. bijvoorbeeld een teller.met void maak je een functie aan die bij jou keyhit heet.
die wordt telkens aangeroepen als je pin 1 verandert.
probeer interupts zo kort mogelijk te houden dus bijvoorbeeld een status van een vraiabele veranderen of een teller op te hogen.
antidender is beter als je dat buiten de interupt doet met bijvoorbeeld een tijd millis() gebruiken.
in de loop zet je telkens verwijzingen naar allerlei functies die je gebruikt en die functies kunnen waarden ontvangen die staan dus tussen de twee haakjes, en waarden terug sturen en daar is die void positie voor bedoeld (dat kan dus bijvoorbeeld een booloean maar ook een long zijn.)
er zijn vele voorbeelden in de IDE te vinden en nog veel meer als je op arduino.cc gaat kijken.
paul deelen
shooter@home.nl

Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor FTMZ » 05 Jul 2020, 11:53

Bedankt voor je reactie.
Het is verhelderend! :!:

Bestaat er trouwens een Arduino "simulator" waar ik een geschreven programma in kan laden om de werking "visueel" te monitoren?

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor Koepel » 05 Jul 2020, 12:28

Er bestaan allerlei simulators. Ik heb er misschien wel tien uitgeprobeerd, en het is allemaal bagger :(
Op forum.arduino.cc komen regelmatig vragen voorbij waarom iets niet werk in een simulator. Het antwoord is dan altijd om een echt Arduino board te gebruiken.

Er is één uitzondering: https://www.tinkercad.com/.
Het is nodig een autodesk account aan te maken.
Dan bij het onderdeel "Circuits" kun je een Arduino board in het veld zetten, en dan voor de code "text" kiezen om daar je sketch neer te zetten.
De simulatie draait in de browser, dus een snelle computer met de Chrome browser werkt het beste.
Je kunt helaas alleen de libraries gebruiken die tinkercad zelf al heeft.
Het is zelfs mogelijk om stap-voor-stap er doorheen te lopen en de variabelen te bekijken. Dat werkt niet helemaal lekker, vooral niet als je een hardware emulator bent gewend die op volle snelheid draait.

Een kleine sketch met knoppen en leds en display en neopixel leds en een servo motor kun je snel in Tinkercad opzetten.
Wat dacht je van drie Arduino boards die met elkaar verbonden zijn en elk een eigen sketch draaien ? Zelfs dat kan in Tinkercad.

Met een echt Arduino board kun je de seriële monitor kun je gebruiken om tekst te laten zien. Op die manier kun je toch zien waar de sketch mee bezig is, en de sketch draait gewoon op volle snelheid en de code heeft alle optimalisaties van de compiler. Als je dat doet en je programma netjes hebt geschreven, dan kom je een heel eind.

Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor FTMZ » 05 Jul 2020, 20:34

Ok, dank je.
Tinkercad... Dat is toch een 3d ontwerpprogramma? Volgens mij zijn er meer met raakvlakken tussen arduino en 3d printen... :-)
Ik zal me er eens in verdiepen.

Ik wilde mij antidender code graag testen. Maar dat gaat met loopjes van 15x 1mS. Dat is niet te volgen met een serial monitor.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor Koepel » 05 Jul 2020, 22:32

shooter schreef: "antidender is beter als je dat buiten de interupt doet met bijvoorbeeld een tijd millis() gebruiken".
Daar is iedereen het mee eens die een tijdje met een Arduino werkt, maar dan ook echt iedereen.
Wij gebruiken geen interrupts voor knoppen. Het lezen van knoppen is iets dat traag is, en dat kan in de loop(). Het is ook echt beter om dat in de loop() te doen.
Trouwens, zelfs een eenvoudige Arduino Uno kan al allerlei dingen doen in 1 ms.

Kijk bijvoorbeeld eens naar de Bounce2 library: https://github.com/thomasfredericks/Bounce2/blob/master/src/Bounce2.cpp.

Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor FTMZ » 06 Jul 2020, 08:50

Niet om mijn eigenwijsheid te verdedigen :D , maar ik moet wel een interrupt on change hebben, die daarna strak getimed moet worden.
Het programma is met andere zaken bezig en moet meteen reageren. Vandaar dat ik dat via een interrupt wilde doen.
In het programma taan bepaalde taken die niet onderbroken mogen worden op een manier dat ze niet meer worden opgepakt.
Vandaar dat ik dat via een interrupt on change wilde doen.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor Koepel » 06 Jul 2020, 15:43

Als je taken hebt die niet onderbroken mogen worden, dan kun je die misschien op de Arduino manier met millis() doen.
Heb je veel delay() in die taken ? Tijdens een delay() kun je niets anders doen, alleen de interrupts werken dan nog.
Met millis() kun je al die tijd gebruiken die je vroeger verkwistte door in een delay() te gaan zitten. Met millis() kun je honderd dingen tegelijk doen. Met een leuk testje kon ik 27000 dingen tegelijk doen, onafhankelijk van elkaar, met een ESP32: https://github.com/Koepel/Fun_with_millis/blob/master/millis_overdone.ino.

Dit weet echt iedereen die wat gevorderd is met Arduino :roll:

Berichten: 30
Geregistreerd: 14 Dec 2018, 14:39

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor FTMZ » 06 Jul 2020, 20:54

Ik heb me ook verdiept in de Millis. Dat heeft z'n voordelen maar voor mij is het niet nodig.
De Interrupt on change heeft 15 loopjes van 1mS. Daarmee heb ik gelijk een basis van exact 15mS die ik kan meenemen (optellen) bij andere delays.
Dus als ik de loop van 15x 1mS heb gehad, kan ik daar de tijd die de poort naderhand hoog, of juist laag houdt, daarbij optellen.
Dus zodra de sleutel van status verandert, zal er eerst 15mS ontdenderd worden, los van de tijd die de sleutel hoog of laag blijft.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Loopjes in ISR vraagstukje (Leek aan het woord)

Berichtdoor Koepel » 08 Jul 2020, 13:16

Om te weten hoe laat het is hoef ik niet op de klok te kijken. Dat heb ik niet nodig.
Ik gebruik mijn eigen zandloper. Om eventuele onnauwkeurigheid op te vangen heb ik 15 zandlopers. Daar heb ik een speciale jas voor laten maken waar ze allemaal in passen. Tijdens het lopen schudden de zandlopers, dus heb ik een dempingsmechanisme voor iedere zandloper met veren en schokbrekers. De jas werd daardoor een paar honderd kilo zwaar, daarom heb ik een metalen stellage gemaakt op wielen die de jas draagt. Dat werd te zwaar om vooruit te trekken, dus heb ik er een elektrische kar voor. Die kar werkt op batterijen. De batterijen raken in een uur leeg, dus heb ik er ook aan aanhanger achter om reserve-batterijen te vervoeren. Om de batterijen op te laden heb ik een aggregaat gekocht. Dat wordt vervoerd door een volgwagen. Om die volgwagen te bemannen heb ik drie mensen in dienst die elk 8 uur werken. Trouwens, die mensen kijken wel op de klok om te kijken wanneer hun dienst ingaat :roll:

Ik hoop dat je mijn uitvergroting kunt waarderen ;) O nee, wacht, het is geen uitvergroting, het is een verkleining :o want wat jij doet is nog veel vreemder :shock: omdat je het Arduino systeem onderuit haalt door in een interrupt langer dan 1ms te wachten, waardoor de millis() niet meer goed werkt.

Kun je dit verhaaltje waarderen ? Zo ja, bekijk dan eens dit: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.
Zo nee, dan kun je beter dit eens lezen: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten