-         

Ergebnis 1 bis 8 von 8

Thema: mSleep und Sleep

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2014
    Beiträge
    6

    mSleep und Sleep

    Anzeige

    Hallo alle Zusammen,

    Vorneweg -> ich bin Neu in diesem Forum und bin mir nicht ganz sicher, ob ich das Thema im Richtigen Bereich erstellt habe. Aber Ich denke Ihr werdet mich zur Not schon korrigieren, oder ich dezent darauf hinweisen!

    Mein Problem ist mehr ein grundsätzliches Verständnisproblem beim Programmieren. Und zwar habe ich jetzt mehrere Roboter von Arexx und mit den bereits definierten Funktionen aus den bereitgestellten Libraries ist es kinder einfach zu programmieren. Da mich aber
    der Hintergrund genauer interessierte, wollte ich mir die Funktionen im Detail angucken und da stolpere ich bereits über die Funktionsweise von Sleep und mSleep:
    Vorneweg mal der Code wie Ich ihn betrachte:
    Code:
    ISR(TIMER2_COMP_vect)
    {
    	delay_timer++;
    
    	if(ms_timer++ >= 10) { // 10 * 100µs = 1ms
      	// 16bit Stopwatches:
      	if(stopwatches.watches & STOPWATCH1)
      		stopwatches.watch1++;
      	if(stopwatches.watches & STOPWATCH2)
      		stopwatches.watch2++;
      	if(stopwatches.watches & STOPWATCH3)
      		stopwatches.watch3++;
      	if(stopwatches.watches & STOPWATCH4)
      		stopwatches.watch4++;
      	if(stopwatches.watches & STOPWATCH5)
      		stopwatches.watch5++;
      	if(stopwatches.watches & STOPWATCH6)
      		stopwatches.watch6++;
      	if(stopwatches.watches & STOPWATCH7)
      		stopwatches.watch7++;
      	if(stopwatches.watches & STOPWATCH8)
      		stopwatches.watch8++;
      	ms_timer=0;
    	}
    }
    void sleep(uint8_t time)
    {
    	for (delay_timer = 0; delay_timer < time;);
    }
    
    
    void mSleep(uint16_t time)
    {
    	while (time--) sleep(10);
    }

    Mein Problem an der ganzen Sache ist, dass nach meinem (beschränkten) Programmierwissen die for-Schleife in der sleep Funktion ja quasi endlos ist. Schließlich wird delay_timer ja nicht inkrementell erhöht...
    Sofern Ich das mitgekriegt habe treten dann wohl diese Interrupt Service Routinen (ISR) auf, um das ganze zu Unterbrechen oder?
    Allerdings weis ich nicht, warum und wann genau diese auftritt? Für mich ist das ganze irgendwie nicht klar. Vielleicht erbarmt sich von euch jemand und kann mir dabei weiterhelfen und mir den Funktionsaufbau genauer erklären. Ich weis auch, dass ich diese Funktion einfach nur
    wie bisher verwenden könnte, allerdings will ich einen genaueren Einblick in die Sache.

    Ich danke euch bereits


    Grüße

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von XRay117 Beitrag anzeigen
    Allerdings weis ich nicht, warum und wann genau diese auftritt? Für mich ist das ganze irgendwie nicht klar. Vielleicht erbarmt sich von euch jemand und kann mir dabei weiterhelfen und mir den Funktionsaufbau genauer erklären.
    Um den Nebel etwas zu lichten: Es gibt verschiedene Quellen für Interrupts. Eine dieser Quellen, die hier verwendete, ist eine Übereinstimmung der Output-Compare-Einheit von Timer 2. Aus der Konfiguration von Timer 2 (Vorteiler und Vergleichswert) ergibt sich das Zeitintervall zwischen zwei Übereinstimmungen, und mit der entsprechenden Frequenz wird dann die entsprechende ISR auch aufgerufen. Die ISR zählt die Variable, auf die die sleep-Schleife wartet, hoch. Damit kann sleep also erst beendet werden, wenn die ISR time Mal aufgerufen wurde.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2014
    Beiträge
    6
    Super, vielen Dank. Das hilft auf alle Fälle schon weiter.
    D.h. dass die ISR immer dann aufgerufen wird, wenn die Output und die Compare Einheit vom Timer 2 übereinstimmen. Ist das so korrekt? Nur weis ich net wo hier der Compare Wert festgesetzt wird. Irgendwie ist das alles noch sehr kompliziert...
    Bitte entschuldigt mir daher meine etwas dümmlich anmutenden Frage!

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von XRay117 Beitrag anzeigen
    D.h. dass die ISR immer dann aufgerufen wird, wenn die Output und die Compare Einheit vom Timer 2 übereinstimmen. Ist das so korrekt?
    Fast. Du solltest dir dringend Mal das Datenblatt (Datasheet) des von dir verwendeten Mikrocontrollers ansehen, Kapitel Timer2.

    Der Timer hat ein Register das er kontinuierlich hochzählt, das TCNT2 (timer 2 counter register). Die Output-Compare-Einheit vergleicht einen hinterlegten Referenzwert bei jedem Inkrement mit diesem Zählerregister. Je nach Timer kann der Vergleichswert dabei in verschiedenen Registern stehen, bei deinem AVR wird das wohl das OCR2 sein (timer 2 output compare register). Bei einem positiven Vergleich kann die Timer-Hardware eine Reihe verschiedener Funktionen ausführen, unter anderem spezielle Ausgabepins manipulieren. Eine dieser Funktionen ist aber auch das Auslösen eines Interrupts.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2014
    Beiträge
    6
    Jetzt hab ichs! Vielen Dank für die Mühe

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hi XRay117,
    der Code, den du eingestellt hast, stammt ja aus der RP6 Library.
    Vielleicht solltest du diese Fragen dann eher im RP6 Forum stellen!?
    Gruß
    Dirk

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    11.01.2014
    Beiträge
    6
    Hallo Dirk,

    also diese Funktionen so, kommen bei allen Geräten die ich von Arexx bisher habe vor. Deswegen war ich mir nicht sicher und dachte mir ich stell es in das Allgemeine Forum zur C-Programmierung. Aber meine Fragen wurde beantwortet.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Ja, stimmt.
    trotzdem kennt "man" im RP6 Forum diese Libs am besten.
    Gruß
    Dirk

Ähnliche Themen

  1. Probleme mit USART und sleep mode
    Von John Locke im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 15.08.2009, 10:26
  2. Stromverbrauch Tiny24 und RF12 Sleep Mode
    Von izaseba im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 13.02.2008, 20:49
  3. Sleep und Idle
    Von wolleausmallo im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 27.04.2007, 10:53
  4. Msleep
    Von malwine im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 22.04.2007, 14:38
  5. Asuro und die Sleep funktion
    Von redsnapper im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 12.10.2005, 18:39

Berechtigungen

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