Forum: Mikrocontroller und Digitale Elektronik Arduino Uno Interrupt verlässt while Schleife und kehrt nicht wieder zurück


von M. H. (maiggl)


Angehängte Dateien:

Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

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.

von fast (Gast)


Lesenswert?

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

von M. H. (maiggl)


Angehängte Dateien:

Lesenswert?

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?

von Bernd B. (microwave-designer)


Lesenswert?

... so Variablennamen wie "Flag" benutzt man nicht!

Gruß

Bernd

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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
von M. H. (maiggl)


Lesenswert?

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!

von M. H. (maiggl)


Lesenswert?

Hallo ukw,

werde ich in Zukunft so machen, danke

von Pete K. (pete77)


Lesenswert?

Was passiert mit Deinen Interrupts während der delay-Zeit?
Kann pulse nicht auch >29 werden?

von M. H. (maiggl)


Lesenswert?

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.

von Maik M. (sonnenjunge)


Lesenswert?

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