- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Stopwatch geht um 10% zu langsam

  1. #1

    Ausrufezeichen Stopwatch geht um 10% zu langsam

    Anzeige

    Praxistest und DIY Projekte
    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:
    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 )

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

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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

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

    Code:
    	// 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). Unmissverständlicher wäre diese Variante:

    Code:
    	// All 1ms based timing stuff
    	ms-timer++;
    	if(ms_timer >= 10) { // 10 * 100µs = 1ms
    		// 16bit Stopwatches:
    (ebenfalls ungetestet)
    Geändert von radbruch (02.02.2012 um 22:31 Uhr)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Hallo,
    also erst mal Vielen Dank radbruch für die schnelle Antwort und die 2.Lösung funktioniert einbannfrei:
    Zitat Zitat von radbruch Beitrag anzeigen
    Code:
    	// 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
    _______________
    MFG DERICH
    Geändert von Derich2 (03.02.2012 um 18:08 Uhr)

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    @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

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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

  7. #7
    Zitat Zitat von radbruch Beitrag anzeigen
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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.
    Gruß
    Dirk

Ähnliche Themen

  1. RP6 - Stopwatch
    Von DonGru im Forum Robby RP6
    Antworten: 5
    Letzter Beitrag: 16.02.2011, 16:09
  2. Stopwatch in Sekunden ausgeben
    Von Dasive im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 06.01.2011, 11:54
  3. problem mit K6 (geht, geht nicht...)
    Von ijjiij im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 17.12.2010, 17:19
  4. Fragen zu den Stopwatch
    Von TrainMen im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 30.06.2009, 14:10
  5. Stopwatch auslesen
    Von Roboman93 im Forum Robby RP6
    Antworten: 12
    Letzter Beitrag: 14.01.2008, 15:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen