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 ;-)
Holger W. schrieb: > Leider meldet der Compiler für die Zeile > > asm volatile("do #3200, inner"); > > das der Befehl für den PIC24FJ1128GA010 nicht unterstützt wird Da hat der Compiler recht, den ASM "do" Befehl kennen nur die PIC24H und dsPIC Controller.
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
#4689526
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 | |
2 | |
3 | |
4 | |
MfG Klaus
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.