LEOS e la frequenza

salve a tutti, sto impiegando LEOS multiple per startare dei conteggi e gestire delle frequenze in uscita, tutto funziona benissimo con 4 Leos 2 si occupano di due count down e due di darmi due uscite variabili in funzioni di condizioni esterne rilevare da sonde, uso ardu mega 2560 con leos eun display collegato su rx0 e tx0 115200 baud tutto funziona alla perfezione, solo mi sembra ci sia un limite per la frequenza degli impulsi gestiti da LEOS che sopra i 16hz circa (60millisec.) comincia ad impallarsi tutto ad esempio per ho collegato un sensore temp analogico che di colpo mostra sul display 0 come valore per qualche istante per poi riprendere a leggere i valori reali e poi ribloccarsi ho notato che se il valore di frequenza nelle LEOS e' basso non si verificano questi problemi, Chiedo se altri hanno riscontrato problemi simili grazie

Ciao, sono l'autore del leOS. Non ho ben capito qual è il tuo problema. :sweat_smile: Potresti spiegarti meglio e magari pubblicare anche il codice per vedere cosa stai facendo? Ah, che versione del leOS usi?

CIAO,
la versione e’ 1.1.3
allego il programma,
in pratica se tramite LEOS cerco accendere e spegnere un uscita ad una frequenza superiore ai 10HZ ardu va in palla e non riesce piu ad eseguire altri compiti come conversione della temperatura per il controllo della stessa
grazie

ALMA_19.ino (28.5 KB)

Scusa se rispondo solo ora ma mi era sfuggito il thread (ho avuto un fine settimana moooolto impegnato). Intanto noto che non usi dichiarare le variabili utilizzate all'interno dei task come "volatile". Devi farlo, altrimenti il compilatore ottimizza l'uso delle variabili e potrebbe incasinarti il codice finale. Poi, che libreria è la ArduinoGenie che usi? Che fa? Tornando alla frequenza, 10 Hz sono 100 ms. Considerando che la risoluzione dello scheduler del leOS è di 1 ms, mi suona strano che ti vada in palla. Non ho studiato bene il codice ma dovresti esserci come tempi.

è un pò dura capire quel codice senza sapere cosa hai collegato (il coperchio da seganle LOW quando è alzato? bottone_start normalemne è ha 1 o cosa?)

però vedo che ci sono dei reset sui task leos, non sono quelli a darti fastidio? ion oltre i task leos sembrano fare cose indipendenti dai problemi che riscontri, senza leos succede lo stesso?

cosa deve fare il tuo codice?

salve a tutti ci sono ancora XD chiedo scusa ma ero fuori sede enon ho avuto la possibilità di rispondere,

la libreria arduino genie serve per implementare un fantastico display touch che, si costa, ma ha una discreta interfaccia grafica per la programmazione, ed essendo dotato di proprio processore grafico + mini auidio non appesantisce il codice di arduine necessita di soli 2 dico 2 pin per la comunicazione, tutta la parte grafica viene direttamente caricata sul display, a chi interessasse ecco il link: http://www.4dsystems.com.au Ciao Leo "Intanto noto che non usi dichiarare le variabili utilizzate all'interno dei task come "volatile". Devi farlo, altrimenti il compilatore ottimizza l'uso delle variabili e potrebbe incasinarti il codice finale." non capisco a quali variabili ti riferisci, se ad esempio ti riferissi a "pre_f--;" e' usata anche per mostrare a display il valore del tempo decrescente per cui non può essere eliminata a fine ciclo

dovrei usare in totale 4 task Leos 2 per 2 conteggi alla rovescia due per ottenere una variazione in frequenza che che mi permetta di ridurre la velocità di rotazione di un motore in ca per il momento le ho disattivate poichè avevo urgenza di usare l'apparecchiatura ma vorrei che funzionassero .

ciao Lesto la macchina e' un fornetto con dei timer e delle ventilazioni, il coperchio è provvisto di protezione, se aperto tutto si ferma sono effettivamente 4 task indipendenti , vedi sopra

quando faccio funzionare i 2 che gestiscono la frequenza, (dovrebbero andare in contemporanea)sopra una certa frequenza 16hz sembra che arduino perda colpi e tutto funzioni a singhiozzo in particolare la comunicazione con tx0 erx0 che sono dedicati al display dovrei arrivare almeno a 60hz grazie

le variabili che sono usati sia all'interno di diversi interrupt (i task di leos) o il ciclo principale, vanno messi volatile per questioni di ottimizzazione, ma non nel senso che il compilatore le leimina; ma nel senso che le variabili potrebbero essere messe nei reistri interni della CPU, e questo può causare un disallineamento del loro valore, in oltre se più grandi del bus dati interno 1 byte nel nostro caso essendo MCU 8 bit) allora può essere che mentre un interrupt/main scriveva un pezzo di variabile, parte un altro interrupt che ne modifica il valore e poi quando ritorna scrive l'altra parte e.. vabbè ci siamo capiti. Mettile volatile e non ne parliamo più.

perda colpi e tutto funzioni a singhiozzo in particolare la comunicazione con tx0 erx0

AHHHHHH molto bene. anche la seriale (sia parte di quella HW che la SoftSerial) funzionano ad interrupt; io direi che allora il tuo problema è che hai troppi interrupt che durano troppo, tanto che si danno a sovrapporre, sballano le tempistioche e tutto si impalla.

il leos va bene per opèerazioni che devi fare con precisione di tempo, ma MOLTO veloci. esiste un leos che non usa gli interrupt (leo saprà indicarti il nome, ora mi sfugge), ti da meno precisione di tempo (mi pare al millisecondo) ma in compenso non usa gli interrupt e quindi il tuo codice può essere anche un pò più lento.

vedi te, o snellisci, o deinterruppti, o entrambi

Il looper, è uno schedulatore basato su millis invece che su un timer. Tutto ciò che usa gli interrupt si pesta i piedi a vicenda, come ti ha spiegato Lesto. Cerca di semplificare il codice.

chiamalo leooper :grin: :grin:

ciao non abbiamo usato i millis per evitare interferenze con i delay , per variabili volatili intendi forse "volatile type var_name" poiche sono usate dagli interrupts esterni al loop? quindi a tuo avviso, correggimi se sbaglio, dovrei cambiare le 4 relative ai 4 task? ed il looper funza come le magiche Leos che non sono influenzate dai delay? posso eventualmente combinare il tutto? esplode o vien fuori una salsina piccante?

l'obbiettivo e': allo start partono leos 1 , leos 2 leos3 leos 1 e' un uscita pulsata che varia in funzione della temperatura (accende le resistenze) leos 2 e' una uscita pulsata che varia in funzione della temp (accende la ventilazione) parte piano x tutto leos3 leos 3 conta un tempo alla fine di leos 3 parte leos4 altro contata tempo leos2 accelera leos1 continua in riferimento della temp. alla fine del conteggio di leos4 tutto si spegne....

grazie

Pietro_P: ciao non abbiamo usato i millis per evitare interferenze con i delay , per variabili volatili intendi forse "volatile type var_name" poiche sono usate dagli interrupts esterni al loop? quindi a tuo avviso, correggimi se sbaglio, dovrei cambiare le 4 relative ai 4 task?

Tutte le variabili globali che sono usate anche all'interno di una ISR (quindi un task del leOS) vanno dichiarate come "volatile".

ed il looper funza come le magiche Leos che non sono influenzate dai delay?

No, il looper non interrompe il codice principale come fa il leOS. Lo scheduler del looper devi vederlo come una normale funzione del tuo programma che viene chiamata ad ogni esecuzione del loop.

posso eventualmente combinare il tutto?

Il looper ultima versione può girare anche in combinazione col leOS.

esplode o vien fuori una salsina piccante?

Dipende da quel che ci devi fare.

l'obbiettivo e': allo start partono leos 1 , leos 2 leos3 leos 1 e' un uscita pulsata che varia in funzione della temperatura (accende le resistenze) leos 2 e' una uscita pulsata che varia in funzione della temp (accende la ventilazione) parte piano x tutto leos3 leos 3 conta un tempo alla fine di leos 3 parte leos4 altro contata tempo leos2 accelera leos1 continua in riferimento della temp. alla fine del conteggio di leos4 tutto si spegne....

grazie

Gli scheduler basati sugli interrupt sono usati per far eseguire operazioni ad intervalli predefiniti, ma ovviamente se non parliamo di situazioni critiche il tutto può sempre essere fatto anche con altri sistemi. Certo, scheduler come il leOS aiutano. Però io non sono nella tua mente per cui sei tu che devi giudicare se uno strumento fa ai tuoi fini.

sinceramente ecco come archietturerei i codice:

prima di tutti si identificano gli stati: 1. riscaldamento 2. cottura 3. raffreddamento 4. spegnimento

"un uscita pulsata che varia in funzione della temperatura" > PWM (http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM)

ora, entra in gioco il looper: attacchi un task che ogni secondo mette a 1 una vbariabile volatile "aggiorna_sensori"

bene, ora il tuo loop, che NON ha delay, può funzionare: se il modo è 1,2 o 3 e aggiorna_sensori == 1 metti aggiorna_sensori = 0 e leggi i sensori e aggiorni i PWM a ventola e resistenza, in base a che modalità ti trovi;

se per caso hai input utente usi un Looper: metti uno task che gira ogni 200 ms, per esempio, e legge lo stato dei vari bottoni, ne calcola lo stato (pressione prolungata etc..) un altro task più lento (es al 1Hz) aggiorna l'output. in alcuni casi il task di input, o qualsiasi altra partedel codice, può "forzare" l'aggiornamento chiamando la funzione e bypassando così il delay di un secondo, utile per allarmi o per aprire menu

ciao a tutti scusate l'assenza, sono andato via per lavoro ho letto con grande interesse i vs suggerimenti, mi portano a rieditare interamente il codice, che per me, che non sono particolarmente addentro alla programmazione è un bel carico, vi chiedo quindi: pensate che effettivamente la funzionalità migliori , il risultato compenserà la fatica? grazie