mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ccs delay_us() problem


Autor: Ivan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Wittmann (miwitt001)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ivan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ivan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Wittmann (miwitt001)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ivan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.