Preselettore BCD e salto nel programma

Buongiorno, vorrei che una volta letto il valore di un preselettore bcd il programma salti al punto indicato dal valore letto.
Esempio se legge 9 va al sottoprogramma o funzione 9.
Ricordo che nel Basic scrivevo: on x gosub 1,2,3... ecco qualcosa del genere.
Grazie

... prova a guardare la struttura switch/case :wink:

Guglielmo

1 Like

Grazie per la rapida risposta, ora lo studio.
Questa struttura la metto nel loop oppure il loop lo uso solo
per leggere il valore del preselettore, ciao.

Cancella dalla memoria il BASIC.

In ambiente Arduino si usa principalmente il C/C++ che concettualmente è molto diverso.

1 Like

Lo so, ma il Basic l'ho avuto come imprinting e faccio un pò fatica a "rinnegarlo".
Rispondo anche a Guglielmo, ho fatto le prove ed ho capito che
la struttura che mi consigliava va messa nel loop. :ok_hand:

1 Like

In realtà non serve nemmeno uno statement "switch"

basta creare le N funzioni, tutte con la stessa "firma"

creare un array di puntatori a funzione

eseguire la funzione puntata dal puntatore indicato dall'indice

magia, lavoro fatto....

per esempio, scritto al volo qui, non necessariamente tutto giusto


// le funzioni 
void f1(){....
void f2(){...
// e via così....


// l'array di puntatori a funzione
typedef void(* fpunt)();
fpunt elenco[]=f1,f2,f3....;

// e poi quando si conosce l'indice basta "mandare in esecuzione" la funzione

* elenco[indice]();

// questa riga è la "vera" sostituta in C del "on X gosub ...." del vecchio basic

2 Likes

Visto, ora studio anche il tuo consiglio e faccio sapere :raised_hand:

ps: come si fa a citare un post precedente, con il nuovo sito non ci riesco.

Selezionando il testo da citare, viene fuori il pulsante "quote" subito sopra (o sotto) il testo.

Con la struttura switch/case all'inizio del programma, e per una sola volta vorrei far eseguire ad esempio " case 4:" indirizzando direttamente senza entrare dalla porta principale cioè switch(val){}
Non credo si possa fare, dovrei mettere un segnalino penso.
Mentre con l'esempio di Standardoil credo si possa fare, giusto?
Spiego cosa sto facendo:
Al posto del preselettore ho messo due pulsanti, up e down e vado da 1 a 16 ogni volta che c'è una variazione il nuovo numero viene scritto in memoria.
All'accensione legge il valore del programma e per una sola volta salta al punto indicato dal valore, poi torna a "sentire" i pulsanti.
:raised_back_of_hand:

Si può fare con tutti e due gli approcci.

Quello che devi tenere a mente è che nei sistemi Arduino hai due funzioni principali, setup() e loop() e sfruttarle a tuo vantaggio.

La prima viene eseguita all'avvio, mentre la seconda continuamente.

Se non ho capito male le esigenze, ti basterebbe usare una variabile booleana che dopo aver eseguito la funzione selezionata metti = true per impedire una seconda volta la funzione fino al successivo riavvio.

if( ! eseguito) {
 * elenco[indice]();
 eseguito = true;
}

//Resto del codice per selezionare la funzione con i pulsanti

La variabile indice ovviamente va salvata in EEPROM ed assegnata nella funzione setup().

Avevo già fatto, nel setup, esattamente come hai suggerito.

Per quanto riguarda il controllo ho usato una variabile che inizialmente vale 0 e quindi con una "if" vado dove voglio, solo la prima volta, poi nel loop la variabile diventa 1 e quindi non esce più dal loop.
L'unica "pecca" e che l'avevo dichiarata byte, ma siccome assume solo due valori 0/1 meglio risparmiare e farla diventare booleana :sweat_smile:

... mi spiace deluderti ma, su Arduino, byte e bool occupano sempre un byte ... purtroppo non c'è la gestione di variabili da un bit :grin:

Bene, senza volerlo ho fatto la cosa giusta :rofl:

Sì, se vuoi la gestione a singoli bit devi fartela da solo con gli and e gli or! :slight_smile:
Attento al "preselettore" (Contraves?...) perché, non uscendo in codice Gray ma in semplice BCD, durante i passaggi da una posizione all'altra vengono generati valori errati! Ad esempio, da 3 a 4 ci può essere 0 oppure 7! Prima di assumere come valido un valore, quindi, aspetta che non ci siano più variazioni: per esempio, se le letture negli ultimi 500ms non sono variate, il valore è valido.

Il preselettore lo volevo mettere alla centralina irrigazione
dell'altro tread. Poi ho optato per due pulsanti, up e down, (selezione programmi).
Appena riesco aggiorno lo stato dell'arte l'altra discussione.
(Irrigatore). Ciao