PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfache bei ganz einfachem Code :)



Powell
26.06.2007, 13:28
Hi zusammen,

Ich bin was Programmiersprachen angeht noch nicht allzusehr bewandert, learning by doing halt. Es geht um folgendes: Über einen entprellten Eingabetaster rufe ich ein Sub über den debounce befehl auf - soweit ist noch alles klar.
Im Sub möchte ich dann nach einer kurzen Wartezeit (30ms) einen ADC Eingang abfragen. Wenn dieser Wert W größer 120 ist soll nach 10 ms nochmal eine Sicherheitsabfrage gemacht werden, wenn W immer noch größer 120 ist soll Portb.0 auf 0 gehen und das Sub kann beendet werden.
Gleichzeitig soll aber Portb.0 auch auf 0 gehen, wenn W nach ca. 130 ms den Wert 120 immer noch nicht erreicht werden, damit soll dann auch das Sub beendet werden.
Mein Code habe ich mal reingeschrieben. Problem dabei ist, dass wenn W nach 30 ms noch nicht auf 120 ist, die IF Bedingung übersprungen wird und der waitms 100 befehl ausgeführt und das sub danach beendet wird - so soll es nicht sein... wer kann helfen?


Sub Hoch


Portb.0 = 1
Waitms 30
W = Getadc(0)
If W > 120 Then
Waitms 10
W = Getadc(0)
If W > 120 Then Portb.0 = 0
Else
Waitms 100
Portb.0 = 0
End If



End Sub

Schokohoernl
26.06.2007, 13:43
hallo!

also so wie ich das sehe fehlt hier nen end if, da zwei if-bedingungen aufgerufen werden, aber nur eine beendet wird, zum anderen doch das programm das tut was da steht.
wie soll das jetzt genau aussehen??
ADC0 wird überprüft ob der wert über 120 liegt, ok.... aber was wenn er nicht über 120 liegt?? soll dann 100ms gewartet werden und dann der sub beendet werden (so ist dein code momentan), oder soll nach 100ms ADC0 nochmals überprüft werden, ob dann ADC0 über 120 liegt und wenn ja, dann die zweite prüfung machen, dann Portb.0 auf 0 setzten und anschließend den sub beenden?

mfg

Schoko

P.s: für was brauch man das?? klingt nen bisschen nach ultraschallsensorauswertung....

recycle
26.06.2007, 13:46
Ich vermute mal wenn du das else durch ein elseif ersetzt bist du am Ziele.
Die korrekte Syntax für Elseif findest du in der Bascom Hilfe.

Powell
26.06.2007, 13:54
Hi,

also das Programm ist für eine Motorstrommessung. Der Motor fährt gegen eine Art anschlag, dabei sieht das Signal des Motorstroms wie eine Art V aus: Hoher Anfangsstrom (Anlauf), der soll durch den waitms 30 Befehl herausgefiltert werden (erst 30 ms nach Motoranlauf wird die Spannung am Shunt abgefragt). In der zweiten Phase steigt der Motorstrom wieder an bis er sein maximum (Anschlag=Motor steht=Strom wird nur durch den Ohmschen Anteil begrenzt). Der ADC fragt nun die Spannung am Shunt ab (proportional zum Motorstrom) wobei ein wert von 120 aussagt, dass der Strom sein Maximum erreicht hat. Ist dem so, soll durch die zweite Abfrage nochmal bestätigt werden dass der Motor tatsächlich am Anschlag ist und das kein Störimpuls war. Wird diese Abfrage bestätigt, soll Portb.0 (der Motor) abgeschaltet werden.
Hat die Messung nach 130ms immer noch kein Ergebnis geliefert soll der Motor auch abgeschaltet werden weil dann offensichtlich ein Problem vorliegt und der Motor vor zuerstörung geschützt werden soll.

Beim momentanen Programmablauf ist es so, dass er die ADC auswertung durchführt, nach 30ms noch keine 120 erreicht hat, und demnach zum Else weiterspringt wo er angewiesen wird einfach nach 100ms abzuschalten...

Schokohoernl
26.06.2007, 15:37
also ich würde das so machen:




Sub Hoch


Portb.0 = 1
Waitms 30

For i = 1 to 10
Waitms 10
W = Getadc(0)
If W > 120 Then
Waitms 10
W = Getadc(0)
If W > 120 Then
I = 11
End If
End if
Next

Portb.0 = 0
End If



End Sub


soo... damit wird alle 10ms der strom überprüft... nach 10 durchgängen (10*10ms = 100ms) und den 30ms vom anfang also nach 130ms wird die schleife beendet, oder wenn der wert W größer als 120 ist.

MfG

Schoko

Powell
26.06.2007, 17:54
Hi,

Vielen Dank Schoko, das funzt so!

Jetzt hätt ich noch ne Frage: Ich möchte über ein LCD Display mehrere Temperaturen (=ADC Werte) ausgeben. Ich hab mir das so vorgestellt, dass das Display alle 3 Sekunden den anzuzeigenden Sensor wechselt, also erst t1= ...°C, nach 3 sek t2= ...°C usw.
Das ganze soll quasi im hintergrund in diesem 3 Sekundentakt ablaufen (ADC-Wert-Abfrage und Ausgabe an LCD). Der Controller muss aber währenddessen immer auf den Debounce-Befehl für die Tastereingabe reagieren können um damit die Subs für den Motor-Start aufrufen zu können - hat jemand eine Idee wie man das realisieren kann?

Vitis
26.06.2007, 19:51
Also wenn der Controller auch aus der Anzeigeroutine raugeholt werden
soll dann bieten sich die Interrupts an, sprich die Hardwareinterrupts
INT0 INT1.
Dann geht aber nix mit dem Bascombefehl debounce, sondern dann
mußt Du eben selbst ne kleine Debounceroutine in die Interrupserviceroutine
konstruieren.