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
schau mal unter Delay1KTCYx() , Delay10TCYx() und weitere...
:
Bearbeitet durch User
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.
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.
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
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
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
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.
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.
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?
Weil ich in der Mikrochipprogrammierung(ausgenommen Arduino) blutiger Anfänger bin.
es gibt im Adobe Reader, zumindest unter Win, auch eine Suchfunktion. da findet man sofort den delay
Es gibt auch __delay_ms(x). Nicht wundern wenn diese Funktion im Editor rot Unterstrichen wird. Das ist normal.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.