Arduino Uno Interrupt verlässt while Schleife und kehrt nicht wieder zurück

OP #5455901
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
Angehängte Dateien:
Gast #5455915
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
OP #5455923
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?
Angehängte Dateien:
Moderator Persönliche Seite #5455933
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.
OP #5456083
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.
#5466421
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren