Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Conteggio che torna indietro dopo determinata soglia

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[21] Re: Conteggio che torna indietro dopo determinata soglia

Messaggioda Foto Utentedimaios » 3 mag 2018, 15:06

Un metodo alternativo è quello di utilizzare la ricorsione.
Non avendo a disposizione Arduino l'ho scritto in C++ ma l'implementazione non cambia molto ; basta variare la funzione di stampa e sostituire la funzione del delay.

Codice: Seleziona tutto
#include "stdafx.h"
#include <iostream>
#include <chrono>
#include <thread>

const int MAX_VALUE = 31 ;
const int MIN_VALUE = 0 ;



void PrintResult( int n )
{
   std::cout << n << std::endl ;
   std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ) ;
}

void DoStep( int n )
{
   if ( n < MAX_VALUE ) {
      PrintResult( n ) ;
      DoStep( n + 1 ) ;
   }
   
   if ( n > 0 ) {
      PrintResult( n ) ;
   }

   return ;
}

int main( )
{

   while ( 1 )
   {
      DoStep( 0 ) ;
   }

    return 0 ;
}
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

0
voti

[22] Re: Conteggio che torna indietro dopo determinata soglia

Messaggioda Foto UtenteIlGuru » 3 mag 2018, 16:03

La soluzione è molto bella, ma probabilmente non è utilizzabile con i microntrollori.
Ogni chiamata ricorsiva utilizza dello spazio nella pila di sistema che spesso è molto limitata specialmente su mcu ad 8 bit. Magari succede che non viene nemmeno segnalato il rollover dello stack pointer, e dopo l ottava chiamata ricorsiva inizia a scrivere gli indirizzi di ritorno dalla prima posizione e ti giochi la possibilità di tornare nel main. Ma che ne sanno gli arduinisti di queste cose
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[23] Re: Conteggio che torna indietro dopo determinata soglia

Messaggioda Foto Utentedimaios » 3 mag 2018, 16:17

In effetti era solo per proporre qualcosa di alternativo.
Comunque quando mi capita tra le mani un Arduino provo a far girare il codice, siccome l'occupazione dello stack non è esagerata potrebbe anche funzionare.
Vi farò sapere. :ok:
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

0
voti

[24] Re: Conteggio che torna indietro dopo determinata soglia

Messaggioda Foto UtenteIlGuru » 3 mag 2018, 19:22

Ho controllato sul datasheet, con l'MCU atmel328P di arduino dovrebbe funzionare.
Il suo stack pointer è formato da 11 bit spalmati su due registri ad 8 bit SPH ed SPL, la memoria dello stack è tutta la SRAM interna quindi anche se fossero 32 PUSH sulla stack di spazio ce n'è a sufficienza.
Cosa diversa sarebbe farlo fare ad un PIC628a dove la stack è limitato ad 8 livelli. Ho già provato a trovarmi a debuggare del codice che apparentemente andava in loop solo perché l'ultima RET non poteva più tornare nel main ma nel mezzo di una funzione che era stata chiamata 8 livelli di CALL prima :D
Del resto il datasheet lo diceva pure:
The stack operates as a circular buffer. This means that after the stack has been PUSHed eight times, the ninth PUSH overwrites the value that was stored from the first PUSH. The tenth PUSH overwrites the second PUSH (and so on).
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

Precedente

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti