Hallo hat vielleicht schon mal jemand eine delay-Funktion für den MSP430 geschrieben mit einer µsec genauen Auflösung. Benutze einen 8MHz Quartz. MFG Dominik
HI, wenn du nen genauen delay brauchst, dann nehme am besten einen timer, der dann eine funktion aufruft oder so gruß timo
Timo wrote: > HI, > wenn du nen genauen delay brauchst, dann nehme am besten einen timer, > der dann eine funktion aufruft oder so > gruß timo Hi ich brauch eine delay Funktion der ich beim aufruf die Zeit in µsec (dword) übergebe und nach ablauf dieser wieder zurück kehrt. Was ich schon weiß das ich allein durch das aufrufen und zurück kehren schon 1µsec brauche. D.h. bei sehr kurzen zeiten wird es nicht hinhauen. Wenn ich einen Timer verwende soll, wie ist da das vorgehen? Timer laufen lassen und CCR anpassen (Dann müsste ich vorher TAR auslesen) oder erst beim aufrufen anlaufen lassen? Und Wie sorg ich für das zurück kehren (in der ISR ein Flag setzen und in der delay Funktion pollen?) oder was giebt es noch für Methoden? Und was mach ich wenn ich länger warten will als der Timer zum überlaufen braucht? Gruß Dominik
Mit einem 8 MHz Quarz ist es einfach:
1 | //-------------------------------------------------------------------------------------------------------
|
2 | // void halWait(UINT16 timeout)
|
3 | //
|
4 | // DESCRIPTION:
|
5 | // Runs an idle loop for [timeout] microseconds.
|
6 | //
|
7 | // ARGUMENTS:
|
8 | // UINT16 timeout
|
9 | // The timeout in microseconds
|
10 | //-------------------------------------------------------------------------------------------------------
|
11 | void halWait(UINT16 timeout) { |
12 | |
13 | // This sequence uses exactly 8 clock cycles for each round
|
14 | do { |
15 | _NOP(); |
16 | } while (--timeout); |
17 | |
18 | } // halWait |
Ist aus dem TI-Code für den CC2420.
überprüf wie viele clockcycles der ASM NOP befehl für deinen MSP braucht! dann kannst du es herunterrechnen!
@supachris 1.) Auch wenn der Code von TI kommt (oder gerade deswegen...) kriege ich immer Bauchschmerzen, wenn mir jemand einen C-Code vorlegt und sagt, dieser braucht genau xy Taktzyklen. Das geht nur in Assembler! 2.) Im Übrigen braucht das Ding 5TZ pro Durchgang + 7/8TZ für den Funktionsaufruf u. Rücksprung (7/8 je nach Funktionsargument)
@Fabio der Befehl braucht 1 clockcyle @Christian R. danke das ist genau was ich gesucht habe. Ist das aus einer von TI mietgelieferten header? wenn ja welche? Funktioniern tuts soweit ganz gut bei angabe von 100 braucht es 716 Zycklen was einer zeit von 89,5µsec entspricht muss also noch was aufaddieren. Gruß Dominik
Das ist aus der AN033, die Software für den CC2420 Funk-Chip. Klar kann man das nur mit Bestimmtheit in Assembler machen. Aber dann hast du wieder das Problem, dass du das mit Inline Assembler machen musst, denn ASM-Funktionen werden je nach Kompiler auch verschieden aufgerufen und dann weiß man wieder nicht genau, was passiert. Ich glaub, in der oben geposteten version fehlt das volatile vor dem UINT16. Ich hab gerade gesehn, dass ich das bei mir drin hab, damit das auch mit Optimierung noch stimmt. Naja, TI-Bugs halt. Kennt man ja.
Falls Du den IAR Compiler verwendest, kannst Du mit der Intrinsic Function "__delay_cycles()" mit relativ wenig Aufwand eine Funktion ähnlich der _delay_us() aus der avr-libc konstruieren. MfG
also ich würde ad hoc den Inline Assembler nicht als "ungenauer" als das entsprechende C Pendant hinstellen. In solchen Fällen hilft wirklich nur eine exakte Analyse des Assemblercodes um eine Aussage über eine Genauigkeit treffen zu können! Ich würd das ganze über einen Timer lösen bei dem ich als "funktionsaufruf" das run Bit setze und dann in einer Schleife das auf ein entsprechendes CCR Bit warte.
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.