32. Lektion: Timer: Unterschied zwischen den Versionen

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche
(Created page with "== Timer== Überlauf in 584942.4 Jahren")
 
(WDT – Watchdog Timer)
 
(37 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Timer==
 
== Timer==
  
Überlauf in 584942.4 Jahren
+
Der RP2040 enthält einen 64-bit Zähler. Dieser wird im 1µS-Takt hochgezählt. Da ein Überlauf erst  in 584942 Jahren erfolgen würde, ist kein Überlauf und die damit verbundenen Komplikationen zu befürchten.<br>
 +
Vermutlich ist dieser Zähler die Basis aller zeitabhängigen Funktionen. Es gibt nichts, was eine kürzere Auflösung besitzt.
 +
 
 +
Die Timer sind (beim Pico-Micropython) in Software realisiert. Deshalb ist ihre Anzahl im Prinzip nur durch den vorhandenen Speicherplatz begrenzt.
 +
<!----
 +
Die Timer im RP2040 besteht aus zwei 16-Bit-Kanälen, die zu einem 32-Bit-Timer zusammengeschaltet werden können. Die Betriebsart muss für jeden Timer konfiguriert werden, aber dann kann die Periode (oder die Frequenz) für jeden Kanal unabhängig konfiguriert werden. Mit Hilfe der Callback-Methode kann das Timer-Ereignis eine Python-Funktion aufrufen (Interrupt).
 +
 
 +
Mit einem 16-bit Timer kann maximal eine Zeit von 65,535 mS erreicht werden. Für längere Zeiten können beide Kanäle zu einem 32-bit Timer zusammen geschaltet werden. Dann sind Zeiten bis 4294,967.296 Sekunden oder > 71 Minuten zu erreichen.
 +
 
 +
Bei Micropython braucht man sich um diese Details nicht zu kümmern.
 +
---->
 +
 
 +
== Eine Timer-Instanz erzeugen==
 +
Wie immer in Micropython muss zuerst eine Instanz der Klasse Timer erzeugt werden.<br>
 +
Dabei werden folgende Parameter übergeben:
 +
; ID / *
 +
: Wird nicht als Keywordargument übergeben. Für Softwaretimer -1. Ist default und muss deshalb nicht angegeben werden.
 +
; mode
 +
: Timer.PERIODIC oder Timer.ONE_SHOT.
 +
; period / freq
 +
: Entweder period in ms oder freq in Hz (nur ganze Zahlen).
 +
; callback
 +
: Funktion die ausgeführt werden soll.
 +
 
 +
Hier der Prototyp:
 +
<pre>
 +
tim = Timer(*, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None)
 +
</pre>
 +
und hier 2 Beispiele:
 +
<pre>
 +
from machine import Timer
 +
 
 +
tim = Timer(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
 +
tim.init(freq=2, mode=Timer.PERIODIC, callback=lambda t:print(2))
 +
</pre>
 +
 
 +
== Timer Methoden==
 +
; Timer.init(*, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None)
 +
: Alternative Methode eine Instanz zu erzeugen:
 +
<pre>def mycallback(t):
 +
    pass
 +
 
 +
# periodic at 1kHz
 +
tim.init(mode=Timer.PERIODIC, freq=1000, callback=mycallback)
 +
 
 +
# periodic with 100ms period
 +
tim.init(period=100, callback=mycallback)
 +
 
 +
# one shot firing after 1000ms
 +
tim.init(mode=Timer.ONE_SHOT, period=1000, callback=mycallback)
 +
</pre>
 +
 
 +
; Timer.deinit()
 +
: Hält den Timer an.
 +
 
 +
 
 +
== Ticks==
 +
Zur Zeitmessung (nicht für die Uhrzeit) gibt es die Ticks. Hierbei wird ein Zähler kontinuierlich hochgezählt. Sein aktueller Wert kann ausgelesen werden. So kann die Zeit zwischen zwei Abfragen bestimmt werden. Die Auflösung kann in ms, µs und cpu Frequenz gewählt werden.
 +
<br>
 +
'ticks_ms', 'ticks_us', ticks_cpu
 +
Die Funktion <code>ticks_cpu()</code> misst entgegen ihres Namens nur µs!
 +
ticks_add, ticks_diff'
 +
<br>
 +
Der Ticks-Zähler ist 30 bit groß.
 +
 
 +
== Lambda Funktion==
 +
Lambda Funktionen sind kleine (eine Zeile) lokale und namenlose Funktionen.<br>
 +
Es muss mindestens ein Parameter angegeben werden, auch wenn er nicht benutzt wird.
 +
<pre>
 +
lambda parameter(s):return value
 +
</pre>
 +
Und hier eine Anwendung:
 +
<pre>
 +
# Lambda_test_01.py
 +
#
 +
from machine import Pin, Timer
 +
 
 +
led = Pin(22, Pin.OUT)
 +
 
 +
led.value(1)
 +
 
 +
led_timer = Timer(freq=2, mode=Timer.PERIODIC, callback=lambda x:led.toggle())
 +
</pre>
 +
 
 +
 
 +
Mehr Info zur Lambda Funktion z.B. hier:  https://geekflare.com/de/lambda-functions-python/
 +
 
 +
== WDT – Watchdog Timer==
 +
Der Watchdog Timer startet das System nach einem Absturz wieder neu. Dazu wird ein Timer gestartet der als callback einen Reset ausführt. Das Programm muss den WDT jeweils vor Ablauf der Zeit zurücksetzen. Wenn das Programm abstürzt erfolgt das Zurücksetzen des WDT nicht und er löst einen Reset aus. Beim Pico ist die maximale Zeit 8388 ms.
 +
 
 +
<pre>
 +
from machine import WDT
 +
wdt = WDT(timeout=2000)  # enable it with a timeout of 2s
 +
wdt.feed()
 +
</pre>
 +
 
 +
'''wdt.feed()''' muss im Programm vor Ablauf des WDT ausgeführt werden.<br>
 +
Die Einstellungen des WDT können nicht verändert werden und er kann auch nicht gestoppt werden.
 +
 
 +
==Navigation==
 +
[[Micropython_Kurs_2023_-_Teil_2|Zurück zur "Micropython Kurs 2023 Teil 2" Startseite]]<br>
 +
[[Micropython Kurs 2023|Zurück zur "Micropython Kurs 2023" Startseite]]<br>
 +
[[Programmieren|Zurück zur Programmieren Startseite]]<br>
 +
[[Attraktor_Wiki|Zurück zur Wiki Startseite]]<br>

Aktuelle Version vom 30. Januar 2024, 19:45 Uhr

Timer

Der RP2040 enthält einen 64-bit Zähler. Dieser wird im 1µS-Takt hochgezählt. Da ein Überlauf erst in 584942 Jahren erfolgen würde, ist kein Überlauf und die damit verbundenen Komplikationen zu befürchten.
Vermutlich ist dieser Zähler die Basis aller zeitabhängigen Funktionen. Es gibt nichts, was eine kürzere Auflösung besitzt.

Die Timer sind (beim Pico-Micropython) in Software realisiert. Deshalb ist ihre Anzahl im Prinzip nur durch den vorhandenen Speicherplatz begrenzt.

Eine Timer-Instanz erzeugen

Wie immer in Micropython muss zuerst eine Instanz der Klasse Timer erzeugt werden.
Dabei werden folgende Parameter übergeben:

ID / *
Wird nicht als Keywordargument übergeben. Für Softwaretimer -1. Ist default und muss deshalb nicht angegeben werden.
mode
Timer.PERIODIC oder Timer.ONE_SHOT.
period / freq
Entweder period in ms oder freq in Hz (nur ganze Zahlen).
callback
Funktion die ausgeführt werden soll.

Hier der Prototyp:

tim = Timer(*, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None)

und hier 2 Beispiele:

from machine import Timer

tim = Timer(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(1))
tim.init(freq=2, mode=Timer.PERIODIC, callback=lambda t:print(2))

Timer Methoden

Timer.init(*, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None)
Alternative Methode eine Instanz zu erzeugen:
def mycallback(t):
    pass

# periodic at 1kHz
tim.init(mode=Timer.PERIODIC, freq=1000, callback=mycallback)

# periodic with 100ms period
tim.init(period=100, callback=mycallback)

# one shot firing after 1000ms
tim.init(mode=Timer.ONE_SHOT, period=1000, callback=mycallback)
Timer.deinit()
Hält den Timer an.


Ticks

Zur Zeitmessung (nicht für die Uhrzeit) gibt es die Ticks. Hierbei wird ein Zähler kontinuierlich hochgezählt. Sein aktueller Wert kann ausgelesen werden. So kann die Zeit zwischen zwei Abfragen bestimmt werden. Die Auflösung kann in ms, µs und cpu Frequenz gewählt werden.
'ticks_ms', 'ticks_us', ticks_cpu Die Funktion ticks_cpu() misst entgegen ihres Namens nur µs! ticks_add, ticks_diff'
Der Ticks-Zähler ist 30 bit groß.

Lambda Funktion

Lambda Funktionen sind kleine (eine Zeile) lokale und namenlose Funktionen.
Es muss mindestens ein Parameter angegeben werden, auch wenn er nicht benutzt wird.

lambda parameter(s):return value

Und hier eine Anwendung:

# Lambda_test_01.py
#
from machine import Pin, Timer

led = Pin(22, Pin.OUT)

led.value(1)

led_timer = Timer(freq=2, mode=Timer.PERIODIC, callback=lambda x:led.toggle())


Mehr Info zur Lambda Funktion z.B. hier: https://geekflare.com/de/lambda-functions-python/

WDT – Watchdog Timer

Der Watchdog Timer startet das System nach einem Absturz wieder neu. Dazu wird ein Timer gestartet der als callback einen Reset ausführt. Das Programm muss den WDT jeweils vor Ablauf der Zeit zurücksetzen. Wenn das Programm abstürzt erfolgt das Zurücksetzen des WDT nicht und er löst einen Reset aus. Beim Pico ist die maximale Zeit 8388 ms.

from machine import WDT
wdt = WDT(timeout=2000)  # enable it with a timeout of 2s
wdt.feed()

wdt.feed() muss im Programm vor Ablauf des WDT ausgeführt werden.
Die Einstellungen des WDT können nicht verändert werden und er kann auch nicht gestoppt werden.

Navigation

Zurück zur "Micropython Kurs 2023 Teil 2" Startseite
Zurück zur "Micropython Kurs 2023" Startseite
Zurück zur Programmieren Startseite
Zurück zur Wiki Startseite

Diese Seite wurde zuletzt am 30. Januar 2024 um 19:45 Uhr geändert. Diese Seite wurde bisher 950 mal abgerufen.