Programm anhalten über Taster

OP #2694109
Lesenswert?

Will mein C-Programm durch einen Tastendruck anhalten und wieder 
fortsetzen. Also wenn der µC eingeschaltet wird, soll er erst auf einen 
Tastendruck warten und dann mit der Programmabarbeitung starten. Wenn 
die Taste erneut gedrückt wird, soll er wieder anhalten (Überprüfung zu 
Beginn der Haupt-Programmschleife).

Bin grad irgendwie zu blöd und krieg's einfach nicht gebacken. 
Einschalten geht, aber ausschalten nicht. Der alte Tastenzustand muß 
noch gespeichert werden und so...
Kann jemand helfen?
Gast #2694133
Lesenswert?

Hi
Nun, ein Programm anhalten wirst du nicht können. Vielleicht schlafen 
legen und wieder aufwecken. Macht aber keinen Sinn. Warum nicht ein Bit 
setzen und wenn nicht gesetzt, dann Sprung zum Ende der Programmschleife

In Prinzip sähe das so aus:
Taster -Kommende oder gehende Flanke bilden
Mit Flanke ein Bit triggern
Ist Bit gesetzt, dann in Bearbeitungszweig

Fertig
Gruß oldmax
Gast #2694155
Lesenswert?

In der Hauptschleife:
1
 
2
if (tastegedrueckt()) { //Taste gedrückt -> Pause bis erneutes Drücken
3
  do {_delay_ms(10);} while (tastegedrueckt());   //warten auf loslassen
4
  do {_delay_ms(10);} while (!tastegedrueckt());  //warten auf weiteren Tastendruck
5
  do {_delay_ms(10);} while (tastegedrueckt());   //warten auf loslassen
6
}
OP #2695032
Lesenswert?

Leute, vielen Dank für Eure Tips!
Das mit der Flankenauswertung gab mir dann den richtigen Anstoß. Habe 
mal etwas rumgeschrieben, aber noch nicht getestet:
1
int main(void) {
2

3
   ...
4

5
   while(1) {
6
      if(ein == 0)
7
         while(!(*pPORTFIO & TASTER));   // warten auf Start
8
      taste = 1;
9
      ein = 1;
10

11
      if(!(*pPORTFIO & TASTER) & taste == 1)
12
         taste = 0;                      // eingeschaltet
13

14
      if((*pPORTFIO & TASTER) & ein == 1)
15
         ein == 0;                       // ausschalten
16

17
      ...Hauptprogramm...
18

19
   }
20
   return 0;
21
}

Kann das so gehen?
Die Hauptschleife (direkt unter while(1)) wird aller 10 ms neu 
gestartet, das habe ich jetzt nicht mit reingeschrieben. Der Taster (Pin 
TASTER) ist schon hardwaremäßig entprellt mit RC und Schmitt-Trigger, 
daher braucht das nicht mit programmiert zu werden. "taste" und "ein" 
sind zwei Hilfsvariablen - kann man das evl. so optimieren, daß man sich 
eine spart?
Gast #2695479
Lesenswert?

Hi
@Dieter
So ganz verstehe ich deinen Beitrag nicht....
Da ich von C nich viel Ahnung habe, hier mal eine Flankenauswertung in 
Assembler ( ohne entprellen)
1
   In   R16, Port(n)
2
   COM  R16           ; Bits drehen bei Verschaltung Taster nach GND
3
   ANDI R 16, 0b00001111   ; Maske für Bit 0-3
4
   STS  New_In, R16        ; neue Bits ablegen
5
   LDS  R17, Old_In        ; letzen Stand in 2. Register für EOR
6
   EOR  R16, R17           ; Bit mit "1" hat sich geändert
7
   STS  Switch_Bits, R16
8
   AND  R16, R17           ; Wechsel nach "0" ( alt "1", neu muss "0")
9
   STS  In_To_LOW, R16     ; Flankenbits ablegen
10
   LDS  R16, Switch_Bits   ; Wechselbits holen
11
   LDS  R17, New_In        ; neue Signallage holen
12
   AND  R16, R17           ; Flanke Taster gedrückt = 1 
13
                           ; Wechselbit 1, neues Bit 1, dann war alt = 0
14
   STS  In_To_High, R16    ; Flankenbits ablegen
15
   STS  Old_In, R17        ; neue Eingänge für nächste Prüfung ablegen
Statt der Variablen "Switch_Bits" kann auch R16 gepusht und gepopt 
werden.
Wichtig ist, daas du das Flankenbit nach bearbeitung zurücksetzt. Z.B. 
Eltako-Schaltung:
1
   ...
2
   LDS   R16, In_To_High     ; Flankenbits laden
3
   ANDI  R16,0b00000001      ; Bit 0 gesetzt ?
4
   BREQ  Irgendwohin         ; Bit ist nicht gesetzt
5
   LDS   R16, Eltako         ; Bit 0 toggeln
6
   LDI   R17, 0b00000001     ; nur Bit 0 wird geändert
7
   EOR   R16, R17 
8
   STS   Eltako, R16         
9
   LDS   R16, In_To_High     ; Flankenbit löschen
10
   ANDI  R16, 0b11111110
11
   STS   In_To_High, R16
Vielleicht kannst du das in C umsetzen....
Gruß oldmax
Gast #2695606
Lesenswert?

Hi
Von "eingefrorenen" Programmen halte ich nicht viel. Schließlich kostet 
es nicht mehr, wenn der Controller durch seine Programmschleife "saust" 
und vielleicht noch ein wenig Kontrollaufgaben übernimmt. z.B. könnte 
eine blinkende LED Bereitschaft signalisieren...
Gruß oldmax
#2695616
Lesenswert?

oldmax schrieb:
> Hi
> Von "eingefrorenen" Programmen halte ich nicht viel.

Ich schliess mich da oldmax an.

Auch ich halt davon nicht viel. Zumal, wie wir alle wissen, Programme 
nie so bleiben, wie sie in der ersten Version waren. D.h. die Chance für 
zukünftige Erweiterungen ist gegeben und es ist nicht besonders schlau, 
sich diese Chance ohne Not zu verbauen. Und sei es nur, das der µC per 
Fernwartung zu jedem Zeitpunkt darüber Auskunft geben können muss, warum 
der Ausgang abgeschaltet ist.


Eine Funktionalität per Taster ein/ausschaltbar zu machen ist eine 
Sache. Aber ihn in einem Interrupt solange festzuhalten ist eine andere 
Sache.
Zumal es das alles auch nicht einfacher macht. Das 'Problem' an der 
Sache ist die saubere Erkennung der Taster-flanken. Der Rest ist 
pipifax.

Und Tasterauswertung ist nichts, was einen externen Interrupt 
erforderlich macht. Zumal die Alternative bei bereits 
hardware-entprellten Tastern trivial ist.
#2696599
Lesenswert?

Das halten per Taster wäre halt die minimal-lösung.....
Und wenn sein Programm wies jetzt aussieht eher trivial gehalten ist, 
dann ist es Schwachsinn eine aufwendige Technik anzuwenden um es 
anzuhalten. Ausserdem ist die int Methode failsave, d.h. selbst ein 
fehlerhaftes proggi wird sicher unterbrochen Ausser es cleart den 
interrupt-enable) ...
Gast #2696618
Lesenswert?

Hi
Also, ich halte es für ziemlich aufwändig, wenn ich einen Controller 
nehme und damit 11kW schalte...., wo der Controller scheinbar nur die 
Aufgabe hat, auf Tastendruck die Leistung ein- bzw.abzuschalten. Ich 
mein, wenn ich schon auf einen Taster drücken muss, warum schalte ich 
nicht gleich den Hauptschalter? Oder nehm eine simple 
Selbsthalte-Schaltung oder einfach einen Eltako ?
Einen Controller einzubauen, um ihn "schlafen" zu legen, ist dagegen 
sicherlich aufwändig...  Aber es ist nicht unsere Aufgabe, der Welt ihre 
fixen Ideen auszureden.
Gruß oldmax
OP #2697280
Lesenswert?

Also zum eigentlichen Projekt hatte ich ja konkret noch nichts gesagt 
(ist ja auch nicht Thema), von daher gehen Eure Mutmaßungen etwas in die 
falsche Richtung.
11 kW sollen nicht einfach bloß geschaltet werden, sondern hier geht es 
u.a. um feldorientierte Regelung von Asynchronmaschinen 
(Raumzeigermodulation). Das Anhalten und Fortsetzen der Steuerung soll 
später auch über Funk möglich sein und der eigentliche FU wird mittels 
Schütz geschaltet (DSP schaltet Transistor -> Relais -> Schütz).
Gast #2697384
Lesenswert?

Hi
Nun, das der µC nicht mit einem Ausgang 11kW schalten soll, hatte ich 
auch nicht erwartet. Trotzdem wird sich hier jeder fragen, wieso du 
einen Controller "anhalten" willst. Ob der nun im Kreis rotiert oder 
nicht, spielt doch erst mal gar keine Rolle. Wenn's um die Sicherheit 
beim Betreiben der Maschine geht, müssen eh andere Maßnahmen ergriffen 
werden, mal ganz simpel angefangen von Strom- und Drehzahlüberwachung. 
Damit kann man auch den Controller beschäftigen und auch mit der 
Schalterei per Funk, aber dafür muss er laufen. So wie du die Frage 
gestellt hast, muss jeder einen falschen Ansatz sehen. Lass deinen 
Controller ruhig seine Runden drehen und wenn ein Ereignis vorliegt, die 
Stichworte sind ja alle schon gefallen, führst du einen Job aus, 
quittierst ihn und drehst dann weiter deine Runden. Der Controller ist 
nicht "abgeschaltet", sondern prüft, ob er irgend was machen darf..... 
da isser nämlich ganz scharf drauf.
Gruß oldmax
OP #2699356
Lesenswert?

Ganz meine Meinung. Wobei die kritischen Sachen wie z.B. Motorstrom und 
ZK-Spannung freilich hardwareüberwacht sind. Je größer das Programm 
wird, umso wahrscheinlicher sind Fehlfunktionen/Überläufe/Abstürze. 
Derart kritische Sachen per Software zu überwachen, wäre nicht zu 
verantworten.
OP #2699811
Lesenswert?

Ist doch völlig egal, WAS für ein Programm angehalten werden soll. Ob 
das den Mittelwert zweier Zahlen ausrechnen soll, oder Pi oder weiß der 
Kuckuck was... Wenn Du der Meinung bist, ich hätte das Problem nicht 
genau beschrieben, tut's mir leid.
Wenn ich großartig drumherum geredet hätte, bekäme ich vielleicht noch 
eins auf den Deckel wegen OT. Wie man's macht, macht man's verkehrt. 
Aber nichtsdestotrotz danke für Eure Hilfe!
Gast #2699848
Lesenswert?

F. P. schrieb:
> Wie man's macht, macht man's verkehrt.

Passiert hier halt gerne im Forum. Aber dahinter steckt meistens, dass 
das eigentliche Problem gar nicht das wesentliche ist. Gerade Anfänger 
denken oft, "Ich muss nur X schaffen, dann ist die Aufgabe gelöst", und 
verstehen gar nicht, dass es gar nicht um X geht, da mit ein bisschen 
nachdenken dieses Problem sich gar nicht stellen würde.

Daher lieber immer direkt alles auf den Tisch - dann findet man die 
beste Lösung.

Nur nicht frustrieren lassen, oder vom herben Ton hier entmutigen 
lassen.
Gast #2699891
Lesenswert?

Wenn du die Hauptschleife anhälst, dann musst du dein Controller wieder 
zurücksetzen damit er wieder was tut. Die Aufgabe der Hauptschleife 
eines Programms ist das Verhindern des Stillstandes eines Controllers.
Gast #2700198
Lesenswert?

Hi
Och, manchmal ist es richtig interessant, da kommt nix zum Thema, aber 
den Abschnitt "Netiquette" scheint perfekt auswendig gelernt....
Ole
Also, ich hab das erste Schreiben nochmal gelesen und da geht so 
ziemlich eindeutig klar hervor, der Autor hat einen Knoten in seinen 
Gedanken. Da braucht es kein drumherum reden.. ein Programm anzuhalten 
ist purer Nonsens. Die Aufgabe spielt doch da überhaupt keine Rolle. Und 
kommt mir bitte nicht mit dem Sleep-Mode.
Das war hier nie die Frage.
Na ja, das im Verlauf der Diskussion Informationen nachgeschoben werden, 
macht doch die Ausgangsbasis nicht hinfällig. Ob nun ein 11KW Antrieb 
geschaltet oder eine LED blinkt, ein Programm anzuhalten ist in beiden 
Fällen Blödsinn. Aber das ist mittlerweile ausgiebig diskutiert worden. 
Was bringt es jetzt noch, auf einer Netiquette zu bestehen....
Nur um mal etwas gesagt zu haben ?
Sorry Jobst, ich weiß, du kannst auch anders.
Gruß oldmax

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