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
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
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?
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
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.