Forum: Mikrocontroller und Digitale Elektronik delay beim PIC16F887


von Jonas G. (fallobst)


Lesenswert?

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

von Holger W. (holgerw)


Lesenswert?

schau mal unter Delay1KTCYx() , Delay10TCYx() und weitere...

: Bearbeitet durch User
von Jonas G. (fallobst)


Lesenswert?

Das geht leider auch nicht.

von Holger W. (holgerw)


Lesenswert?

was geht nicht ?

von Jonas G. (fallobst)


Lesenswert?

Ich habs in meinen C-Code eingefügt, dann hab ich's mit nem int als 
Argument versucht und es wurde noch immer ein Fehler angezeigt.

von Wilhelm F. (Gast)


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.

von Holger W. (holgerw)


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

: Bearbeitet durch User
von Jonas G. (fallobst)


Lesenswert?

Microchip xc8

von Holger W. (holgerw)


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

von Klaus (Gast)


Lesenswert?

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

von Wilhelm F. (Gast)


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.

von Jonas G. (fallobst)


Lesenswert?

Klar, ich wollte aber jetzt diese Funktion nutzen und nicht erst den 
"Otto-Katalog" lesen. Daher habe ich kurz gefragt, ob jemand diese 
Funktion kennt.

von Wilhelm F. (Gast)


Lesenswert?

Jonas G. schrieb:

> Klar, ich wollte aber jetzt diese Funktion nutzen und nicht erst den
> "Otto-Katalog" lesen. Daher habe ich kurz gefragt, ob jemand diese
> Funktion kennt.

Warum schreibst du sie nicht selbst in PIC-Assembler?

von Jonas G. (fallobst)


Lesenswert?

Weil ich in der Mikrochipprogrammierung(ausgenommen Arduino) blutiger 
Anfänger bin.

von Holger W. (holgerw)


Lesenswert?

es gibt im Adobe Reader, zumindest unter Win, auch eine Suchfunktion.
da findet man sofort den delay

von Dominic A. (neo123)


Lesenswert?

Es gibt auch __delay_ms(x).
Nicht wundern wenn diese Funktion im Editor rot Unterstrichen wird. Das 
ist normal.

von deKatz (Gast)


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

von Chris B. (dekatz)


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

von Chris B. (dekatz)


Lesenswert?

uuups sorry Doppelpost, bin mit ein/ausloggen etwas durcheinander 
gekommen ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.