Hey, Ich möchte mit dem MSP430f149 und dem Timer B eine Verzögerung von 10us (+/- 5%) realisieren. Der MSP430 läuft mit 8MHz. Der Timer B ist ein Free Running Timer. In der Interrupt Routine setze ich das Flag, damit ich aus der Schleife komme. Das Problem: Aus mir noch unbekannten Gründen ist die Verzögerung nur 7.5us, gemsssen mit KO. Was mach ich falsch? Den Timer höher zählen lassen, kann wohl nicht die Antwort sein, oder? void Wait10us() { chTime10us_up = FALSE; TBCTL &=~ MC_2; // Stopp Timer TBCCR1 = TBR + 80; // Neuer Capture Value (8MHz) TBCTL |= MC_2; // Restart Timer TBCCTL1 = CCIE; // CCR2 interrupt enabled do { _NOP(); }while (chTime10us_up == TRUE); }
In do { _NOP(); }while (chTime10us_up == TRUE); liegt der Hund begraben. Du initialisierst chTime10us_up mit FALSE, diese Schleife wird also sofort verlassen. Wenn Du es so machen willst,musst Du schon auf (chTime10us_up == FALSE) abfragen. Ich nehme an, dass die 7,5µs, welche Du misst, die reine Laufzeit ist. Allerdings sind die 10µs allgemein zu hinterfragen. Wenn es schon 10µs sein müssen,macht man es denke ich geschickterweise über eine Schleife mit NOPs, welche Du ausmisst. Bei Deiner Timerlösung solltest Du ausserdem bedenken, dass beim Anhalten des Timers alle anderen Kanäle beeinflusst, eventuelle Capturing-Messungen (wie in Deinem Beispiel Kanal CCR0), kannst Du dann wegschmeissen.
Kopfschüttel - Logisch! Diese Sequenz scheint es in Sich zu haben. Wenn ich mit dem KO hinschaue, dann kann ich sehen, dass es ca. 15us dauert, bis diese Addition abgeschlossen ist. TBCCR1 = TBR + 80; Vielleicht gibt es noch einen besseren Weg.
Jetzt bin ich aber voellig verwirrt. Die Addition dauert 15us, die ganze Routine 7,5us ? Riecht stark nach Nobelpreis...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.