PIC24 Probleme mit Delay_ms

OP #4688980
Hallo Leute,

ich habe ein Probleme mit der Delay-Routine für einen PIC24-Prozesser.

Ich arbeite mit MPLAB X und dem X16-Compiler.

Der Code, den ich für die Delay-Funktion benutze ist:

void Delay(unsigned int delay_count)
{
  temp_count=delay_count +1;
  asm volatile("outer: dec _temp_count");
  asm volatile("cp0 _temp_count");
  asm volatile("bra z, done");
  asm volatile("do #3200, inner");
  asm volatile("nop");  asm volatile("inner: nop");
  asm volatile("bra outer");
  asm volatile("done:");

Leider meldet der Compiler für die Zeile

asm volatile("do #3200, inner");

das der Befehl für den PIC24FJ1128GA010 nicht unterstützt wird (habe ich 
durch succesives Auskommentieren herausgefunden).

Was mache ich falsch, bzw. gibt es eine bessere Möglichkeit für eine 
Delay-Funtion?

Vielen Dank schonmal , Holger
Hallo Holger,

was du falsch machst hab ich nicht nachgesehen, nachstehend was ich 
meist benutze um delays zu machen wenn ich es ohne timer machen möchte.
habe damit noch nie probleme gehabt auf diversen 16 bit PICs.

#include<libpic30.h> // for __delay32

#ifndef delay_msec
#define delay_ns(d) { __delay32( (unsigned long) 
((d)*(FCY)/1000000000UL)); }
#define delay_us(d) { __delay32( (unsigned long) ((d)*(FCY)/1000000UL)); 
}
#define delay_msec(d) { __delay32( (unsigned long) ((d)*(FCY)/1000UL)); 
}
#define delay_s(d)  { __delay32( (unsigned long) ((d)*(FCY)/1UL)); }
#endif

wichtig, FCY muss irgendwo mal für deine HW/config passend definiert 
sein.
#define FCY 16000000UL // 8 mhz * pll(4) => 32Mhz == 16Mhz FCY

mfG
Peter ;-)
OP
Hallo Peter,

vielen Dank für Deine überaus schnelle Antwort.

Dein Code funktioniert prima und ist zudem viel eleganter, als das was 
ich gepostet und sonst gefunden habe!
Und mit FCY = Fosc/2 kann man die Funktionen an jede Konfiguration 
bequem anpassen.

Also ich bin begeistert.

Viele Grüße, Holger
Gast
Peter C. schrieb:
> was du falsch machst hab ich nicht nachgesehen, nachstehend was ich
> meist benutze um delays zu machen wenn ich es ohne timer machen möchte.
> habe damit noch nie probleme gehabt auf diversen 16 bit PICs.
>
> #include<libpic30.h> // for __delay32
>
> #ifndef delay_msec
> #define delay_ns(d) { __delay32( (unsigned long)
> ((d)*(FCY)/1000000000UL)); }
> #define delay_us(d) { __delay32( (unsigned long) ((d)*(FCY)/1000000UL));
> }
> #define delay_msec(d) { __delay32( (unsigned long) ((d)*(FCY)/1000UL));
> }
> #define delay_s(d)  { __delay32( (unsigned long) ((d)*(FCY)/1UL)); }
> #endif

Könnte es sein, daß das fast genauso schon in libpic30.h drinsteht? Die 
fertig gelieferten Funktionen heißen

__delay_us()   und
__delay_ms()
1
#define __delay_ms(d) \
2
  { __delay32( (unsigned long) (((unsigned long long) d)*(FCY)/1000ULL)); }
3
#define __delay_us(d) \
4
  { __delay32( (unsigned long) (((unsigned long long) d)*(FCY)/1000000ULL)); }

MfG Klaus

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.