ich experimentiere gerade mit Arduino und dem ATTiny84A rum. Bin da neu auf dem Gebiet. Als Programmer nutze ich einen Arduino Mega, das funktioniert auch soweit alles gut. Nun möchte ich eine Drehlzahl mit dem ATTiny84 erfassen. Das wird mittels Interrupt bewerkstelligt, damit auch jede Umdrehung gezählt wird. Nun möchte ich die Daten zusätzlich per SoftwareSerial an den PC übergeben. Hier scheint aber irgendwas nicht sauber zu klappen. Es kommt nicht immer alles sauber über. Mal Fehlen Daten, mal sind sie unvollständig.
Kann es sein, dass der Interrupt zur Drehzahlerkennung die SoftwareSerial Übertragung unterbricht? Oder woran kann es sonst liegen? Es soll jede Umdrehung bzw. die Zeit millis() bei jeder erkannten Umdrehung übertragen werden.
Oder gibt es eine bessere Lösung die Daten an den PC zu übermitteln als mit SoftwareSerial?
FaVo:
Oder gibt es eine bessere Lösung die Daten an den PC zu übermitteln als mit SoftwareSerial?
Ich sage mal so: Eine schlechtere Methode als SoftwareSerial, um Daten von A nach B zu senden, wirst Du wohl kaum irgendwo finden. SoftwareSerial ist schon das Schlechteste, was es gibt. Funktioniert je nach Umständen aber trotzdem.
Wenn Du keine HardwareSerial hast, mit der Du es machen kannst, wäre AltSoftSerial eine brauchbare Alternative. Aber die AltsoftSerial-Library läuft wohl nicht auf Deiner Controller-Sparversion.
Hast Du denn mal getestet, ob es an den Interrupts Deines Zählers liegt, dass die Übertragung so holperig läuft? Z.B. so: Du legst Deine Timer-Interrupts mal testweise still (attachInterrupt auskommentieren) und überträgst stattdessen nur fortlaufend um 1 hochgezählte Werte in einer Schleife. Funktioniert das dann fehlerfrei?
Hast Du auch mal eine geringere Baudrate für SoftwareSerial getestet, 4800 Baud oder noch weniger?
Sendest Du vielleicht zu viele Daten, so dass der serielle Sendepuffer überläuft?
Oder mal gesucht, ob es für Deinen Spar-Controller auch noch eine andere alternative Serial-Library gibt, so wie es AltSoftSerial für Arduino-kompatible Controller gibt?
FaVo:
Oder woran kann es sonst liegen?
Am Quellcode, den Du verfaßt hast. Poste den doch mal! Wenn da gröbere Kinken bei der Interruptverarbeitung bei sind, dann könnte man ja etwas dazu sagen.
Danke für die Hinweise.
Ich habe damit nun noch mal rumprobiert. Eine einfache fortlaufende Variable überträgt er fehlerfrei bei 4800 Baud.
Wenn ich nun den Interrupt nutze und direkt innerhalb der Interrupt Routine z.B. micros() über serial sende, dann kommen diese auch korrekt an. Jedoch scheint das auch der limitierende Faktor zu sein. Ich möchte die Zeit jeder Umdrehung übertragen, um dann am PC entsprechend in einer Software eine Drehzahl etc. daraus rechnen kann. Wenn ich nun aber ein Delta mit micros() von einer zur nächsten Drehung bilde, dann ist das kleinste was er anzeigen kann 24. Ich habe zum testen einfach einen PC Lüfter, dessen Drehzahl ich erfasse. Da dieser 7 Blätter hat, ist es eben die 7-Fache Drehzahl. Jedoch werden hier die Impulse nicht mehr alle erfasst... es bleibt eben dieses Delta 24 übrig. Der Lüfter sollte mit ca. 3000upm drehen. Hier scheint dann wohl die Übertragung die Schwachstelle zu sein, dass diese zu lange dauert und entsprechend nicht alle Umdrehungen gezählt werden.
Da das Ganze später zur Leistungsmessung für einen Prüfstand gebraucht wird, ist es zwingend erforderlich jede einzelne Umdrehung zu erfassen.
Die Idee einen ATTiny84 zu nehmen kam eben auf, weil die Erkennung einer Drehzahl an sich ja eine simple Sache ist und man dafür eigentlich keinen "ganzen" Arduino verschwenden muss. Aber wenn es nun an der Übertragung scheitert bringt das ja nix
Ist da nicht generell ein Konzept-Fehler da wenn du alle paar Mikrosekunden Zustände senden willst mit einer Schnittstelle die 1-2ms pro Zeichen braucht?
Ich benutze derzeit einen ATTiny85 mit meiner eigenen SoftwareSerialTX (http://forum.arduino.cc/index.php/topic,188578.0.html) mit 9600 baud nur mit dem internen oscillator. Zum Senden von Daten wird kein Interrupt verwended.
Ich sehe keine Probleme den ATTiny84A fuer Deine Anwendung zu verwenden...
Mit externen Kristall gehts bestimmt auch mit 57600 baud oder mehr.
Ansonsten liegt das problem bestimmt irgendwo im Programm.
Im Interrupt JEDE Umdrehung zum PC zu schicken ist Unsinn!
Der ATTiny84 kann die Drehzahl selbst berechnen und einmal pro Sekunde (oder so) an den PC schicken.
Ich benötige eine recht hohe Auflösung und die Drehzahl in Abhängigkeit der Zeit.
Ich könnte natürlich die Drehzahl schon im Controller berechnen und entsprechend mit der Zeit oder alle 100ms senden. Allerdings ist hier dann das Ergebnis nicht mehr so genau.
FaVo:
Ich benötige eine recht hohe Auflösung und die Drehzahl in Abhängigkeit der Zeit.
Ich könnte natürlich die Drehzahl schon im Controller berechnen und entsprechend mit der Zeit oder alle 100ms senden. Allerdings ist hier dann das Ergebnis nicht mehr so genau.
Warum nicht?? Es waere bestimmt genauer als jeden Puls zum PC zu uebertragen.
Fuer die end-anwendung, wie viele Umdrehungen pro Minute/Sekunde und wie viele Interrupts werden den erwartet?
Naja, genauer als jede Umdrehung aufzuzeichnen geht ja wohl nicht.
Daraus werden dann Leistung und Drehmoment errechnet. Das muss schon genau sein.
Die Endanwendung wird vermutlich nicht so hoch drehen. 3000upm würde ich mal sagen.
Derzeit läuft es mit einem Arduino Pro Mini. Dieser erfasst ebenfalls jede Umdrehung und sendet diese. Das klappt ziemlich stabil. Aber wie gesagt, eigentlich ist das ja mit Kanonen auf Spatzen und so
Die upm im controller zu berechnen und einmal pro Sekunde (od. öfter) an den PC zu schicken wird bestimmt genauer sein als sich auf die Übertragung eines einzigen Pulses über die Serielle Schnittstelle zu verlassen.
Es geht aber um die Auflösung... für nen Prüfstand ist alle 100ms noch zu langsam... Die berechnete Leistungskurve die am Ende raus kommt soll schon genau sein und nicht in groben Schritten wie z.B. bei 100ms.
Eine andere Alternative wäre vielleicht erst die komplette Messung durchzuführen und alle Messpunkte aufzuzeichnen und anschließend zur Weiterverarbeitung in Ruhe zu übertragen mit nem Handshake oder ner Prüfsumme um sicher zu gehen, dass alles heil ankommt.
Allerdings wäre eine Echtzeit Übertragung schon schöner, dass man während der Messung bereits die Daten verarbeiten und den Graphen zeichnen kann.
Also muss ich wohl doch erstmal beim Pro Mini oder Mega bleiben.