Go Down

Topic: Problema magari banale...ma non ci dormo la notte! (Read 1 time) previous topic - next topic

Etemenanki

Perche' ? ... il loop e' piuttosto veloce, se non contiene delay, quindi i vari blocchi di istruzioni possono essere messi uno in coda all'altro, e verranno eseguiti "quasi" contemporaneamente (in realta' saranno in sequenza, ma parliamo di frazioni di millisecondo di ritardo, quindi accettabili per l'uso normale) ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Maurotec

Quote
Sto prendendo spunto da tutti i consigli. Ho implementato due funzioni nuove (iniziali e finali), inserendo anche il controllo "flag". Non mi funge ancora, ma sento di non essere troppo distante :)
Al di la del problema principale e nello specifico la macchina a stati per cerebrolesi.
Mi piace vedere che ci sperimenti, ti sfugge qualcosa, o meglio credi ci sia ancora qualcosa di magico e invece
devi fare tutto te.

void af() {
    mutexRun = bf;
}

void bf() {
    mutexRun = cf;
}

void cf() {
    mutexRun = af;  
}


void loop() {
    mutexRun(); // chiama qualunque funzione, chi chiama lo sceglie la funzione chiamata (cerebrolesi)
}

Se nel setup non assegniamo un valore al puntatore mutexRun il programma e fuori controllo
Nel setup prenotiamo la funzione cf().

Quindi la sequenza esecutiva sarà:
cf() // esce e va nel loop
af() // esce e va nel loop
bf() // esce e va nel loop

Continuerà sempre così perché in bf() c'è la prenotazione di cf();

L'ordine, l'esclusione, inclusione di un funzione viene decisa dentro le stesse funzioni
Per far smettere il ciclo di esecuzione basterebbe introdurre in una delle funzioni, del codice per il controllo
di un pulsante, se premuto prenota le prossima funzione, altrimenti "prenota se stessa." :smiley-eek:

Anche per questo l'ho definita per cerebrolesi, o meglio compromette irrimediabilmente le normali funzioni cerebrali. Quindi ricorda che quando aggiungi una funzione, perché questa possa essere venire invocata
deve essere prenotata da qualcuno, o lo fai nel setup o in una delle funzioni coinvolte.

Tornando al problema, qui c'è un comoda macro:
Code: [Select]

/** macro ftoadc(f)
  * converte da voltAdcValue a rawAdcValue
  * es:
  * printf("5.0 V (%d)\n", ftoadc(5.0));
  * printf("2.5 V (%d)\n", ftoadc(2.5));
  * console output:
  * 5.0 V (1023)
  * 2.5 V (511)
*/
#define ftoadc(f) ((uint16_t)(f*204.6))


Si può dire cosi?
Ho una onda triangolare di cui voglio tracciare solo i valori intermedi durante il fronte di salita e prendere nota riguardo il valore del picco massimo (4.5V), dopo il picco massimo il fronte sarà discendente.

Durante la discesa non mi interessa tracciare valori intermedi, devo solo prendere nota riguardo il valore del picco minimo (3.0) dopo il quale considero terminato il fronte di discesa e come conseguenza avrà inizio il fronte di salita che devo gestire come detto sopra

Ciao.

KKMeph

Grazie Maurotec! Oggi provo anche con il codice che hai postato tu!

KKMeph

Ri-Ciao a tutti...dilemma!

Utilizzando il codice precendente con una sorgente di tensione continua (circuito aperto), misuro tutto pulito.
5V? 5V. 3V? 3V.

Se connetto all'ingresso analogico una tensione NON generata dal generatore, ma presa dai capi di un carico...il mio valore balla più di michael jackson!

Com'è possibile? Misurando la stessa tensione con un multimetro la vedo stabile!

Etemenanki

Disturbi ? ... niente masse in comune ? ... cavi troppo lunghi ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Maurotec

Quote
Se connetto all'ingresso analogico una tensione NON generata dal generatore, ma presa dai capi di un carico...il mio valore balla più di michael jackson!
Bene sei ad un passo da capire la legge di ohm. :D

La cosa che noti è normale, poi dipende dal carico che colleghi alla sorgente e dalla sorgente stessa e dalla sezione dei cavi e da quanti punti di giunzione esso attraversa.

Solitamente un carico che assorbe corrente costante comporterà una riduzione di V dettata dalla
legge V = I/R, in questo caso R è la serie delle resistenze introdotte dal cavo, dalle giunzioni, dalla R interna del generatore.

Scommetto che il carico è un motore DC.

Comunque puoi inserire un circuito RC come filtro passa basso. C'è anche la possibilità di creare un filtro software ma ciò va oltre le mie competenze.

Ciao.

Go Up