antidender op Arduinopoort?

hennep

Golden Member

Er zijn vele wegen die naar Rome leiden.

code:

unsigned long step = millis();
unsigned long stoptijd = millis() + 15;
for( int i=0; stoptijd>millis(); i++ ) {
    if( step != millis() ) {
        step = millis();
        //doe iets eens per ms 
        if( hetisnuwelgenoeggeweestbinnen15ms ) {
            break;
        }
    }
}

of

code:

for( int i=0; i<15; i++ ) {
    delay_ms(1); // delay_ms gebruik ik nooit meer, ms als param?
    //doe iets eens per ms, de loop stop na 15ms 
}

Zelf heb ik een voorkeur voor de bovenste functie omdat ik binnen de loop nog andere code uit kan voeren. Tijdens delay_ms heb je geen controle meer, om nog even door te zagen over delays :-)
Ik heb de code niet gecompileerd, zo uit mijn hoofd geklopt. Vergeef me een typfoutje.

Als je eerder uit de loop wilt springen dan doe je dat met "break;". "Goto" kennen we gelukkig niet in C en "Gosub" doe je bij het aanroepen van iedere functie.

Op 3 juli 2020 10:32:22 schreef hennep:

...Tijdens delay_ms heb je geen controle meer, om nog even door te zagen over delays :-)

Die 15 mS hoeft hij niets te doen dan monitoren. Zo lang is dat niet.
Ik ben het wel met jou, en vele tutorals eens, dat er geen delays in ISR horen. Maar hier kan dat geen kwaad.

Als je eerder uit de loop wilt springen dan doe je dat met "break;". "Goto" kennen we gelukkig niet in C en "Gosub" doe je bij het aanroepen van iedere functie.

Ik meende te herinneren dat Goto wel mogelijk is, maar wordt afgeraden.
Maar als je die Break gebruikt, gaat dan het programma uit de loop en verder waar hij eerst was gebleven?

code:

for( int i=0; i<15; i++ ) {
    delay_ms(1); // delay_ms gebruik ik nooit meer, ms als param?
    //doe iets eens per ms, de loop stop na 15ms 
}

Hoe vertaal ik dat eerste stukje For-code?
In eerste instantie is i 0.
Zolang i minder is dan 15, vul ik i aan met 1

Is dat ook de volgorde bij dat regeltje? Beginwaarde;voorwaarde;wat-te-doen?

En nu ken ik de For Next loops wel van vroeger, maar dan sprong hij uiteindelijk uit die loop.
Hoe gaat dat hier? Bij gebrek aan een next "afsluiting" zal hij dus dat For loopje uitgaan. Maar gaat hij dan meteen uit de VOID loop?
Of moet ik een Break commando plaatsen ter afronding van die For loop, zodat hij na de For voorwaarden uit de VOID loop springt?

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
hennep

Golden Member

Op 3 juli 2020 21:31:50 schreef Fantomaz:Is dat ook de volgorde bij dat regeltje? Beginwaarde;voorwaarde;wat-te-doen?

code:

for( beginwaarde; eindconditie; ophoogfunctie ) {
    wat-te-doen;
}

ophoogfunctie kan met 1 verhogen of verlagen maar zou ook in stappen kunnen verhogen of verlagen, of een echte functie die een waarde retourneert.

Hoe gaat dat hier? Bij gebrek aan een next "afsluiting" zal hij dus dat For loopje uitgaan.

Alles binnen de accolades {} wordt uitgevoerd zolang de eindconditie niet is bereikt.

Maar gaat hij dan meteen uit de VOID loop?

Als er verder niets staat tussen de } van de "for" en de } van loop functie, dan ja.

Of moet ik een Break commando plaatsen ter afronding van die For loop, zodat hij na de For voorwaarden uit de VOID loop springt?

Een break is alleen nodig als je uit de for-loop wilt springen voordat de eindconditie is bereikt.
Als de for loop is beeindigd door zijn eigen conditie, dan gaat de code verder na de sluit accolade.

EDIT: Als ik zo naar het niveau van jouw vragen kijk, dan verwacht ik dat je een AVR hebt kapot geprogrammeerd voordat je morse decoder klaar is. Ik neem tenminste aan dat je voor ieder testje de Arduino opnieuw programmeert.
Ik zou dan eens overwegen om voor het testen van dit soort elementaire stukjes code een C-compiler te installeren.
Deze is gratis en doet het op windows/linux/mac: http://www.codeblocks.org/downloads

Op 4 juli 2020 12:09:26 schreef hennep: Als ik zo naar het niveau van jouw vragen kijk, dan verwacht ik dat je een AVR hebt kapot geprogrammeerd voordat je morse decoder klaar is. Ik neem tenminste aan dat je voor ieder testje de Arduino opnieuw programmeert.
Ik zou dan eens overwegen om voor het testen van dit soort elementaire stukjes code een C-compiler te installeren.
Deze is gratis en doet het op windows/linux/mac: http://www.codeblocks.org/downloads

Nee hoor! O-)
Ik wil graag alles weten en probeer altijd eerst code te doorgronden voor ik hem test.
Ik ken de For/Next of While/Wend, Repeat/until lussen wel hoor. :-)
Maar omdat VOID geen endcode heeft, vroeg ik me af wat de conditie was die hen uit die loop haalde.
Accolades dus... Dat is duidelijk. Voorts wist ik niet zeker of een break onder een conditie ervoor zorgde dat het programma uit de complete loop ging of niet.
Het zit wel ergens, maar in Basic en niet in C(++).
Werken met interrupts, anders dan Gosub/return, is nieuw voor me.

En waar ik moeite mee heb (bevattelijk vermogen van snelheid) zijn de loops van enkele millisecondes.
Daarbij valt dat ook slecht te monitoren.

Neemt overigens niet weg dat ik even ga neuzen bij die C compiler. ;-)

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
hennep

Golden Member

Op 4 juli 2020 14:25:53 schreef Fantomaz:
En waar ik moeite mee heb (bevattelijk vermogen van snelheid) zijn de loops van enkele millisecondes.
Daarbij valt dat ook slecht te monitoren.

Dat monitoren valt wel mee. Ik toggle vaak een overbodige pin in de loop functie om te zien hoe snel de code achter elkaar wordt uitgevoerd. Dat kun je dan prima met een scope bekijken.
Het verbetert je "bevattelijke vermogen" aanzienlijk. :-)

Ik kan de Integer na 15 of 16 loops wel laten zien in de serial monitor, maar tijdens het doorlopen van die loop zie ik niet wat er gebeurt.

Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
hennep

Golden Member

Ik begrijp wat je bedoelt. Sommige dingen zijn gewoon niet te debuggen. Het denderen van een contact is er een van. Je moet gewoon aannemen dat het gebeurt, dat gaat te snel om het in programmacode te kunnen volgen.
Je zou nog wel alle timing van ms naar seconden kunnen brengen en zelf een paar keer stuiteren op de toets/seinsleutel.
Op die manier heb ik de DebounceKey classe ook gecontroleerd. Die staat overigens ondertussen op github. Ik heb daar ondertussen ook nog een tweetal methods aan toegevoegd om te zien hoe lang de tijd is tussen de laatste twee flanken en hoe hoeveel tijd is verstreken sinds de laatste flank. Ik snap dat je zoiets zelf graag wilt bouwen, zo zit ik zelf ook in mekaar. Als het je aan inspiratie ontbreekt kun je daar zien hoe ik het heb aangepakt.