Pages: 1 [2] 3 4 ... 6   Go Down
Author Topic: looper - un semplice schedulatore senza timer/interrupt  (Read 7923 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ahhaha grande leo, sempre sulla cresta dell'onda (lo so, ultimamente son lento ma troppo lavoro e niente ferie rendono lesto pazzo)
Bisogna sempre inventare qualcosa di utile  smiley-wink
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
io mi sono inventato un lavoro come bagnino
In che provincia stai lavorando?
Logged

Offline Offline
Edison Member
*
Karma: 28
Posts: 2031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
io mi sono inventato un lavoro come bagnino
In che provincia stai lavorando?
cosi se sei nella stessa provincia eviti di buttarti a mare? smiley-twist
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Offline Offline
God Member
*****
Karma: 9
Posts: 550
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
io mi sono inventato un lavoro come bagnino
In che provincia stai lavorando?
cosi se sei nella stessa provincia eviti di buttarti a mare? smiley-twist
perspicace il ragazzo!! smiley-razz
oltre a quello, anke x sapere dove si può trovare un bagnino a cui fregare alcol e raspberry..
Logged

0
Online Online
Faraday Member
**
Karma: 46
Posts: 5851
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

legacy, ti comunico che sei rientrato nella mia lista dei cattivi  smiley-yell
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Leo,
tramite looper è possibile lanciare una istanza OneTime per effettuare l'accensione e lo spegnimento di un pin con un intervallo settabile?

Mi spiego:
avviene un evento
metto il pin HIGH
passa un tot di tempo
metto il pin LOW

questo solo una volta e per ogni evento.
Lo so che posso usare la millis con variabili di supporto, ma mi si incasina lo sketch.
oppure è meglio la Leos?
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un task di tipo onetime viene eliminato dallo scheduler una volta eseguito.
Quindi pare fatto apposta per il tuo caso.

Se la tempistica non è critica, puoi usare anche il looper invece che il leOS.
Logged


Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7079
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok. Provo.  smiley-roll
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Online Online
Faraday Member
**
Karma: 46
Posts: 5851
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In allegato trovate looper2, è una versione modificata di looper che dovrebbe sistemare il bug dell'overflow di milis mediante l'uso di un contatore di overflow a 8 bit, creando in pratica una variabile a 40 bit, che dovrebbe quindi soffrire del problema dell'overflow dopo 34 anni. Ho modificato anche lo scheduler affinché usi questa nuova gestione a 40 bit.
Siccome non ho potuto provare per 49,7 giorni BlinkWithoutMillis, rilascio il codice così com'è  smiley-sweat smiley-sweat
Leo rileggendo questo punto mi chiedevo: ma la situazione overflow millis e' stata risolta da te/lesto con il discorso dell'articolo del tuo blog ?
A questo punto non puoi usare quel metodo ed eliminare questa variabile da 40bit ?
« Last Edit: April 01, 2013, 04:46:17 am by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, vero. Ma quel post era di agosto, sai quant'acqua è passata sotto ai ponti... mica me lo ricordavo neanche  smiley-yell
Oggi provvedo a sistemare anche il looper. Grazie della segnalazione  smiley-wink
Logged


0
Online Online
Faraday Member
**
Karma: 46
Posts: 5851
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sara' a tutti gli effetti il Delay2.0
spero il team si accorga della grande necessita' di una funzione di ritardo non bloccante integrata nel core
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nuovo looper 1.0!

Fantastico, che devo dire di più?  smiley-yell
Ecco un piccolo riassunto delle novità:
1) ridotto il codice compilato rispetto al vecchio looper2 (usando struct e ripulendo il codice)
2) mantenuta la sintassi dei metodi del looper2 (quindi addJob, removeJob ecc...) per poter usare il looper abbinato al leOS
3) nuovo metodo myDelay! Adesso è possibile introdurre nel codice principale un'attesa mentre lo scheduler continua a lanciare i job in sospeso!! Allegato alla libreria c'è un esempio che mostra proprio questa possibilità: un job fa lampeggiare un led ogni 100 ms mentre nel loop principale un altro led viene fatto lampeggiare con un intervallo di 1000 ms gestito proprio con myDelay. Come si può vedere, il led che lampeggia con il minor tempo di intervallo non risente del delay di 1000 ms, mentre i precedenti looper e looper2 soffrivano di questo problema.
Logged


Offline Offline
Edison Member
*
Karma: 135
Posts: 1245
O ti distingui o ti estingui
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@leo72
+1

e complimenti!
Pighixxx
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie pighi.
Tornando ai punti, il 3 è quello più interessante.
L'esempio che ho inserito exnovo è questo:

Code:
//include the scheduler
#include "looper.h"

looper myScheduler; //create a new istance of the class looper

//variabiles to control the LEDs
byte led1Status = 0;
byte led2Status = 0;
const byte LED1 = 7;
const byte LED2 = 8;

//program setup
void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
   
    //add the tasks at the scheduler
    myScheduler.addJob(flashLed1, 100);
}


//main loop
void loop() {
    digitalWrite(LED2, led2Status);
    led2Status ^= 1;   
    myScheduler.myDelay(1000);
    myScheduler.scheduler();
}


//first task
void flashLed1() {
    led1Status^=1;
    digitalWrite(LED1, led1Status);
}

Ciò che mi preme evidenziare è :
Code:
myScheduler.myDelay(1000);
Questa istruzione mette il looper in un ciclo in cui per 1000 milisecondi altro non fa che controllare lo scheduler per lanciare i job eventualmente da eseguire. Il job flashLed1 deve essere eseguito ogni 100 ms, e così viene fatto, nonostante il loop si fermi per 1000 ms. Ciò si evidenzia dal fatto che il secondo led lampeggia proprio con la frequenza di 1 secondo.
Logged


Pages: 1 [2] 3 4 ... 6   Go Up
Jump to: