PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Signal nur einmal ausführen aber wie



..Razmataz..
17.10.2009, 20:24
Hallo
Ich bin ein Neuling im Bereich der Programmierung und brauch mal bisschen hilfe bei meinen ersten Programm. Ich möchte meinen Tft im Auto ausfahren lassen wenn das RN Controll am PortA ein signal bekommt was aber so lange an ist wie der Schlüssel im Zündschloss ist. Wenn das Signal aus ist soll der der Tft wieder runter fahren.
Das Funktioniert bis dahin alles ganz gut. Jetzt hab ich noch zwei Taster mit eingebaut, mit den ich den Tft auch noch raus und rein fahren kann.
Wenn ich den Tft ausfahren lasse über das Signal was vom Zündschloss und dann irgendwann den Tft per Taster mal einfahren will, fährt er gleich wieder aus weil ja das Signal vom Zündschloss noch anliegt.
Nun jetzt meine Frage wie kann ich es machen das das Signal anliegt die Submenü nur einmal ausgeführt wird.
Ich hoffe ich konnte mein Problem halbwegs erklären.
Hier noch mein Programm:

masterchief
17.10.2009, 20:29
Hy

Wie genau soll es funktionieren?
Soll der Tft ausfahren wenn der Zündschlüssel eingesteckt wird oder erst wenn der Knopf gedrückt ist?

EDIT:
Du hast in deinem Programm 12 Servos eingebaut, nutzt du zum herausfahren und zum einfahren des Tft´s alle 12 Servos?

lg masterchief

..Razmataz..
17.10.2009, 20:53
Wenn der Zündschlüssel eingesteckt ist kommt das Schaltsignal und der Tft fährt hoch und wenn ich mal keine lust bei der fahrt habe kann ich ihn mit den Taster einfahren lassen.
Edit: Nein hab bloß 4 Servos verbaut. Das mit Servo1 bis Servo12 sind bloß bestimmte Position für die Servos.

Dirk
18.10.2009, 13:07
Hallo ..Razmataz..,

zu deinem Programm ein paar Tips:

1. Hardware:
Offenbar hast du einige Taster an Pins von PortA angeschlossen.
Das ist ok. Du brauchst aber diese Taster nicht analog (d.h. mit Getadc wie bei einer analogen Tastatur, die du zum Beispiel an AD7 benutzt) auszulesen, sondern kannst sie als Digitalports (X = Pina.Y) auslesen. Dadurch bekommst du eine klare digitale Antwort (Schalter offen/zu = 0/1). Alle Spannungsmessungen sind dann nicht nötig. Das Programm wird ganz einfach.
Was du brauchst ist also nur EIN Unterprogramm, das den Zustand aller Schalter immer wieder einliest und z.B. in variablen (namens Deckel, Schaltplus ...) speichert. Das "immer wieder" kann man in der Haupt-Do-Loop Schleife des Programms oder besser auch in einer ISR (z.B. 1x pro Sekunde) machen.

2. Software:
Die Servo1..12 Variablen sind ein typisches Array. Ich würde sie auch so (z.B. als Servopos(x) ) anlegen.
Deine Frage bezog sich aber eher auf die Programmlogik:
Die kann ich in deinem Programm wegen vieler nahezu identischer Variablennamen nur mit großer Mühe nachvollziehen.
Namen wie "TasteY" machen das Verständnis schwer und du wirst selbst nach 1/2 Jahr dein Programm nicht mehr verstehen.
Am besten ist die Benennung nach Funktionen (Deckel_aufzu, Akkuspannung ...).
Beispiel:
Wenn ich im Programm auf die Variable "Taste" stoße, muss ich erst die Zeile "Taste = Tastenabfrage()" suchen, dann schaue ich mir die Funktion "Tastenabfrage()" an, um da erst zu sehen, dass AD7 ausgelesen wird und aus der Case-Struktur zu erkennen, dass hier wohl eine analoge Tastatur angeschlossen ist. Zurück zu meiner Ausgangszeile "If Taste <> 0 Then" kann ich dann sehen, dass Taste 1 zum Hochfahren des TFT dient, usw.
Diese Analyse ist so mühsam, dass ich eine Fehlersuche nur in kurzer Zeit machen könnte, wenn ich deine Hardware nachbaue.

3. Vorschlag:
Konstruiere dein Programm hier im RN neu:
a) Mache zuerst eine Do-Loop Schleife mit nur zwei Funktionen: Die 1. liest alle Schalterstellungen in einzelne Variablen (mit passenden Namen) aus. Die zweite zeigt die Stellung aller Schalter (an/aus) z.B. mit den LEDs des RN-Control an.
b) Von deinen Funktionen behalte nur Tfthoch() und Tftrunter().
c) Jetzt kommt die 3. Funktion in die Do-Loop-Schleife: Die "Logikfunktion". Da fragst du mit einfachen If-then Strukturen die Taster ab: If Deckel_auf Then Tfthoch() usw. Auch die Spannung vom Zündschloß (Zuendung_an o.ä.) kann so abgefragt werden, aber nur nach dem Einschalten. Sobald danach die Deckel_auf- oder _zu-Taste gedrückt wurde, ist der Zustand von Zuendung_an solange egal, bis er 0 wird. Dann muss das TFT wieder einfahren. Das geht per Logik einfach zu machen. Erst würde ich aber die grundlegende Programmstruktur ganz neu machen.

Gruß Dirk

P.S.: Ist zwar nicht die schnelle Lösung, aber die, mit der du am meisten lernst.

Bammel
18.10.2009, 13:49
das er die taster per ADC einliest hängt warscheinlich damit zusammen das er mehrere taster dran hat die dan die in reihe geschalteten widerständer unterschiedlich schalten. dieses system nutze ich auch. so "verschwendet" man nur einen port für x-beliebige taster anstatt für jeden tasten einen pin zu nutzen.

ansonsten finde ich die programmstruktur auch sehr unüberlichtlich. ab so mein vorschglag ohne dein programm genau betrachtet zu haben wäre. das du mit einem flag arbeitest.. also wenn zündung an = 1 , dann setzte zündungflag = 1 , wenn zündungflag = 1 dann fahre tft aus , denn zündungsflag = 1 und tasten für tft einfahren ist gedrückt dann setzte zündungsflag = 2 wenn zündungflag = 2 dann fahre tft rein und nciht wider raus bis zündugsflag wieder 1 ist.

ich hoffe das ist verständlich.

..Razmataz..
19.10.2009, 12:24
Oh mein Gott das war jetzt viel Input für einen der erst zwei Wochen mit BAscom arbeitet. Werde mal versuchen das Programm bisschen übersichtlicher zu gestallten. Das mit den Tastern ist so wie Bammel gesagt hat, ich habe an den meisten Ports zwei Taster mit Widerständen dran.

@Dirk was meinst du mit der Logikfunktion, kannst du mir ein kleines Beispiel geben.
@Bammel was ist den eine flag?

Bammel
19.10.2009, 16:14
ich flag ist einfach eine variable die dazu genutzt wird einen bestimmten status zu merken.

z.b. du willst ein programm erst dann starten wenn du einen taster drückst. nun kannst du das programm so lange in einer schleife warten lassen bis der taster gedrückt wird. das ding ist wnen diese schleife in einer anderen ist wird diese jedesmal wieder angesprungen und du musst jedesmal bei beginn der hauptschleife den taser drücken. also setzt du mit dem taste den flag (ist eine einfache variable) auf eins und fragst halt einfach am anfang genau das flag ab. also wenn das flag = 0 ist springe in die warteschleifen. wenn dann das flag 1 ist weil der taster gedrückt wurde springe aus die schleife raus. wenn du wieder auf die schleife triffst aber das flag beinhaltet die 1 dann überspringe die warteschleife.

ich hoffe das ist verständlich im schriftlichen beschreiben bin ich nciht wirklich gut.

aber ich kann die das buch von roland walter http://www.rowalt.de/ nur ans herz legen. das ist top für den einstieg in bascom. durt ist eigentlich so ziehmlich alles beschreiben was man benötigt für den einstieg.

gruß bammel