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?
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) 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.
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
intmain(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
return0;
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?
@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. ;)
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
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
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.
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.
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) ...
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.
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
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).
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
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.
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
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!
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.
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.
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
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