PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mSleep und Sleep



XRay117
13.01.2014, 07:50
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:


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

markusj
13.01.2014, 10:57
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

XRay117
13.01.2014, 11:18
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!

markusj
13.01.2014, 13:00
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

XRay117
13.01.2014, 15:08
Jetzt hab ichs! Vielen Dank für die Mühe

Dirk
13.01.2014, 19:25
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!?

XRay117
14.01.2014, 10:31
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.

Dirk
14.01.2014, 13:20
Ja, stimmt.
trotzdem kennt "man" im RP6 Forum diese Libs am besten.