Moin Gemeinde,
Ich sehe wieder einmal den Wald vor lauter Bäume nicht. Vielleicht bekomme ich ja über diesen Weg ein Licht am Tunnel.
Ich Benutze den Tone Befehl als Rechteckgenerator um einen Schrittmotor anzusteuern. Klappt auch. Jetzt möchte ich aber wissen wieviele Schritte er gemacht hat während ich die Taste gedrückt hatte. Mein Idee war einfach den Ausgang des TonPins an den Interrupt Eingang zu legen. Klappt auch, aaaber der counter des interrupt zählt fleißig weiter obwohl der Tonausgang per notone abgeschalten wurde ?????
Ich benutze einen UNO
Ein Tip für die richtige Richtung zur Lösung wäre SUPI
Hallo,
das kann ja eigentlich nicht sein, mit notone() wird ja keine Frequenz mehr ausgegeben und der Motor bleibt ja auch stehen.
Zeig doch mal einen mini Sketch wie du das gemacht hast.
es funktioniert ja zu Programmstart. Soll heissen es wird nichts gezählt solange per Tone nichts generiert wird. Aktiviere ich den Tone, Zählt der Interrupt auch, allerding hört er nicht mehr auf wenn ich notone aufrufe. Das finde ich etwas verwirrend.
da hab ich Verständnis Probleme. Ich möchte die Anzahl der generierten Rechteecke am Tone Ausgang Zählen. Vielleicht kannst du das etwas ausführlicher erklären
Ja, das mit dem Pin umlegen hat funktioniert, aaaber es ändertt nichts am Problem. Der Interrupt Zähler zählt weiter unbeirrt weiter obwohl der Motor abschaltet, sprich es kein Rechtecksignal mehr an Pin 2 generiert wird.
Hallo
ich hab das mal auf das Wesentliche gekürzt , und hatte das Problem ebenfalls. Allerdings ist es so das die Frequenz nicht ausgeschaltet wird. Dein Motor stopt sicher weil die Richtung ebenfalls aus geschaltet wird.
allerdings solltest du den Atomic nutzten. zum auslesen der Variablen count werden mehrere ASM Befehle benötigt. Wenn während der Zeit ein Interrupt rein kommt dann kann die Variable falsch sein.
/*
zum Testen eine Brücke zwischen pin 2 und 6 einlegen
*/
#include<util/atomic.h>
const byte tasterPin = 8;
const byte freqPin = 6;
const byte IntrPin = 2;
bool tasterState;
volatile long i_count;
long count;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(tasterPin, INPUT_PULLUP);
pinMode(freqPin, OUTPUT);
pinMode(IntrPin, INPUT);
attachInterrupt(digitalPinToInterrupt(IntrPin), isrCount, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(tasterPin) == 0) {
tone(freqPin, 100);
if (tasterState == false) { // flanke bilden
Serial.println("start messen");
i_count = 0; // reset
tasterState = true;
}
}
else {
noTone(freqPin);
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
count = i_count; // umladen
}
Serial.println(count); // Ergebniss anzeigen
tasterState = false;
}
}
void isrCount()
{
i_count++;
}
erwarten.
Edit: Hatte Rentners Beitrag übersehen; vielleicht braucht es wirklich den Pin. Der Nicht-Funktionsaufruf aus #7 ist aber in jedem Fall falsch.
E:\Programme\arduino\portable\sketchbook\Combie\AssemblerTest002_schlank\AssemblerTest002_schlank.ino: In function 'void Motor_AUS_X()':
E:\Programme\arduino\portable\sketchbook\Combie\AssemblerTest002_schlank\AssemblerTest002_schlank.ino:7:3: warning: statement is a reference, not call, to function 'noTone' [-Waddress]
7 | noTone;
| ^~~~~~
E:\Programme\arduino\portable\sketchbook\Combie\AssemblerTest002_schlank\AssemblerTest002_schlank.ino:7:3: warning: statement has no effect [-Wunused-value]
So, neuer Tag , neues Glück. Den Tone(6) Fehler habe ich nicht gesehen und das der Motor stehen bleibt wenn ich ihn Disable habe ich auch nicht berücksichtigt. Nach mehreren Stunden am Stück eigene Fehler suchen sieht man halt bald nix mehr.