mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 delay-Funktion mit µsec Auflösung


Autor: Dominik S. (sleepingiq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI,
wenn du nen genauen delay brauchst, dann nehme am besten einen timer, 
der dann eine funktion aufruft oder so
gruß timo

Autor: Dominik S. (sleepingiq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem 8 MHz Quarz ist es einfach:
//-------------------------------------------------------------------------------------------------------
//  void halWait(UINT16 timeout)
//
//  DESCRIPTION:
//    Runs an idle loop for [timeout] microseconds.
//
//  ARGUMENTS:
//      UINT16 timeout
//          The timeout in microseconds
//-------------------------------------------------------------------------------------------------------
void halWait(UINT16 timeout) {

    // This sequence uses exactly 8 clock cycles for each round
    do {
        _NOP();
    } while (--timeout);

} // halWait

Ist aus dem TI-Code für den CC2420.

Autor: Fabio (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
überprüf wie viele clockcycles der ASM NOP befehl für deinen MSP 
braucht! dann kannst du es herunterrechnen!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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)

Autor: Dominik S. (sleepingiq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Bertram S. (bschall)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.