Forum: Mikrocontroller und Digitale Elektronik mit Arduino 2 parallele Prozesse steuern


von Tobias M. (tobner)


Lesenswert?

Grüßt euch,

ich brauche malwieder eure Hilfe.
Ich habe einen Arduino Uno und möchte ihn dazu vergewaltigen, 2 
unterschiedliche Prozesse gleichzeitig zu bearbeiten. Ich weiß, dass das 
prinzipiell nicht vorgesehen ist, aber es gibt wohl Wege und 
Möglichkeiten, den Arduino dazu zu bringen.
Hier mal 2 Links. Leider verstehe ich die Befehle nicht so ganz.

http://www.vielsichtig.de/index.php?id=120

http://www.arduinoforum.de/arduino-Thread-zwei-Befehle-paralell


Zum Ziel:
Ich möchte gleichzeitig einen Servo ansteuern und über den digitalen 
Ausgang ein Rechtecksignal in verschiedenen Frequenzen ausgeben. Der 
Servo soll ein Programm ablaufen (langsam hin und herschwenken, dann 
aufhören) und das per Taster starten. Das Rechtecksignal soll über einen 
Drehschalter 6 verschiedene Frequenzen erzeugen. Die beiden Programme 
einzeln funktionieren schon, nur leider weiß ich nicht, wie ich sie 
verbinden kann. Ich weiß, dass ich auf jeden Fall "delay" aus dem 
Programm verbannen muss und stattdessen mit "millis" arbeiten muss. Hat 
einer einen Tipp, wie ich das alles bewerkstelligen kann?

Hier mal die Quelltexte der einzelnen Programme:

Servo:

#include <Servo.h>
Servo servo1;

const int Taster = 2;
const int LedPin = 13;

void setup() {
  pinMode(Taster, INPUT);
  pinMode(LedPin, OUTPUT);
  servo1.attach(9);
}

void loop() {
  int druck;
  druck = digitalRead(Taster);
  int position;
  if (druck == HIGH)
  {
   digitalWrite(LedPin, LOW); //dient nur der Kontrolle
       for(position = 0; position < 180; position += 20)
  {
      servo1.write(position);
      delay(500);
  }


    for(position = 180; position >= 0; position -= 20)
  {
    servo1.write(position);
    delay(500);
  }
  }
else
  {
    digitalWrite(LedPin, HIGH);
    servo1.write(0);
  }
}



Rechteck:
Ich weiß, dass man die Taster über Indizes zusammenfassen kann und den 
Text somit kürzen und übersichtlicher machen kann. Darum gehts erstmal 
nicht. Mir gefällt die einzelne Abfage in jedem Ablauf nicht. Wie kann 
ich die Abfrage vereinfachen? Mit Unterprogrammen?

const int Taste1 = 2;
const int Taste2 = 3;
const int Taste3 = 4;
const int Taste4 = 5;
const int Taste5 = 6;
const int Taste6 = 7;
const int LedPin = 13;


void setup() {
  pinMode (Taste1, INPUT);
  pinMode (Taste2, INPUT);
  pinMode (Taste3, INPUT);
  pinMode (Taste4, INPUT);
  pinMode (Taste5, INPUT);
  pinMode (Taste6, INPUT);
  pinMode (LedPin, OUTPUT); //nur zum Testen

  }

void loop() {
  if (digitalRead (Taste1)== LOW){
    digitalWrite (LedPin, HIGH);
    delay (100);
    digitalWrite (LedPin, LOW);
    delay (1100);}
  if (digitalRead (Taste2)== LOW){
    digitalWrite (LedPin, HIGH);
    delay (100);
    digitalWrite (LedPin, LOW);
    delay (650);}
  if (digitalRead (Taste3)== LOW){
    digitalWrite (LedPin, HIGH);
    delay (100);
    digitalWrite (LedPin, LOW);
    delay (400);}
  if (digitalRead (Taste4)== LOW){
    digitalWrite (LedPin, HIGH);
    delay (100);
    digitalWrite (LedPin, LOW);
    delay (328);}
  if (digitalRead (Taste5)== LOW){
    digitalWrite (LedPin, HIGH);
    delay (100);
    digitalWrite (LedPin, LOW);
    delay (275);}
  if (digitalRead (Taste6)== LOW){
    digitalWrite (LedPin, HIGH);
    delay (166);
    digitalWrite (LedPin, LOW);
    delay (166);}
}

Die LED wird nur zum Test angesteuert. Es soll dann über ein 
Spannungsteiler und einen Verstärker ein Körperschallwandler angesteuert 
werden. Wisst ihr, ob man da eine Impedanzwandlung dazwischen schalten 
muss? Eingangsimpedanz verstärker sind 10kOhm, max. Pegel 60mV.


Kann man die Programme verbinden oder soll ich einfach 2 Arduinos 
verwenden?

Gruß
Tobner

von Einer K. (Gast)


Lesenswert?

Vielleicht kann man sie verbinden....

Dazu wird der Dreh und Angelpunkt, der Verzicht auf Delay() sein.

Tipp:
Lese das Beispiel  "BlinkWithoutDelay".
Mache dich über endliche Automaten kundig.


Für deinen Frequenzgenerator könnte sich die Beschäftigung mit den 
Timern auszahlen.

Tobias M. schrieb:
> http://www.vielsichtig.de/index.php?id=120
Der Autor hat die Berechnung mit den Millis nicht verstanden.
In die Tonne mit dem Artikel.

von aSma>> (Gast)


Lesenswert?

Servus,
das ist hier alles kein Problem. Das schafft auch ein Chinduino.
Wir brauchen hier einen Timerinterupt für die LEDs und zwei Funktionen, 
um die Geschichte übersichtlich zu halten. Außerdem brauchen wir eine 
feste Abtastzeit: TA;
1
#include <Servo.h>
2
#define SERVO_SPEED        20
3
#define SERVO_MAX_ANGLE   180
4
#define TA                 32  //Abtastzeit
5
6
Servo servo1;  
7
8
typedef enum{
9
     CW=1, CCW=0;
10
}SERVO_DIR_t;
11
12
const int Taster = 2;
13
const int LedPin = 13;   //schreib gleich hin ServoLed oder so
14
const int LedPin2 = x;   //2. LED oder weglassen
15
16
const int Taste1 = 2;
17
const int Taste2 = 3;
18
const int Taste3 = 4;
19
const int Taste4 = 5;
20
const int Taste5 = 6;
21
const int Taste6 = 7;
22
const int LedPin = 13;
23
24
void Servo_loop();
25
void LED_loop();
26
27
void setup() {
28
  pinMode(Taster, INPUT);
29
  pinMode(LedPin, OUTPUT);
30
  servo1.attach(9);
31
  pinMode (Taste1, INPUT);
32
  pinMode (Taste2, INPUT);
33
  pinMode (Taste3, INPUT);
34
  pinMode (Taste4, INPUT);
35
  pinMode (Taste5, INPUT);
36
  pinMode (Taste6, INPUT);
37
  pinMode (LedPin2, OUTPUT); //hier brauchst du eine 2. LED
38
  }
39
40
}
41
42
void Servo_loop() {
43
  static int position=0;            //entweder global oder static
44
  static SERVO_DIR_t dir = CW;      //clock wise
45
46
  int druck = digitalRead(Taster);
47
       
48
  if (druck == HIGH){
49
     if(position<=SERVO_MAX_ANGLE && dir){
50
        position+=SERVO_SPEED;
51
        dir = CW;
52
     } else {
53
        position-=SERVO_SPEED;
54
        dir = CCW;
55
        if(position<=0){
56
        position=0;       //keine neg. Werte!
57
        dir = CW;
58
     }  
59
   
60
     digitalWrite(LedPin, LOW); //dient nur der Kontrolle
61
     servo1.write(position);
62
63
   }else{
64
    digitalWrite(LedPin, HIGH);
65
    servo1.write(0);
66
  }
67
}
68
69
// das kann man genau so lösen, nur bei 7 tasten ist es 
70
// nicht übersichtlich, deshalb guck dir mal an wie man 
71
// Interupt erstellt.
72
void LED_loop(){
73
  if (digitalRead (Taste1)== LOW){
74
    digitalWrite (LedPin, HIGH);
75
    delay (100);
76
    digitalWrite (LedPin, LOW);
77
    delay (1100);
78
  }
79
...
80
}
81
82
void loop() {
83
84
  while(!(millis()%TA){  
85
    void Servo_loop();
86
    void LED_loop();   //hier besser mit einer ISR lösen
87
  }
88
}

Von den Tasten musst du auch Zustände merken:
1
typdef struct {
2
  bool taste_1,taste_2,taste_3,taste_4,taste_5,taste_6;
3
}TasteFlag;

Viel Erfolg.

mfg

von Wolfgang K. (donkracho)


Lesenswert?

Für solche Aufgaben sind die Timer und Timer-Interrupts des ATMega 
prädestiniert. Die Arduino Uno "Firmware" belegt nur einen der 8Bit 
Timer. Der 16Bit Timer und ein zweiter 8Bit Timer stehen zur freien 
Verfügung. Schau dir mal im Datenblatt des ATMega328P den Fast PWM Mode 
an. Das ist die einfachste Variante ein Servo mit Timer anzusteuern.

Alles zeitkritische wird mit den Timern erledigt und dann hast du im 
loop() alle Zeit der Welt sonstige Dinge zu erledigen und zu steuern. 
Mit delay() blockiert man den Arduino nur, die Funktion ist ein 
absoluter Notbehelf. Zu dem Thema sollte es aber auch genügend Tutorials 
geben.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Siehe Multitasking.

von chris_ (Gast)


Lesenswert?

Hier eine sehr gute Anleitung zum Thema Multitasking auf dem Arduino:
https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview

von Tobias M. (tobner)


Lesenswert?

WOW, ich bin begeistert. Ich hatte mich schon auf das hier typische 
Grundrauschen eingestellt. Keine Spur davon!

Vielen Dank für die ganzen Tipps, mit der Anleitung von chris habe ich 
es hinbekommen. Hier mal der Quelltext:

    #include <Servo.h>

const int Taste1 = 2;
const int Taste2 = 3;
const int Taste3 = 4;
const int Taste4 = 5;
const int Taste5 = 6;
const int Taste6 = 7;

      class Flasher
    {
      // Class Member Variables
      // These are initialized at startup
      int ledPin;      // the number of the LED pin
      long OnTime;     // milliseconds of on-time
      long OffTime;    // milliseconds of off-time

      // These maintain the current state
      int ledState;                 // ledState used to set the LED
      unsigned long previousMillis;   // will store last time LED was 
updated

      // Constructor - creates a Flasher
      // and initializes the member variables and state
      public:
      Flasher(int pin, long on, long off)
      {
          ledPin = pin;
  pinMode(ledPin, OUTPUT);
          OnTime = on;
          OffTime = off;
      pinMode (Taste1, INPUT);
      pinMode (Taste2, INPUT);
      pinMode (Taste3, INPUT);
      pinMode (Taste4, INPUT);
      pinMode (Taste5, INPUT);
      pinMode (Taste6, INPUT);


      ledState = LOW;
      previousMillis = 0;
      }

      void Update()
      {
        // check to see if it's time to change the state of the LED
        unsigned long currentMillis = millis();

        if((ledState == HIGH) && (currentMillis - previousMillis >= 
OnTime))
        {
          ledState = LOW;  // Turn it off
          previousMillis = currentMillis;  // Remember the time
          digitalWrite(ledPin, ledState);  // Update the actual LED
        }
        else if ((ledState == LOW) && (currentMillis - previousMillis >= 
OffTime))
        {
          ledState = HIGH;  // turn it on
          previousMillis = currentMillis;   // Remember the time
          digitalWrite(ledPin, ledState);   // Update the actual LED
        }
      }
    };

    class Sweeper
    {
      Servo servo;              // the servo
      int pos;              // current servo position
      int increment;        // increment to move for each interval
      int  updateInterval;      // interval between updates
      unsigned long lastUpdate; // last update of position

    public:
      Sweeper(int interval)
      {
        updateInterval = interval;
        increment = 1;
      }

      void Attach(int pin)
      {
        servo.attach(pin);
      }

      void Detach()
      {
        servo.detach();
      }

      void Update()
      {
        if((millis() - lastUpdate) > updateInterval)  // time to update
        {
          lastUpdate = millis();
          pos += increment;
          servo.write(pos);
          Serial.println(pos);
          if ((pos >= 180) || (pos <= 0)) // end of sweep
          {
            // reverse direction
            increment = -increment;
          }
        }
      }
    };


    Flasher led1(13, 100, 1100);
    Flasher led2(13, 100, 650);
    Flasher led3(13, 100, 400);
    Flasher led4(13, 100, 328);
    Flasher led5(13, 100, 275);
    Flasher led6(13, 166, 166);

    Sweeper sweeper1(200);

    void setup()
    {
      Serial.begin(9600);
      sweeper1.Attach(9);
    }


    void loop()
    {

      if(digitalRead(0) == HIGH)
      {
         sweeper1.Update();
      }
      if(digitalRead(Taste1) == LOW)
      {
        led1.Update();
      }
      if(digitalRead(Taste2) == LOW)
      {
        led2.Update();
      }
      if(digitalRead(Taste3) == LOW)
      {
        led3.Update();
      }
      if(digitalRead(Taste4) == LOW)
      {
        led4.Update();
      }
      if(digitalRead(Taste5) == LOW)
      {
        led5.Update();
      }
      if(digitalRead(Taste6) == LOW)
      {
        led6.Update();
      }
      }


Einziges Problem ist, dass der Servo die ganze Zeit hin und her fährt 
und bei Tastendruck deaktiviert wird. Er soll aber auf Tastendruck 
starten und einmal hin und herfahren und dann stehenbleiben, bis wieder 
der Taster gedrückt wird.

von Peter D. (peda)


Lesenswert?

Tobias M. schrieb:
> Er soll aber auf Tastendruck
> starten und einmal hin und herfahren und dann stehenbleiben, bis wieder
> der Taster gedrückt wird.

Dazu braucht man eine Flankenerkennung. Es gibt fertige Libs für 
Entprellung + Flankenerkennung mehrerer Tasten, einfach danach suchen.

von Tobias M. (tobner)


Lesenswert?

Ich wollte es nur über "digitalread == HIGH" machen. Was spricht 
dagegen?

Es geht mir eher darum, dass der Servo momentan noch ununterbrochen hin- 
und herfährt. Ich bin gerade dabei, das "increment = -increment" 
herrauszunehmen.

von Peter D. (peda)


Lesenswert?

Tobias M. schrieb:
> Ich weiß, dass das
> prinzipiell nicht vorgesehen ist

Doch, genau das ist vorgesehen. Die Taktfrequenz moderner MCs ist so 
hoch, daß es fast keine Anwendungen ohne Multitasking mehr gibt.

von aSma>> (Gast)


Lesenswert?

Tobias M. schrieb:
> Einziges Problem ist, dass der Servo die ganze Zeit hin und her fährt
> und bei Tastendruck deaktiviert wird. Er soll aber auf Tastendruck
> starten und einmal hin und herfahren und dann stehenbleiben, bis wieder
> der Taster gedrückt wird.

Ein bisschen nachdenken musst du aber auch. Das ist doch das gleiche 
Prinzip wie bei den LEDs nur als Änderungsvariable hast du nicht die 
Zeit sondern die Bewegung/Winkel.

von Peter D. (peda)


Lesenswert?

Tobias M. schrieb:
> Ich wollte es nur über "digitalread == HIGH" machen. Was spricht
> dagegen?

Daß "HIGH" keine Flanke ist.
MCs sind da etwas störrisch. Sie machen immer nur das, was Du 
programmierst und nicht das, was Du denkst, was sie tun sollten.

von Tobias M. (tobner)


Lesenswert?

Ich hab den Sketch soweit am Laufen.

Nur Leider muss ich einen lcd-Display einbauen und darauf einen 
Countdown ablaufen lassen.

Der Countdown (5Minuten) soll auf Tastendruck starten und wenn er 
abgelaufen ist, automatisch wieder auf 05:00 (MM:SS) springen. Dabei 
soll der Servo schwenken.

Im großen und ganzen wollte ich unter im Loop einfach ein unterprogramm 
countdown einfügen, was nach Tastendruck aktiviert wird.

Leider stellt sich die Geschichte schwieriger als gedacht.

bisheriger Ansatz des unterprogramms:
die variable time wird bei Tastendruck auf 500000000 gesetzt. Das 
sollten 5min sein. Anfangs war das im Unterprogramm mit drin, aber bei 
jedem Durchlauf wäre die Zeit wieder auf 5Min gesetzt worden, was ja 
sinnlos ist..

Danach gehts in das Programm

void countdown(){
    double time ;
    double timeb =0;
    double secondsa=0;
    int secondsb=0;
    double secondsc=0;
    int minutes=0;
    double mic=0;

      secondsa=timeb/1000000;
      minutes=secondsa/60;
      secondsc=minutes*60;
      secondsb=secondsa-secondsc;

   lcd.setCursor(1,0);
   lcd.print(minutes);
   lcd.setCursor(2,0);
   lcd.print(":");
   lcd.setCursor(3,0);
   lcd.print(timeb);
    if(time!=0){
    timeb=time-micros();
    mic=micros();
    if (timeb<=0){
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("05:00");
    }
    }
    }

von The D. (thedaz)


Lesenswert?

Und was ist jetzt die Frage ?

von Tobias M. (tobner)


Lesenswert?

Wo der Fehler ist. Es funktioniert einfach nicht. Es kommt kine 
Startzeit,wenn ich den Taster betätige und es läuft auch keine Zeit ab.

von Peter D. (peda)


Lesenswert?

Lies Dir das hier durch, da ist alles schön erklärt:

Tobias M. schrieb:
> http://www.vielsichtig.de/index.php?id=120

von DonKracho (Gast)


Lesenswert?

Nur mit dem Code von contdown() ist mir nicht klar wie das funktionieren 
soll.

Die Variable time wird nicht initialisiert und mic wird ein Wert 
zugewiesen, der dann aber nicht benutzt wird.

Wenn du irgendwo den Zeitstempel von letzten Aufruf der Funktion 
festfalten moechtest kommst du um zumindest eine statische Variable 
nicht herum.

von Tobias M. (tobner)


Lesenswert?

Ich werd auch gerade nicht schlau. Es fehlt halt irgendwas.


Ich habe dieses Beispiel versucht zu vereinfachen: 
http://kuskus.bplaced.net/index.php/arduino-und-microcontroler/5-arduino-countdown-timer

Ich habe den ganzen Bums mit der Hintergrundbeleuchtung und dem 
Zeitüberlauf rausgenommen, aber es funktioniert nicht.

Problem ist, dass der Sketch rundherum immer größer wird. Langsam wird 
es unübersichtlich und ich seh den Wald vor lauter Bäumen nicht.

von chris_ (Gast)


Lesenswert?

Einen Tastendruck kannst Du folgendermaßen detektieren:
1
loop 
2
{
3
...
4
static uint8_t alteTasteMerker=0;
5
uint8_t neueTaste;
6
7
neueTaste = getTastenPinWert();
8
if( neueTaste != alteTasteMerker ) ... Taste gedrückt, mach was ....
9
10
alteTasteMerker = neueTaste;
11
...
12
}

von Tobias M. (tobner)


Lesenswert?

Hallo Leute,

der Sketch funktioniert soweit. Ich habe nur das Problem, dass der 
Zähler ins negative geht. Hier mal der Sketch (stückweise):

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    double time = 0;
    double timeb =0;
    double secondsa=0;
    int secondsb=0;
    double secondsc=0;
    int minutes=0;

 void countdown(){

      secondsa=timeb/1000000;
      minutes=secondsa/60;
      secondsc=minutes*60;
      secondsb=secondsa-secondsc;

  lcd.setCursor(0,0);
  lcd.print("  ");
  lcd.setCursor(0,0);

  if(minutes<10){
  lcd.print("00");
  lcd.setCursor(1,0);
  }

  lcd.print(minutes);
  lcd.setCursor(2,0);
  lcd.print(":");
  lcd.setCursor(3,0);
  lcd.print("  ");
  lcd.setCursor(3,0);

  if(secondsb<10){
  lcd.print("00");
  lcd.setCursor(4,0);
  }

  lcd.print(secondsb);

    if(time!=0){ //count only time isn't 0 (button dos'nt pressd)
    lcd.setCursor(0,1);
    lcd.print("Zeit louft");
    lcd.setCursor(5,0);
    lcd.print("  ");
    timeb=time-micros();
    }
    if(timeb>0){
      sweeper1.Update();
      }
      if (timeb<=0){
      lcd.clear();
      lcd.setCursor(0,1);
      lcd.print("Zeit = 0");
    }
    }


    void loop()
    {
      countdown();
      if(digitalRead(A0) == LOW)
      {
         time = time + 3000000;
      }
      ..
Bei Tastendruck soll er 5 Minuten hinzufügen. Funktioniert auch, nur ist 
der Taster noch nicht entprellt.

Wie schaffe ich es, dass der Zähler auf 00:00 stehen bleibt?
Am liebsten wäre es mir, wenn er anfangs bei 05:00 steht und bei 
Tastendruck anfängt, abzulaufen.

Vllt hat einer ne Idee, ich seh langsam dem Wald vor lauter Bäumen nicht 
mehr.

von Peter D. (peda)


Lesenswert?

Tobias M. schrieb:
> ich seh langsam dem Wald vor lauter Bäumen nicht
> mehr.

Das haben Programme allgemein so an sich, wenn sie wachsen und man 
keinen Programmablaufplan erstellt hat.

Quelltexte nicht anzuhängen, sondern stückchenweise ohne Syntax 
Highlighting erhöht auch nicht gerade die Lesebereitschaft.

von Tobias M. (tobner)


Lesenswert?

Okay, hier der komplette Quelltext:

    #include <Servo.h>
    #include <LiquidCrystal.h>
const int Taste1 = 0;
const int Taste2 = 6;
const int Taste3 = 7;
const int Taste4 = 8;
const int Taste5 = 0;
const int Taste6 = 10;
const int Taster = A0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    double time = 0;
    double timeb =0;
    double secondsa=0;
    int secondsb=0;
    double secondsc=0;
    int minutes=0;

      class Flasher
    {
      // Klassen speichern die Variablen
      // Sie werden anfangs initialisiert
      int ledPin;
      long OnTime;     // "An"-Zeit in Millisekunden
      long OffTime;    // "Aus"-Zeit in Millisekunden



      int ledState;                 // led-Status
      unsigned long previousMillis;   // speichert die Zeit seit dem 
letzten Update


      // Flasher bereitstellen
      public:
      Flasher(int pin, long on, long off)
      {
          ledPin = pin;
  pinMode(ledPin, OUTPUT);
          OnTime = on;
          OffTime = off;
      pinMode (Taste1, INPUT);
      pinMode (Taste2, INPUT);
      pinMode (Taste3, INPUT);
      pinMode (Taste4, INPUT);
      pinMode (Taste5, INPUT);
      pinMode (Taste6, INPUT);
      pinMode (Taster, INPUT);


      ledState = LOW;
      previousMillis = 0;
      }

      void Update()
      {
        // checken, ob es Zeit zum umschalten der LED ist
        unsigned long currentMillis = millis();

        if((ledState == HIGH) && (currentMillis - previousMillis >= 
OnTime))
        {
          ledState = LOW;  // ausschalten
          previousMillis = currentMillis;  // Zeit speichern
          digitalWrite(ledPin, ledState);  // LED umschalten
        }
        else if ((ledState == LOW) && (currentMillis - previousMillis >= 
OffTime))
        {
          ledState = HIGH;  // anschalten
          previousMillis = currentMillis;   // Zeit speichern
          digitalWrite(ledPin, ledState);   // LED umschalten
        }
      }
    };

    class Sweeper
    {
      Servo servo;              // the servo
      int pos;              // current servo position
      int increment;        // increment to move for each interval
      int  updateInterval;      // Intervall zwischen den Updates
      unsigned long lastUpdate; // Zeit seit dem letzten Update

    public:
      Sweeper(int interval)
      {
        updateInterval = interval;
        increment = 1;
      }

      void Attach(int pin)
      {
        servo.attach(pin);
      }

      void Detach()
      {
        servo.detach();
      }

      void Update()
      {
        if((millis() - lastUpdate) > updateInterval)  // time to update
        {
          lastUpdate = millis();
          pos += increment;
          servo.write(pos);
          Serial.println(pos);
          if ((pos >= 180) || (pos <= 0)) // Ende der Rotation
          {
            // rückwärtige Rotation
            increment = -increment;
          }
        }
      }
    };


    Flasher led1(13, 600, 600);
    Flasher led2(13, 375, 375);
    Flasher led3(13, 250, 250);
    Flasher led4(13, 210, 218);
    Flasher led5(13, 187, 188);
    Flasher led6(13, 166, 166);

    Sweeper sweeper1(250); //Zeit zwischen den Schritten

    void countdown(){

      secondsa=timeb/1000000;
      minutes=secondsa/60;
      secondsc=minutes*60;
      secondsb=secondsa-secondsc;

  lcd.setCursor(0,0);
  lcd.print("  ");
  lcd.setCursor(0,0);

  if(minutes<10){
  lcd.print("00");
  lcd.setCursor(1,0);
  }

  lcd.print(minutes);
  lcd.setCursor(2,0);
  lcd.print(":");
  lcd.setCursor(3,0);
  lcd.print("  ");
  lcd.setCursor(3,0);

  if(secondsb<10){
  lcd.print("00");
  lcd.setCursor(4,0);
  }

  lcd.print(secondsb);

    if(timeb>0){ //count only time isn't 0 (button dos'nt pressd)
    lcd.setCursor(0,1);
    lcd.print("Zeit louft");
    lcd.setCursor(5,0);
    lcd.print("  ");
    timeb=time-micros();
    sweeper1.Update();
    }
      if (timeb<=0){
      lcd.setCursor(0,0);
      lcd.print("00:00");
      lcd.setCursor(0,1);
      lcd.print("Zeit = 0   ");

    }
    }

    void setup()
    {
      Serial.begin(9600);
      sweeper1.Attach(9);
      lcd.begin(16, 2);
      lcd.setCursor(4, 0);
      lcd.print("Dings");
      lcd.setCursor(2,1);
      lcd.print("CTG-Simulator");
      delay (4000);
      lcd.clear();
      digitalWrite (A0,HIGH);
    }


    void loop()
    {
      countdown();
      if(digitalRead(A0) == LOW)
      {
         time = time + 30000000;
         timeb = time;
         delay(250);
      }

      if(digitalRead(Taste1) == LOW)
      {
        lcd.setCursor(9, 0);
        lcd.print("FHF: 50");
        led1.Update();
      }
      if(digitalRead(Taste2) == LOW)
      {
        lcd.setCursor(9, 0);
        lcd.print("FHF: 80");
        led2.Update();
      }
      if(digitalRead(Taste3) == LOW)
      {
        lcd.setCursor(9, 0);
        lcd.print("FHF:100");
        led3.Update();
      }
      if(digitalRead(Taste4) == LOW)
      {
        lcd.setCursor(9, 0);
        lcd.print("FHF:120");
        led4.Update();
      }
      if(digitalRead(Taste5) == LOW)
      {
        lcd.setCursor(9, 0);
        lcd.print("FHF:160");
        led5.Update();
      }
      if(digitalRead(Taste6) == LOW)
      {
        lcd.setCursor(9, 0);
        lcd.print("FHF:200");
        led6.Update();
      }
      }


Habe den Taster entprellt, die Anzeige bleibt bei 00:00 stehen, doch die 
Zeit läuft "hinter den Kulissen" weiter Rückwärts. Bedeutet, wenn ich 
bei 00:00 den Taster drücke, geht die Zeit nicht auf 05:00 hoch, sondern 
nur auf 04:xx.

von Frickelfritze (Gast)


Lesenswert?

Tobias M. schrieb:
> Okay, hier der komplette Quelltext:

Wie wär's wenn auch du dich mal an die Regeln zum
Posten von (grossen) Quelltexten hältst? Hast du deren
Sinn nicht verstanden?

von Tobias M. (tobner)


Lesenswert?

Frickelfritze schrieb:
> Wie wär's wenn auch du dich mal an die Regeln zum
> Posten von (grossen) Quelltexten hältst? Hast du deren
> Sinn nicht verstanden?

Wie hättest du es denn gerne? ;)

von Karl M. (Gast)


Lesenswert?

Hallo Tobias,

es geht um diese Regeln:
1
Antwort schreiben
2
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
3
Wichtige Regeln - erst lesen, dann posten!
4
Groß- und Kleinschreibung verwenden
5
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
6
Formatierung (mehr Informationen...)
7
[c]C-Code[/c]
8
[avrasm]AVR-Assembler-Code[/avrasm]
9
[code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
10
[math]Formel in LaTeX-Syntax[/math]
11
[[Titel]] - Link zu Artikel
12
Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
13
"Adresse kopieren", und in den Text einfügen.

Noch eine Anmerkung einen Datentype double mit 64Bit hast Du nicht zur 
Verfügung. Bei den AVR ist dieser als double = float deklariert.

von Frickelfritze (Gast)


Lesenswert?

Karl M. schrieb:
> Hallo Tobias,
>
> es geht um diese Regeln:

Das wird scheinbar nicht helfen, denn Tobias kann
nur Copy & Post.

von Tobias M. (tobner)


Lesenswert?

Es tut mir leid, das habe ich vergessen. Kann leider den Betrag nicht 
mehr ändern. Werde es in Zukunft aber berücksichtigen.

von Tobias M. (tobner)


Lesenswert?

Hat keiner noch eine Idee?

Vllt könnte ich eine Variable einfügen, die ich mit micros () 
gleichsetzen, aber die ich bei Bedarf Null setzen kann. An der Umsetzung 
bin ich bisher leider gescheitert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.