Forum: Mikrocontroller und Digitale Elektronik Latenzzeit verkürzen - MSP430 - aber wie??


von U. Nauber (Gast)


Lesenswert?

Kann man irgendwie die Interrupt-Latenzzeit beim MSP430 verkürzen??

Momentan liegt sie bei 1 ... 1.3 us, was jedoch ziemlich lange ist.

Verwende den internen Oszi mit 16 Mhz.

So die hälfte, also rund 0.5 us wären super.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Welche Programmiersprache?
Welcher Compiler?

von Christian R. (supachris)


Lesenswert?

Aus den LPM oder aus dem Active Mode? 500ns wären gerade mal 8 Takte, 
das wird schon aus dem Active Mode knapp. Sind ja mehrere Pushs und erst 
mal den aktuellen alten Befehl abarbeiten. Ein Interrupt-Einsprung 
benötigt mindestens 6 MCLK Zyklen, wenn noch irgendwelche Variablen auf 
den Stack wandern, noch mehr. Die Abarbeitung des aktuellen Befehls kann 
ebenfalls bis zu 6 MCLK Zyklen dauern...

von U. Nauber (Gast)


Lesenswert?

Aus dem Active Mode.

Compiler: IAR Kickstart V4.11
Sprache: C

von Stefan (Gast)


Lesenswert?

@Christian
>Die Abarbeitung des aktuellen Befehls kann
>ebenfalls bis zu 6 MCLK Zyklen dauern...
Das klingt zwar logisch, da ein Befehl max. 6TZ dauern kann.
Auf der anderen Seite sagt der User-Guide (Kap.2.2.3), dass in den 6TZ 
Latenzzeit die Abarbeitung des aktuellen Befehls schon mit drin sei.
Was stimmt denn nun ?

@U.Nauber
Wie schon gesagt wurde, steigt die Latenzzeit mit der Anzahl der 
Register, die vor dem Aufruf der ISR noch gesichert werden müssen.
Eine Möglichkeit das etwas einzudämmen, wäre vielleicht die Benutzung 
von globalen Variablen in der ISR, da lokale Variablen oft in Registern 
gehalten werden, die dann eben, um in der ISR "frei" zu sein, vorher 
gesichert werden müssen.
Das Ergebnis kannst Du Dir im Ausgabelisting deiner ISR-Funktion 
anschauen.
Ein schlechtes (Zeit-) verhalten wäre dann z.B.:
1
          __interrupt void TMRA_CCR1_CCR2_Interrupt (void)   
2
   \                     TMRA_CCR1_CCR2_Interrupt:
3
   \   000000   0A12         PUSH.W  R10
4
   \   000002   0B12         PUSH.W  R11
5
   \   000004   0D12         PUSH.W  R13
6
   \   000006   0C12         PUSH.W  R12
7
   \   000008   0F12         PUSH.W  R15
8
   \   00000A   0E12         PUSH.W  R14  
9
// Kostet 6x3TZ = 18TZ extra Zeit!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Übertakten!

von Christian R. (supachris)


Lesenswert?

Stefan wrote:
> @Christian
>>Die Abarbeitung des aktuellen Befehls kann
>>ebenfalls bis zu 6 MCLK Zyklen dauern...
> Das klingt zwar logisch, da ein Befehl max. 6TZ dauern kann.
> Auf der anderen Seite sagt der User-Guide (Kap.2.2.3), dass in den 6TZ
> Latenzzeit die Abarbeitung des aktuellen Befehls schon mit drin sei.
> Was stimmt denn nun ?


Nur 6 Zyklen kann ja nicht sein, denn 6 Zyklen braucht es schon, um das 
Statusregister und den Stack zu sichern. Dazu kommt auf jeden Fall die 
Abarbeitung des letzten Befehls, im günstigsten Fall 0 Zyklen, im 
ungünstigsten halt noch 6 Zyklen. Der Rücksprung dauert ebenfalls 
mindestens 5 Zyklen. Meist noch viel länger, da wie gesagt meist noch 
einige Register gesichert und wiederhergestellt werden.

von Markus (Gast)


Lesenswert?

Travel Rec. schrieb:
> Übertakten!

Bei 16 MHz den MSP430 noch übertakten????
Das geht nicht lange gut, wenn überhaupt!

Standart sind 8 MHz!

von Jörg S. (joerg-s)


Lesenswert?

>Standart sind 8 MHz!
Nicht bei den neuen MSPs

Ansonsten ist der Beitrag aber auch schon etwas älter um darauf zu 
antworten ;)

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
Noch kein Account? Hier anmelden.