michael_x:
Mit Mess-Spitzen sollte man eigentlich keinen Arduino kaputtkriegen, mit Kurzschlüssen, 5V oder mehr an den falschen Stellen evtl. schon. Aber ohne OUTPUT Pins und mit nur 5V auch eher seltsam ...
Ich hab mit den Messpitzen am Hallsensor gemessen und dabei werde ich 5V und Massemit der Messpitze gebrückt haben. Is ja recht fuddelig da für große Hände
Danke an alle. Ich werds morgen noch mal probieren, wenn die neuen Nanos da sind.
Auf den Breakout Boards von Funduino ist die Fummelei beim Ausprobieren doch einfacher. Wenns dann steht wirds ein Pro Mini, der dann in den Flieger kommt.
Ich konnte es nicht abwarten und hab nen Pro aus einer anderen Schaltung raus genommen.
Mit dem 4,7K Widerstand und dem Code von Michael funzt es.
Jetzt muss ich nur noch die Impulse in eine Drehzahl umrechnen.
Danke an alle.
Dann kann ich mich ja jetzt an den nächsten Hallsensor in einem Durchflussmengensensor geben.
Damit der Kollege auf seinem Sender endlich die Motordrehzahl des Verbrenners und den Spritverbrauch per Telemetrie angezeigt bekommt.
Mit dem 4,7K Widerstand und dem Code von Michael funzt es.
Schön. Mit meinem Code sollte es übrigens auch ohne Widerstand zwischen Vcc und Pin3 gehen.
Mit 4,7k ist es evtl. etwas unempfindlicher gegen Störungen.
[/
#define READPIN 2 // Pin für Reed-Kontakt, Digital-2 für Interrupt 0
#define REEDINTERRUPT 0 // Hardware-Interrupt für den Reed-Pin (Tacho)
volatile int reedCountSum;
volatile long reedMillisSum;
float impulse;
unsigned long letzteSekunde=0;
unsigned long lastReedMillis;
void setup()
{
Serial.begin(9600);
attachInterrupt(REEDINTERRUPT, reedISR, FALLING);// prüfen des Signals auf fallende Flanke
}
void loop()
{
// Anzeige wird einmal pro Sekunde aktualisiert
if (millis()-letzteSekunde>1000)
{
tacho();
Serial.print(impulse); //Impulse je Sekunde
impulse=0;
reedCountSum = 0;
reedMillisSum = 0;
letzteSekunde=millis();
}
}
void reedISR()
{
reedCountSum++; // Impulse addieren
reedMillisSum+=millis()-lastReedMillis; // Zeit addieren
lastReedMillis=millis(); // Zeit merken
}
void tacho()
{
if (reedMillisSum >0 && reedCountSum>2) // Division durch null abfangen
detachInterrupt(REEDINTERRUPT); // Interrupt deaktivieren um das Rechnen nicht zu unterbrechen.
impulse = reedCountSum*1000.0/reedMillisSum;
attachInterrupt(REEDINTERRUPT, reedISR, FALLING);
if (millis()-lastReedMillis>150) impulse=0; // wenn 150 ms kein Signal kommt Impulszähler auf null setzen
}
code]
Danke für die Info. Ich möchte aber gerne solange es geht die Benutzung von Interrupts vermeiden, da der Mini nur 2 hat. In der derzeitigen Planung sind schon 2 Hallsensoren geplant ( Drehzahl, Durchflussmenge ). Damit hätte ich schon alle verfügbarer Interrupts belegt.
Da ich / wir noch nicht wissen, wo denn das ganze hinführt, möchte ich mir alle Möglichkeiten soweit möglich offen halten.
Was wäre denn der Nachteil, wenn das ganze ohne Interrupts gemacht wird? Doch höchstens, das mal ein Impuls verloren geht. Bei >1000 pro Minute sollte das nicht so ins Gewicht fallen. Da alle 20 ms die Telemtrie auf dem Rückkanal neu bedient wird.würde die Abarbeitung durch den Interrupt ja auch beeinflust.
Da alle 20 ms die Telemtrie auf dem Rückkanal neu bedient wird.würde die Abarbeitung durch den Interrupt ja auch beeinflust.
Ja.
Alles was auf dem atmega in software abläuft, beeinflusst einander. So gesehen ist es ohne ISR einfacher: Sicherstellen, dass loop() immer schnell genug fertig ist und alle Teile oft genug drankommen, fertig.