www.mikrocontroller.net

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


Autor: Markus (Gast)
Datum:

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

Autor: Johnny B. (johnnyb)
Datum:

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

Autor: Markus (Gast)
Datum:

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

Autor: Johnny B. (johnnyb)
Datum:

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Tat!!!!!

Vielen Dank für den Tip!

Läuft einwandfrei!!!!

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.