Forum: Mikrocontroller und Digitale Elektronik MSP430 16MHz Assembler-Delay Funktion


von Markus (Gast)


Lesenswert?

Servus,

Nachdem mein MSP439F169 für meine Applikation nun zu langsam geworden 
ist, wollte ich mein komplettes Projekt nun auf den neuen MSP430F2417 
mit 16 MHz Main-Clock laufen lassen. Das Portieren hat auch super 
geklappt; Keine Probleme mit Register oder Bezeichungen.

Einziges Problem: Ich habe auf dem MSP430F169 eine Assemler-Funktion zum 
genauen Ausführen von Zeit-Intervallen genutzt. Sobald ich diese 
Funktion nun auf dem 2417 benutze, stürzt das Programm beim Verlassen 
der Funktion komplett ab.

Der Code:
Header:
#ifndef __SUPPORT_H
#define __SUPPORT_H

void DelayCycles(unsigned int Count);

#endif




Source:
;----------------------------------------------------------------------- 
---
; Name: support.asm
;----------------------------------------------------------------------- 
---
      .cdecls C,LIST,"msp430x241x.h"
;----------------------------------------------------------------------- 
---
; Exported Symbols
;----------------------------------------------------------------------- 
---
            .def  DelayCycles
;----------------------------------------------------------------------- 
---
; Implementation
;----------------------------------------------------------------------- 
---
      .text
;----------------------------------------------------------------------- 
---
; DelayCycles
;
; Delays the program flow by the given number of cycles (R12). The 
parameter
; MUST be >= 20 (decimal).
;
; IN:  R12
;----------------------------------------------------------------------- 
---
DelayCycles                                     ; call #DelayCycles (5 
cyc)
            push    R12                         ; Save R12 (3 cyc)
            sub.w   #17,R12                     ; Adjust cycle count (2 
cyc)
            clrc                                ; Clear carry bit (1 
cyc)
            rrc.w   R12                         ; Divide by 2 (1 cyc)
            rra.w   R12                         ; Divide by 2 (1 cyc)
Delay2      nop                                 ; (1 cyc)
            dec.w   R12                         ; (1 cyc)
            jnz     Delay2                      ; (2 cyc)
            pop     R12                         ; Restore R12 (2 cyc)
            ret                                 ; (2 cyc)
;----------------------------------------------------------------------- 
---
.end


Da ich die Funktion nicht selber geschrieben, Assembler nie gelernt 
habe, aber trotzdem so genau zählen muss, wollte ich nun mal kurz 
nachfragen, ob hier jemand weiß, wo mein Problem liegen könnte.

Für eine Antwort jeglicher Art sage ich schon mal DANKE!!!!

von Johnny B. (johnnyb)


Lesenswert?

Also beim IAR Compiler für den MSP430 gibts die Funktion __delay_cycles 
schon fixfertig und Du musst nicht selber in Assembler hantieren.
Vielleicht gibts ja sowas auch beim Compiler den Du verwendest.
Definiert ist die Funktion übrigens in folgender Datei: intrinsics.h

von Markus (Gast)


Lesenswert?

Johnny B. schrieb:
> Also beim IAR Compiler für den MSP430 gibts die Funktion __delay_cycles
> schon fixfertig

Nette Idee!!!!!!
Aber leider scheint es diese Funktion beim CCE-Compiler nicht zu geben 
:(

Oder kann mir jemand das Gegenteil zeigen? (Wäre toll!!!!!)

Das scheint auch der Grund zu sein, warum der Urheber der Funktion diese 
neu schreiben musste!

Aber trotzdem danke für die Antwort!!!!!

von Johnny B. (johnnyb)


Lesenswert?

Habs gerade mit dem CCE getestet, geht auch.
Wahrscheinlich musst Du auf die aktuellste Version updaten, dann steht 
das __delay_cycles() zur Verfügung.
Allerdings kann ich kein .h oder .c File finden wo das definiert ist, 
keine Ahnung wie das genau funktioniert. Jedenfalls gehts. ;-)

von Markus (Gast)


Lesenswert?

In der Tat!!!!!

Vielen Dank für den Tip!

Läuft einwandfrei!!!!

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.