Ich hoffe, dass ich die Frage richtig gestellt habe. Ich hätte gern einen Programmvorschlag, mit dem ich folgendes erreichen kann: Aktuell habe ich 6 Taster, mit dem ich 3 Vorgänge auslöse. An einem Heizkörperthermostat werden dazu durch je 2 Taster folgende Vorgänge ausgelöst: a1) Ventil auffahren a2) Ventil zufahren b1) Sollwert höher stellen b2) Sollwert tiefer stellen c1) Heizung hochfahren (EIN, morgens auf einen vorgewähltem Temperaturwert fahren) c2) Heizung runterfahren (AUS, abends) Es gibt ja schon Lösungen, wie man das mit 3 Tasten machen kann. Leider habe ich nichts gefunden oder falsch gesucht. 1. Taster einmal drücken --> Taster 2+3 Ventil auf/zufahren 2. Taster zweimal drücken --> Taster 2+3 Sollwert ändern 3. Taster dreimal drücken --> Taster 2+3 Heizkörper EIN/AUS 4. .... noch offen Hinweis: meine Programmierkünste ('C') (sowie englisch) sind nur schwach ausgeprägt µC: MSP430Fxxx,
Wolle G. schrieb: > 1. Taster einmal drücken > 2. Taster zweimal drücken > 3. Taster dreimal drücken Man sollte kein Interesse daran haben, ein Bedienfeld derart maximal unkomfortabel zu gestalten.
Wolle G. schrieb: > Hinweis: meine Programmierkünste ('C') (sowie englisch) sind nur schwach > ausgeprägt Dann lernst Du es am besten oder beauftragst eine Firma damit. Erwartest Du jetzt ernsthaft daß sich jetzt jemand eine Woche lang hinsetzt und das Programm für Dich schreibt? Davon abgesehen ist die vorhandene Steuerung schon durchdacht genug. Da muß man eigentlich nichts mehr vermurksen.
Andreas B. schrieb: > Davon abgesehen ist die vorhandene Steuerung schon durchdacht genug. Da > muß man eigentlich nichts mehr vermurksen. danke für die Lorbeeren, aber ich möchte meine Ansteuerung verbessern, um meine Leiterplatte noch weiter verkleinern zu können. > Erwartest Du jetzt ernsthaft daß sich jetzt jemand eine Woche lang > hinsetzt und das Programm für Dich schreibt? eine Woche lang hinsetzt und > das Programm für Dich schreibt? So lange habe noch nicht einmal ich für die 6 Tasteransteuerung + PID-Regler-programmierung gebraucht. Aber vielleicht kann mir doch noch jemand mit einem konkreten Verweis o.ä. helfen.
Du musst dein Programm schon selbst gestalten, oder jemanden dafür bezahlen. Von nichts kommt nichts.
Wolle G. schrieb: > Es gibt ja schon Lösungen, wie man das mit 3 Tasten machen kann. Nun, dann schaltet man mit der ersten Taste ein Switch/Case weiter (Statemaschine). Die einzelnen Case werten dann die anderen beiden Tasten aus. Am einfachsten geht das mit einer Entprell-Lib, die fertige Ereignisse an das Main übergibt. Man muß natürlich auch eine Anzeigemöglichkeit haben, in welchem State man gerade ist.
Stefan ⛄ F. schrieb: > oder jemanden dafür bezahlen. Wie viel Euro möchtest Du dafür haben? Man muss ja mal rechnen.
Wolle, benötigst du ein komfortables / zweckmäßiges Bedienkonzept, oder Hinweise, wie man dieses (oder dein schon beschriebenes) algorithmisch umsetzt?
Wolle G. schrieb: > Hinweis: meine Programmierkünste ('C') (sowie englisch) sind nur schwach > ausgeprägt Wolle G. schrieb: > So lange habe noch nicht einmal ich für die 6 Tasteransteuerung + > PID-Regler-programmierung gebraucht. Das passt nicht zusammen. Wenn Du dieses Programm schon selbst geschrieben hast, warum zeigst Du es dann nicht? Ansonsten: Peda hat gesagt wie es geht.
Wolle G. schrieb: > danke für die Lorbeeren, aber ich möchte meine Ansteuerung verbessern, > um meine Leiterplatte noch weiter verkleinern zu können. Und langfristig bereitet dir eine möglichst kleine Leiterplatte tatsächlich mehr Freude als ein durchdachtes Bedienkonzept? Sachen gibts...
Ein beliebiges Menü mit Unterpunkten und Untermenüs muss man minimal in eine Richtung durchlaufen können dank wraparoud, man muss Einträge setzen können und wieder löschen und man muss aus einer Ebene in einer darüber gelangen können. Das geht mit 3 Tasten. Guck dir Menüs von Geräten mit wenigen Tasten an wie Computerbildschirme. Oder auch DECT Telefone.
Peter D. schrieb: > Switch/Case weiter > (Statemaschine) Ist ein Programm bestehen aus Switch/Case-Anweisungen bereits eine Statemaschiene? Wie definiert man die Transitionen mit Switch-Case?
Ich Programmiere auf meine Arduino Menüs mit viel mehr Möglichkeiten mit 3 Tasten ohne so ein Mist aber mit einen einfachen 2 * 16 Display. Taste 1 : PLUS Taste 2 : MINUS Taste 3 : MENÜ oder OK. Alle Tasten sind während des Betrieb mit anderen Funktionen belegt. Je nach Projekt ist die Menü-Taste auch doppelt belegt (dann 3 Sekunden Auslösung für Menü-Funktion) oder direkt. Funktioniert so. Menü-Taste Auslösen = Menü wird aufgerufen mit Eintrag 1, Restliche Einträge werden mit kurzen Druck weiter geschaltet. 3 Sek. Druck oder Eintrag "Menü verlassen" verlässt das Menü. Menüs in Loop-Schleife. + o. - schaltet auf nächsten Eintrag. MENÜ ändert der Wert Mit Loop-Reihe bei vorgegebenen Werten = z.b. 18 - 20 - 22- 24 - 30 - 18 - ..... oder JA / NEIN ) Besonderheit : Menu - Taste länger (3 Sek) halten = zurück aus den Menü o. Untermenü Je nach meiner Laune. Das Menü kann auch Untermenüs haben. Dann Springt MENÜ als OK halt ins Menü. Und das ohne so ein Theater wie der TO da macht. Mein aktuelles Projekt hat z.Z. 14 Einträge. Da würde ich mit der Art des TO irre werden. Und ein billiges Display gehört m.M.n. eh zu jeden Projekt/Gerät. Damit der User Rückmeldungen bekommt was Sache ist. Ich entwickele zwar nur für mich, aber ich will wissen was halt Sache ist. Ja nach Laune, Platz oder Geld (bei 4 x 16/20er Display)wird in der letzten Zeile des Display die Tastenbelegung angezeigt.
Wolle G. schrieb: > Wie viel Euro möchtest Du dafür haben? Nein Danke. Ich habe kein Interesse an dem Projekt. Ich mache in Freizeit lieber Sachen, die Spaß machen, als so einen Käse.
Wolle G. schrieb: > Ich hoffe, dass ich die Frage richtig gestellt habe. > Ich hätte gern einen Programmvorschlag, mit dem ich folgendes erreichen > kann: Variante mit zwei Tasten / Bedienelementen: Drei LEDs geben die aktuelle Funktion aus (Ventil, Sollwert, Heizung). Taste 1 verkleinert den Wert, Taste 2 vergrößert ihn. Wird Taste 1 gedrückt und gehalten, kann mit Taste 2 die Funktion geändert werden. Eventuell springt die Funktion nach einiger Zeit wieder auf "Sollwert" zurück, damit der Wert auch ohne Funktionswahl einstellbar ist. Variante mit einer Taste / einem Bedienelement: Ein Drehgeber mit Tastenfunktion = ergibt wieder drei Tasten plus eine eventuelle Nutzung eines langen Tastendrucks als vierte Taste. Die Programmierung machst Du aber selber.
verzweifelter Bediener schrieb: >> um meine Leiterplatte noch weiter verkleinern zu können. > > Und langfristig bereitet dir eine möglichst kleine Leiterplatte > tatsächlich mehr Freude als ein durchdachtes Bedienkonzept? Die Größe eines elektronischen Thermostatkopfes mit seiner Elektronik setze ich mal als bekannt voraus. Diese Größe wird wieder angestrebt. Die zu ersetzende Elektronik hatte auch nur 3 Tasten. Peter D. schrieb: >Nun, dann schaltet man mit der ersten Taste ein Switch/Case weiter >(Statemaschine). Die einzelnen Case werten dann die anderen beiden >Tasten aus. So was mit -Switch/Case- habe ich schon mal gelesen. Leider aber wenig bis keine Ahnung von der Anwendung. Im Anhang einen Ausschnitt aus meinem Programm zur aktuellen Tastensteuerung. Eigentlich hatte ich gedacht, dass jemand nur seinen Schubkasten öffnen muss, um eine Lösung zu finden. (einfaches menü) Früher gab es mal Forenteilnehmer (z.B. Rufus oder Buchegger), die mir immer gern geholfen haben, wenn ich Probleme bei der Programmierung hatte. Schlaumaier schrieb: > Funktioniert so. > > Menü-Taste Auslösen = Menü wird aufgerufen mit Eintrag 1, Restliche > Einträge werden mit kurzen Druck weiter geschaltet. 3 Sek. Druck oder > Eintrag "Menü verlassen" verlässt das Menü. Genau. So was, o. ä., suche ich in C vorzugsweise für MSP430Fxxx Stefan ⛄ F. schrieb: > Wolle G. schrieb: >> Wie viel Euro möchtest Du dafür haben? > > Nein Danke. Ich habe kein Interesse an dem Projekt. Wie sang doch Roberto Blanko: "Ein bisschen Spaß muss sein..." oder https://www.youtube.com/watch?v=hQ8tY0c-s04
:
Bearbeitet durch User
Ist ja gruselig. ;-) 1) habe ich das Ganze mal korrekt eingerückt damit es lesbar wird. Gewöhn Dir das an, sonst wirst Du bei Deiner Hilfesuche einige zur Flucht veranlassen (Kate hat eine Funktion dazu, sonst hätte ich das auch nicht gemacht). 2) Die Tastenabfrage machst Du am besten erst mal mit einer ordentlichen Debounce Routine. Das mit der direkten Abfrage wird nichts, glaube es einfach. (Stichwort: Tastenprellen). Die Debounceroutine gibt es von Peda in der Artikelsammlung. Kopieren, nicht drüber nachdenken und glücklich sein. Wobei es natürlich nicht schaden kann, das auch zu verstehen. ;-) 3) Schau Dir an, wie Statemaschinen funktionieren. Wenn Du dieses Bedienkonzept wirklich so machen willst: Bsp. für die States der ersten Taste: - 1x gedrückt (hier wird geprüft, ob Timeout 1 abgelaufen ist: ja, dann Ventil steuern. Nein dann Status 2x gedrückt setzen) - 2x gedrückt (hier wird geprüft, ob Timeout 1 abgelaufen ist: ja, dann Sollwert steuern. Nein dann Status 3x gedrückt setzen) - 3x gedrückt (hier wird geprüft, ob Timeout 1 abgelaufen ist: ja, dann Heizung steuern. Nein dann komplett raus, da Fehlbedienung) Timeout 1 für diese Auswahl (hier mußt Du Dir eine Zeit ausdenken, bis der Tastenzähler 1-3) wieder zurückgesetzt wird. Bsp. 1-2s, danach wird der entsprechende Wert gesetzt. Timeout 2 für den kompletten Einstellvorgang. Bsp. 5-10s, danach alle Zähler zurück und Einstellwert übernehmen. 4) Verdacht: Du hast noch nie mit Timern programmiert. Lerne es. Ohne die geht das nicht. Diese Timeouts kannst Du mit der Debounceroutine zusammen in einen Timer setzen. Es ginge auch ohne Statemaschine, wenn Du einen der Taster mit 2 Positionen verwendest (halb- /ganz durchgedrückt hat jeweils einen extra Kontakt). Dann wäre ohne Drücken der ersten Taste Ventil, halb durchgedrückt Sollwert, ganz durchgedrückt Heizung. Ah, ja, was Rufus oder Buchegger betrifft: Diese Herren haben immer sehr gute Tips gegeben (habe ich immer sehr gerne gelesen). Aber Deine SW hätten sie bestimmt nicht geschrieben.
Andreas B. schrieb: > Schau Dir an, wie Statemaschinen funktionieren. Weil das hier so oft gefragt wird, habe ich dazu mal einen kleinen AUfsatz mit Bildchen geschrieben: http://stefanfrings.de/multithreading_arduino/index.html
Wolle G. schrieb: > Eigentlich hatte ich gedacht, dass jemand nur seinen Schubkasten öffnen > muss, um eine Lösung zu finden. (einfaches menü) Die Schublade gibt es fürs Tastenentprellen von Peter. Der Rest sind 10 Zeilen Konzept, die mit 100 Zeilen deiner Aufgabe gefüllt werden. Und ja nach Aufgabe gibt es 20 Variationen dieser 10 Zeilen Konzept. Wichtig sind: -welches Zeitkonzept fährst Du? Spsloop oder ist deine Pause1 mehr als 10ms? -welches Möglichkeiten hat deine Anzeige? 2x7seg, dotmatrix, LEDs? - was bist Du bereit zu lernen? Pointer? Strukturen? Refaktoring? Tastenentprellen? Prinzipiell geht es mit 6 Tasten hier auch ohne entprellen, dann ist aber Pause wohl eher 200-500ms lang und das ganze Programm sehr ineinander verwoben.
Wolle G. schrieb: > 1. Taster einmal drücken Noch ein Vorschlag zum Tieferlegen der Benutzbarkeit: 1 Taste und Morsecode. Aber mit 3 Tasten und einem Display kriegt man das hin: Taste 1 = rauf Taste 2 = Enter Taste 3 = runter Man manövriert mit Tasten 1+3 zu dem Eintrag, den man ändern will, drückt Enter und kann dann mit Tasten 1+3 den Wert ändern. Nochmal Enter und man ist wieder im Manövrier-Modus. Und wo man ist und was jeder Eintrag grad für einen Wert hat, kann man am Display ablesen. W.S.
W.S. schrieb: > Man manövriert mit Tasten 1+3 zu dem Eintrag, den man ändern will, > drückt Enter und kann dann mit Tasten 1+3 den Wert ändern. Das macht bei 3 Aufgaben und wolles Kenntnissen wenig Sinn. Es reicht eine Taste, die durch die 4 Punkte durchtickert (3+Default) und dann die anderen beiden +/- resp. an/aus. Mit enter wird die Bedienung hier komplizierter und aufwändiger. M.e. macht enter erst Sinn, wenn das Menü mehrdimensional ist oder mehr als etwa 10 Einträge hat. Auf der anderen Seite: mit 4 Tasten (also noch Escape, bzw Menü Up) ist dann jedes noch so komplexe Menü relativ einfach möglich, mit Zahlen eingeben etc.. Hier aber alles Overkill.
W.S. schrieb: > Man manövriert mit Tasten 1+3 zu dem Eintrag, den man ändern will, > drückt Enter und kann dann mit Tasten 1+3 den Wert ändern. Nochmal Enter > und man ist wieder im Manövrier-Modus. Und wo man ist und was jeder > Eintrag grad für einen Wert hat, kann man am Display ablesen. So funktioniert das Thermostat meiner Heizungsanlage. Und ich finde es eine dreiste Unverschämtheit, dafür auch noch 240€ zu verlangen. Mit dem Ding haben sich sogar die Monteure der Anlage schwer getan.
....mit Einsatz einer Farb/Leuchtdiode oder Minipiper kann man das sogar mit einer Taste lösen. Aber ohne Bedienanweisung wird dies nicht gehen. Ist ein Experimental-Lösungsvorschlag welchen ich für die Praxis nicht Nutzen würde. ...es ist mir aufgefallen das auch Lösungsvorschläge nicht ohne nach treten auskommen. ;-)) MfG
:
Bearbeitet durch User
Al. K. schrieb: > ....mit Einsatz einer Leuchtdiode oder minipiper kann man das sogar mit > einer Taste lösen. > Aber ohne Bedienanweisung wird dies nicht gehen. > Ist ein Experimental-Lösungsvorschlag welchen ich für die Praxis nicht > Nutzen würde. da kommen wir wieder zu meiner eingangs gestellten Frage (bzw. "Behauptung"): Es sollte erst mal klar sein, wie das Bedienkonzept aussieht: Wieviele Tasten, welche in welcher Reihenfolge, wieviele Menuepunkte, wieviele Masken etc.) Danach kann man sich dran geben, über Interupts oder Register oder Variablen-Namen nachzudenken.
:
Bearbeitet durch User
In meiner Jugendzeit hatte ich mal ein Pager.(Google was das ist). Da ich nur das billigste Modell hatte (45 DM) hatte er nur eine Taste. Hat funktioniert aber war grausig. Wichtig aber war. Er hatte ein Display. Man KANN wenn ein Display da ist, immer alles mit einer Taste steuern, selbst Einstellungen. ABER das was man an Technik (Schaltern) spart, muss man durch viel mehr Code und größeren Speicher sich erkaufen. Meine (s.o.) Methode ist einfach zu bedienen, spart Code und *sorry Stefan* hat keine AUTOMATISCHE Rücksprungfunktion. Der Grund ist einfach. Es kostet Code und ich bin Faul. ;) Aus diversen Gründen wird sogar der Code "angehalten". Was bedeutet der MC warten bis das Menü verlassen wird. Projekt bedingt ist das nämlich nicht erforderlich das er weiter läuft. Weil über das Menü nur Einstellungen für die Eigenschaft der anderen Tasten und den Ablauf des Programms gemacht werden, die beim Druck der Taste START/STOP abgefragt wird und den zu folge reagiert werden. P.S. In einen anderen Tread hier habe ich ein Tipp für ein prima Tasten-Board bekommen was hoffentlich morgen geliefert wird. ;) (ca. 3 Euro aus DE)
Wenn sich schon der Programmierer schon keinen Plan erstellen kann, wie das Menü funktionieren soll, wie sollen dann die Anwender damit klar kommen? Die müssen die Logik doch auch verstehen können!
Stefan ⛄ F. schrieb: > Wenn sich schon der Programmierer schon keinen Plan erstellen kann, wie > das Menü funktionieren soll, wie sollen dann die Anwender damit klar > kommen? Die müssen die Logik doch auch verstehen können! Deshalb ist mein Menü auch PERFEKT. ;) Ich bin beides. Programmierer und Anwender. hihi. Und wir beide verstehen uns. hihi.
Schlaumaier schrieb: > Deshalb ist mein Menü auch PERFEKT A)ALLES, was man nicht hat, macht auch keine Probleme. B)Mit nur 3 Tasten rumfummeln kann den User wenig Spaß machen, besonders wenn später die Tasten prellen.
oszi40 schrieb: > B)Mit nur 3 Tasten rumfummeln kann den User wenig Spaß machen, besonders > wenn später die Tasten prellen. Ein Menü ist zum Einstellen da. Da fummelt man 1 x herum und meist nie wieder. Und es hat keiner gesagt das es keine Entprell-Routine bei mir gibt. Das ist in meinen Augen Standard und nicht der Rede wert. Ach übrigens das Menü meiner Nikon-Spiegelreflex-Kamera wird auch nur mit 3 Tasten bedient. ;) Und die hat viel mehr Einstellungen wie meine Projekte. Aber sie hat auch ein (schöneres) Display.
Al. K. schrieb: > ....mit Einsatz einer Farb/Leuchtdiode oder Minipiper kann man das sogar > mit einer Taste lösen. Naja, das ist kein Hexenwerk. So wie man mit einer Taste die Menüs durchklimpern kann, kann man mit einer andern Taste auch jeweils nur toggeln oder incrementieren (kein decrement) Um das ganze mit einer Taste zu machen, muss man halt entweder lang (Menü) und kurz (wert ändern) unterscheiden, oder mit timeouts arbeiten (z.b. Grundstellung nach 5s: jeder Tastendruck toggelt Menüpunkt, nach 2s Pause blinkt der Wert und man kann den toggeln)
Schlaumaier schrieb: > hat keine AUTOMATISCHE Rücksprungfunktion. Der Grund ist > einfach. Es kostet Code und ich bin Faul. ;) Ob Du mit einer Zeile Code verhinderst, dass man nach dem letzten Eintrag weiterspringt, oder stattdessen mit einer Zeile Code zum ersten Eintrag springst, macht keinen Unterschied. Schlaumaier schrieb: > Aus diversen Gründen wird sogar der Code "angehalten". Was bedeutet der > MC warten bis das Menü verlassen wird. Der erste der diversen Gründe ist, dass Du keine State Machines bauen kannst? Schlaumaier schrieb: > Ich bin beides. Programmierer und > Anwender. hihi. Und wir beide verstehen uns. hihi. Damit hast Du unbeabsichtigt auf den Punkt gebracht, warum viele Produkte (insbesondere Software) von Endanwendern als umständlich empfunden werden. In diesem konkreten Fall (gerade mal 3 Menüeinträge) ist eine Menütaste zum Auswahl des Eintrags in Kombination mit "+"- und "-"-Tasten völlig ausreichend. Ein Feedback (idealerweise ein LCD, mit LEDs ist es schon wenig elegant) ist natürlich notwendig.
Hmmm schrieb: > In diesem konkreten Fall (gerade mal 3 Menüeinträge) ist eine Menütaste > zum Auswahl des Eintrags in Kombination mit "+"- und "-"-Tasten völlig > ausreichend. Ein Feedback (idealerweise ein LCD, mit LEDs ist es schon > wenig elegant) ist natürlich notwendig. Was ich in meinen Ersten Eintrag hier sehr genau beschrieben habe. Hmmm schrieb: > Der erste der diversen Gründe ist, dass Du keine State Machines bauen > kannst? Nein, der Grund ist das es nicht erforderlich ist, und der 2. ist das ich zu Faul bin. SÄMTLICHE Informationen werden bei Druck der Taste START o. einer andere Taste abgefragt und danach abgearbeitet. Ich versuche es mal zu erklären. Die Taste "M-1" gibt eine Zeiteinheit vor an das System. Mit der Taste + und Minus wird dieser Wert verringert. Start löst eine Funktion aus die genau so lange läuft wie dieser Wert eingestellt ist. Im Menü wird für die Taste "M-1" der Wert vorgegeben der bei ihren Druck erscheint. Ach die Tasten sind im Normal Betrieb. M-1 , M-2, M-3, M-4, +10, +5, +1, Clear (Setz alles auf Anfang), Menü, Start , Stop. Nach Druck auf Start sind alle Tasten geblockt bis auf Stop. Nach Druck auf STOP (oder Ablauf der Zeit) sind alle wieder frei. Es ist im Prinzip einen Digitale Eieruhr die aber via Infrarot und andere Technik diverse Funktionen auslöst. Die M-Tasten sind gespeicherte Werte damit ich nicht jedes mal die Zeit einstellen muss. Diese könnte ich zwar im Code hinterlegen aber ich mag es etwas flexibler. Was das Display angeht. Mir reichen die China-Text-Display via i2c völlig aus. Preiswert, einfach anzusteuern und ich muss wenig Coden. Code : lcd.Initialize(0x27, 16, 2) lcd.Backlight = True lcd.SetCursor(1,0) lcd.Write("Startzeit") ;)
Schlaumaier schrieb: > Was ich in meinen Ersten Eintrag hier sehr genau beschrieben habe. Nein. Ich meine, dass man die Menütaste direkt zum Durchblättern benutzt und die "+"- und "-"-Tasten ausschliesslich für die Veränderung der Werte benutzt werden. Du beschreibst eine Variante, bei der "+" und "-" zum Durchblättern benutzt werden und die Menü-Taste auch als Enter-Taste fungiert. Das ist erst in Menüs mit mehreren Ebenen (oder sehr vielen Menüpunkten) sinnvoll. Bist Du eigentlich identisch mit Alexander K. aka "Pucki"?
Hmmm schrieb: > Das ist > erst in Menüs mit mehreren Ebenen (oder sehr vielen Menüpunkten) > sinnvoll. Schlaumaier schrieb: > Mein aktuelles Projekt hat z.Z. 14 Einträge. Da würde ich mit der Art > des TO irre werden. Bei 14 Einträgen wovon ich geschrieben habe ist meine Art halt sinnvoll. Aber das kann der TO oder wer auch immer ja regeln wie er will. Hmmm schrieb: > Bist Du eigentlich identisch mit Alexander K. aka "Pucki"? Wie kommst du darauf. ?
Erfolgsmeldung. Ich habe jetzt mein Programm mit einem Eigenbaumenü ergänzt. Taste 1 stellt den Menüpunkt ein. Taste 2 + 3 öffnen und schließen das Ventil oder fahren den Sollwert hoch und runter oder.... Die Anzahl der Menüpunkte oder wie man das nennt, ist noch erweiterbar.
sehr gut. Ich würde solche Fragen lieber in einem richtigen Forum stellen idealerweise direkt für C Oder, da es dir nur ums prinzipielle geht in einem Basic oder Pascal Forum. Die Leute dort sind bedeutend hilfsbereiter und liefern dir ungefragt auch gleich einen Quellcode, da es ihnen Spaß macht in diese Sprachen zu programmieren. In C macht so etwas scheinbar niemand ma eben so aus Spaß an der Freude...
Paula P. schrieb: > In C macht so etwas scheinbar niemand ma eben so aus Spaß an der > Freude... Nö, da gibts sowas schon fertig. https://www.mikrocontroller.net/articles/Entprellung#Timer-Verfahren_.28nach_Peter_Dannegger.29 Ich kombiniere das oft mit einer Drehencoderroutine, weil ich die Einknopfbedienung schätze (Drehencoder mit einer Taste). Ich würde Wolle empfehlen, die Routine auf den MSP430 zu portieren, und damit ist ein für alle Mal das Thema Tasten mit Entrprellung gelöst.
Stefan ⛄ F. schrieb: > Nein Danke. Ich habe kein Interesse an dem Projekt. Ich mache in > Freizeit lieber Sachen, die Spaß machen, als so einen Käse. Dann hast du entweder zu wenig zu tun in deiner Freizeit, oder dein tun hier im Forum macht dir tatsächlich Spaß. Sachen gibts ...
hier auch noch mal ein zum Download aber in c https://libstock.mikroe.com/projects/view/724/menus-on-lcd-2x16-menus-example
Paula P. schrieb: > und liefern dir ungefragt > auch gleich einen Quellcode, da es ihnen Spaß macht in diese Sprachen zu > programmieren. > In C macht so etwas scheinbar niemand ma eben so aus Spaß an der > Freude... naja, wenn das Bedienkonzept unklar ist, dann nutzt die beste Programmiersprache der Welt nix. Aber: Wolle G. schrieb: > Erfolgsmeldung. > Ich habe jetzt mein Programm mit einem Eigenbaumenü ergänzt. > Taste 1 stellt den Menüpunkt ein. > Taste 2 + 3 öffnen und schließen das Ventil oder fahren den Sollwert > hoch und runter oder.... > Die Anzahl der Menüpunkte oder wie man das nennt, ist noch erweiterbar. Wolle ist ja jetzt am Ziel. Ein (meines Erachtens verwendbares) Bedienkonzept, und das Programm läuft auch schon gemäß dieser Idee. Also alles fertig, sämtliche weitere diskussionen "nutzen" ja dem Wolle nix mehr, da er ja alles hat was er braucht oder angefragt hat.
"naja, wenn das Bedienkonzept unklar ist, dann nutzt die beste Programmiersprache der Welt nix. Aber:" Keine Frage, aber doe Kommentare die hier wieder gekommen sind, sind hatl wieder ein Armutszeugnis für dieses Forum. Ich hatte nicht ind er Art gelesen wie "Mache s doch so..oder so..und in Quellcode würde das dann in etwa so doer so aussehen.. Wie immer kam nur Gepöbel und Wichtigtuerei von Leuten die offenbar besser einfach nicht antworten sollte...
"naja, wenn das Bedienkonzept unklar ist, dann nutzt die beste Programmiersprache der Welt nix. Aber:" Wenn man dann Kommentare gibt, wren hilfreiche Vorschläge sinnvoll und kein Geblubber
Wegstaben V. schrieb: > Es sollte erst mal klar sein, wie das Bedienkonzept > aussieht Du forderst also, daß die Leute hier zuerst nachdenken und wissen sollen, was sie tun, bevor sie es tun. Nun, das ist sozusagen völlig konträr zu den in diesem Forum üblichen Verhaltensmustern. gelle? Hier wird zuerst 'geproggt', 'gecodet', 'gebuggt' und dann gegreint, gejammert, geklagt - aber das füllt das Forum mit Beiträgen. W.S.
Paula P. schrieb: > Ich würde solche Fragen lieber in einem richtigen Forum stellen > idealerweise direkt für C Wie kommst du auf so etwas? Der Sinn der Sache besteht doch darin, daß jemand lernt, wie man eine Funktionalität konstruiert, einen Algorithmus ausarbeitet und ein Konzept entwickelt. Und dazu ist keinerlei spezielle Programmiersprache erforderlich. Sowas geht zu allererst auf dem Papier mit Bleistift. Was du vermutlich meinst, ist das blinde Kopieren ohne nachdenken zu müssen - und ohne dabei etwas tatsächlich selbst zu lernen. Oder hab ich dich mißverstanden? W.S.
Paula P. schrieb: > Ich hatte nicht ind er Art gelesen wie > "Mache s doch so..oder so..und in Quellcode würde das dann in etwa so > doer so aussehen.. So war meine Ursprungsfrage gestellt. Leider wurde aber zumeist nur viel Text produziert, ohne konkret meine Anfrage beantworten zu wollen. Andreas B. schrieb: > Ah, ja, was Rufus oder Buchegger betrifft: Diese Herren haben immer sehr > gute Tips gegeben (habe ich immer sehr gerne gelesen). Aber Deine SW > hätten sie bestimmt nicht geschrieben. Ich würde eher sagen: Es wäre vermutlich ein konkreter Quellcode geworden, den man nur noch an meine spezielle Anwendung hätte umstricken müssen. Etwa so: while(1) { steuerungsmenue(); if (reglerstart==1)regler(); // Regler wird nach Abtastrate 7x4s + 900x4s =1h angestoßen } void steuerungsmenue(void) { if (P3IN&BIT7) //P3.7 Taster: menuepunkt hochzählen { pause1(); menuepunkt = menuepunkt + 1; if (menuepunkt>3)menuepunkt = 0; } switch (menuepunkt) { case 1: ventilsteuerung_von_hand();break; case 2: sollwerteintellung();break; case 3: heizung_EIN_AUS();break; } } Das wäre dann viel weniger Text gewesen, aber ein Lösungsvorschlag zu meinem Problem. Bestimmt gibt es programmiertechnisch bessere Lösungen. Dann her damit.
Wolle G. schrieb: > Bestimmt gibt es programmiertechnisch bessere Lösungen. Dann her damit. Aber die hast Du doch jetzt mehrfach, auch vorgekaut, bekommen?! >>>>>>> statemachine<<<<<<<<<<<<<
Wolle G. schrieb: > if (P3IN&BIT7) //P3.7 Taster: menuepunkt hochzählen > { > pause1(); > menuepunkt = menuepunkt + 1; > if (menuepunkt>3)menuepunkt = 0; > } Die Taste ist nicht entprellt. Und die "Pause" ist nicht wirklich sinnvoll. Entprellung - Dieser Artikel ist dir bereits mehrmals vorgeschlagen worden. Da gibts sogar den berühmten Code von PeDa - komplett fix und fertig.
Wolle G. schrieb: > Bestimmt gibt es programmiertechnisch bessere Lösungen. Dann her damit. Es ist nicht wichtig ob es "programmiertechnisch bessere Lösungen" gibt. Es ist nur wichtig das der Coder und seine Nachfolger den Code lesen und verstehen können. Zu C-64 Zeiten gab es von selbiger Zeitung ein Wettbewerb. Was geht alles an Code in eine PRG-Zeile. Das war dann perfekt optimierter Code und kein Schwein blickte da durch. .. Ein Code sollte meiner Meinung nach einfach sein, gern ETWAS länger aber schön übersichtlich und gut strukturiert. Das reicht. Ich persönlich tue mich oft sehr schwer Code-Schnipsel von MS zu verstehen. Was ich selbst geschrieben habe, da blicke ich nach 20 Jahren noch perfekt durch. Die Aussage ist getestet weil ein Kunde ein Prg. was ich vor 20 Jahren geschrieben habe, neulich erweitert haben wollte. Da war das schwerste den Code auf ein neues Entwicklungssystem zu porträtieren.
Schlaumaier schrieb: > Hmmm schrieb: >> Bist Du eigentlich identisch mit Alexander K. aka "Pucki"? > > Wie kommst du darauf. ? Ist er. Es gab mal einen Beitrag unter "Schlaumaier", da hat er versehentlich mit Pucki unterschrieben. Finde ich noch... Außerdem ist seine "Grammatik" unverkennbar.
Wolle G. schrieb: > Dann her damit. Lösungen machen nur Sinn, wenn man die Ansätze deines Programms drumherum kennt. Daher die konkreten Fragen. A. S. schrieb: > Wichtig sind: > -welches Zeitkonzept fährst Du? Spsloop oder ist deine Pause1 mehr als > 10ms? > -welches Möglichkeiten hat deine Anzeige? 2x7seg, dotmatrix, LEDs? > - was bist Du bereit zu lernen? Pointer? Strukturen? Refaktoring? > Tastenentprellen?
Das Wichtigste am User-Interface-Design ist imho das weglassen. Du schreibst, du hast 3 Doppelfunktionen: a) Ventil auffahren, Ventil zufahren wofür ist das gut? b) Sollwert höher stellen, Sollwert tiefer stellen nachvollziehbar, das ließe sich klar verständlich auf 2 Tasten mappen. "Feedback" fehlt aber. Was heißt höher? Von welchem Wert aus? Wo sind wir? Wenn du das nicht irgendwie hinkriegst (z.B. mit einem Display) bringen die 2 Tasten nichts. c) Heizung hochfahren (EIN, morgens auf einen vorgewähltem Temperaturwert fahren), Heizung runterfahren (AUS, abends) Ein Ein/Aus-Schalter. Du musst entscheiden, welche Hardware dein Gerät bekommt. Mit Display sind nahzeu beliebig komplizierte Menüs möglich. Mit 4 Cursortasten (ggf. zusätzlich Enter) kann man gut durch Menübäume navigieren. Hast du nur 3 Taster und kein Display wird's schwierig. An/Aus geht z.B. über einen Taster wenn man z.B. eine (optional mehrfarbige) LED als Feedback spendiert. Ein Piepser ist auch eine Idee für Feedback, aber oft wenig intuitiv. Vorschlag zur Vorgehensweise: * Überleg' dir die Hardware * Überlege dir ein Bedienkonzept * Dokumentiere das in einem Zustandsdiagramm (ausgehend vom Ruhezustand, drücke ich Knopf 1, wass passiert dann? --> Knoten "Ruhezustand", Pfeil "Knopf 1", weiterer Zustand "Knoten 1",...). Du kannst dann die komplette Bedienung auf Papier durchspielen. Erst wenn das rund ist, gehts ans programmieren. Das ist dann aber nicht mehr so wild, die Zustände und Übergänge der Statemachine hast du ja schon.
OldPapa schrieb: > Wolle G. schrieb: >> Bestimmt gibt es programmiertechnisch bessere Lösungen. Dann her damit. > > Aber die hast Du doch jetzt mehrfach, auch vorgekaut, bekommen?! Wie weiter oben schon gesagt und von Paula P. richtig erkannt, bezog sich meine Frage nur nach einem Quellcodeschnipsel, vorzugsweise mit viel erklärendem Kommentar, damit auch ich verstehe, wie der Code funktioniert. Zwischenzeitlich habe ich meinen Lösungsversuch mit switch/case „entwickelt“, der nur 10 Zeilen umfasst und genau das macht, was vorher an Stelle von 6 Tasten jetzt die gewünschten 3 Tasten machen. Wie schon mal gesagt, gab es die Art der gewünschten Hilfe (Quellcodeschnipsel) z. B. von Rufus oder Buchegger. Tilo R. schrieb: > Vorschlag zur Vorgehensweise: > * Überleg' dir die Hardware > * Überlege dir ein Bedienkonzept > * Dokumentiere das in einem Zustandsdiagramm (ausgehend vom Ruhezustand, > drücke ich Knopf 1, wass passiert dann? --> Knoten "Ruhezustand", Pfeil > "Knopf 1", weiterer Zustand "Knoten 1",...). Du kannst dann die > komplette Bedienung auf Papier durchspielen. > > Erst wenn das rund ist, gehts ans programmieren. Ich hatte angenommen, dass mein Problem, nämlich ein mir fehlender Programmschnipsel für die Umstellung von 6 Tasten auf 3 Tasten, bereits aus meinem 1. Beitrag ersichtlich ist. Alles, was ich für nötig erachte (z. B. Flüssigkristallanzeige, Motorbrückenschaltung, Stellwegerfassung über Lichtschranke, digitales PID-Reglerprogramm, Temperaturerfassung mit DS18B20 sowie Datenerfassung auf SD-Karte) ist bereits fertig und funktioniert im Wesentlichen. (gutes Spielzeug) Unzufrieden bin ich noch mit der Stellwegerfassung des Hubes. Aktuell kann ich die Weglänge des Ventilhubes auf 1/100mm erfassen. Allerdings fehlen nach einer Betriebzeit von einem Tag ca. 5-15 Hundertstel mm. Eine Erklärung für diese Fehlmessung habe ich noch nicht. Eigentlich ist mein ursprüngliches Hilfeersuchen (ein Menü programmieren) ja schon durch. Trotzdem mal die Frage: Wie wurde der Weg bei einer Computermaus, die über eine Kugel + Lichtschranke angesteuert wurde, erfasst?
:
Bearbeitet durch User
Mit Hardware überlegen hatte ich nur die Bedien-Hardware gemeint, alles andere tut hier ja nichts zur Sache. Aber schön dass es größtenteils funktioniert. Wolle G. schrieb: > Trotzdem mal die Frage: Wie wurde der Weg bei einer Computermaus, die > über eine Kugel + Lichtschranke angesteuert wurde, erfasst? Das ging über 2 Walzen (für zwei Richtungen), an denen dann mit einer Achse Code-Rädchen befestigt waren, die mit je 2 Gabellichtschranken abgetastet wurden. (Code-Rad = hell/dunkel-Streifenmuster, Lichtschranken um 90° versetzt, so dass man die Bewegungsrichtung erkennen kann.)
Hallo Hmmm, Hmmm schrieb: > Bist Du eigentlich identisch mit Alexander K. aka "Pucki"? vielen Dank für den Hinweis. Passt! :) Frei von Selbstzweifeln dringt Alexander K., der auch als Pucki oder schlaumeier firmiert, immer weiter in die unendlichen Tiefen von µc.net vor, um immer wieder neue Bewohner der Galaxie zu belehren. Als letzter Universalgelehrter im deutschen Raum nach Leibniz steht im das zu - zumindest in seiner Selbstwahrnehmung. Mangels positiven Reaktionen der Restforisten auf seine Beiträge entschloss sich Alexander K. dann, aber den Namen "schlaumeier" zu tragen. Man kann seinen Namen wechseln, aber ohne Schizophrenie behält man dummerweise die Persönlichkeit. Ob nun Unternehmen oder Foristen - Namenswechsel sind kein gutes Zeichen... Letztens ließ ihn sein Instinkt eine Hitachi-Festplatte ablehnen: Beitrag "Festplatte noch gut?" Dumm nur, dass ein Blick auf die Backblaze-Statistik zu ganz anderen Ergebnissen führt, als die anekdotische Evidenz eines Computerfricklers. Alexander K(ruger) (Mutter geborene Dunning) wird uns weiterhin viele konfuzianische Weisheiten vermitteln - unter welchem Namen ist egal - seine Handschrift ist unverkennbar.
:
Bearbeitet durch User
Wolle G. schrieb: > nämlich ein mir fehlender > Programmschnipsel für die Umstellung von 6 Tasten auf 3 Tasten Das wäre sowas wie hier unten. Es ist jedoch z.B. ersichtlich, dass die Tastaturbedienung nur über wohldosiert verstreute pause1 möglich ist. Wenn Du dich dazu nicht äußerst, wird der Beispielcode (zurecht) in der Luft zerrissen, obwohl er genau das macht, was Du möchtest (ggf. Flüchtigkeitsfehler). Hätte Dir so ein Code etwas gebracht?
1 | #define T_MENU P3IN&BIT7
|
2 | #define T_UP P3IN&BIT6
|
3 | #define T_DOWN P3IN&BIT5
|
4 | void tastensteuerung(void) |
5 | {
|
6 | int menu=0; |
7 | |
8 | if(T_MENU) {menu++; pause1();} |
9 | |
10 | switch(menu) |
11 | {
|
12 | default: menu=0; /* das default hier macht automatisch auch den Überlauf */ |
13 | break; |
14 | case 1: /* Sollwert (hier sw) */ |
15 | if(T_UP) {sw+=2; if(sw > 470) {sw=470;}} |
16 | else if(T_DOWN) {sw-=2; if(sw < 200) {sw=200;}} |
17 | else break; /* keine Pause wenn keine Taste. Sonst werden Tastendrücke nicht erkannt */ |
18 | sollwert_anzeigen(); |
19 | pause1(); /* ohne diese Pause würde der Wert evt. nach Anschlag springen */ |
20 | break; |
21 | case 2: /* Ventil */ |
22 | if(T_UP) {AUF=1; P5OUT &=~BIT5;} |
23 | else {AUF=0; P5OUT |= BIT5;} |
24 | if(T_DOWN) {ZU=1; P3OUT &=~BIT0; if(ADC12MEM3 > 100) {hub=1;}} |
25 | else {ZU=0; P3OUT |= BIT0;} |
26 | break; |
27 | case 3: /* Heizung EIN / AUS */ |
28 | if(T_UP) {sw=440; ...} /* was immer da zu tun war */ |
29 | else if(T_DOWN) {sw=224; ...} /* " */ |
30 | break; |
31 | }
|
32 | }
|
Also ich mach so simple Sachen mit 2 Tastern und z.B. 4x20 LCD. LCD stellt die Menueebene dar, T1 springt durch die Befehle, T2 ist quasi Enter. Ist intuitiv, geht über beliebige Ebenen und ist schnell eingegeben und ist auch noch schnell programmiert. Gruß Rainer
@ A. S. Danke für den Programmschnipsel. So oder ähnlich hatte ich mir das vorgestellt mit meiner Äußerung: „Dann her damit“. Damit kann ich was anfangen und werde es mal testweise in mein Programm einbauen. Rainer V. schrieb: > T1 springt durch die Befehle, T2 ist quasi > Enter. Ist intuitiv, geht über beliebige Ebenen und ist schnell > eingegeben und ist auch noch schnell programmiert. Und wie sieht jetzt konkret der Quellcode dazu aus? Ich brauche in erster Linie Programmschnipsel (mit erläuternden Kommentar) . siehe Beispiel A.S vom 5.1.21 14:07
Wolle G. schrieb: > So oder ähnlich hatte ich mir das vorgestellt > Ich brauche in erster Linie Programmschnipsel > mit erläuternden Kommentar. Dann schau dir nochmal den Beitrag an, da hatte ich dir bereits vor 2 Tagen ein Beispiel gegeben, das "so ähnlich" und "mit erläuternden Kommentar" war: Beitrag "Re: Menü programmieren" > Und wie sieht jetzt konkret der Quellcode dazu aus? Den musst du selbst entwickeln.
@Wolle G. Ich war mal so frei und habe mich dem allgemeinen Trend dieser Diskussion, welcher aus verdammt viel dämlichem, erbärmlichem Geschwätz der üblichen Verdächtigen bestand, diametral gegenüber positioniert und mal ein einfaches Beispiel geschrieben. Siehe Anhang. Für den MSP430 muss man noch die Bitmanipulation anpassen, aber das ist eher einfach. https://www.mikrocontroller.net/articles/Bitmanipulation#Bitmanipulation_beim_MSP430 D.h. folgende Zeilen müssen etwa so angepaßt werden.
1 | #define KEY_PIN P2IN
|
2 | #define KEY0 BIT7
|
3 | #define KEY1 BIT6
|
4 | #define KEY2 BIT5
|
5 | #define ALL_KEYS (KEY0 | KEY1 | KEY2)
|
6 | #define REPEAT_MASK (KEY1 | KEY2) // repeat: key1, key2
|
7 | |
8 | get_key_press(KEY0) // mehrfache Aufrufe ändern! |
Logischerweise muss auch die IO- und Timerinitialisierung angepaßt werden, ebenso die ISR-Definition. Aber ich glaube das kriegst du hin.
Den Programmvorschlag von A.S. habe ich mit wenigen Änderungen getestet. läuft! So habe ich die Variable menu aus der Funktion Tastensteuerung herausgenommen und als globale Variable (oder wie man das nennt) deklariert. Die Funktion Tastensteuerung läuft ja in einer while(1)-Schleife in der main Funktion, sodass bei jedem Schleifendurchlauf die Variable menu auf 0 gesetzt wurde. (oder sehe ich das falsch?)Der Zählvorgang blieb bei 1 stehen. Bei case 3 wurde vor else break eingefügt. Ob das Ganze auch ohne eine while Schleife läuft, habe ich noch nicht getestet. Wahrscheinlich kann mir das jemand auch sagen. Den Programmvorschlag von Falk B. habe ich mir zunächst nur mal angesehen. Welche Vorteile sind zu erwarten?
:
Bearbeitet durch User
Wolle G. schrieb: > Den Programmvorschlag von Falk B. habe ich mir zunächst nur mal > angesehen. > Welche Vorteile sind zu erwarten? Es gibt eine richtige Auswertung der Taster mit Entprellung. Da muss man nicht mit ominösen Pausen im Programmablauf rumeiern. Ein Tastendruck erzeugt EXAKT eine Reaktion in der Auswertung. Außerdem erreicht man dadurch Multitasking ohne die Verschwendung von CPU-Leistung durch Wartepausen. Der Rest ist im prinzip gleich.
Wolle G. schrieb: > sodass bei jedem Schleifendurchlauf die Variable menu auf 0 gesetzt > wurde. (oder sehe ich das falsch?)Der Zählvorgang blieb bei 1 stehen. Ja, Fehler. Vor meinem int menu hätte "static" stehen müssen, dann ist es wie eine globale Variable, die aber nur innerhalb der Funktion zugreifbar ist. > Bei case 3 wurde vor else break eingefügt. Dürfte hier keine Auswirkung haben, ggf. Code posten. Früher oder später solltest Du Dich jedoch mit sps-loop, Timing und entprellen beschäftigen. Wolle G. schrieb: > Ob das Ganze auch ohne eine while Schleife läuft, habe ich noch nicht > getestet. Nein, ein embedded Programm braucht irgendwo eine Schleife. Alternativ regelmäßiges retriggern durch Timer oder Interrupt. (Der vorgesehene Weg in c ist zwar eine leere for-Schleife, aber das Thema ist nur gut für unnötige Diskussionen ;-)
Falk B. schrieb: > einfaches Beispiel geschrieben. Siehe Anhang Lausig - jedenfalls im Vergleich zu dem von A.S. Viel Gedöns, keine Erläuterungen. Der TO wird da nie und nimmer durchsteigen. Soviel zu dem von dir bemängelten "verdammt viel dämlichem, erbärmlichem Geschwätz". W.S.
W.S. schrieb: > Soviel zu dem von dir bemängelten "verdammt viel dämlichem, erbärmlichem > Geschwätz". Getroffene Hunde bellen. ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.