Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
...eben. Den Wert von 1000 habe ich einfach besispielhaft genommen. Du kannst auch die Bereichsgrenze eines Word, DWord oder sonstwas eintragen.
Nur ist es eben so, dass diese Prüfungen verhindern, dass Werte erreicht werden, welche außerhalb des Wertebereichs deiner Variable liegen.
ich habe Deinen schon früher gemachten Vorschlag mit dem Flag mal probiert, leider mit negativem Ergebnis.
Ich weiß nicht, wie ich es begründen, oder prüfen kann, ich habe den Eindruck, dass mir die pcint-isr das ganze zerschiesst.
Bei max. 6,25U/sec sind das also 3125Striche/s also 6250 pcint`s,
ich vermute, dass die die main so zerstückeln, dass der Flag ausgeschaltet wird.
Wie gesagt, ich kann das nicht beweisen/begründen, aber die Ergebnisse ohne Flag sind öfters plausibler, als ohne Flag.
Ich bin nur noch nicht dahntergekommen, an welcher Stelle der Mist passiert.
Defacto ist es für das Programm der Spulenwickelmaschine nicht relevant, mit dem Programm möchte ich ja nur die Beschleunigungsrampe (welche ich programmiert habe) überprüfen, und leider stimmen die Ergebnisse nicht unbedingt mit der Theorie überein, der Schrittmotor beschleunigt langsamer als er sollte, (rechnerisch sollte er nach 3 Umdrehungen auf Nenndrehzahl sein, in der Praxis sind es etwa 4 Umdrehungen)
Ist prinzipiell auch kein Problem, aber wie schon erwähnt, es interessiert mich halt, hinter solche Abweichungen zu kommen, erhöht auch im Laufe der Versuche das Verständnis.
(Mein Geld könnte ich damit wahrscheinlich nicht verdienen)
Als nächstes will ich mal probieren, die Betriebsspannung zu erhöhen, viellecht wird ja der Nennstrom /Phase nicht erreicht, also erstmal versuchen die Hardware zu optimieren.
Zeig doch mal deine Version mit dem flag.
Mit deinem Drehgeber könntest du ja auch den timer als counter verwenden. Die Drehrichtungserkennung ist ja nicht relevant, nur die Strichzahl. Wenn du die Strichzahldifferenz/Zeit berechnest, kannst du die U/s errechnen. Die Zeit kann ja dann auch 50ms oder 100ms sein, dann hast du weniger interrupts. Halt noch die interrupts, wenn der counter überläuft und die Anzahl der Überlaufe gezählt wird.
Wenn du den timer1 nimmst, als counter und nach 499 einen interrupt auslöst (compare1a, kombiniert mit clear timer=1), dann kannst du in der isr gleich die ganzen Umdrehungen mittzählen und brauchst die nicht aus den Schritten errechnen.
habe jetzt 2 Tage probiert und das Programm soweit abgespeckt wie möglich.
Ich konnte mal den Fehler auf Zeile 124 eingrenzen, ohne sicher zu sein, dass es wirklich daran liegt.
Aber wenn ich diese Zeile aktiviere, tritt irgendein Berechnungsfehler auf, welcher mir das Programm stoppt (springt aus der Do loop until Schleife, obwohl die Bedingung noch nicht erfüllt ist, deaktiviere ich diese Zeile, läuft es problemlos durch.
Ich bin etwas ratlos
Zeile 96-99
im Originalprogramm steht da natürlich mehr drin, aber ich habe Zeile für Zeile gelöscht und probiert, wo es hakt.
In der Form macht das Programm nichts anderes mehr, als Die Striche des Drehgebers zu zählen und durch 500 zu teilen (=Umdrehungen)
Die fragliche Zeile 124 soll die Drehzahl pro Zeit ermitteln, und an der hängt es offensichtlich, bzw. wenn ich deise Zeile deaktiviere, läuft das Programm ohne Fehler
Ohne es genau zu wissen: Wie lange läuft denn die Berechnung mit den Single Variablen? Wenn ich mich nicht verrechnet habe dann ist die Timer ISR alle 50ms fällig. Wenn Du innerhalb der Laufzeit zur Berechnung der Variablen ein Interrupt Auftritt, dann könnte das ein Thema sein - schließlich wetteifern der Timer und der Pin Change um die Ausführung.
Zudem könnte es knapp werden mit dem Stack, wenn 2 ISR die Register sichern (jeweils 32 Register, SREG und die Rücksprungadresse).
Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
Ohne es genau zu wissen: Wie lange läuft denn die Berechnung mit den Single Variablen? Wenn ich mich nicht verrechnet habe dann ist die Timer ISR alle 50ms fällig.
das ist richtig (50ms) wie lange die läuft? weiß ich nicht, sollte aber doch bei 50ms kein Problem sein, oder?
wie kann ich das denn messen?
Gibt es eine einfache Möglichkeit den Registerbedarf zu ermitteln?
Ja @Hans_L, die 50ms reichen bestimmt. Wenn Du den Knopf schnell drehst schaffst Du bestimmt 300-500 Pulse, das wären dann 2-3 ms pro Puls.
Aber bei der zeitlichen Überschneidung von Timer- und Pin Change Interrupt könnte es zeitlich knapp werden. Obwohl... Du gibst zwar den Timer frei, aber nicht die Interrupts - das ist dann doch seriell in der Abarbeitung.
Hast Du mal versucht die Stackwerte größer zu machen?
Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.