MSP430 16MHz Assembler-Delay Funktion

Gast #1759145
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!!!!
Gast #1759333
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!!!!!
#1760367
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. ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren