delay beim PIC16F887

Gast #3331526
Lesenswert?

Jonas G. schrieb:

> Moin,
> ich benutze unter Debian die MPLAB X IDE und suche eine delay Funktion.
> Am liebsten in Mikrosekunden. Sowas wie beim Arduino
> delayMicroseconds(int).
>
> Danke,
> fallobst

Unter MPLAB habe ich z.B. für den von mir verwendeten PIC12F675 eine 
Funktion delay_ms(), ich schaue aber noch mal. Sonst muß man sich diese 
Funktion selbst schreiben. Am besten verwendet man da auch einen 
Timer-Interrupt.
#3331529
Lesenswert?

Welchen Compiler verwendest du denn ?

Am einfachsten eigene Funktion schreiben, 1 Nop() braucht einen 
Prozessortakt. In einer Schleife aufrufen bis die Anzahl die gewünschte 
Dauer hat, abhängig von deinem Prozessortakt.
Das wird zwar nicht genau, auber für einfache Verzögerung reicht es.
Muss es genauer sein dann Timer verwenden.

Holger
#3331647
Lesenswert?

mit dem arbeite ich nicht.
Suche in den Sourcen im Ordner ergab u.a dieses

Datei: d1ktcyx.c

evtl. muss die noch eingebunden werden
1
#include <htc.h>
2

3
/*
4
 * Delay multiples of 1000 Tcy
5
 * Passing 0 (zero) results in a delay of 256,000 cycles.
6
 */
7
void 
8
Delay1KTCYx(unsigned char unit)
9
{
10
  do {
11
    _delay(1000);
12
  } while(--unit != 0);
13
}

PS: nach "xc8 delay" googeln bringt auch was
Gast #3331673
Lesenswert?

Klaus schrieb:

> Jonas G. schrieb:
>> Microchip xc8
>
> Da gibt es natürlich eine solche Funktion. Scheinbar gehört das Manual
> nicht zu den meistgelesenen Werken (warum schreiben die eigentlich
> sowas, liest ja doch keiner)
>
> MfG Klaus

Manuals sind natürlich oft dick wie ein Otto-Katalog. Da vorbei gibt es 
aber nichts, man muß einfach durch.

Man darf das auch nie als Drangsalierung sehen. Je mehr Info ich habe, 
desto besser.
Gast #3331944
Lesenswert?

MPLAB X 1.90 mit XC8 1.20 zickt genau noch so rum wie die 
Vorgängerversionen, auch wenn im manual steht das der XC8 _delay(), 
__delay_us() und __delay_ms() definiert hatc (da hilft auch <htc.h> 
nichts).

(Beispiel aus dem Manual):
#include <xc.h>

void main(void){
   while(1){
  NOP();
  _delay(1000);
  CLRWDT();
  __delay_us(400);
  CLRWDT();
  __delay_ms(100);
   CLRWDT();
   }
}

ist __delay_us(400) und __delay_ms(100) rot markiert. Compiliert wird 
allerdings trotzdem ohne Fehlermeldung.
Wem die "Fehlermeldungen" auf den Keks gehen, der fügt nach #include 
<xc.h> eine eigen Definition der beiden Macros ein:

(Quelle: MICROCHIP Forum)
#ifndef _XTAL_FREQ
#define _XTAL_FREQ  4000000 //hier eigene Wert einsetzen
#define __delay_us(x) _delay((unsigned 
long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

...und schon sind die Fehlermeldungen weg. Habe es überprüft, der 
erzeugte Code ist identisch mit der "Fehlermeldungs" - Variante.

Der Simulator liefert folgende Zeiten:

Target halted. Stopwatch cycle count = 9 (9 µs)
Target halted. Stopwatch cycle count = 10 (10 µs)
Target halted. Stopwatch cycle count = 1010 (1,01 ms)  (1)
Target halted. Stopwatch cycle count = 1011 (1,011 ms)
Target halted. Stopwatch cycle count = 1411 (1,411 ms) (2)
Target halted. Stopwatch cycle count = 1412 (1,412 ms)
Target halted. Stopwatch cycle count = 101412 (101,412 ms)  (3)
Target halted. Stopwatch cycle count = 101413 (101,413 ms)

(1) das sind die _delay(1000) ....Schleife mit NOP 1,01 - 0,01 = 1,00
(2) der Wert nach __delay_us(400) 1,411 - 1,011 = 0,400
(3) der Wert nach __delay_ms(100) 101,412 - 101,412 = 100,0
#3331946
Lesenswert?

MPLAB X 1.90 mit XC8 1.20 zickt genau noch so rum wie die
Vorgängerversionen, auch wenn im manual steht das der XC8 _delay(),
__delay_us() und __delay_ms() definiert hatc (da hilft auch <htc.h>
nichts).

(Beispiel aus dem Manual):
#include <xc.h>

void main(void){
   while(1){
  NOP();
  _delay(1000);
  CLRWDT();
  __delay_us(400);
  CLRWDT();
  __delay_ms(100);
   CLRWDT();
   }
}

ist __delay_us(400) und __delay_ms(100) rot markiert. Compiliert wird
allerdings trotzdem ohne Fehlermeldung.
Wem die "Fehlermeldungen" auf den Keks gehen, der fügt nach #include
<xc.h> eine eigen Definition der beiden Macros ein:

(Quelle: MICROCHIP Forum)
#ifndef _XTAL_FREQ
#define _XTAL_FREQ  4000000 //hier eigene Wert einsetzen
#define __delay_us(x) _delay((unsigned
long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
#endif

...und schon sind die Fehlermeldungen weg. Habe es überprüft, der
erzeugte Code ist identisch mit der "Fehlermeldungs" - Variante.

Der Simulator liefert folgende Zeiten:

Target halted. Stopwatch cycle count = 9 (9 µs)
Target halted. Stopwatch cycle count = 10 (10 µs)
Target halted. Stopwatch cycle count = 1010 (1,01 ms)  (1)
Target halted. Stopwatch cycle count = 1011 (1,011 ms)
Target halted. Stopwatch cycle count = 1411 (1,411 ms) (2)
Target halted. Stopwatch cycle count = 1412 (1,412 ms)
Target halted. Stopwatch cycle count = 101412 (101,412 ms)  (3)
Target halted. Stopwatch cycle count = 101413 (101,413 ms)

(1) das sind die _delay(1000) ....Schleife mit NOP 1,01 - 0,01 = 1,00
(2) der Wert nach __delay_us(400) 1,411 - 1,011 = 0,400
(3) der Wert nach __delay_ms(100) 101,412 - 101,412 = 100,0

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