Timer sind mein Problem

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Hier bin ich!
      Bei meinem Programm war ein Fehler bei der Faktorberechnung drin, deshalb hat er in ein dword gepasst. Die Konstante hat zwar eine Kommastelle, die wird aber beim Zuweisen auf ein dword ignoriert. Mit dem richtigen Wert würde ich auch eine Fehlermeldung bekommen. Das heißt ganz einfach, das Geschwindigkeitsmessprogramm muss bisschen geändert werden, was aber kein Problem ist.
      Lass einfach mal den Maßstab bei der Konstanten weg und rechne mit dem an einer geschickteren Stelle weiter. Die Konstannte rechnet dann nur von mm/ms in km/h um und in einem weiteren Schritt wird in den Maßstab umgerechnet.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo tschoeatsch,

      probier ich aus. Das ändert aber nichts am Problem! Kann doch nicht sein, wenn ich das gleiche Prog, wenn ich den Rechner wechsele ändern muss damit es compiliert wird! :!:
      Mein Notebook hat zwar einen Core I5 ist dafür aber auch schon ein paar Tage (Totensonntage) alt. Oder man macht deinen Vorschlag gleich von Anfang an, was man aber nicht wissen kann, weil es bei einem selber ja läuft ohne diesen Trick. Ich probier es zuerst mal mit dem Vorschlag von djmsc, wenn ich dann keine System relevanten Meckereien mehr lese und der Fehler immer noch da ist, hau ich den Rechner gegen die Wand :D ! Nee mach ich nicht. ;)

      Klaus
    • Hallo Leute,

      hipp hipp hurra! a_42_02cc30b2 a_22_9ac28a82 Das Programm läuft wieder, warum auch immer? Das Schöne daran ist aber auch, es läuft auch ohne Änderungen im Tacho Progi. Ich hab eigentlich nur Windows repariert und Bascom neu installiert. Um 2 Uhr heute Nacht war es geschafft. Bleibt das nächste Update von Microsoft abzuwarten ob der Zustand dann auch erhalten bleibt? Jetzt kann es weiter gehen, danke für die Tipps von euch! :thumbup:

      Klaus

      PS: Jetzt kann ich mich wieder um die Timer kümmern!
    • Hallo Leuts,

      da jetzt alles wieder im Lot ist und ich wieder den Rechner benutzen kann :thumbup: hab ich aber trotzdem noch ein bis hundert Fragen zum Thema Timer!
      Mit zwei Leds funktioniert es, die kann ich unabhängig von einander blinken lassen, auch in verschiedenen Takten. Was ist aber, wenn ich z.B. 3 oder mehrere Leds unabhängig blinken lassen möchte? Ich hab ja nur die beiden Timer z.B. beim Tiny24/44 zur Verfügung, wie funktioniert das? Ich hab versucht mit anderen Werten und Constanten bzw. Variablen aber das klappt nicht, zwei Leds blinken immer gleichzeitig! ?( Hilft mir jemand bei dem Problem des Verstehens wie es geht? ?(

      Gruß
      Klaus
    • Hallo Klaus,
      Du brauchst für die ganze Blinkerei nur einen Timer. Die Timer ISR wird in kleinen Zeitintervallen ohne Unterbrechung angesprungen, zum Beispiel alle 100ms. Für jede gewünschte LED benötigst Du eine Zählvariable (z. B. LED_1, LED_2 usw). In der Timer ISR erhöhst Du jede Zählvariable (z.B. incr 1). Der Rest passiert im Hauptprogramm. Zum Beispiel eine LED im Sekundentakt, die zweite LED doppelt so schnell:

      If LED_1 = 10 then '10 x 100 ms = 1 Sekunde
      toggle LED_rot
      LED_1=0 'Wichtig, Variable zurücksetzen
      end if

      If LED_2 = 5 then '5 x 100 ms = 0,5 Sekunden
      toggle LED_gruen
      LED_2=0 'Wichtig, Variable zurücksetzen
      end if

      In der Timer ISR steht nur:
      incr LED_1
      incr LED_2
      Return

      Was macht Dein Programm?
      es zählt alle 100ms die Variablen hoch. erreicht die Variable LED_1 den Wert 10 (10 x 100ms) toggelt LED_rot und der Zähler (nur) für diese LED wird wieder auf Null gesetzt. Die Variable LED_gruen erreicht bereits nach 5 ISR- Ansprüngen ihren Toggelwert, also doppelt so schnell. Bei Erreichen von 5 x 100ms wird also diese LED getoggelt und ganz wichtig, auch die Variable für diese LED wird noch vor End if wieder auf Null gesetzt.

      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Hallo Leuts,

      danke Christian, ich hab dann mal ein wenig probiert und hoffentlich auch verstanden! ;) Nur, so wie Du mir das geschrieben hast, hat es nicht funktioniert. Ich bekam dazu einige Fehlermeldungen. Dachte zuerst es läge wieder am Rechner aber jetzt läuft es. Was ich aber noch nicht so ganz auf die Reihe bekomme, das ist die Berechnung, wenn ich einen bestimmten Zeitablauf errechnen möchte. Sagen wir mal, ich möchte eine Led nach ca. 1 Minute zweimal blinken lassen, eine andere nach 5 Minuten usw.. Wie berechne ich das? Ich habe 1 MHz Taktfrequenz und 65536 Ticks! ?( Anbei das neu geschriebene Progi!

      $regfile = "attiny24.dat"
      $crystal = 1000000 ' 1MHz int. Fuse Bits= High = 0xDF, Low = 0xE2
      $hwstack = 32
      $swstack = 10
      $framesize = 40
      '---- Config Timer1 ---------------------------------------
      Config Timer1 = Timer , Prescale = 64
      Enable Timer1
      On Timer1 Sec_1 ' Timer isr
      '---- Config Ports ----------------------------------------
      Config Porta.0 = Output
      Led1 Alias Porta.0
      Config Porta.1 = Output
      Led2 Alias Porta.1
      Config Porta.2 = Output
      Led3 Alias Porta.2
      Config Porta.3 = Output
      Led4 Alias Porta.3
      Config Porta.4 = Output
      Led5 Alias Porta.4
      Config Porta.5 = Output
      Led6 Alias Porta.5
      '---- Variable --------------------------------------------
      Dim Mz_1 As Byte
      Dim Mz_2 As Byte
      Dim Mz_3 As Byte
      Dim Mz_4 As Byte
      Dim Mz_5 As Byte
      Dim Mz_6 As Byte
      '---- Constante Timer vorspannen --------------------------
      Const T1_laden = 65400 ' 65536
      '---- Interrupts aktivieren -------------------------------
      Enable Interrupts
      '---- Hauptprogramm ---------------------------------------
      Do
      If Mz_1 = 5 Then '
      Toggle Led1
      Else
      Led1 = 0 '
      End If
      If Mz_2 = 10 Then '
      Toggle Led2
      Else
      Led2 = 0 '
      End If
      If Mz_3 = 15 Then '
      Toggle Led3
      Else
      Led3 = 0 '
      End If
      If Mz_4 = 20 Then '
      Toggle Led4
      Else
      Led4 = 0 '
      End If
      If Mz_5 = 25 Then '
      Toggle Led5
      Else
      Led5 = 0 '
      End If
      If Mz_6 = 30 Then '
      Toggle Led6
      Else
      Led6 = 0 '
      End If
      Waitms 10
      Loop
      End
      '---- Unterprogramm isr -----------------------------------
      Sec_1: 'In der Timer ISR steht nur:
      Timer1 = T1_laden
      Incr Mz_1
      Incr Mz_2
      Incr Mz_3
      Incr Mz_4
      Incr Mz_5
      Incr Mz_6
      Return

      Gruß :)
      Klaus
    • Der Timer scheint recht hektisch: 1tick sind 64µs (1/1MHz/64). Nun wird er mit 64000 vrogeladen so das er nur noch 1536 ticks hat bis zum Int hat.( Ca 100ms). Nun wird z.B. Led4 nach 2 Sekunden für 10 ein dann 10ms aus dann wieder ein (toggle) für 100ms dann bleibt sie aus (Mz4 größer 20) für 25,5 sekunden bis Mz4 nach Überlauf nach 255 wieder bei 20 ist. Und so weiter. Falls das 10ms blitzen nicht gewünscht ist einfach das toggle durch Set ersetzen. Die 25,5s sind vermutlich nicht gewünscht? Dann müssen die Mzx auf 0 zurück gesetzt werden. Dabei stellt sich die Frage wie lange sollen die LEDs leuchten? Eine Möglichkeit :
      Alle gleich lang - am einfachsten : hinter jedem Toggle (Set) Led Mzx=0 und das waitms bestimmt die Leuchtzeit.
      Jede individuell - Die Abfagen ändern z.B
      if Mz_4 = 20 then Set Led4
      if Mz_4 >=25 then ' 5*100ms
      reset Led4 (Led4=0)
      Mz4=0
      end if
      soll jetzt noch eine z.B. zweimal kurz blinken und danach erst wieder die normale Wartezeit einhalten das MZ_x erst zum Schuß auf 0 setzen und mehrere Abfrage dazwischen (if MZ =30 then set: If mz=40 then reset ...) (Natürlich darf dann erst das letzte if >= heißen.)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pluto25 ()

    • Hallo Pluto25,

      zuerst mal zu dem Progi! Die durch die Werte ergebenen Zeiten sind rein willkürlich gewählt um überhaupt eine Reaktion zu Erwirken. Mittlerweile stelle ich wohl fest, ich sollte mir wirklich einen großen Zettel an meinem Bastelplatz bappen und darauf z.B. die Berechnungszeiten für die Timer zu vermerken, sonst vergess ich das bestimmt wieder weil ich eigentlich zu wenig bastele. Die 25,5s kommen so zustande, weil ich wollte, dass die 4 Leds kurz hintereinander kurz aufblitzen um das Ergebnis schnell zu sehen! Ich hätte auch den Timer Teiler auf 8 setzen können aber da war das Blitzen zu kurz um etwas deutlich zu sehen! Jetzt zumindest wird ich mit dem Erlernten mal wieder in mein Bastelzentrum verschwinden und mich an den Tiny setzen. trinkende-smileys-210

      Gruß :)
      Klaus
    • Ich habe jetzt nicht den ganzen Thread durchgelesen, aber ich würde so "Blinkschaltungen" mit einem einzigen Timerinterrupt und der Hauptschleife lösen.
      Das kann man sich dann im Ablauf wie ein Schrittschaltwerk vorstellen.

      Jede LED erhält eine eigene Zählvariable.
      Die Zählvariablen werden mit einem Wert belegt der der Pausenzeit entspricht .
      Diesen Wert muss man sich dann abhängig vom IRQ entsprechend berechnen (bei einem 20ms IRQ wären dann ein Wert von 50=1000ms oder eben eine Sekunde).
      Im Prinzip läuft da ein IRQ läuft mit der kleinsten notwendigen Zeiteinheit und zählt alle LED-Variablen solange herunter bis diese Null sind (ab da werden diese nicht mehr verändert).
      In der Hauptschleife werden diese Variablen auf Null geprüft und wenn der Wert erreicht ist wird die jeweilige LED abhängig von ihrem Zustand eben umgeschaltet und die Zählvariable neu gesetzt und das ganze beginnt wieder von vorne.

      Hier habe ich das schon mal in etwa :D so umgesetzt. Da laufen z.B. Ampeln oder Hausbeleuchtungen von einander unabhängig auch vollautomatisch ab können aber mittels RS485 auch individuell gesetzt werden.