-         

Ergebnis 1 bis 7 von 7

Thema: Brauche Hilfache bei ganz einfachem Code :)

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    32
    Beiträge
    207

    Brauche Hilfache bei ganz einfachem Code :)

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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?

    Code:
    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
    Grüße Paul

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.05.2006
    Ort
    @ Home
    Alter
    29
    Beiträge
    270
    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....
    Warum bekommen Vegetarier immer eine Extrawurst?

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    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.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    32
    Beiträge
    207
    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...
    Grüße Paul

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.05.2006
    Ort
    @ Home
    Alter
    29
    Beiträge
    270
    also ich würde das so machen:

    Code:
    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
    Warum bekommen Vegetarier immer eine Extrawurst?

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.01.2006
    Ort
    Homberg (Efze)/Nordhessen
    Alter
    32
    Beiträge
    207
    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?
    Grüße Paul

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •