Forum: Mikrocontroller und Digitale Elektronik Programm anhalten über Taster


von F. P. (pl504)


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?

von Oliver J. (skriptkiddy)


Lesenswert?

Zeig mal etwas Code.

Gruß Oliver

von oldmax (Gast)


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

von (Gast) (Gast)


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
}

von Karl H. (kbuchegg)


Lesenswert?

Und was verbirgt sich hinter 'tastegedrueckt()'?

von Peter D. (peda)


Lesenswert?


von (Gast) (Gast)


Lesenswert?

Ja, hätt ich vielleicht dazusagen sollen - das muss man dann halt 
implemetieren, zumindest ist der Name selbsterklärend :)

von Karl H. (kbuchegg)


Lesenswert?

(Gast) schrieb:
> Ja, hätt ich vielleicht dazusagen sollen - das muss man dann halt
> implemetieren, zumindest ist der Name selbsterklärend :)

Ach, das hab ich gar nicht mitgekriegt.
Das war eine Antwort FÜR den Fragesteller!
Ich hatte das als Antwort des Fragestellers auf seine Ausgangsfrage 
gesehen.

von F. P. (pl504)


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?

von Karl H. (kbuchegg)


Lesenswert?

1
   vorher = *pPORTFIO & TASTER;
2
   ein = 0;
3
4
   while( 1 ) {
5
6
     jetzt = *pPORTFIO & TASTER;
7
8
     if( ( vorher != jetzt ) && jetzt ) {
9
       ein = 1 - ein;
10
       vorher = jetzt;
11
     }
12
13
     if( ein ) {
14
15
       .....
16
     }
17
   }

von Troll (Gast)


Lesenswert?

Wieso nicht einfach einen Schalter an den externen Quarz?!

->kein Takt-> kein laufen

von F. P. (pl504)


Lesenswert?

@kbuchegg:
Danke, werde ich testen. :)

@Troll:
Ganz so brutal geht's leider nicht. Das Teil hat (später mal) 11 kW 
unter Kontrolle und den Not-Aus-Knopf gibt es schon. ;)

von Dieter (Gast)


Lesenswert?

Das ist immer das Beste: Keine Ahnung von nix, davon aber viel...und 
dann mit solchen Zahlen um sich werfen :-)

von oldmax (Gast)


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

von Max D. (max_d)


Lesenswert?

Taster an interrupteingang und im Interrupt ne Endlosschleife die das 
Hauptprogramm blockiert und bei erneutem drücken wieder loslässt...

von oldmax (Gast)


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

von F. P. (pl504)


Lesenswert?

Die Idee mit dem Interrupt kam mir heute früh auch. Wäre wohl am 
einfachsten. Interrupt auf steigende Flanke und dann Bit in der ISR 
toggeln, was dann zu Beginn der Hauptschleife abgefragt wird, z.B.
1
while(!ein);

von Karl H. (kbuchegg)


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.

von Max D. (max_d)


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) ...

von Karl H. (kbuchegg)


Lesenswert?

Max D. schrieb:
> 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

Na komm.
Übertreib nicht, von wegen aufwändig.

von oldmax (Gast)


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

von Route_66 (Gast)


Lesenswert?

Hallo!
Falls Du keinen dynamischen RAM im System hast (Refresch!), kannst Du 
auch den WAIT Eingang (Pin 24) einfach auf GND ziehen.

von F. P. (pl504)


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).

von oldmax (Gast)


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

von F. P. (pl504)


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.

von Jobst M. (jobstens-de)


Lesenswert?

F. P. schrieb:
> 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.

Vielleicht solltest Du Dir mal die Netiquette durchlesen. Besonders 
ab dem Abschnitt 'Klare Beschreibung des Problems'


Gruß

Jobst

von F. P. (pl504)


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!

von Jens (Gast)


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.

von F. P. (pl504)


Lesenswert?

Kein Problem, da kenne ich ganz andere Foren... ;)

von Herbert T. (Gast)


Lesenswert?

F. P. schrieb:
> Kein Problem, da kenne ich ganz andere Foren... ;)

Welche denn?

von set (Gast)


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.

von Jobst M. (jobstens-de)


Lesenswert?

F. P. schrieb:
> Wenn Du der Meinung bist, ich hätte das Problem nicht
> genau beschrieben, tut's mir leid.

Nein, da bist Du schon selbst drauf gekommen. (Siehe mein Zitat von Dir) 
Aber Dir scheint es nicht leid zu tun. Und es sieht so aus, als würdest 
Du dies nicht ändern wollen.


Gruß

Jobst

von oldmax (Gast)


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

von fLIP (Gast)


Lesenswert?

hardware-stop per quarz und paralell angeschlossenem taster der die 
lastkapazitäten trennt.

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.