Go Down

Topic: mehrfachzeiten, blink without delay (Read 848 times) previous topic - next topic

postmaster-ino

#30
May 13, 2019, 08:39 pm Last Edit: May 13, 2019, 10:17 pm by postmaster-ino
Hi

AUSLESEN sollst Du schon laufend - Du willst ja nicht irgendwo stehen bleiben, weil Dein Arduino beschlossen hat, daß der angezeigte Tankinhalt die nächsten 30 Minuten wohl so bleiben wird.

Du sollst aber die Anzeige nur ÄNDERN, wenn sich auch was GEÄNDERT hat.

Die serielle Kommunikation braucht Ihre Zeit, wenn Du laufend am schwätzen bist, ist diese Verzögerung IMMER vorhanden.
Wenn Du nur schwätzt, wenn was zu schwätzen da ist, fällt diese Verzögerung nicht auf.

Vll. sollte man im Endausbau darauf achten, daß immer nur alle paar ms einer der Inhalte geupdatet wird, um die Verzögerungs-Last aufzuteilen - aber kA, ob Das Sinn macht.

MfG

*Edit*
DU -> Du
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

Also sollte man den Tank z.b. alle paar Minuten auslesen, und die Drehzahl dann alle paar 100ms, und bei Temperature vielleicht alle paar Sekunden ??
So ungefähr habe ich das gemeint. Man muß die Resourcen eines Arduino klug einsetzen.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Medolino73

erlichgesagt kapier ich das immer noch nicht so recht, wie ich das zeitgesteuert etwas abfrag oder schalte z.b.

vielleicht jemmand ein beispiel mit den millis, wie ich zum beispiel eine led alle 1000 millis einschalt und eines alle 2000, nur als beispiel wie ich zeitbasiert etwas tu ?

combie

Quote
wie ich zeitbasiert etwas tu ?
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Quote
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay, 
--
Blink Without Delay
Der Wachmann
--
Multitasking Macros
Intervall Macro
Nobody is perfect!
(und selbst der nicht zu 100%)

Medolino73


Doc_Arduino

Hallo,

jetzt wollte ich versuchen combies Pin Lib einzubauen. Scheitere leider daran.
Wie kann man ein Objekt einer template Klasse in einer anderen Lib initialisieren?
Habe mittlerweile viele Varianten probiert. Entweder fehlt ein Argument oder es ist eins zu viel oder es ist angeblich nicht konstant.

Im normalen Sketch würde ein Objekt mit
OutputPin <28> led;
initialisiert

Ein Objekt einer nicht template Klasse würde man mit
Output led
anlegen
und im Konstruktor mit
led (pin)
endgültig initialisieren.

Wie lautet der richtige Syntax mit templates?


.cpp ist leer

Header
Code: [Select]

// docUniversalBlinker.h

#pragma once
#include <avr/io.h>

#include <CombiePin.h>

using namespace Combie::Pin;

class Steuerung
{
  private:
    //const uint8_t pin;
    //OutputPin <pin> led;     // falsch
    OutputPin led;         // falsch
    
  public:
    // Konstruktor
    Steuerung (const uint8_t pL) :
    // Initialisierungsliste
    led (pL)             // falsch
    {}
    
    // Methoden
    void begin ()
    {
       // led.init();
    }
};


Sketch
Code: [Select]

#include <docUniversalBlinker.h>

Steuerung test (28);  
 
void setup(void) {
  test.begin();
}

void loop(void) {

}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#36
May 14, 2019, 07:39 am Last Edit: May 14, 2019, 07:50 am by combie
Code: [Select]
template<byte pin>
class Steuerung
{
  private:

    OutputPin<pin> led;    

// usw

  
   public:
    
    // Methoden
    void begin ()
    {
       led.init();
    }

}    
    


Bedenke:
Der jeweilige Template Parameter  wird zum Teil des Datentyps der generierten Klasse.
Darum ist er wie ein Type zu behandeln, und nicht wie ein klassischer Parameter.

Instanziierung:

Code: [Select]
Steuerung<13> blinkDings;
Nobody is perfect!
(und selbst der nicht zu 100%)

Doc_Arduino

Hallo,

aha, vielen Dank. Das bedeutet auch das meine Klasse "Steuerung" zwangsweise zur template Klasse wird und ich damit meine bisher liebevoll aufgeteile Lib in .h. und .cpp vergessen kann? Weil templates nur in Header gehören und sich gegen eine Aufteilung sträuben.

Deine template Klasse zeigt übrigens wie erhofft die Flash bereinigende Wirkung.
Vorher benötigte der einfache Blinktest 1514 / 10 Bytes. Jetzt 844 / 9 Bytes.  :D  
Fairerweise muss man sagen das die Arduino.h dadurch nicht mehr eingebunden wird bzw. muss.

Code: [Select]
// docUniversalBlinker.h

#pragma once
#include <avr/io.h>

#include <CombiePin.h>

using namespace Combie::Pin;

template<byte pin>
class Steuerung
{
  private:
    OutputPin<pin> led;
    
  public:
    // Methoden
    void begin ()
    {
        led.init();
    }
    
    void ledON ()
    {
        led.setHigh();
    }
    
    void ledOFF ()
    {
        led.setLow();
    }
};
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

combie

#38
May 14, 2019, 12:51 pm Last Edit: May 15, 2019, 02:30 pm by combie
Quote
Das bedeutet auch das meine Klasse "Steuerung" zwangsweise zur template Klasse wird und ich damit meine bisher liebevoll aufgeteile Lib in .h. und .cpp vergessen kann?
Hmm ...
Durchaus!

Aber wie alles im Leben, hat auch die Aufteilung in *.h und *.cpp, die Eigenschaften einer Medallie.
Es hat 2 Seiten.

Einerseits kann sich durch die Aufteilung in mehr Übersetzungseinheiten der Kompilerlauf beschleunigen.
Sogar die evtl. die resultierende Codegröße verringern (je nach Optimierungsstufe).

Aber meist wird der resultierende Code dadurch langsamer, da der Kompiler so keine Chance hat den Code der anderen Übersetzungseinheiten inline einzubinden. Dieses implizite Inlining wird durch die Aufteilung wirksam unterbunden. Eine Vielzahl von Optimierungsmöglichkeiten werden dem Kompiler so genommen.


Also entscheidet auch hier wieder der konkrete Einzelfall darüber, welches Verfahren das günstigere ist.
Nobody is perfect!
(und selbst der nicht zu 100%)

Doc_Arduino

Hallo,

Danke für die Rückmeldung. Ich bau um ... 
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

habe die template Variante heute nochmal getestet. Die ganze template Magie, die Zauberei mit der Flashreduzierung hat sich in Luft aufgelöst und ich weis nicht warum. Auch die wundersame Einsparung durch die Pin Klasse ist abhanden gekommen. Es steht 3892/290 zu 3888/269 Bytes.

Falls ich in der template Variante keine Fehler gemacht habe, dann war es dennoch nicht umsonst, diese Übung. Dümmer gewurden bin ich nicht.

In dem einfachen Vergleich hier spart man locker 600 Bytes ein. Das hätte ich nun mindestens auch erwartet.
Code: [Select]

// 1462 / 10 Bytes

const byte out1 = 28;
const byte out2 = 29;
const byte out3 = 30;
bool state = false;

void setup(void) {
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
}

void loop(void) {

 digitalWrite(out1, state);
 digitalWrite(out2, state);
 digitalWrite(out3, state);
 state = !state;
 delay(500);
}


Code: [Select]

// 816 / 9 Bytes

#include <CombiePin.h>
using namespace Combie::Pin;

OutputPin <28> out1;
OutputPin <29> out2;
OutputPin <30> out3;

void setup(void)
{
  out1.init();
  out2.init();
  out3.init();
}

void loop(void)
{
   out1.toggle();
   out2.toggle();
   out3.toggle();
   delay(500);
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up