Das Deutsche C++ Arduino Handbuch

Handbücher zur Programmiersprache. Kleine übersichtliche Programme, die gut Dokumentiert sind. u.v.m.
Antworten
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Das Deutsche C++ Arduino Handbuch

Beitrag von Admin »

Hier habe ich mal das Deutsche ArduinoCC Programmierhandbuch. Hier sind die Befehle aufgelistet und sehr gut beschrieben, auch mit Beispielen versehen. Damit kann man klar kommen.

Und ich habe hier noch meine HP, inder ich noch viele Probleme und deren Lösung erkläre.

Franz :(V):
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Das Deutsche C++ Arduino Handbuch

Beitrag von Admin »

Hier habe ich mal ein Programm reinkopiert, womit man die Delay´s ersetzen kann. Wenn man delay(xxx); schreibt, wartet die CPU solange wie man eben angegeben hat und macht in der Zeit NICHTS. Wenn man dann im Programm aber z.B. noch Tasten abfragen will, dann wird dieser Tastendruck nicht erkannt. Ich habe hier in dem Programm eine Taste, die abgefragt werden muß, dass darauf richtig regiert werden kann.

Der Unterschied zwischen delay() und millis() ist:
Wenn ich delay() im Programm habe, passiert hinter der Delay() Zeile so lange nichts wie ich im Befehl stehen habe.

Steht da zu Beispiel delay(2000); dann wartet das Programm an dieser Stelle 2 Sekunden lang bevor es weiterläuft. Der gesammte weitere Durchlauf ist z.B. 2-3 Millisekunden. Das heißt, das Programm wartet 2 Sekunden lang dann macht es 2-3 tausendstel Sekunden lang die Abfrage der Tasten. Dann steht es wieder 2 Sekunden lang am delay dann macht es wieder 2-3 millisekunden lang den rest des Programmes. Das heißt, wenn ich die Taste kurz drücke, sind das normal so 200-300 Millisekunden, die diese Taste gedrückt ist, dann lässt man sie üblicher Weise wieder los. Dass diese Tastendruck in die 2-3 Millisekunden fällt die man den Tastendruck abfragt, das ist extrem unwahrscheinlich.

In dem Programm hier unten, wird nicht gewartet bis die Zeit abgelaufen ist, sondern in dieser Zeit wird der Teil der nur nach einer bestimmten Zeit einmal ablaufen soll, übersprungen, so dass die anderen Programmteile wieder durchlaufen werden. In dem Programm gibt es drei verschiedenen Wartezeiten, aber immer wird der Teil der warten soll nur übersprungen, und das Programm läuft mit Tempo weiter. Ein Durchlauf dauert etwa 2-3 Millisekunden. Das heißt auch die Tastenabfrage wird alle 2-3 Millisekunden durchgeführt. Es ist also unmöglich, dass ein Tastendruck nicht erkannt wird, denn der dauert bestimmt etwa 100ms.
Die einzige Wartezeit, inder der taster nicht mehr abgefragt wird, sind die 5 Sekunden, die mit dem Taster ausgelöst werden, Dann wird die Taste 5 Sekunden nicht mehr abgefragt, weil die Taste in diesem Programmteil abgefragt wird, der in den 5 Sekunden übersprungen wird, wenn die Taste gedrückt wurde.

Das selbe Programm würde mit delay() 9 Sekunden für einen durchlauf brauchen. Alle 9 Sekunden würde dann für 2-3 tausenstel Sekunden die Tasten abgefragt werden. Also keine Chance dass es funktioniert. Wenn ich nichts abfragen muss, keine Steurungim Programm habe, kann ich delays nehmen, aber ich würdedazu raten von Anfang an, jeden Delay weg zu lassen.

Code: Alles auswählen

const byte led01 = 13;

const byte Taster01 = 11;      // Pin 11 wird Constant als Taster01 bezeichnet
byte Tasterstatus01 = 0;       // Zum Abfragen des Tatsenpins
byte Tastenmerker01 = 0;       // Zum Merken des aktuellen Tatsenstatus

unsigned long Sekundenablauf01 = 0; // Zeit wenn Taster gedrückt 5000ms
unsigned long Pausezeit01 = 5000;
byte funktion01 = 0;

unsigned long Sekundenablauf02 = 0; // leuchtzeit led01 300ms aussetzen
unsigned long Pausezeit02 = 1000;
byte funktion02 = 0;

unsigned long Sekundenablauf03 = 0; // Serialprint Ausgabe auf 3000ms aussetzen
unsigned long Pausezeit03 = 100;
byte funktion03 = 0;

int startzeit = 0;
int endzeit = 0;

void setup() {
  pinMode(led01, OUTPUT);
  pinMode(Taster01, INPUT_PULLUP);
}

void loop() {
   startzeit = micros();
  // Block 01 >>>>>>>>>>>>>>>
  // Ist Taste gedrückt?------------------------------------------------------------------------
  if (millis() - Sekundenablauf01 >= Pausezeit01)
  {
    Tasterstatus01 = digitalRead(Taster01); // Pin von Taster01 abfragen
    if (Tasterstatus01 == LOW)
    {
      funktion01 = 1;
      Sekundenablauf01 = millis();      // Der 5000ms Timer01 wird gestartet
      digitalWrite (led01, funktion01);
    }
    else {
      funktion01 = 0;
    }
  }
  // Block 01 Ende <<<<<<<<<<<<

  // Wenn die Taste gedrückt wurde, bleibt die LED 5 Sekunden an, -------------------------------
  // weil die nächsten Blocks 2+3 5Sek. lang übersprungen werden -------------------------------
  if (funktion01 == 0)
  { // Taste wurde gedrückt
    // Block 02 >>>>>>>>>>>>>>
    // Alle 1000ms LED13 an / aus--------------------------------------------------------------
    if (millis() - Sekundenablauf02 >= Pausezeit02)
    {
      funktion02 = !funktion02;
      digitalWrite (led01, funktion02);
      Sekundenablauf02 = millis();      // Der 1000ms Time02 wird gestartet
    }
    // Block 02 Ende <<<<<<<<<<<<
    // Block 03 >>>>>>>>>>>>>>>>>
    // Wenn LED13 für 1000ms aus ist, dann LED13 im 100ms Tackt an / aus----------------------
    if ((millis() - Sekundenablauf03 >= Pausezeit03) && (funktion02 == 0))
    {
      funktion03 = !funktion03;
      digitalWrite (led01, funktion03);
      Sekundenablauf03 = millis();      // Der 100ms Time03 wird gestartet
    }
    // Block 03 Ende <<<<<<<<<<<<
  } // Tastensteuerung Ende
  endzeit = micros();
  Serial.println(endzeit-startzeit);
}
// Loop Ende ----------------------------------------------------------------------------------
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste