Forum

Einloggen | Registrieren | RSS  

Zahnlos72(R)

24.04.2023,
13:22
 

Wer misst misst Mist ... die Zweite (Elektronik)

Hallo nochmal !

Wie schon im vorigen Posting bemerkt, wollte ich am Arduino Mega2560 in einer alle Sekunden ausgelösten ISR, eine Zeitmessung an einer darin laufenden Schleife messen.
Es wurden hierbei leider falsche Werte zurückgegeben, obwohl die Zeitmessung an und für sich so funktionieren müsste.
Jetzt habe ich, statt die Zeitdauer der Schleife zu messen, dort den PIN13 für eine gewisse bekannte Zeit ( in diesem Beispiel 500µSek. ) eingeschalten
und danach die Zeit wie schon zuvor gemessen und so funktioniert die Zeitmessung prinzipiell auch und stimmt mit der Messung am Oszilloskop überein !....siehe Bild !



Nur wenn die zu messende Zeit über 1000µSekunden liegt, bricht die Messung nach einigen Takten ab und der PIN13 bleibt dann auch auf HIGH...
Das Problem, wie auch schon von xy erkannt, ist dass nach 1000µSekunden vermutlich ein Interrupt auftritt welcher das ganze stört !
Nur welcher ?

lG

NoName

24.04.2023,
13:40

@ Zahnlos72

Wer misst misst Mist ... die Zweite

» Hallo nochmal !
»
» Wie schon im vorigen Posting bemerkt, wollte ich am Arduino Mega2560 in
» einer alle Sekunden ausgelösten ISR, eine Zeitmessung an einer darin
» laufenden Schleife messen.
» Es wurden hierbei leider falsche Werte zurückgegeben, obwohl die
» Zeitmessung an und für sich so funktionieren müsste.
» Jetzt habe ich, statt die Zeitdauer der Schleife zu messen, dort den PIN13
» für eine gewisse bekannte Zeit ( in diesem Beispiel 500µSek. )
» eingeschalten
» und danach die Zeit wie schon zuvor gemessen und so funktioniert die
» Zeitmessung prinzipiell auch und stimmt mit der Messung am Oszilloskop
» überein !....siehe Bild !
»
»
»
» Nur wenn die zu messende Zeit über 1000µSekunden liegt, bricht die Messung
» nach einigen Takten ab und der PIN13 bleibt dann auch auf HIGH...
» Das Problem, wie auch schon von xy erkannt, ist dass nach 1000µSekunden
» vermutlich ein Interrupt auftritt welcher das ganze stört !
» Nur welcher ?
»
» lG

Hi,

Vermutlich die Zeitbasis von den Softwaretimern.

Gruß
N.N.

Zahnlos72(R)

24.04.2023,
13:50

@ NoName

Wer misst misst Mist ... die Zweite

» Hi,
»
» Vermutlich die Zeitbasis von den Softwaretimern.
»
» Gruß
» N.N.


Hallo !

Und die betrifft natürlich auch den Timer1 und kann vermutlich für die anderen nicht gesondert abgestellt werden ?!?
Es ist aber auch so, dass wenn ich die Interrupts mit cli(); am Beginn ausschalte und mit sei(); am Ende wieder einschalte, es trotzdem zum Abbruch kommt !

lG

xy(R)

E-Mail

24.04.2023,
14:51

@ NoName

Wer misst misst Mist ... die Zweite

» Vermutlich die Zeitbasis von den Softwaretimern.

Und die kann man abstellen, wenn man Funktionen wie "delay" nicht benötigt.

Zahnlos72(R)

24.04.2023,
18:48

@ xy

Wer misst misst Mist ... die Zweite

» » Vermutlich die Zeitbasis von den Softwaretimern.
»
» Und die kann man abstellen, wenn man Funktionen wie "delay" nicht benötigt.



» Hi,
»
» Vermutlich die Zeitbasis von den Softwaretimern.
»
» Gruß
» N.N.


Hallo !

Und die betrifft natürlich auch den Timer1 und kann vermutlich für die anderen nicht gesondert abgestellt werden ?!?
Es ist aber auch so, dass wenn ich die Interrupts mit cli(); am Beginn ausschalte und mit sei(); am Ende wieder einschalte, es trotzdem zum Abbruch kommt !

lG

Gast

24.04.2023,
20:42

@ Zahnlos72

Wer misst misst Mist ... die Zweite

» » » Vermutlich die Zeitbasis von den Softwaretimern.
» »
» » Und die kann man abstellen, wenn man Funktionen wie "delay" nicht
» benötigt.
»
»
»
» » Hi,
» »
» » Vermutlich die Zeitbasis von den Softwaretimern.
» »
» » Gruß
» » N.N.
»
»
» Hallo !
»
» Und die betrifft natürlich auch den Timer1 und kann vermutlich für die
» anderen nicht gesondert abgestellt werden ?!?
» Es ist aber auch so, dass wenn ich die Interrupts mit cli(); am Beginn
» ausschalte und mit sei(); am Ende wieder einschalte, es trotzdem zum
» Abbruch kommt !
»
» lG

Nimm mal den Serial.print raus und prüfe dann.
Verwende mal XOR anstatt UND und ODER
Falls das nichts hilft verwende 2 zusätzliche Serial.print. Einmal erhöhst du eine neue Variable um +1 und gibst sie aus und beim 2. Serial.print reduzierst du die selbe Variabl um 1 und gibst diese aus. Wenn die Variable hochläuft, dann stört sich dein Interrupt selbst.

Zahnlos72(R)

25.04.2023,
08:50

@ Gast

Wer misst misst Mist ... die Zweite

» Nimm mal den Serial.print raus und prüfe dann.
» Verwende mal XOR anstatt UND und ODER
» Falls das nichts hilft verwende 2 zusätzliche Serial.print. Einmal erhöhst
» du eine neue Variable um +1 und gibst sie aus und beim 2. Serial.print
» reduzierst du die selbe Variabl um 1 und gibst diese aus. Wenn die Variable
» hochläuft, dann stört sich dein Interrupt selbst.


Hallo !

...ich glaube nicht, dass das nützlich sein könnte !

lG

xy(R)

E-Mail

25.04.2023,
09:08
(editiert von xy
am 25.04.2023 um 09:08)


@ Zahnlos72

Wer misst misst Mist ... die Zweite

Frag doch mal auf https://www.mikrocontroller.net

Dort hat es wohl deutlich mehr Arduinisten.

Zahnlos72(R)

25.04.2023,
14:37

@ xy

Wer misst misst Mist ... die Zweite

» Frag doch mal auf https://www.mikrocontroller.net
»
» Dort hat es wohl deutlich mehr Arduinisten.

Danke xy !

Nachtrag:
Wenn ich die Messung in der Loop mache funktioniert es auch so wie geplant nur eben mit dem Manko, dass dort dann die Schleife von den Interrupts alle 1mS unterbrochen wird..
Wenn man vor der Schleife mit cli(); die Interrupts aus und mit sei(); wieder einschaltet funktioniert die Messung wieder nicht !
Scheint so, als würde die Microsfunktion die Interrupts von Grund auf benötigen und da ja im Timer ISR selbst dann keine auftreten würde dies erklären warum es dort bis zu Messungen bis an die Grenze von 1mS funktioniert und ab dieser nicht mehr.
Ob ich das so richtig interpretiert hab ?

lG

Gast

25.04.2023,
16:03

@ Zahnlos72

Wer misst misst Mist ... die Zweite

» » Nimm mal den Serial.print raus und prüfe dann.
» » Verwende mal XOR anstatt UND und ODER
» » Falls das nichts hilft verwende 2 zusätzliche Serial.print. Einmal
» erhöhst
» » du eine neue Variable um +1 und gibst sie aus und beim 2. Serial.print
» » reduzierst du die selbe Variabl um 1 und gibst diese aus. Wenn die
» Variable
» » hochläuft, dann stört sich dein Interrupt selbst.
»
»
» Hallo !
»
» ...ich glaube nicht, dass das nützlich sein könnte !
»
» lG

Glauben heisst nicht wissen.

Zahnlos72(R)

25.04.2023,
22:33

@ Gast

Wer misst misst Mist ... die Zweite

» Glauben heisst nicht wissen.


.... und das Schlimmste ist ja...wer nix weiß muss alles glauben .....;-)