boxtec Forum

Microcontroller => AVR / ATtiny => : achim August 07, 2014, 08:16:27 AM

: Multitasking
: achim August 07, 2014, 08:16:27 AM
Hallo
hat jemand Erfahrung mit einem z.B. AT128 und Multitasking gemacht?
In der einfachen Methode müsste es auf allen AT lauffähig sein. Keine zusätzlichen Datein notwendig.
Ich habe es bereits auf diesem AT gemacht, z.B. tastenentprellung wobei ich kurz oder lang unterscheiden kann. Man kann auch mehrere LED mit verschiedenen Zeiten gleichzeitig laufen lassen. Damit kann mal viele Sachen (fast) gleizeitig machen. Zeitschleife beträgt dabei 1 ms (auch kürzer möglich).
Habe erprobte Software dazu bereits fertig. Als nächste soll das Tut dazu kommen. Für einen anderen Typ gibt es bereits ein Tut (für die es eilig haben)
achim
: Re: Multitasking
: achim August 17, 2014, 08:28:29 AM
Hallo in die Runde
so wie es aussieht hat keiner Erfahrung damit gemacht.
Hat jemand Interesse an der Sache?
Könnt ihr euch was drunter vorstellen?
Frage in die Runde:
Wie kann ich (egal welche Sprache) mehrere LED (ca. 3 bis 5) unabhängig voneinander zu unterschiedlichen Zeiten blinken lassen? Betonung liegt auf unterschiedlich und unabhängig.
Vielleicht hat jemand eine Idee dazu
achim
: Re: Multitasking
: arduinopraxis August 17, 2014, 11:10:58 AM
Hallo Achim,

das Thema ist sehr interessant. Ich habe momentan keinen konkreten Fall wo das Thema erforderlich ist.

Unterschiedlich blinkende LEDs kann man mit dem Arduino-Sketch "BlinkWithoutDelay" relativ einfach realisieren.

Gruss
Thomas

/* Blink without Delay
 
 Turns on and off a light emitting diode(LED) connected to a digital 
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.
 
 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.
 
 
 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 
 This example code is in the public domain.

 
 [url]http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay[/url] ([url]http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay[/url])
 */

// constants won't change. Used here to
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);     
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}
: Re: Multitasking
: microtherion August 17, 2014, 02:20:52 PM
Erfahrungen damit gemacht habe ich keine, aber hier einige Überlegungen:


Trotzdem gibt es einige Systeme, die Multitasking implementieren, z.B.: QP (preemptive) http://playground.arduino.cc/Code/QP (http://playground.arduino.cc/Code/QP) und Scoop (cooperative) https://code.google.com/p/arduino-scoop-cooperative-scheduler-arm-avr/ (https://code.google.com/p/arduino-scoop-cooperative-scheduler-arm-avr/)

Sinnvoller scheint mir aber der Ansatz, den Code auf kleine Subroutinen zu verteilen, und diese mit einem Event-driven Framework aufzurufen, z.B.: Ebl https://code.google.com/p/ebl-arduino/ (https://code.google.com/p/ebl-arduino/) oder Aiko https://github.com/samotage/Aiko (https://github.com/samotage/Aiko). Das benötigt keine separaten Stacks oder Register-Saves.
: Re: Multitasking
: achim August 17, 2014, 03:27:07 PM
Hallo Thomas
es geht eigentlich nicht darum LED zu verschiedenen Zeiten blinken zu lassen. Kenne dein Beispiel nicht. Das gibt es bei mir nicht.
Es geht um das "fast" gleichzeitige zu machen, wie Sensoren, Motore, Textausgabe usw., also in Grunde total verschieden Sachen. Habe die LED nur als Beispiel genommen.

Andere Programme kenne ich auch, die über die verschiedensten Sachen so was zu lassen. Leider bleibt bei einigen Sachen dann kein Platz für mein Programm über.
Mache es wie in deinem Ansatz, zerlege es in kleine Stücke.
Bin dabei das Tut mit Beispielen und Herleitung fertig zu machen. Wenn es klappt steht es morgen im Netz. Ist saueinfach und überall anzuwenden.
achim 
: Re: Multitasking
: arduinopraxis August 17, 2014, 05:20:33 PM
Hallo Achim,

Bin dabei das Tut mit Beispielen und Herleitung fertig zu machen. Wenn es klappt steht es morgen im Netz. Ist saueinfach und überall anzuwenden.

Gerne schaue ich mir deine Lösung an  ;)

Gruss
Thomas
: Re: Multitasking
: achim August 17, 2014, 07:49:16 PM
Hab dir was geschickt
: Re: Multitasking
: achim August 18, 2014, 08:02:04 PM
Der erste Teil Multitasking steht im Netz. Könnt jetzt anfange es zu zerreissen oder eure Meinung dazu sagen
achim
: Re: Multitasking
: dinoi August 19, 2014, 10:50:09 AM
Hallo Achim,

toll, sehr schön gemachte Beschreibung und leicht verständlich jede Überlegung ist nachvollziehbar. Die Lösung der Problems ist sehr einfach und damit sehr gut einsetzbar. Einziger Punkt bei welchem ich etwas Bedenken habe ist folgendes:
Sobald in die Unterprogramme Schritte eingebaut werden welche selber Zeit brauchen, sei es für die Berechnung oder Abfrage von Sensoren oder Modulen (RTC, usw). Dann geht die Zeitsteuerung wieder schief. Alternativ wäre da evtl. die Abfrage der millis() und der Vergleich if(currentMillis - previousMillis > interval) vom Beispiel "Blink without Delay" besser.

Grüessli Reto
: Re: Multitasking
: achim August 19, 2014, 01:03:01 PM
Hallo Reto
auch diese Sache kann man relativ einfach gestalten. Es kommt einmal auf die Art der Rechnung drauf. Dabei geht es besonders um den Bereich Festkomma oder Gleitkomma Berechnung. Das macht viel Zeit aus. Dazu zählt auch die Grösse der Zahl als Ergbenis oder Grundlage. Jedes Komma dabei vermeiden. Das andere ist, wie oft muss welcher Sensor ausgelesen werden. Ist unbedingt 1ms nötig oder reicht jeder 10 Durchlauf, ergibt Abtastung von 10 ms oder sogar 50ms? Es ist ein relatives Umdenken dazu nötig. Alles muss der Zeit untergeordnet werden. Es gilt immer der Grundsatz: Nicht auf das Ergenis warten, sondern was kann ich für dich tun. Wenn nicht mache ich halt was anderes.
Bei einer Quarzfrequenz von 16MHz geht eigentlich alles rasant schnell. Eigentlich ... muss den AT nur lassen
Denke dran, das ist nur eine einfache Art, kompliziert geht es immer.
achim
: Re: Multitasking
: dinoi August 19, 2014, 10:05:32 PM
Hallo Achim,

Du hast mich gerade angesteckt mit diesem Thema  :). Hier habe ich jetzt meine Idee mit der Abfrage der millis() umgesetzt.
Dabei habe ich es auch versucht möglichst einfach zu machen, etwas besser wäre es mit einer Klasse statt nur einer Routine. Als Anhang die Ausgabe vom Protokoll.

Gruss Reto

:
/* Blink without Delay Multitasking */

const int ledPin1 = 13;      // the number of the LED pin
const int ledPin2 = 9;       // the number of the LED pin

boolean ledState1 = LOW;
boolean ledState2 = LOW;

unsigned long prevM1 = 0;
unsigned long prevM2 = 0;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
 
// call void parameters ( Intevall, LedPin, Pointer to Previus Millis Variable, Pointer to Led State  )
led_blinken1(1000, ledPin1, &prevM1, &ledState1);
led_blinken1(333, ledPin2, &prevM2, &ledState2);

}

void led_blinken1(long intervl, int ledPin, unsigned long *prevM, boolean *ledState){
  unsigned long currentMillis;
  currentMillis = millis();

  if(currentMillis - *prevM >= intervl) {
    // save the last time you blinked the LED
    *prevM = currentMillis;   

    // write Log
     Serial.print("Led: ");
     Serial.print(ledPin);
     Serial.print(" Time: ");
     Serial.print(intervl);
     Serial.print(" Status: ");
     Serial.print(*ledState);
     Serial.print(" Millis: ");
     Serial.println(currentMillis);

    // if the LED is off turn it on and vice-versa:
     if (*ledState == LOW) {
      *ledState = HIGH;
   } else {
      *ledState = LOW;
      }

    // set the output pin
    digitalWrite(ledPin, *ledState);
  }
 
}

: Re: Multitasking
: arduinopraxis August 19, 2014, 10:42:33 PM
Hallo zusammen,

ich habe den Lösungsansatz von Achim für Arduino umgesetzt.
Die beiden LED blinken unabhängig voneinander  ;)

:
// Angabe der Quarzfrequenz, wichtig für die Zeit
#define F_CPU 16000000UL
// Angabe der Quarzfrequenz, wichtig für die Zeit
#include <util/delay.h>
// Einbindung Datei Pause
#include <avr/io.h>
// Einbindung Datei Ausgänge


// Einbindung Datei Ausgänge
int16_t led1=0;
int16_t led2=0;



void setup(void)
{
  // Port D als Ausgang D7, D6
  DDRD = B11000000;
 
}


void loop(void)
{
  while (1)
  // Programmschleife
  {
    led_blinken1(); // Aufruf Unterprogramm 1
    led_blinken2(); // Aufruf Unterprogramm 1
    _delay_ms(1);
  }
}

void led_blinken1()
{
  led1++;
  if
  (led1==99)
  {
    PIND = _BV (7);
}
  else
  {
    if (led1==299)
    {
      PIND |= _BV (7);
      led1=0;
    }
  }
}

void led_blinken2()
{
  led2++;
  if (led2==599) {
    PIND = _BV (6);
   
  }
  else
  {
    if (led2==1199) {
      PIND |= _BV (6);
      led2=0;
    }
  }
}

Gruss
Thomas
: Re: Multitasking
: achim August 20, 2014, 08:32:24 AM
Dann warte mal ab, wenn der Rest kommt. Soll ich das Thema umbenennen, so in Virus 1 bis 3 ???
Arbeite gerade an mehrfach Nutzung, verschiedne Zeiten an einer LED, Tasterabfrage. Tasterübergabe, Taster lang/kurz, Taster 10 fach, Menuesteuerung mit Display.
Da kann sich dein Virus so richtig ausleben.
achim
: Re: Multitasking
: arduinopraxis August 20, 2014, 11:35:19 AM
Hallo Achim,

Dann warte mal ab, wenn der Rest kommt. Soll ich das Thema umbenennen, so in Virus 1 bis 3
Bin gespannt auf die weiteren Funktionen.
Das Beispiel mit Blink ist ein guter und recht einfacher Ansatz. Voraussetzung ist dass man sich etwas tiefer in seine Programmierung versetzt.

Multitasking sagt genau aus was mit dem Konzept gemeint ist. Vom Virus bin ich noch nicht befallen  ;)
Aber auf jeden Fall ein gutes Projekt um etwas die Gehirnwindungen zu wärmen  :)

Gruss
Thomas
: Re: Multitasking
: dinoi August 20, 2014, 12:38:40 PM
Hallo Achim,

gerade letzte Woche habe ich eine "Taster lang/kurz" gebaut, würde mich interessieren, wie Du es gelöst hast.

Gruss Reto
: Re: Multitasking
: achim August 20, 2014, 12:48:56 PM
Danke für die Blumen.
Wenn es so ankommt, freut es mich besonders. Da ich mit so einer fiesen Sommegrippe zu hause bin, kann ich einiges machen. Ganzen Tag meinen Kater streicheln wir auf die Dauer langweilig.
Such mal im Netz "Bulletprof bzw Tasterentprellung" von Dannegger. Ist eines der besten Codes für das System. Kann dabei 4 oder 8 Taster schalten. Jeweils mit 4 Funktionen. Geht alles über ein Feld. Funktion ist sehr anstrengend aber gut. Habe es an C angepast gemacht/bekommen und läuft saugut. Ist sogar eine Einknopf Bedienung möglich. Entprellung, Zeitverzögerung, Unterschied kurz/lang alles dabei. Und das alles für 4 Taster. Must noch ein bischen warten. Mache erst die anderen Themen fertig. So ein kurzer Aufbau von leicht bis schwer.
Das schönste kommt aber noch. Die Kombination von I2C und Multitasking, dazu noch ein bischen Master/Slave Betrieb mit Funkbrücken, Anbindung an Andriod über Netzwerk und WLAN. Neugierig?
achim 
: Re: Multitasking
: achim August 21, 2014, 07:28:34 PM
So, der zweite Teil steht auch im Netz  :). Natürlich wieder mit einigen Beispielen, geht dabei besonders um LED.
Habe gerade den dritten Teil an boxtec geschickt. Es wird langsam Interessant. Es geht dabei um LED und Taster.
Habe aber scheinbar ein Problem. Ich arbeite mit C, der richtig grossen Version. Einige nutzen Anduino. Da muss ich leider passen. Soll einfacher sein, hab damit noch nicht gearbeitet. Falls notwendig, müsste es jemand anpassen. Wieweit es möglich ist - keine Ahnung.  :-\
Hat jemand die Sachen gelesen und vielleicht sogar getestet?  ???
Mich würde eure Erfahrung damit interessieren.  ;)
achim
: Re: Multitasking
: arduinopraxis August 22, 2014, 08:36:31 AM
Hallo Achim,

So, der zweite Teil steht auch im Netz  :). Natürlich wieder mit einigen Beispielen, geht dabei besonders um LED.

du bist ja richtig produktiv  :)
Ich glaube die Forumteilnehmer kommen gar nicht nach mit lesen deiner vielen Tutorials  ;)

Habe aber scheinbar ein Problem. Ich arbeite mit C, der richtig grossen Version. Einige nutzen Anduino. Da muss ich leider passen. Soll einfacher sein, hab damit noch nicht gearbeitet. Falls notwendig, müsste es jemand anpassen. Wieweit es möglich ist - keine Ahnung.
Die meisten aktiven Forumteilnehmer hier sind Arduino-Bastler. Die in der Arduino-Umgebung verwendete Sprache ist eine leicht vereinfachte Variante der "grossen Version".
Dein Code ist meist ohne grosse Anpassungen in der Arduino-Umgebung lauffähig. Wie du aus meinem angepassten Blinkbeispiel erkennst, musste nur die Portausgabe angepasst werden. In der Arduino-Umgebung gibt es nur ein setup() und ein loop(). Somit muss int main() etwas angepasst werden.
Ich sehe da keine Probleme. Wer sich in deinen Code einarbeiten will, wird auch diese Hürde nehmen.

Einige nutzen Anduino. Da muss ich leider passen. Soll einfacher sein, hab damit noch nicht gearbeitet.
Da musst du dich wohl auch mal ein bisschen einarbeiten  ;)

Hat jemand die Sachen gelesen und vielleicht sogar getestet?
Wie du aus meinem angepassten Beispiel siehst, habe ich dein Tutorial gelesen und Code schon verwendet.

Bitte beachte dass wir hier alle Arduino und Elektronik als Hobby betreiben. Feedback kommt also nicht immer sofort  :)

Gruss
Thomas
: Re: Multitasking
: achim August 22, 2014, 08:58:31 AM
Keine Angst, nächste Woche wird es ruhiger. Da bin ich wieder auf Arbeit. Will eigentlich in Vorbereitung zum September ein bisschen für Diskussionsstoff sorgen. Kann man sich Auslassen, was damit möglich ist oder nicht.
Ansonste habe ich noch ca. 10 bis 20 fertige Platinen oder in Arbeit, ca. 10 Tuts zum Umschreiben, ca. 150 bis 200 Programme zum Anpassen oder löschen und einen Sack voller Ideen
Ansonsten wurde doch gesagt, wenn eine Diskette (?!) voll ist nehmen wir halt die nächste oder eine grössere.
Wichtig dabei ist, es soll für jeden was dabei sein.
achim
: Re: Multitasking
: arduinopraxis August 22, 2014, 11:13:37 AM
Hallo Achim,

mit deinen bisherigen Entwicklungen und Tutorials hast du sicher genug Stoff für Diskussion am Maker Day  ;)
Wirst du ein lauffähiges Netzwerk von Modulen präsentieren?

Gruss
Thomas
: Re: Multitasking
: achim August 22, 2014, 12:25:57 PM
Hallo  Thomas
habe 2 Platinen fertig bestückt. Leider sind die IC noch nicht da. In der ersten Lieferung wurden sie falsch geliefert (SO8 statt DIP8). Habe schon kabel zu liegen, ca. 6 bis 8m. Noch alles testen und ein Programm dazu. Ist die Version dann mit übergang zu LSCI und LSDA, mit P82B715. Soll bis 200m laufen. So viel Kabel kann ich aber nicht mitbringen. Vielleicht habe ich dann auch die Temp Messung und ein Display fertig, z.B. 1604 über Bus oder Graphik über Port. Noch so viel vor. Wann kommen endlich die Platinen? oder die restlichen IC
Das kleine Netzwerk mit NT2, Board1, In/Out1 usw. geht sehr gut. Versuche in der zwischenzeit den Timer in den Griff zu bekommen.
achim
: Re: Multitasking
: achim August 24, 2014, 10:10:39 PM
Hallo   8)
habe Teil 4 Multitasking fertig gemacht.   :)  Ist mit Timer, entprellung und so einigen schönen Sachen drin
Hat z.b. eine echte Ein Knopf Bedienung   ;)  (kurz/lang) drin. alles in c und für jeden frei Verfügbar. 
achim
: Re: Multitasking
: achim March 23, 2015, 11:14:56 AM
Hallo Gemeinde  8)
habe den nächsten bzw letzten Teil fertig geschrieben. Es geht dabei um die Kontrolle der Zeit. Lauffen die Programme zu lange, geht es auf Störung. Hat einen Teil als Puffer drin, Ist dadurch recht flexibel   ;)
Wünsche viel Spass damit  :)
achim