mit Arduino 2 parallele Prozesse steuern

OP #4596692
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
Gast #4596698
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.
Gast #4596857
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
#4597819
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.
OP #4605023
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.
Gast #4605148
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.
OP #4617003
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");
    }
    }
    }
Gast #4617093
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.
OP #4617102
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.
Gast #4617240
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
}
OP #4620032
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.
OP #4620351
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.
Gast #4620432
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren