Hallo zusammen! Habe ein "kleines programmiertechnisches Problem": Möchte gerne ein Programm haben, mit folgender "Teilfunktion": Es soll den Wert von einem ADC einlesen, vergleichen ob sich dieser im Gegensatz zu vorher geändert hat (ob also am Poti "gedreht" wurde), wenn nein, dann soll das Programm fortlaufen die Werte 2er anderer ADCs auslesen + anzeigen, ist dies aber nicht der Fall (und da tritt dann auch mein "Problem" auf), also wenn am Poti "gedreht" wurde, soll er eine neue "Anzeige" starten, bei der dann der Poti-Wert angezeigt wird (soweit im Prinzip auch kein Thema), er soll jedoch wenn das Poti wieder "losgelassen" wird, erst noch ein bisschen warten, bis er zur Anzeige der beiden anderen ADCs wieder zurück kehrt. Hat da jemand eine "Grundidee" für mich?!! Brauche keine konkrete Syntax für Bascom, das ist kein Problem, eher so eine Idee wie: "Schleife starten"... "Schleife beenden"... etc. Danke schonmal im Voraus!
Schleifenbeginn ADC1 einlesen wenn ADC1 sich veränndert hat: ADC2 und ADC3 einlesen Anzeige aktualisieren wenn ADC1 sich nicht verändert hat: warte ein gewisse Zeit ([OT] auf den Weihnachtsmann, die Bahn [/OT] Schleifenende Und wo ist das Problem?
Du hast das glaube ich falsch verstanden: Schleifenbeginn ADC1 einlesen Wenn ADC1 unverändert: ADC2 und ADC3 einlesen ADC2 und ADC3 ausgeben auf Display Wenn ADC1 verändert: ADC1 einlesen ADC1 auf Display ausgeben Schleifenende So, wenn ich jetzt vor das Schleifenende die Verzögerung lege, dann verzögert er das ja bei jedem Durchlauf der Schleife, und ich kann am Poti drehen, aber es tut sich nichts... Ich hoffe das Problem ist jetzt klar geworden?!?!
Schleifenbeginn ADC1 einlesen Wenn ADC1 unverändert: ADC2 und ADC3 einlesen ADC2 und ADC3 ausgeben auf Display Wenn ADC1 verändert: ADC1 einlesen ADC1 auf Display ausgeben Warten ADC2 und ADC3 ausgeben auf Display Schleifenende So vielleicht?
Dann habe ich ja auch wieder das Problem: ich drehe am Poti, der Controller "registriert" eine Veränderung des Werte, springt in den 2. Teil der Abfrage ("ADC1 verändert"), gibt auch den ADC1-Wert aus, und wartet dann => wenn ich jetzt weiter am Poti drehe, bekomme ich die Änderung erst nach der Wartezeit wieder... :-/ Aber danke soweit für die Hilfe! Hat noch jemand eine Idee?!?
Sprich, solange am Poti gedreht wird, soll dieser Wert angezeigt werden. Wenn dann nicht mehr gedreht wird, soll dieser Wert noch eine gewisse Zeit angezeigt werden. Dann sollen wieder die anderen 2 Werte angezeigt werden. Korrekt ? Schleifenbeginn ADC1 einlesen IF ADC1 verändert: ADC1 einlesen ADC1 auf Display ausgeben ADC1-Flag setzen END IF IF ADC1 unverändert: IF ADC1-Flag gesetzt Warten ADC1-Flag löschen ELSE ADC2 und ADC3 einlesen ADC2 und ADC3 ausgeben auf Display END IF END IF ADC2 und ADC3 ausgeben auf Display Schleifenende
Das ADC2 und ADC3 ausgeben auf Display am Ende gehört natürlich weg.
Aber so wie ich das sehe, würde er ja dann zuerst (also wenn ADC1 verändert ist) das hier machen: (IF ADC1 verändert:) ADC1 einlesen ADC1 auf Display ausgeben ADC1-Flag setzen Aber er macht das dann doch nur ein mal, oder?!? (Ist ja soweit auch "gewollt" denke ich, ich frage nur wegen des Verständnisses) Aber er geht ja dann weiter im Programm, fragt ob ob das "Flag" gesetzt ist, was ja dann der Fall ist, und wartet also... Aber das soll er ja gerade nicht?!? Weil dann wartet er ja, geht dann wieder raus, zeigt ADC2 und ADC3 an, und fragt dann erneut ab... Aber so die "Grundidee" mit dem "Flag" (Ich denke du meinst damit einfach nur eine Variable, die ich setze?!?!) könnte man ja mal "weiterdenken"...
Im Prinzip brauchst du dann eine Art Entprell-Routine für ADC1: solange ADC1 sich ändert, ADC1 anzeigen. Danach einen Moment warten und die beiden anderen anzeigen. Scheifenbeginn Schleifenbeginn frage ADC1 ab zeige ADC1-Wert an Schleifenende, wenn ADC1 sich nicht verändert hat. warte einen Moment Schleifenbeginn Zeige ADC2 und ADC3 an beende Schleife, wenn ADC1 sich verändert hat Schleifenende
Mmmmh...ich hatte mir folgendes gedacht (ist so ähnlich wie da von Peter Schwarz): Schleifenanfang ADC1-Abfragen Wenn ADC1 = Verändert ADC1 anzeigen ADC1-"Flag" setzen Wenn ADC1 = unverändert wenn ADC1-Flag = gesetzt Warten ADC1-"Flag" zurück setzen Sonst ADC2 und ADC3 anzeigen Ende Wenn-Abfrage Ende schleife So (oder so ähnlich) sollte es klappen...oder ich versuch einfach mal in Bascom über die Simulation, aber ob es das bringt?!?!
Also, ich hab das jetzt mal versucht, aber irgendwie klappt das alles nicht, bin momentan auch etwas "unschlüssig", wie ich die Abfrage "ADC1 verändert oder nicht" hinbekommen soll... :-/ Wenn da vielleicht jemand nen Tip hätte!??!?!
Ich will ja nicht rumnölen, aber eigentlich solltest du wissen, wie du das haben willst. Um sich den Ablauf klarzumachen benutzt man auch gerne solche altmodischen Gerätschaften wie einen Bleistift und ein Blatt Papier. (oder auch mehrere...). Auf dieses Blatt kann man solche Sachen wie Ablaufpläne oder Struktogramme, also Programme ohne Programmiersprachenbezug aufmalen. Ausserdem solltest du dir darüber im Klaren sein, welche Funktionsblöcke du hast/brauchst. Übrigens macht meine Version exakt das Gleiche...nur dass ich mir ein Flag spare, und im Einschaltmoment die Pause gemacht wird, da die Variable in der der ADC1-Wert zwecks Vergleich enthält ("Hat ADC1 sich verändert?") noch nicht den ADC1-Wert enthält. Das kann man entweder dadurch abstellen, dass man vor Beginn der Schleife in diese Variable den ADC1-Wert einliest, oder man ignoriert die Pause, verkauft sie als neues "Feature" (Es ist ja vielleicht auch interessant zu Beginn des Betriebs den ADC1-Wert zu lesen). Aber wenn du nicht mal weißt, wie du solche Probleme löst, solltest du dir vielleicht lieber die Freizeitbeschäftigung "Briefmarken- / Kronenkorkensammeln" aussuchen. Merkt man, dass ich etwas angepestet bin? Schön...
Super, genau den Beitrag habe ich gebraucht, nachdem ich vorhin ungefähr 10 Blatt Papier vollgeschrieben hab, und jetzt immer noch hier sitze, und es mal "live" probiert habe, also im Simulationsmodus von Bascom!! Aber danke für deinen geistreichen Beitrag, hat mich echt aufgebaut, und ich bin frohen Mutes, da jetzt mit vollem Elan weiter zu machen!! TOP!! Ich weiß doch wie ich es haben will! Hab ich doch schon 3 mal gepostet mindestens!!
Poste doch mal deinen Code bisher... Freut mich, dich aufgebaut zu haben...
Also, bis lang habe ich das hier: $regfile = "m8def.dat" $crystal = 3686400 Dim X As Word Dim Y As Word Dim Z As Word Dim B As Bit Do While Y = Y 'Einfach mal "laufen" lassen If X <> X Then ' Wenn X sich geändert hat X = Getadc(0) Cls Upperline Lcd X B = 1 '"Flag" setzen Else If B = 1 Then Waitms 500 B = 0 Else Z = Getadc(1) Cls Upperline Lcd Z End If End If Wend Loop So mal "ganz grob" für mich programmiert... Habe es mal simuliert, aber wie gesagt, da ändert sich nichts, wenn ich am ADC0 was ändere...
Hab mal den ersten Fehler "selber" gefunden: X ist ja immer gleich X, weil selbst wenn er am Anfang die Variable "irgendwie" setzt, sind sie ja gleich, also springt er da schonmal nicht rein... :-/ Aber wie löse ich es dann?
Versuchs mal damit: $regfile = "m8def.dat" $crystal = 3686400 Dim X As Word Dim Y As Word Dim Z As Word Dim B As Bit X = Getadc(0) Do While Y = Y 'Einfach mal "laufen" lassen Endlosschleife? b=0 If X <> Getadc(0) Then ' X = Getadc(0) Cls Upperline Lcd X 'ADC1-Wert anzeigen B = 1 '"Flag" setzen End If If B = 1 Then Waitms 500 B = 0 End If Z = Getadc(1) Cls Upperline Lcd Z Wend Loop '2 Endlosschleifen? Meine Variante: $regfile = "m8def.dat" $crystal = 3686400 Dim X As Word Dim Y As Word Dim Z As Word Dim B As Bit X = Getadc(0) While 1 'Endlosschleife do Y = Getadc(0) Cls Upperline Lcd X 'ADC1-Wert anzeigen loop while X<>Y Waitms 500 'ADC1 hat sich nicht mehr verändert do Z = Getadc(1) Y = Getadc(0) Cls Upperline Lcd Z loop while X<>Y Wend
Vielleicht fällt dir noch was auf: Grupppiere Anweisungen durch Einrückungen. Und spare nicht an sinnvollen Kommentaren. Selbst wenn du nur so für dich was machst, helfen Kommentare meistens zu verstehen, was man eigentlich mit dem erreichen will, was man da gerade geschrieben hat, und wenn man später ins Programm guckt, muß man nicht erst wieder den Code "aufdröseln", um zu verstehen, was da steht...
Ja, da hast du wohl recht...habe auch leider den Code gelöscht, wo ich es am laufen hatte, nur halt ohne die Verzögerung...aber ich mach für heute sowieso erstmal Ende, das bringt nix mehr, hab gar keinen Elan mehr irgendwie... Danke soweit für die Hilfe, ich meld mich morgen mal wieder, wenn ich wieder klar denken kann... ;-)
Dein Code will übrigens nicht so ganz, bzw. Bascom "kennt" die Anweisung nicht, der macht nur "Loop Until [Bedingung]" Aber auch wenn ich das "umstricke" klappt dat irgendwie nicht... Aber der Akku ist bei mir jetzt echt "alle", ich geh mal lieber pennen, und morgen dann "frisch" ans Werk... ;-)
Ich glaube den Ansatz mit dem wait würde ich schon gar nicht machen. In der Zeit, tut das Program nämlich gar nix, auch wenn man am Poti dreht und ich würde schon gerne eine Echtzeitanzeige haben wollen. Vielleicht würde ich es so machen: Zaehler = 0 NeuADC1 = <ADC1 einlesen> While 1=1 'um bei dem Beispiel oben zu bleiben mit der Endlosschleife AltADC1 = NeuADC1 NeuADC1 = <ADC1 einlesen> ADC2 = <ADC2 einlesen> ADC3 = <ADC3 einlesen> If Zaehler > 0 Display NeuADC1 Zaehler = Zaehler - 1 Else If NeuADC1 <> AltADC1 Display NeuADC1 'könnte man hier aber auch weglassen Zaehler = <StartWert wieder> 'ausprobieren was passt Else Display ADC2 Display ADC3 End If Wend Nach dem Start passiert erst mal nix und ADC2+3 werden ausgegeben. Wenn sich dann was am Poti ändert (ADC1) gehts los in der Schleife. Der Zaehler wird runtergezählt und der aktuelle Wert ausgegeben. Passiert in dieser Zeit dann irgenwann nix mehr, läuft der Zähler komplett runter bis auf 0 und dann werden wieder ADC2+3 ausgegeben. Wahrscheinlich kommt jetzt wieder einer mit 'Ja, aber geht doch viel einfacher'. Mag sein, aber so auf die schnelle würde ich erst mal machen. Sollte jetzt noch ein Fehler drin sein, dann selbst debuggen, Fehler ausmerzen und freuen.
Da fehlt noch ein End If vor dem Wend, aber das meckert Bascom schon an ;)
Hallo Peter!! Dein Ansatz klingt echt vernünftig und verständlich, werde ich direkt zu Hause mal versuchen!! Mit den "Feinheiten" von Bascom etc. komme ich schon klar (habe heute wieder einen wesentlich klareren Kopf als gestern. ;-)), das Grundprinzip von dir scheint "auf dem Papier" auch zu laufen, ich denke das wird am Controller selber auch laufen... Melde mich dann später mal, wie es so "läuft"... ;-)
Also, hab's ausprobiert, es funktioniert! Danke dir vielmals! Ärgere mich zwar, das ich nicht selber drauf gekommen bin, aber gestern war echt der Akku "leer"...
Freut mich :) Diese simplen Funktionen sind manchmal doch mit etwas 'Hirnschmalz' zu lösen, vor allem weil man sowas ja wirklich tagtäglich bei allen möglichen Geräten sieht z.B. Lautstärkeanzeige bei einem Radio.
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.