Hallo Community, ich würde gerne bei meinem Mikrocontroller alle 2 Sekunden eine Temperatur auslesen. Ich habe die Temperatur bereits über den Befehl Serial.print(temp) auslesen können. Das Problem ist nur, dass sich meine Loop alle 20ms wiederholt und ich folglich sehr viele Messwerte bekomme. Jetzt will ich den Wert nur alle 2 Sekunden anzeigen lassen, damit die Anzeige übersichtlicher bleibt. Kann mir jemand einen Tipp geben, wie ich das verwirklichen kann? Eine delay-Funktion fällt ja wohl raus, da ich ja sonst meine loop pausieren würde? Wäre cool, wenn mir jemand weiterhelfen könnte. Gruß Alex
Alexander R. schrieb: > Das Problem ist nur, dass sich meine > Loop alle 20ms wiederholt und ich folglich sehr viele Messwerte bekomme. > Jetzt will ich den Wert nur alle 2 Sekunden anzeigen lassen, damit die > Anzeige übersichtlicher bleibt. vielleicht die Loop langsamer laufen lassen. Oder in der Loop jeweils einen Zähler hochzählen und nur in jeder 100ten Loop den Messwert übermitteln. Oder 100 Loops lang den Messwert mitteln und dann einmal den gemittelten Wert senden.
1 | {
|
2 | if (print_counter == 100){ |
3 | print_counter = 0; |
4 | Serial.print(temp1); |
5 | |
6 | |
7 | }
|
8 | pwm_cnt++; |
9 | }
|
Was sagt ihr dazu? Das hab ich mir gerade ausgedacht. Also meine loop dauert 20ms Sekunden. Durch pwm_cnt++ zählt er pro Druchlauf +1 hoch also müsste er durch die if-Funktion alle 2 Sekunden (100 x 20ms) einen Messwert ausgeben. Die Funktion könnte ich normalerweise einfach in die loop mit einbauen. Was denkt ihr?
Alexander R. schrieb: > Was denkt ihr? Es ist noch nie jemand schlauer geworden indem er etwas ausprobiert hat. Das wäre eine wirtschaftliche Katastrophe, insbesondere bei kurzen Programmen. Also unbeding Finger davon lassen und lieber in allen möglichen Foren fragen. </Sarkassmus>
Alexander R. schrieb: > meine loop pausieren würde Wozu solltest du Temperaturen messen, wenn sie doch nicht ausgegeben werden sondern weggeschmissen im Nirvana verschwinden ? Es reicht also, nur vor dem println ein Mal zu messen. Bleibt noch den Zeitgeber auf 2s zu programmieren.
Ohne Sarkasmus: 1. Es spricht an sich nichts von dem, was Du geschrieben hast, dagegen, ein delay einzusetzen. 2. Dein Code wäre auch eine Lösung (mit kleinen Korrekturen): [c] { if (print_counter <= 100) { // mit == gibt es nur 180ms Zeitabstand, wg ... (siehe unten) print_counter = 0; // temp1 = readTemperature (); // temp dann lesen, wenn sie gebraucht wird Serial.print(temp1); } print_counter++; // korrekter Variablenname ... dieser Anweisung, die den Zähler auch inkrementiert, nachdem er auf 0 gesetzt wurde. } [\c] Allerdings setzt das voraus, dass die Durchlaufzeit der loop-Funktion tatsächlich exakt 20ms ist - was vermutlich nicht der Fall sein wird. Oder nicht mehr, sobald Du weiteren Code einfügst.
Theor schrieb: > 1. Es spricht an sich nichts von dem, was Du geschrieben hast, dagegen, > ein delay einzusetzen. Das soll man sich gar nicht erst angewöhnen. Sonst kommt als nächstes die Frage, warum das Programm sich 2s lang taub stellt und auf Tastendruck nicht reagiert.
Alexander R. schrieb: > Eine > delay-Funktion fällt ja wohl raus, da ich ja sonst meine loop pausieren > würde? Such mal nach "blink without delay" und dann anstatt blinken einfach auslesen ;-)
Wolfgang schrieb: > Sonst kommt als nächstes > die Frage, warum das Programm sich 2s lang taub stellt Da hat ein wahrhaft genialer Mensch die Timer erfunden und dazu noch den Interrupt (waren vielleicht auch 2?). @TO: nachlesen und weiterbilden. Georg
Du programmierst: Auslesen alle 20ms Jetzt stört Dich Deine Arbeit Kaum eine Anwendung erfordert derartiges Timing
Hi, Temperatur wird mit Analog Digital Converter oder Analog Digital Comparator ausgelesen? Also, wollte darauf hinaus: Die Zeit zum Erfassen des Temperaturwertes musst Du unter Umständen mit berücksichtigen. Der "einfache" Temperaturmesser mit ADC nimmt ebenfalls eine Timer-Funktion in Anspruch. Die Zeit bis zum Laden des C's wird ja "verglichen". Bringst Du die Timerfunktionen jetzt durcheinander, bekommst Du nur die Lottozahlen. Aber ich nehme an, Du hast die "richtige" Temperaturmessung drin und brauchst Dich nicht darum zu kümmern. Vielleicht ist es schlichtweg ein "statischer" Messwert, der irgendwo her kommt, vielleicht vom USART sogar. Es handelt sich also "nur" um ein Ausgabeproblem. Das hat man insbesondere im Zusammenhang mit LCDs ziemlich oft. Diese sind das langsamste Glied in der Kette, so dass man sich da Extra-Routinen ausdenken musste. Das einfachste Prinzip ist, in der Interruptserviceroutine alles Mögliche erfassen und berechnen zu lassen und erst nach der Rückkehr in die "Main" die Ausgaberoutinen auszuführen. Da baut man eben noch eine clock Funktion ein und/oder ein Flagregister, dessen einzelne Bits als Steuerbits für Programmabschnitte verwendet etc. p.p. ciao gustav
:
Bearbeitet durch User
Karl B. schrieb: > Das einfachste Prinzip ist, in der Interruptserviceroutine alles > Mögliche erfassen und berechnen zu lassen ... Das ist der größte Irrweg. Berechnungen haben in der Interruptserviceroutine gar nichts zu suchen, wenn man mal von Elementaroperationen ab sieht. Die ISR soll die zeitkritischen Sachen möglichst kurz und knapp erledigen und danach die Abarbeitung des eigentlichen Programms fortsetzen. Alle Berechnungen und sonstigen zeitlich unkritischen Verarbeitungen erfolgen innerhalb des Hauptprogrammes.
Wolfgang schrieb: > Alle Berechnungen und > sonstigen zeitlich unkritischen Verarbeitungen erfolgen innerhalb des > Hauptprogrammes. OK, genau andersherum als ichs schrieb. Es gibt aber auch Ausnahmen: Schau Dir mal ein beliebiges DCF77-Decoderprogramm an. Und die Timer-ISR ist größer als die Mainroutine. Das hat mich auch schon gewundert. Aber das ist eine Timer-ISR. Kommen jetzt andere Funktionen dazu für jeden verfügbaren Interrupt eine extra ISR, dann kann es durchaus sein, dass trotz Priorisierung sich die ISRs in die Quere kommen. Das meintest Du wohl. Die ISRs also der zur Verfügung stehenden Verarbeitungszeit entsprechend optimieren. geht aber prinzipiell, indem man die Aufgaben aufsplittet in ISR und Mainroutinen. Darauf wollte ich hinaus und die Einführung des Begriffs "Job" Jobregister. Wäre natürlich schön, wenn man wüsste, welcher MC da nun verwendet wird. Dann könnte man noch etwas konkreter werden Setze schon mal ATMEL AVR voraus. Kann aber ganz was anderes sein. Vielleicht macht man sich da auch zu viel Mühe, weil die Funktion von vorne herein da ist, nur noch enabled werden muss und alles Drumherum so wie so unnötig ist. ciao gustav
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.