Forum: Mikrocontroller und Digitale Elektronik Messwert auslesen


von Alexander R. (alex12)


Lesenswert?

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

von Achim S. (Gast)


Lesenswert?

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.

von Alexander R. (alex12)


Lesenswert?

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?

von Nick M. (Gast)


Lesenswert?

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>

von MaWin (Gast)


Lesenswert?

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.

von Theor (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Kolja L. (kolja82)


Lesenswert?

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 ;-)

von georg (Gast)


Lesenswert?

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

von Keller (Gast)


Lesenswert?

Du programmierst: Auslesen alle 20ms
Jetzt stört Dich Deine Arbeit
Kaum eine Anwendung erfordert derartiges Timing

von Markus F. (mfro)


Lesenswert?

was ist eine if-Funktion?

von Karl B. (gustav)


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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.

von Karl B. (gustav)


Lesenswert?

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
Noch kein Account? Hier anmelden.