Freiberg Martin
2007-04-21 19:52:43 UTC
Hi,
Sorry für das Crossposting, aber ich hoffe das ich so diejenigen finde
dir mir die Ursache für mein Problem erklären können.
F-Up ist hoffendlich passend gesetzt, sonst bitte anpassen.
Ich habe ein Problem mit dem realisieren einer Drehzahlmessung über
einen PC und hoffe nun hier die Lösung zu finden.
Ich möchte nur eine Drehzahlmessung realisieren die von 1 bis 2500 oder
wenigstens von 60 bis 2200 U/Min geht. Eigendlich ein einfaches Vorhaben
könnte man meinen, doch der Teufel steckt im Detail. Über einen Sensor
bekomme ich pro Umdrehung einen Impuls. Die Messung erledige ich über
den Timerbaustein im PC.
Da der Timerbaustein im PC fest mit 1193182 Hz getaktet wird, reicht der
Zählbereich nicht aus und muss ihn über den Timerinterrupt erweitern.
Wenn der Messimpuls kommt läuft folgendes ab:
1.Wert im Timerbaustein festhalten (OUT 0x043,04)
2.Wert aus Timerbaustein auslesen (2x IN 0x040)
3.Softwaretimer auslesen (Word aus Adresse 0x0040:0x006C)
3.Die zuvor gespeicherten Werte hohlen
4.Die aktuellen Timerwerte zwischenspeichern
5.Die Differenz aus alten und aktuellen Werten berechnen
6.Aus der Differenz die Drehzahl errechnen (Drehzahl=71590920/Diff).
Dummerweise habe ich aber bei den Werten große Sprünge drin. Um dem
Problem auf die Spur zu kommen habe ich nun 100 Werte jeweils vom
Timerbaustein (Spalte B) und vom Softwaretimer (Spalte A) bei der
Messung abgespeichert.
Hier ein Auszug davon:
A B C D E F G H
Timer Differenz Gesamtwert Diverenz Drehzahl
Soft Hard Div A Div B A*65536+B Div E U/Min
27346 41897 1792189353
27347 49405 1 7508 1792262397 73044 980 516
27349 56965 2 7560 1792401029 138632 516 979
27350 64531 1 7566 1792474131 73102 979 516
27352 6619 2 -57912 1792547291 73160 978 516
27354 14255 2 7636 1792685999 138708 516 978
27355 21893 1 7638 1792759173 73174 978 516
27357 29513 2 7620 1792897865 138692 516 978
27358 37155 1 7642 1792971043 73178 978 516
27360 44807 2 7652 1793109767 138724
27361 52461 1 7654 1793182957 73190
27363 60127 2 7666 1793321695 138738
27365 2257 2 -57870 1793394897 73202
27366 9885 1 7628 1793468061 73164
27368 17513 2 7628 1793606761 138700
27369 25099 1 7586 1793679883 73122
27371 32663 2 7564 1793818519 138636
Das Verrückte dabei ist nun, warum zählt der Softwaretimer
des PC konstant im Wechsel mal um 1 und mal um 2 weiter wie
es Spalte C aufzeigt? So fehlt mir jeweils ein Interrupt aus
dem Timerbaustein. Wenn ich jeweils zum Gesamtwert passend
65536 dazuzähle bzw. abziehe, dann habe ich schöne konstante
Werte.
Die Uhr des PC, die ebenfalls aus dem Softwaretimer errechnet
wird geht hingegen auch nach Stunden korrekt. Wenn ich im
Interruptkontroller die anstehenden Interrupts überprüfe, so
kann ich keinen ausstehenden zum Auslesezeitpunkt feststellen.
Die Interrupts müssen demnach korrekt erfolgen, und trotzdem
bekomme ich Werte aus Soft- und Hardwaretimer die nicht
zueinander passen.
Warum? Was passiert da?
Auch schlugen alle Versuche fehl aus den Werten und auch wenn
sie zweimal gelesen werden, irgend wie an zueinander passenden
Werten zu kommen.
Gruß
Martin
Sorry für das Crossposting, aber ich hoffe das ich so diejenigen finde
dir mir die Ursache für mein Problem erklären können.
F-Up ist hoffendlich passend gesetzt, sonst bitte anpassen.
Ich habe ein Problem mit dem realisieren einer Drehzahlmessung über
einen PC und hoffe nun hier die Lösung zu finden.
Ich möchte nur eine Drehzahlmessung realisieren die von 1 bis 2500 oder
wenigstens von 60 bis 2200 U/Min geht. Eigendlich ein einfaches Vorhaben
könnte man meinen, doch der Teufel steckt im Detail. Über einen Sensor
bekomme ich pro Umdrehung einen Impuls. Die Messung erledige ich über
den Timerbaustein im PC.
Da der Timerbaustein im PC fest mit 1193182 Hz getaktet wird, reicht der
Zählbereich nicht aus und muss ihn über den Timerinterrupt erweitern.
Wenn der Messimpuls kommt läuft folgendes ab:
1.Wert im Timerbaustein festhalten (OUT 0x043,04)
2.Wert aus Timerbaustein auslesen (2x IN 0x040)
3.Softwaretimer auslesen (Word aus Adresse 0x0040:0x006C)
3.Die zuvor gespeicherten Werte hohlen
4.Die aktuellen Timerwerte zwischenspeichern
5.Die Differenz aus alten und aktuellen Werten berechnen
6.Aus der Differenz die Drehzahl errechnen (Drehzahl=71590920/Diff).
Dummerweise habe ich aber bei den Werten große Sprünge drin. Um dem
Problem auf die Spur zu kommen habe ich nun 100 Werte jeweils vom
Timerbaustein (Spalte B) und vom Softwaretimer (Spalte A) bei der
Messung abgespeichert.
Hier ein Auszug davon:
A B C D E F G H
Timer Differenz Gesamtwert Diverenz Drehzahl
Soft Hard Div A Div B A*65536+B Div E U/Min
27346 41897 1792189353
27347 49405 1 7508 1792262397 73044 980 516
27349 56965 2 7560 1792401029 138632 516 979
27350 64531 1 7566 1792474131 73102 979 516
27352 6619 2 -57912 1792547291 73160 978 516
27354 14255 2 7636 1792685999 138708 516 978
27355 21893 1 7638 1792759173 73174 978 516
27357 29513 2 7620 1792897865 138692 516 978
27358 37155 1 7642 1792971043 73178 978 516
27360 44807 2 7652 1793109767 138724
27361 52461 1 7654 1793182957 73190
27363 60127 2 7666 1793321695 138738
27365 2257 2 -57870 1793394897 73202
27366 9885 1 7628 1793468061 73164
27368 17513 2 7628 1793606761 138700
27369 25099 1 7586 1793679883 73122
27371 32663 2 7564 1793818519 138636
Das Verrückte dabei ist nun, warum zählt der Softwaretimer
des PC konstant im Wechsel mal um 1 und mal um 2 weiter wie
es Spalte C aufzeigt? So fehlt mir jeweils ein Interrupt aus
dem Timerbaustein. Wenn ich jeweils zum Gesamtwert passend
65536 dazuzähle bzw. abziehe, dann habe ich schöne konstante
Werte.
Die Uhr des PC, die ebenfalls aus dem Softwaretimer errechnet
wird geht hingegen auch nach Stunden korrekt. Wenn ich im
Interruptkontroller die anstehenden Interrupts überprüfe, so
kann ich keinen ausstehenden zum Auslesezeitpunkt feststellen.
Die Interrupts müssen demnach korrekt erfolgen, und trotzdem
bekomme ich Werte aus Soft- und Hardwaretimer die nicht
zueinander passen.
Warum? Was passiert da?
Auch schlugen alle Versuche fehl aus den Werten und auch wenn
sie zweimal gelesen werden, irgend wie an zueinander passenden
Werten zu kommen.
Gruß
Martin