Forum: Mikrocontroller und Digitale Elektronik ccs delay_us() problem


von Ivan (Gast)


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

von Michael W. (miwitt001)


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

von Rolf Magnus (Gast)


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?

von Ivan (Gast)


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

von Ivan (Gast)


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.

von Michael W. (miwitt001)


Lesenswert?

Wie merkst du dass das Delay die falsche Dauer hat? Mit dem Oszi 
nachgemessen oder dreht sich der Motor nicht? Die 20 MHz, die du oben im 
Code stehn hast ist korrekt?

mfg

von Rolf Magnus (Gast)


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?

von Ivan (Gast)


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

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.