Hallo zusammen, der angehängte code soll die Drehzahl eines Motors ausgeben. Dazu wird das Signal eines Encoders eingelesen und mittels input capture erfasst. Es soll im Sekundentakt die Drehzahl ausgegeben werden. Wenn diese 0 ist, sollen auch die 0 rpm ausgegeben werden. Wenn sich der Motor dreht, sieht es auch so aus, als würde es funktionieren. Bei Stillstand allerdings wird nicht die 0 ausgegeben, sondern der Text "Bereit", der eigentlich nur einmal ganz am Anfang ausgeben werden sollte... Sieht hier jemand meinen Fehler? Grüße Maiggl
Bei stehendem Motor wird "Flag" nie inkrementiert und erreicht die 29 auch nie. Flag ist außerdem ein beschissener Name für eine zählende Variable.
Michael H. schrieb: > Bei Stillstand allerdings wird nicht die 0 ausgegeben, > sondern der Text "Bereit", der eigentlich nur einmal ganz am Anfang > ausgeben werden sollte... Es sieht ganz stark danach aus, dass der uC einen Reset macht, also neu startet, und somit das "Bereit" zu sehen ist. Grund dürfte sein, dass du einen unbehandelten Interrupt hast, ich tippe auf den OVERFLOW Interrupt. Da fehlt die ISR dazu, daher der Reset > TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //ENABLING INPUT CAPTURE AND OVERFLOW INTERRUPTS
Hi turboj, vielen Dank für die schnelle Antwort. Das stimmt natürlich, dass der Name nicht besonders glücklich gewählt war, habs geändert. Ich verstehe auch, dass die Zählvariable bei Stillstand nicht hochgezählt wird und somit nie die Berechnung ausgeführt und auch nie die Drehzahl 0 ausgegeben werden kann. Was ich aber nicht versttehe, ist, dass bei Stillstand ein "Bereit" im Sekundentakt ausgegeben wird. Das bedeutet ja dann, dass die Init() ständig aufgerufen wird und er sich nicht mehr in der while-Schleife befindet, oder?
... so Variablennamen wie "Flag" benutzt man nicht! Gruß Bernd
Michael H. schrieb: > Was ich aber nicht versttehe, ist, dass bei Stillstand ein "Bereit" im > Sekundentakt ausgegeben wird. Das hat "fast" doch oben erklärt: Liegt an nicht behandeltem Interrupt. Dein µC macht dauernd einen Reset, startet also komplett neu. P.S. Hänge bitte zukünfig Deinen Code nicht als Textdatei an, sondern verwende den Original-Dateinamen, insb. behalte das Suffix bei, wie z.B. ".ino". Dann ist der Source weitaus besser lesbar als jetzt.
:
Bearbeitet durch Moderator
Ist ja gut jetzt, ich habe es ja schon geändert... Die Variablennamen werden wahrscheinlich nicht der Grund sein, dass es nicht geht... Danke für den Tipp mit der fehlenden ISR, das war es!
Hallo ukw, werde ich in Zukunft so machen, danke
Was passiert mit Deinen Interrupts während der delay-Zeit? Kann pulse nicht auch >29 werden?
Hallo pete77, das ist eine gute Frage. Sollte ich in dieser Zeit die Interrupts ausschalten? Die Funktion wird dadurch aber nicht gestört. Pulse kann ruhig > 29 werden. nach dem delay wird pulse = 0 gesetzt und es wird wieder bis 28, bzw. bis 29 gezählt. Die 29 oder vielmehr die 28 kommen daher, dass das Zahnrad an der Motorwelle 28 Zähne hat und somit 28 Pulse eine Umdrehung ergeben.
Ich nehme mal an, dass du nicht der Autor des Quelltextes bist, denn dieser sieht deinem ziehmlich ähnlich: https://www.avrfreaks.net/forum/isr-atmega328p Man kann auch über Umwege (Fremdcode) an sein Ziel kommen, aber - er könnte fehlerhaft sein - ungünstige Variablennamen enthalten, die dem Nutzer nichts sagen - unnötig kompliziert sein - oder man versteht den Code einfach nicht und kann so dann das Problem nicht lösen. Nun gut, du hast es letztendlich doch noch geschafft und wieder etwas dazugelernt. Das ist doch die Hauptsache.
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.