ccs delay_us() problem

Gast #1617526
Lesenswert?

hier ist mein programm geschrieben mit ccs compiler bzw. editor:

    float32 p1=223606.0;
    float32 p;
    float32 r=1E-11;
    int32 k;
    int32 i;
   set_tris_b(0b11110000);
   while(true)
   {
   p=p1*(1-r*p1*p1);
   p1=p;
   k=(int32)p1;
   output_b(0b0101);
   for(i=1;i<k;i++){
   delay_us(1);
   }

der erste wert von k soll 111803 sein, entsprechend muss die verzögerung
in etwa 111803µs sein ist aber nicht, woran kann das liegen, was ist 
daran falsch???
danke
#1617554
Lesenswert?

Wie misst du die Verzögerung und wie groß ist sie?
Außerdem gibst du in einer Endlosschleife immer 0b0101 aus, eigentlich 
dürfte sich also überhaupt nichts ändern.
Eventuell dauern auch einfach die float Berechnungen so lange, dass die 
Verzögerung nicht mehr stimmt. Gib mal etwas mehr Infos:
- Was genau willst du machen
- Welcher Prozessor


mfg
Gast #1617576
Lesenswert?

Naja, ein Delay von 1 µs ist nicht sehr lang. Je nach Takt kann der 
Prozessor dieses mehr oder weniger gut einhalten. Die Schleife wird auch 
eine signifikante Zeit pro Durchlauf verbrauchen, so daß insgesamt dann 
deutlich mehr als 111803 µs rauskommen können. Mit welchem Takt läuft 
dein Prozessor denn überhaupt?
Gast #1617583
Lesenswert?

der µc ist pic18f1320
das programm soll einen bipolaren schrittmotor beschleunigen, hier ist 
das ganze programm:


#include "C:\Dokumente und 
Einstellungen\praktikant\Desktop\array\main.h"
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)

void main()
{
    float32 p1=223606.0;
    float32 p;
    float32 r=1E-11;
    int32 l;
    int32 i;
   set_tris_b(0b11110000);
   while(true)
   {
   p=p1*(1-r*p1*p1);
   p1=p;
   l=(int32)p1;
   output_b(0b0101);
   for(i=1;i<l;i++){
   delay_us(1);
   }
   p=p1*(1-r*p1*p1);
   p1=p;
   l=(int32)p1;
   output_b(0b0110);
   for(i=1;i<l;i++){
   delay_us(1);
   }
   p=p1*(1-r*p1*p1);
   p1=p;
   l=(int32)p1;
   output_b(0b1010);
   for(i=1;i<l;i++){
   delay_us(1);
   }
   p=p1*(1-r*p1*p1);
   p1=p;
   l=(int32)p1;
   output_b(0b1001);
   for(i=1;i<l;i++){
   delay_us(1);
   }
   }
}

ich weiss, dass dort noch eine abbruchbedinung in die while() schleife 
muss, aber mich interessiert zuerst, warum das mit der zeitfunktion 
(delay_us()) nicht funktioniert. ich habe mit einem pic simulator das 
programm ohne for schleife und ohne delay_us() laufen lassen und 
festgestellt, dass für die berechnung für p braucht der µc ca. 200µs. 
Also damit wäre mein frequenz zwischen jedem schritt 5khz. aber das mit 
der delay funktion verstehe ich nicht. danke für schnelle antwort
Gast #1617595
Lesenswert?

die zeit muss doch etwa 111803µs + 200µs + (zeit für for schleife) lang 
sein, ist aber nicht, ich habe schon probiert an die delay funktion den 
parameter L direkt übergeben, war auch falsch, ich habe keine 
beschreibung für die delay funktion, weiss nicht wie groß der parameter 
sein darf.
Gast #1617614
Lesenswert?

Ivan schrieb:

> die zeit muss doch etwa 111803µs + 200µs + (zeit für for schleife) lang
> sein,

+ Granularität der delay-Funktion. Kann ja sein, daß die exakt eine 
Mikrosekunde nicht hinbekommt.

> ist aber nicht,

Sondern?
Gast #1617632
Lesenswert?

die 20mhz sind korrekt, ich messe die zeit über "pic18 simulator ide". 
motor ist noch nicht angeschlossen, mein programm laut des simulators 
braucht zwischen den ersten und dem zweiten schritt 1,017s und das bei 
20mhz extern oder 5mhz intern, das scheint mir etwas zu viel sein 
oder???
danke noch mal für die antworten

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