- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 22

Thema: Alternative zu "Wait"-Befehl

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Sehe ich das richtig, das WAIT X einfach nur viele NOP in den AVR schreibt?
    Es gibt ja Programme, in denen man nur eine gewisse Anzahl von verschiedenen Wartezeiten hat. z.B. WAITMS 150/500/1000, diese aber oft einsetzt. 150 nach Tastenabfragen, 500 und 1000 für LEDs.

    Wenn meine erste Vermutung richtig ist, würde der flash ja irgendwann fast nur noch mit NOPs beschrieben sein. Wie wäre es denn, wenn man einfach wie hier jetzt drei SUBs erstellt und an den jeweiligen Stellen dort hinspringt? Sprungbefehle verbrauchen ja nicht so viele Programmzeilen wie sinnlose NOPs.
    Wenn es absolut Zeitkritsche Anwendungen sind, muss man halt zuvor noch die Zeiten für die Sprünge abziehen, aber ansonsten würden ein paar µs ja nicht viel ausmachen.

    PS: Mark von MCS empfiehlt an Stelle von WAIT 1 WAITMS 1000 zu verwenden, weil das weniger Programmspeicher belegt.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2006
    Beiträge
    14
    Hallo,

    dieser Thread ist zwar schon etwas älter, aber wer weiß vielleicht antwortet ja doch jemand auf meine Frage ohne einen neuen Thread aufmachen zu müssen...

    Also ich habe eigentlich ein ziemlich ähnliches Problem.
    Ich hab eine Uhr gebastelt, mit einem ATmega 16 und ner LCD (1602a), ein Wecker ist auch dabei und da sind wir auch schon beim Problem:

    Ich möchte die Alarmdauer festlegen, sagen wir mal erst mal auf 5 Minuten, also 300 Sekunden.

    Wenn bei meiner Uhr der Alarm (Wecker) ausgelöst wird, dann wird ein Pin frei geschalten...
    Ich hab erstmal ganz einfach folgenden Code genommen:

    If Alarm_stat = 1 Then
    Portc.1 = 1
    wait 300
    Portc.1 = 0
    End if

    Tja, wenn ich das in mein Code einbaue, dann pausiert der ATmega 300 Sekunden lang.
    In dieser Zeit bleibt meine Uhr stehen, nach 300 Sekunden geht die Uhr ganz normal weiter...

    Wie könnte Portc.1 für eine gewisse Zeit auf 1 setzen, ohne diesen Befehl in die Do/Loop zu schreiben?

    Oder wie würdet ihr die Alarmdauer festlegen?

    Viele Dank schonmal!
    Geändert von mohi (31.03.2012 um 12:59 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Du hast doch eine Uhr drin. Demnach auch irgendwo eine Sub, welche jede Sekunde aufgerufen wird. Ich mache es immer so:

    PseudoCode:
    Code:
    do
    ...
    ...
    ...
    loop
    end
    
    sectic:
       if alarmzeit=zeit then alarmdauer=300
       if alarmdauer>=1 then
          decr alarmdauer
          set ausgang
       else
          reset ausgang
       endif
    return
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2006
    Beiträge
    14
    Ja habe ich, nämich bei Config Dcf77 am Ende dieser Zeile steht bei mir Gosub = Sectic

    Ist dann Alarmdauer eine neue Variable?
    Anscheined schon, werds gleich mal ausprobieren...

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2006
    Beiträge
    14
    Stimmt der folgende Code-Teil in deinen Augen?

    Code:
    Dim Alarmdauer As Word
    Alarmdauer = 0
    
    Config Portb.1 = Output                                     ' Wecker
    Portb.1 = 1                                                 ' Wecker
    Wecker Alias Portb.1  
    
    Do
    Loop
    End 
    Sectic:
    If _hour = Alstd And _min = Almin Then Alarmdauer = 3
       If Alarmdauer >= 1 Then
          Decr Alarmdauer
          Set Wecker
       Else
          Reset Wecker
       End If
    Return
    Es funktioniert zwar, aber die Wecker-LED geht nach einer Sekunde wieder aus statt nach 3 Sekunden...

    Ist es ok, when ich _hour = Alstd And _min = Almin schreibe?
    Ich frag deswegen, weil in deinem Code _hour und _min in eine Variable stecken...

    Aber wenigstens ist der Hinweiß, dass das ganze auch in Sectic zu realisieren ist, ziemlich cool! Vielen Dank...
    Geändert von mohi (31.03.2012 um 15:38 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Womöglich wird die Sectic öfter in der Sekunde aufgerufen. Da in meinem Beispiel (wie auch von dir übernommen) die Alarmdauer auf 3 und dann gleich wieder auf eins weniger gesetzt werden, bleiben netto nur 2 Sekunden übrig. Du kannst es auch in der Hauptschleife erledigen, indem Du z.B. die Sekunde zwischenspeicherst und dann vergleichst. Ist diese anders, dann ist eine Sekunde vergangen. Möglichkeiten gibt es halt viele.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2006
    Beiträge
    14
    Möglichkeiten gibts es bestimmt viele, nur sind leider meine Möglichkeiten begrenzt, da ich Bascom-Neuling bin...

    Dein Codebeispiel hat mir deshalb auch so gut gefallen, weil ich es verstanden habe

    Hab eben die Alarmdauer auf 10 erhöht, leider bleibt die Alarm-LED trotzdem nur eine Sekunde an.
    In dem Sectic-Bereich, also zwsichen Sectic und Return, ist nur eine Flagsetzung...

    Lösche ich folgenden Code, bleibt die Alarm_LED nonstop an...

    Code:
       If _hour = Alstd And _min = Almin Then Alarmdauer = 10
       If Alarmdauer >= 1 Then
          Decr Alarmdauer
          Set Wecker
       Else
          Reset Wecker
       End If

Berechtigungen

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

12V Akku bauen