PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stopwatch geht um 10% zu langsam



Derich2
02.02.2012, 21:18
Hallo,
ich hab jetzt seit längerer Pause mal wieder meinen RP6 ausgepackt und mal ein bisschen mit Timern etc. rumgespielt. Dabei ist mir aufgefallen, dass die in der Libary integrierten Stopwatches anscheinend um 10% zu langsam gehen.

Wie bin ich drauf gekommen?
Ich hab mal etwas in der Libary rumgespielt und den Timer2 nicht als PWM sondern auch als Stoppuhr verwendet. Nun hab ich beide 30 Sekunden laufen lassen und dann ausgeben lassen.
Während hierbei Timer1 bei 30 Sekunden war, war die Stopwatch erst bei 27 Sekunden.
Anschließend hab ich das dann mal manuel mit einer Uhr nachgemessen und ich bin auf das selbe Ergebniss gekommen.
Also hab ich gedacht, dass ich vielleicht irgendwas in der Libary verändert habe, was die Stopwatch beinflusst hat. Also hab ich wieder die Standard Libary genommen und mit der Uhr nachgemessen und bin zum selben Ergebniss gekommen.
Hier mal der dazu verwendete Code:


#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
mSleep(1000);
writeString("3\n");
mSleep(1000);
writeString("2\n");
mSleep(1000);
writeString("1\n");
mSleep(1000);
writeString("GO\n");
startStopwatch1();
while(true){
if(getStopwatch1() == 30000){ // Eigentlich nach 30 Sekunden ...
writeString("STOP\n");
writeInteger((getStopwatch1()/100),DEC);
writeString("\n");
mSleep(1000);
writeString("3\n");
mSleep(1000);
writeString("2\n");
mSleep(1000);
writeString("1\n");
mSleep(1000);
writeString("GO\n");
setStopwatch(0);
}
}


}
Programm gestartet -> bei Go auf Armbanduhr gestartet -> bei Stop auf Armbanduhr gestopt
-> Ausgabe: 300 Armbanduhr: 33 Sekunden (Und ich hab keine 3 Sekunden Reaktionszeit :D)

Nun meine Frage:
Kann das wer bestätigen?
Kann man das ändern?

Vielen Dank schon jetzt für Antworten!
__________
MFG DERICH

radbruch
02.02.2012, 22:47
Hallo

Erstaunlich. Quick&Dirty würde ich die 10 zu einer 9 machen:


// All 1ms based timing stuff
if(ms_timer++ >= 10) { // 10 * 100µs = 1ms
// 16bit Stopwatches:
(ungetestet)

In RP6RobotBaseLib.c in ISR (TIMER0_COMP_vect).

Gruß

mic


[Edit]
Wäre if(++ms_timer >= 10) nicht richtiger? Erst erhöhen und dann vergleichen? Am Ende der ISR wird ms_timer auf null gesetzt. Beim nächsten Aufruf der ISR wird diese 0 mit >=10 verglichen und erst dann wird ms_timer erhöht (Postincrement (http://www.google.de/search?q=Postincrement)). Unmissverständlicher wäre diese Variante:


// All 1ms based timing stuff
ms-timer++;
if(ms_timer >= 10) { // 10 * 100µs = 1ms
// 16bit Stopwatches:
(ebenfalls ungetestet)

Derich2
03.02.2012, 13:42
Hallo,
also erst mal Vielen Dank radbruch für die schnelle Antwort und die 2.Lösung funktioniert einbannfrei:



// All 1ms based timing stuff
ms_timer++;
if(ms_timer >= 10) { // 10 * 100µs = 1ms
// 16bit Stopwatches:

Jetzt läuft sie auch auf Millisekunden genau, so wie es gehört.
Was mich nur erstaunt, dass das vorher keiner gemerkt hat, weil 10% ist ja immerhin ganzschön viel!

Nochmals Danke :D
_______________
MFG DERICH

radbruch
03.02.2012, 14:09
Ja, das erstaunt mich auch. Vermutlich verwenden die meisten eine Stopwatch für Aufgaben, bei denen es nicht so sehr auf die absolute Zeit ankommt.

Glückwunsch zu dieser Entdeckung. Echte Bugs sind sehr selten in der RP6-Library.

Und bevor ich's wieder vergesse: Willkommen im RN-Forum und Glückwunsch zum RP6.

:)

Gruß

mic

TrainMen
03.02.2012, 15:54
@mic
Du hast die Shifttaste in der zweiten Zeile von Deinem Code vergessen ! (Bindestrich statt Unterstrich).

In der RP6ControlLib.c sollte man das auch ändern.

mfg Berndt

SlyD
03.02.2012, 16:29
Hah tatsächlich! Danke für den Hinweis!
Wie mic schon sagt, die Hauptfunktion der Stopwatches ist es als einfacher "Multitasking" Ersatz zu fungieren.
Da ist es nicht so wichtig ob das nun genau alle 100ms aufgerufen wird.

if(ms_timer++ >= 9)

funktioniert und spart 2 Bytes Codegröße ;)

Wird in die nächste Lib Version mit aufgenommen.
Wann die veröffentlicht wird kann ich aber noch nicht genau sagen.

MfG,
SlyD

Derich2
03.02.2012, 19:05
Und bevor ich's wieder vergesse: Willkommen im RN-Forum und Glückwunsch zum RP6.


Ja so neu bin ich nicht, hab meinen RP6 schon seit 2 Jahren, hat auch hier schon nen Account (Derich) kam nur nicht mehr rein und die Mail gibs auch nimmer.
Ich war der, der mit nem pcf8574 versucht hat Servos anzusteuern :).
Momentanes Projekt:
Digitale Modelbahnstuerung, wobei der RP6 mehrer PCF8574s und Schieberigster zur Servo und Relaisansteuerung ansteurt, und Befehle von einem eigens programierten Java Programm erwartet.
______
DERICH

Dirk
03.02.2012, 21:54
Ich habe den Artikel "RP6-Programmierung" (http://www.rn-wissen.de/index.php/RP6_-_Programmierung) in RN-Wissen entsprechend angepaßt und einen Hinweis bei der RP6RobotBase- und RP6Control-Library aufgenommen.
Die Änderung habe ich für die M32-Zusatzplatine auch in die RP6Control-Beta-Library (Version 1.31beta) eingebaut.