- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: Wartezeit nach PWM-Eingabe - brauche Hilfe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Danke sehr für deine Antwort.

    Die Abfrage per Interrupt klingt interessant, auch wenn ich da momentan noch keinen wirklichen Plan habe, wie das geht. So weit bin ich noch nicht...

    Ich kann nicnt sagen, ob es an der mangelnden Entprellung liegt.
    Das Programm hatte ich mit Hilfsvariablen aufgebaut, verbunden mit einer Wartezeit von 1,5 Sekunden nach jedem Tastendruck, als Prellzeit hätte das locker reichen müssen.

    Im Programm sah es dann jedoch so aus, dass beim Hochzählen nach dem ersten Tastendruck beide Ausgänge nacheinander einschalteten, als hätte ich 2mal gedrückt. Beim nächsten Tastendruck wurde dann jedoch, wie gewollt, auf Null zurück gesprungen - also beide Ausgänge aus. Manchmal passierte aber auch gar nichts, und die Ausgänge blieben an, sooft man auch den Taster betätigte, als wäre das Programm zeitweise stehengeblieben. Auf dem Testboard hatte ich statt des Tasters einen Servotester angeschlossen - mit dem ging es jedoch einwandfrei.

    Nutze übrigens den Befehl Pulsein, vielleicht liegt es daran...


    LG - Maik

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    ich komme bei deiner Beschreibung leider noch nicht so ganz mit, könntest du eventuell mal ein paar fetzen deines Machwerks präsentieren ?

    ich komme gerade noch nicht ganz darauf klar wie du das PWM Signal auswertest, PulseIn ist schonmal grundsätzlich ein guter Gedanke, aber wie wertest du ihn aus ?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Hallo,

    den Code habe ich nur daheim, nicht auf meinem Tablet (bin Unterwegs und habe grad Frühschluck ).

    Ich kann so viel sagen, dass ich alles in der Mainloop schreibe, ohne Unterprogramme.
    Zu Beginn habe ich es so festgelegt, dass der Controller mit dem Programm nur dann fortfährt, wenn der Pulsein-Wert >85 liegt.
    Danach soll ein Flag gesetzt werden, wenn der PulseIn-Wert kleiner 110 ist (relativ nahe am Anschlag) und das Flag zurückgesetzt, bei einem Wert größer 115, um eine Hysterese zu schaffen. Dazwischen ist Totraum.

    Im weiteren wird das Flag abgefragt und soll mit jedem Setzen auf 1 den Zähler einer Select-Case um 1 erhöhen.
    Bei 0 sind alle Ausgänge 0. Bei 1 Ausgang B.1 auf 1, bei 2 Ausgang B.2 auf 1 und bei 3 der Zähler wieder auf 0.


    Habe verschiedenste Sachen probiert. übergabe in eine weitere Variable, Toggeln der Flag, Weglassen des Flag-Rücksetzbefehls, Flag-Pufferwartezeit nach dem Setzen (100-300ms, allerdings erfolgt die Reaktion erst nach Ablauf der Pufferzeit), Wartezeiten von 1-2 Sek zeitgleich bei Setzen der entsprechenden Ports.

    Könnt ihr damit vielleicht etwas anfangen?

    Jetzt fällt mir ein, dass das Programm selbst mit dem Servotester nur passabel lief. Wenn das Flag gesetzt wurde, wurde es auch gleich wieder zurück gesetzt. Ohne Wartezeit blinkten die Led also sehr schnell, mit irgendwas um die 20Hz.

    Meine Suche nach Bascom-Programmen für einen RC-Memory-Schalter waren bislang nicht das, was ich mir vorstelle und alle ohne Pulsein-Befehl aufgebaut.



    LG - Maik

    - - - Aktualisiert - - -

    Könnte es vielleicht daran liegen, dass ich keinen konkreten Wertebereich mit Anfangs- und Endwert bei der Messung der Flankenwechsel eingetragen habe? Ich sage dem Controller ja bisher, er soll bei einem Wert ab 85 erst mit der Messung beginnen und lediglich bei einem Wert kleiner 110 das Flag setzen. Kann es sein, dass ich ihm sagen muss, dass er das Flag nur bei Werten zwischen 85 und 110 setzt oder wäre das nur doppelt-gemoppelt?


    LG - Maik
    Geändert von stardust19322 (17.08.2016 um 08:37 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Dein FEhler liegt in deiner Interpretationslogik, 20Hz ist (ungefähr) die PWM Frequenz!
    Die Pulse werden ja zyklisch weiderholt, nur die Pulsbreite verändert sich.

    Logisch wäre also eine Interpretation nach dem Muster:
    if (IN_OLD==LOW) && (TIME > 115) -> IN_NEW=HIGH
    else if (IN_OLD==HIGH) && (TIME < 85) -> IN_NEW=LOW //für die Hysterese
    if (IN_OLD==HIGH) && (IN_NEW==LOW) -> COUNT++
    IN_OLD=IN_NEW

    unter der annahme 85 ist dein pegel ab dem LOW erkannt werden soll und 115 dein Pegel ab dem High erkannt werden soll

    das könnte man natürlich auch noch etwas zusammenfassen und 1 variable und 1 if sparen, aber so ist es übersichtlicher
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Hallo und danke dir sehr für deine Antwort.

    Jetzt muss ich aber gleich mal fragen: Ist das, was du mir geschrieben hast, ein Bascom-Code oder eine Schematik?
    Als Code kenne ich das so noch nicht.

    In etwa kann ich mir das jedoch vorstellen - probiere es heute Abend gleich aus.


    LG - Maik

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Pseudo Code
    ich tu mich schwer immer gleich in fertigem Quellcode zu tippen, das fühlt sich dann immer so nach vorkauen an

    daher auch meine kleine vorfrage zu existierendem code ... wäre da sowas wie "hab noch garnix gemacht" bekommen hätt ich wohl weniger ausführlich geholfen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    - das ist auch gut so, man soll sich ja auch ein wenig anstrengen ^^.

    Da ich nun Feierabend habe und endlich Daheim bin, hier der Code - hoffe, es ist nicht zu unübersichtlich...

    --------------------------------------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    $baud = 9600


    'Konfiguriere Ports
    Config Portb = Output
    Config Portc = Input

    'Portb.3 = 1 'optional
    'Portb.4 = 1 'optional
    'Portb.5 = 1 'optional
    'Portb.0 = 1 'optional
    Portb.1 = 1
    Portb.2 = 1


    'Umbenennen der Eingänge
    'Taster1 Alias Pinc.0 '### Optional ###
    'Taster2 Alias Pinc.1 '### Optional ###


    'Umbenennen der Ausgänge

    Unterwasser Alias Portb.1
    Beleuchtung Alias Portb.2
    'Kabine Alias Portb.3 '### Optional ###


    'Variablendeklaration
    Dim Kanal3 As Byte 'Verdrahtet zu PinC.2
    Dim Zaehler As Byte
    Dim Flag As Bit





    '_________________________________________________ ______________________________

    ' *************************************
    ' ***** Hauptprogramm *****
    '*******************************************

    Do


    Pulsein Kanal3 , Pinc , 2 , 1 'Signallänge an PWM-Eingang stetig abfragen
    If Kanal3 > 85 Then
    If Kanal3 < 110 Then
    Set Flag
    Elseif Kanal3 > 112 Then
    Reset Flag
    End If

    If Flag = 1 Then
    Incr Zaehler : Waitms 500
    End If

    Select Case Zaehler
    Case 0 : Beleuchtung = 0 : Unterwasser = 0
    Case 1 : Beleuchtung = 1 : Waitms 1000
    Case 2 : Unterwasser = 1 : Waitms 1000
    Case 3 : Zaehler = 0 : Waitms 1000
    End Select




    End If


    Loop

    End

    - - - Aktualisiert - - -

    Hallo Freunde,

    habe ein wenig am Programm gebastelt und es würde definitiv funktionieren, wenn, ja wenn da nicht meine Fernsteuerung wäre, die mir einen gaaaanz klitzekleinen Strich durch die Rechnung macht

    Das Problem ist nämlich, dass der 3te Kanal an meiner Fernsteuerung bereits ein reiner Schaltkanal ist. Demzufolge bräuchte ich im Grunde keinen Zähler, würde ich nur einen Ausgang schalten wollen.
    Nun ist es jedoch so, dass bei EINMALIGEM Drücken des Tasters der Ausgang auf High gesetzt wird und so auch verbleibt. Erst bei erneutem Drücken des Tasters wird der Ausgang auf Low-Pegel gesetzt.
    Wie ihr unten seht, habe ich mir den Rat zu Herzen genommen und ein wenig gebastelt. Allerdings bleiben auch hier gesetzte Flags nicht stehen, sondern fluktuieren, wenngleich auch nicht mehr mit der Geschwindigkeit wie bei meinem ersten Programmversuch.
    Bedeutet, dass der zu setzende Zähler noch immer einfach weiter läuft, solange die Bedingung erfüllt wurde, warum auch immer das so ist.

    Wie das jetzt jedoch gehen soll, weiß ich beim besten Willen nicht - das ist so weit von meinen Basics entfernt, dass ich momentan mit diesem kleinen Schritt in die richtige Richtung eher zufrieden bin als mich gefrustet an weitere Versuche zu setzen. Zumindest heute nicht .
    Werde aber definitiv dran bleiben, den Code sprichwörtlich zu "knacken".

    Vorab jedoch eine Frage: Kann ich das Basis-Programm als Solches dafür nutzen oder muss ich ein neues Prog mit einem entsprechend konfigurierten Timer schreiben?
    Timer mögen bei mir immer nicht so ganz. Sobald das Prog ein wenig voller wird, setzen die Timer aus, geraten aus der Phase und die Interrupt-Zeiten spielen komplett verrückt. Da hilft dann alles rechnen nichts mehr.


    Danke sehr für die Hilfe. Wenn ihr noch was wisst - ich freue mich sehr darüber, wenn ihr mir den Weg weist.




    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    $baud = 9600


    'Konfiguriere Ports
    Config Portb = Output
    Config Portc = Input

    'Portb.3 = 1 'optional
    'Portb.4 = 1 'optional
    'Portb.5 = 1 'optional
    'Portb.0 = 1 'optional

    Portb = &B11111111

    'Umbenennen der Eingänge
    'Taster1 Alias Pinc.0 '### Optional ###
    'Taster2 Alias Pinc.1 '### Optional ###


    'Umbenennen der Ausgänge

    Underwater Alias Portb.1
    Lights Alias Portb.2
    'Kabine Alias Portb.3 '### Optional ###


    'Variablendeklaration
    Dim Channel3 As Byte 'Verdrahtet zu PinC.2
    Dim Count As Byte
    Dim Flag As Bit
    Dim Old_value As Bit
    Dim New_value As Bit




    '_________________________________________________ ______________________________

    ' *************************************
    ' ***** Hauptprogramm *****
    '*******************************************

    Do


    Pulsein Channel3 , Pinc , 2 , 1 'Signallänge an PWM-Eingang stetig abfragen


    If Channel3 < 110 And Old_value = 0 Then New_value = 1
    If Old_value = 1 And Channel3 > 85 Then New_value = 0
    If Channel3 > 200 And Old_value = 1 Then New_value = 0
    If Old_value = 1 And New_value = 0 Then Incr Count
    Old_value = New_value


    Select Case Count
    Case 0 : Lights = 0 : Underwater = 0 : Waitms 300
    Case 1 : Lights = 1 : Waitms 300
    Case 2 : Underwater = 1 : Waitms 300
    Case 3 : Count = 0 : Waitms 300
    End Select



    Loop

    End
    Geändert von stardust19322 (17.08.2016 um 19:59 Uhr)

Ähnliche Themen

  1. [ERLEDIGT] Wartezeit beim Login und Verfügbarkeit der rn-Projekte
    Von Unregistriert im Forum Anregungen/Kritik/Fragen zum Forum und zum Wiki RN-Wissen
    Antworten: 4
    Letzter Beitrag: 12.04.2016, 08:43
  2. Hilfe nach Kurzschluss
    Von TrainMen im Forum Robby RP6
    Antworten: 22
    Letzter Beitrag: 15.04.2014, 12:35
  3. Ich brauche mal (Nach)Hilfe
    Von oderlachs im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 20.02.2013, 09:04
  4. VHDL unerklährliche Wartezeit nach Tastendruck
    Von todo im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 24.09.2009, 00:25
  5. Auf der Suche nach dem Richtigen Befehl brauche Hilfe
    Von becki133 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 09.07.2008, 23:07

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress