INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
27.12.2014, 13:31
Beitrag #9
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Kann ich während einem Delay im Unterprogramm trotzdem mit einem Taster aus dem Loop einen Wert sofort auf Null setzen? Ohne das Delay abzuwarten?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 13:38
Beitrag #10
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
(27.12.2014 13:31)Marlox schrieb:  Kann ich während einem Delay im Unterprogramm trotzdem mit einem Taster aus dem Loop einen Wert sofort auf Null setzen? Ohne das Delay abzuwarten?

Hi,
das kannst du ja mal versuchen indem du die Null Taste auf einen Interrupteingang legst. Dann darf aber der PWM Ausgang auch nur einmal pro Aufruf gestartet werden weil er sonst gleich wieder aktiviert wird. Hier heist es dann mit Flags arbeiten.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 13:47
Beitrag #11
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
wie schnell muss die Anlage denn stoppen? Wenn du delays um 20ms hast sollte das doch passen, oder? Wenn nicht soltest du parallel vielleicht elektrisch trennen oder einen separaten Ausgang für ein Halterelais nutzen, was sofort abfällt und eventl. den Motor (nicht die Stromversorgung) durch Kurzschluss etwas schneller runterbremst....
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 16:07
Beitrag #12
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Hallo Marlox,

wie ich sehe bringst du Interesse für dein Vorhaben mit und gibst dir Mühe auch selbst deinen Sketch voran zu treiben.

Ich habe deshalb auch mal versucht zu deinem Problem etwas zu "Papier" zu bringen.
Das ist noch nicht ausgereift und keine Endlösung, aber zumindest in Teilen eine Grundlage auf der du aufbauen kannst.

Code:
// Warmlaufprogramm für Frässpindel
// 27.12.2014

int out1 = 11;
int out2 = 12;
int out3 = 13;
int knopfA = 2;
int knopfB = 3;
int knopfC = 4;
int knopfD = 5;
int knopfE = 6;


// Zeitkonstanten
#define lzPhase1     120*1000UL   // 120*1000ms = 120 Sekunden
#define lzPhase2     120*1000UL   // 120*1000ms = 120 Sekunden
#define lzPhase3      60*1000UL   //  60*1000ms =  60 Sekunden

// Variablen für Programmablauf
int mode                   = 0;   // 0 = nichts ausgewählt
                                  // 1 = Phase 1 ausgewählt
                                  // 2 = Phase 2 ausgewählt
                                  // 3 = Phase 3 ausgewählt
                                  // 4 = kompletter Warmlauf ausgewählt
                                  // 5 = Abbruch ausgewählt
                    
int modeAkt                = 99;  // 0 = nichts aktiv
                                  // 1 = Phase 1 aktiv
                                  // 2 = Phase 2 aktiv
                                  // 3 = Phase 3 aktiv
                                  // 4 = kompletter Warmlauf aktiv
                                  // 5 = Abbruch aktiv
                                  // 99 = undefiniert, nach Programmstart

unsigned long aktStartzeit     = 0;      //aktuelle Startzeit
unsigned long sekundentakt     = 0;
boolean       sekundenimpuls   = false;

// Funktionsprototypen (wird bei der Arduino IDE eigentlich nicht gebraucht)
void tastenAbfragen (void); // Taster einlesen
void mode0          (void); // Leerlauf
void mode1          (void); // Phase 1
void mode2          (void); // Phase 2
void mode3          (void); // Phase 3
void mode4          (void); // kompletter Warmlauf
void mode5          (void); // Abbruch


//-------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);    
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  pinMode(knopfA, INPUT_PULLUP);
  pinMode(knopfB, INPUT_PULLUP);
  pinMode(knopfC, INPUT_PULLUP);
  pinMode(knopfD, INPUT_PULLUP);
  pinMode(knopfE, INPUT_PULLUP);
  Serial.println(F("Testprogramm Spindel Warmlauf"));
}

//-------------------------------------------------------------------------
void loop()
{
  tastenAbfragen();

  switch(mode)
  {
    case  0:
      mode0();    
    break;    

    case  1:
      mode1();
    break;    

    case  2:
      mode2();    
    break;    

    case  3:
      mode3();    
    break;    

    case  4:
      mode4();    
    break;    

    case  5:
      mode5();    
    break;    


    default:
      mode = 0;
    break;    
  }  

// 1s Taktsignal bilden
if ( millis() - sekundentakt >= 1000 )
  {
    sekundentakt   = millis();
    sekundenimpuls = true;
  }
}

//-------------------------------------------------------------------------
// Taster einlesen
void tastenAbfragen (void)
{
  if ( !digitalRead(knopfA) && (mode != 1) )  mode = 1;
  if ( !digitalRead(knopfB) && (mode != 2) )  mode = 2;
  if ( !digitalRead(knopfC) && (mode != 3) )  mode = 3;
  if ( !digitalRead(knopfD) && (mode != 4) )  mode = 4;
  if ( !digitalRead(knopfE) && (mode != 5) )  mode = 5;
}

// Leerlauf - alles aus
void mode0 (void)
{
  if ( modeAkt != 0)
  {
    modeAkt = 0;
    Serial.println();
    Serial.print(F("Leerlauf - warte auf Tastendruck"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
}

// Warmlauf Phase 1
void mode1 (void)
{
  if ( modeAkt != 1)
  {
    modeAkt = 1;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 1"));
  }  

  if ( millis() - aktStartzeit < lzPhase1)
  {
    digitalWrite(out1, HIGH);  // Ausgang 1 EIN
    digitalWrite(out2, LOW);   // Ausgang 2 AUS
    digitalWrite(out3, LOW);   // Ausgang 3 AUS
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 1 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}

// Warmlauf Phase 2
void mode2 (void)
{
  if ( modeAkt != 2)
  {
    modeAkt = 2;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 2"));
  }  

  if ( millis() - aktStartzeit < lzPhase2)
  {
    digitalWrite(out1, LOW);   // Ausgang 1 AUS
    digitalWrite(out2, HIGH);  // Ausgang 2 EIN
    digitalWrite(out3, LOW);   // Ausgang 3 AUS
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 2 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}

// Warmlauf Phase 3
void mode3 (void)
{
  if ( modeAkt != 3)
  {
    modeAkt = 3;
    aktStartzeit = millis();
    Serial.println();
    Serial.print(F("Warmlauf Phase 3"));
  }  

  if ( millis() - aktStartzeit < lzPhase3)
  {
    digitalWrite(out1, LOW);   // Ausgang 1 AUS
    digitalWrite(out2, LOW);   // Ausgang 2 AUS
    digitalWrite(out3, HIGH);  // Ausgang 3 EIN
  }  
  else
  {
    Serial.println();
    Serial.println(F("Warmlauf Phase 3 abgeschlossen"));
    mode = 0;  
  }      
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }
}


// Kompletter Warmlauf
void mode4 (void)
{
  if ( modeAkt != 4)
  {
    modeAkt = 4;
    Serial.println();
    Serial.print(F("Kompletter Warmlauf"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
  if (sekundenimpuls)
  {
    Serial.print(".");
    sekundenimpuls = false;
  }  
}

// Not-Aus
void mode5 (void)
{
  if ( modeAkt != 5)
  {
    modeAkt = 5;
    Serial.println();
    Serial.print(F("Not-Aus"));
  }
  digitalWrite(out1, LOW);  // Ausgang 1 AUS
  digitalWrite(out2, LOW);  // Ausgang 2 AUS
  digitalWrite(out3, LOW);  // Ausgang 3 AUS
  mode = 0;
}

Probiere das Programm mal aus und entscheide selbst was du davon gebrauchen kannst.
Phase 1,2 und 3 sollten funktionieren. Der "Not-Aus" auch.
Der "komplette Warmlauf" ist nicht enthalten aber vorbereitet.

Für die PWM-Version könnte ich mir auch vorstellen dass die Drehzahl innerhalb einer einstellbaren Zeit von einer minimalen auf eine maximale Drehzahl kontinuierlich hochläuft. Quasi eine zeitgeführte Warmlauframpe.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 17:11 (Dieser Beitrag wurde zuletzt bearbeitet: 27.12.2014 17:44 von Marlox.)
Beitrag #13
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Oha... Zuerst mal vielen Dank für die viele Arbeit!
Da hätte ich noch ne Weile Bücher wälzen müssen, wie ich sehe Big Grin

Zuerst dachte ich mir, warum so aufwendig, aber je mehr ich mir den Code immer wieder durchlese und verstehen lerne, desto logischer wird das und mir fällt dann teiweise selbst schon auf, warum das jetzt so "hintenrum" gelöst wurde. Es ist also noch nicht alles verloren bei mir Big Grin

Den Teil mit if (Sekundenimpuls) muss ich mir nochmal genauer anschauen. Das ist ja nur eine Art Taktanzeige, oder?
Ist das bei boolean-Werten so, dass man dann bei if-Abfragen keine genauen Anweisungen mehr geben muss? Da steht ja nur
if (sekundenimpuls)

Heisst das dann so viel wie
if (sekundenimpuls == true)
....

?

Generell merke ich gerade, da muss man wirklich lernen, in anderen Dimensionen zu denken... Zum Beispiel das Subtrahieren bestimmter Variablen von millis, wo es in der Realität um Millisekunden geht, um einen simplen 1s-Takt zu bekommen, solch eine Denkweise muss man sich erst mal aneignen, wenn man das nicht kennt.





Das Warmlaufprogramm ist so übrigens vom Hersteller vorgeschrieben, wird also schon auch passen. WENN ich das je mal anders machen würde vermutlich mit Temperaturüberwachung des Lager-Temperatursensors. Aber das ist Zukunftsmusik Wink


Nochmals vielen herzlichen Dank für die tolle Unterstützung, damit kann ich das bestimmt vollends hin bekommen! Und wenn das tut, werde ich mich direkt um die PWM-Ausführung bemühen Wink

Viele Grüße, Marlox

edit:
Ach so, Zeitkritisch ist da nichts. Ich wollte nur in der Lage sein, den Warmlauf auch nochmal zu unterbrechen, wenn ich kurz ein WZ einlegen oder rausnehmen muss oder ähnliches. Und dann natürlich auch wieder in der Phase einsteigen, wo ich aufgehört habe und nicht wieder von ganz von vorne beginnen.
Genau am selben Punkt, wie man ausgestiegen ist, wollte ich extra nicht wieder einsteigen, weil die Unterbrechung ja auch wieder einen Temperaturabfall bedeutet (wenn auch minimal) und ich dann lieber nochmal etwas länger warmlaufen lasse als zu kurz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 17:44 (Dieser Beitrag wurde zuletzt bearbeitet: 27.12.2014 17:47 von ardu_arne.)
Beitrag #14
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Hallo Marlox,

ich hab mir die Arbeit gemacht weil erkennbar ist dass du dich wirklich mit der Materie beschäftigst.Smile

Das Programm ist auch nur als Denkanstoß und Einstiegshilfe gedacht. Perfekt geht anders.Exclamation
An manchen Stellen sieht das Programm auf den ersten Blick wohl kompliziert aus, aber so ist es für Einsteiger besser nachzuvollziehen.

Der "sekundenimpuls" ist eine boolean-Variable die nur den Zustand 0 oder 1 kennt.
Statt 0 oder 1 kann man per Definition auch false oder true schreiben.

Es ist wie du schreibst
if (sekundenimpuls == true)
oder
if (sekundenimpuls != false)
kann man kürzer
if (sekundenimpuls)
schreiben

und
if (sekundenimpuls != true)
oder
if (sekundenimpuls == false)
kann man kürzer
if (!sekundenimpuls)
schreiben

Der "sekundenimpuls" wird nach Ablauf vom 1000ms immer auf true gesetzt. Unabhängig davon ob die Variable "sekundenimpuls" gerade true oder false ist.
Dann wenn der "sekundenimpuls" einmal verwendet wurde wird die Variable auf false gesetzt.
Das ist so gemacht, damit nur jede Sekunde ein "." ausgegeben wird und nicht ständig mit maximaler Geschwindigkeit auf die serielle Schnittstelle geschrieben wird.
Würde man ständig auf die serielle Schnittstelle schreiben würde das die die Dauer eines loop() Zyklus erheblich verlängern. Das käme der Reaktionszeit auf Tastendrücke nicht zu gute und hätte auch sonst noch einige Nachteile.

Arbeite dich mal weiter in die Sache ein.
Wenn es noch frage gibt, kannst die gerne stellen.
Es findet sich hier immer jemand der engagierten Einsteigern weiter hilft.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 17:47
Beitrag #15
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Warum setzt du nicht direkt die PWM- Ansteuerung um?

dafür definierst du einen analogen Ausgang.

Dann kannst du mit Case wie es ardu_arne geschrieben hat in die voids springen, wo dann die Zieldrehzahl definiert ist.

In der void loop vor den case- Abfragen setzt du dann die Funktion, die dann z.B. sanft auf die nächste Drehzahlstufe wechselt...

mal grob zusammen geschrieben- ohne Test:
Code:
void loop()

analogwrite(Ausgang, Drehzahl);

if (Drehzahl < Drehzahlsoll)   //vergleicht die Drehzahl die in den Tasten-voids vorgegeben wird, mit der aktuellen Drehzahl - ist sie kleiner?
   {
   Drehzahl++ ;   // und erhöht die Drehzahl sanft
   delay(5);         // stellt das Tempo der Beschleunigung ein
   }
else
   {
    Drehzahl = Drehzahlsoll;   // ist die aktuell Drehzahl nicht kleiner, dann soll die Drehzahl der Vorgabe entsprechen- es würde also die Vorgabe einer geringer Drehzahl zu einem direkten "abbremsen" auf das Soll erfolgen

switch(mode)
  {
    case  0:
      mode0();    
    break;    

    case  1:
      mode1();
    break;    

    case  2:
      mode2();    
    break;    

    case  3:
      mode3();    
    break;    

    case  4:
      mode4();    
    break;    

    case  5:
      mode5();    
    break;    


    default:
      mode = 0;
    break;    
  }  
  
void mode0()
{
Drehzahlsoll = 0; // PWM- Ausgänge haben immer den min-Wert 0 (aus) und max-Wert 255 (an)
}

void mode1()
{
Drehzahlsoll = 50;
}

.
.
.
.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.12.2014, 17:52 (Dieser Beitrag wurde zuletzt bearbeitet: 27.12.2014 17:54 von Marlox.)
Beitrag #16
RE: Suche Beispiel für je einmal ausgeführte Unterprogramme mit Aufruf durch Tasten
Ah, dann habe ich das richtig verstanden. Danke für die extra Erklärung.

Das ist zB so ein Punkt, der beim Einsteigen etwas Probleme bereitet. Es gibt für so viele Befehle "Abkürzungen", die zwar komfortabel zum Programmieren sind, aber für einen Einsteiger nicht direkt nachvollziehbar, dass es nicht immer ganz leicht ist, durch Codes von verschiedenen Programmierern durchzusteigen. Vor allem wenn die das schon länger machen und das gar nicht mehr bemerken.

Aber ich hab jetzt die Arduino-Reference als Lesezeichen in der Symbolleiste und das O'Reilly "Die elektronische Welt mit Arduino entdecken" in der Hand, alles wird gut Big Grin
Ist ein wenig wie im Urlaub, wenn man mit dem Wörterbuch in der Hand versucht zu verstehen, was einem der Kerl an der Rezeption jetzt nochmal aufgeschrieben hat Big Grin

edit:
Eieiei, seid ihr fix beim Schreiben...
Das mit dem Analog schaue ich mir an, wenn ich den Code hier genau verstanden habe. Aber das kommt definitiv noch. Wenn nicht immer die weltlichen Unterbrechungen wären, schon wieder ruft die Frau... Tongue
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 624 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  4 Tasten für 4 Laufzeiten des gleichen Programms Nimes 8 369 18.07.2016 16:32
Letzter Beitrag: Scheams
  Altes Digitales Display mit Text/Bits durch Genuino Micro versorgen - SPI-Bibliothek? RollingStone 0 206 25.06.2016 17:46
Letzter Beitrag: RollingStone
  2 Tasten drücken damit licht angeht tjard 11 555 19.06.2016 12:24
Letzter Beitrag: hotsystems
  Deckel offen erkennung durch Temperaturabfall MarkoM 3 260 08.06.2016 14:18
Letzter Beitrag: hotsystems
  [Suche] Library Programmierer/in für privates Projekt avoid 8 578 19.05.2016 15:01
Letzter Beitrag: avoid
Sad Suche simplen Scetch für ESP8266-Modul torsten_156 14 1.148 19.04.2016 07:54
Letzter Beitrag: amithlon
  nur ein URL aufruf ohne PHP toto1975 3 610 05.04.2016 08:26
Letzter Beitrag: iks77
  Suche LCD.h Zip bojojo 4 871 11.02.2016 17:31
Letzter Beitrag: bojojo
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.194 08.02.2016 16:28
Letzter Beitrag: ardu_arne

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste