Hallo, kannst du bitte in meinem untenstehenden schauen , ob es so gut laufen wird ? Für Gegenvorschlag , oder korrektur werde ich mich freuen eine ungefilterte temperatur bekomme ich von einem sensor ständig, und möchte es filtern -->Eingangswert begrenzen -->Temperatur mittelwert der erste sekunke möchte ich frieren --> und dann alle 5 sekunden temperaturmittelwert berechnen und vergleichen mit anfangstemp(der ersten sekunde) wenn 1 ° höher und fzg geschw über 20 kmh will ich anfangstemp um 1 grad erhöhen wenn um mindestens 1° kleiner reduziere ich es um 1° sonst behalte ich die alte anfangstemp. freue mich auf schnelle antwort. Grüß //sampling time 100 msec // aussen_temp eingangssignal temperatur u8 k = 0; u8 l = 0; si16 temp_start = 0; si8 temp_old = 0; si16 temp_middle = 0; si16 temp_middle_5s = 0; si8 temp_array1[10]; // werte für das erste sekunde si8 temp_array2[50]; // werte für 5 sekunden (50 * 100 msec loop) u8 temp_cnt1 = 0; u8 temp_cnt2 = 0; bool_T counter_valid = TRUE; si8 aussen_temp_filt = 0; //sampling time 100 msec { // eingangsdaten begrenzen if(aussen_temp < -10) { aussen_temp = -10; } if(aussen_temp > 40) { aussen_temp = 40; } // Calculation of temperature middle value at start , just for the first second. if((temp_cnt1 < 11)&&(counter_valid)) { for(k=1; k<11; k++) { temp_array1[k] = aussen_temp; temp_start = (temp_start + temp_array1[k])/k; } temp_cnt1++; } else { counter_valid = FALSE; } // Calculation of temperature middle value for every five second (continuously) if( temp_cnt2 < 50) { for( l=0; l<50; l++) { temp_array2[l] = aussen_temp; temp_array2[l + 1] = temp_array2[l]; temp_middle = temp_middle + temp_array2[l]; } temp_cnt2++; } else { temp_middle_5s = temp_middle/50; temp_cnt2 = 0; } //increasing - decreasing of the temperature ( filtered) if(temp_middle_5s >(temp_start + 1)) { if(geschw_kmh > 20) { temp_start = temp_start + 1; } } else if (temp_middle_5s <(temp_start - 1)) { temp_start = temp_start + 1; } else { temp_start = temp_start; } aussen_temp_filt = temp_start; }
Ralph Ralph wrote: > Hallo, > kannst du bitte in meinem untenstehenden schauen , ob es so gut laufen > wird ? Es wird nicht gut laufen. Es wird überhaupt nicht laufen. > Für Gegenvorschlag , oder korrektur werde ich mich freuen Die fehlenden Teile einfügen insbesondere den Funktionsnamen und die benutzten Variablen ohne Definition.
> freue mich auf schnelle antwort.
Morgen Abgabetermin an der Uni?
Das Ding würde bei mir schon wegen Formalien durchfallen. Zu viele
Magic-Numbers im eigentlichen Quelltext:
1 | temp_cnt1 < 11)&&(counter_valid)) |
2 | {
|
3 | for(k=1; k<11; |
etc. Gemisch aus deutsch-englischen Variablennamen (Bsp.: temp_middle, aber aussen_temp oder geschw_kmh) und Kommentaren
1 | // werte für 5 sekunden
|
2 | /*** Calculation of temperature middle value |
Wenn schon Kommentare in Deutsch, dann wenigstens in anständiger Groß- und Kleinschreibung ("Werte" und "Sekunden", nicht "werte" und "sekunden"). Insgesamt sieht der Quelltext so aus, als ob von irgendwo kopiert und dann "verbessert" wurde. Wie gesagt, schon deshalb könntest du bei mir damit wieder gehen. Dann kämen in der nächsten Runde die Programmierfehler. temp_array1 und temp_array2 laufen über. Damit Note 5.0, tschüss.
Danke für dein antwort Stefan es geht eigentlich um die tatsächlichen kodierung Funktionsname ist im moment nicht sehr wichtig Kannst du bitte drin schauen mir bescheid sagen ?
Ralph Ralph wrote: > Danke für dein antwort Stefan > > es geht eigentlich um die tatsächlichen kodierung > Funktionsname ist im moment nicht sehr wichtig > > Kannst du bitte drin schauen mir bescheid sagen ? Worin? Ich sehe keine verbesserte Version von dir. Wichtig: Auch die Fehler und Unschönheiten verbessern, die Hannes Jaeger gefunden hat!
Hallo , danke für gegenvorschläge ich sehe diese Überlaufe nicht. kannst du mir sie korrigieren ? Danke im Voraus
Ich kann sie korrigieren, werde das aber nicht. Das ist deine Arbeit die du vermutlich morgen abgeben musst, gell? Ich weiß auch, das sich hier schon ein Trottel finden wird, der das mach. Doch ich mache es nicht. Warum ich das nicht mache? Schon mal mit unfähigen Leuten arbeiten müssen? Es ist kein Spaß mit Leuten arbeiten zu müssen, die zwar auf dem Papier irgendwas können (z.B. C Programmieren) aber die ihren Schein nur deshalb bekommen haben, weil andere ihre Programme geschrieben haben. Da darf man deren Arbeit zusätzlich machen und mit Überstunden deren Fehler ausbessern. Unsere Branche ist voll von Leuten, die da nicht rein gehören (HTML "Programmierer"), aber alle Papiere haben, dass sie angeblich programmieren können. Irgendwann reicht es einem da.
Hallo, ich sehe hier nicht wie ich meinem Dokument bearbeiten kann. wo ist es zu klicken ?
Mach einen Anhang in deiner nächsten Nachricht s.o.
Hallo, kann ich es nicht zentral lösen ? ich möchte es schon für alle diese überarbeitung machen... versteh mich ich bin neu hier...
Geschrieben ist geschrieben. Änderungen im Original würden eine darauf basierende Diskussion sinnlos machen. Verbessere deine Fehler und stelle den verbesserten Code neu ins Forum. Und vielleicht bekommst du dazu weitere Hinweise. So machen es alle hier.
Hallo, danke für Antwort. kannst du mir bitte erklären wieso laufen temp_array1 und temp_array2? Ich bin am lernen und brauche hilfe!!! deswegen bin ich hier zum erstem mal heute. Grüß
Danke, es ist mir jetzt klar wie es hier läuft... hier das Dokument Danke nochmals
Wenn du die Dateiendung .c abschneidest, kann der Compiler nichts damit
anfangen. Also solltest du das hier auch nicht machen.
OK. Das ist also fast das Original. Fast, weil die Includedatei mit den
Typedefs für u8, si8, bool_T und si16 noch fehlt.
> kannst du mir bitte erklären wieso laufen temp_array1 und temp_array2?
Wieviele Elemente haben temp_array1 und temp_array2 laut Definition und
wie werden Elemente in Arrays in C indiziert?
1 | si8 temp_array1[10]; // data for the first second |
2 | si8 temp_array2[50]; // data for 5 seconds (50 * 100 msec loop) |
Und welche Elemente werden hier angesprochen, wenn k = 10 ist oder l = 49 ist?
1 | for(k=1; k<11; k++) |
2 | {
|
3 | temp_array1[k] = outer_temp; |
4 | ^
|
5 | temp_start = (temp_start + temp_array1[k])/k; |
6 | ^
|
7 | |
8 | for( l=0; l<50; l++) |
9 | {
|
10 | temp_array2[l + 1] = temp_array2[l]; |
11 | ^^^^^
|
Hallo für includes ist alles klar, woanders behandelt... temp_array1 soll 10 elemente haben ( 1 sekunde lang a 100msec. sampling) temp_array2 soll 50 elemente haben ( 5 sekunde lang a 100msec. sampling) hier wollte ich eigentlich Mittelwert berechnen und verhindern dass ich durch 0 dividiere(erste Durchlauf.....) for(k=1; k<11; k++) { temp_array1[k] = outer_temp; ^ temp_start = (temp_start + temp_array1[k])/k; } ist das richtig? for(k=0; k<10; k++) { temp_array1[k] = outer_temp; ^ if(k!=0) temp_start = (temp_start + temp_array1[k])/k; } ^ ja, hier stimmt auch nicht... for( l=0; l<50; l++) { temp_array2[l + 1] = temp_array2[l]; } ist das richtig jetzt? for( l=0; l<49; l++) { temp_array2[l + 1] = temp_array2[l]; } Mfg.
Ralph Ralph wrote: > hier wollte ich eigentlich Mittelwert berechnen und verhindern dass ich > durch 0 dividiere(erste Durchlauf.....) > ... > ist das richtig? > for(k=0; k<10; k++) > { > temp_array1[k] = outer_temp; > ^ > if(k!=0) temp_start = (temp_start + temp_array1[k])/k; > } Formal ja, um die Division durch 0 zu umgehen. Von der Rechenvorschrift aus nicht. Du beziehst ein Element (temp_array1[0]) nicht in die Mittelwertbildung ein. Du gewichtest also temp_start stärker und den aktuellen Messwert outer_temp schwächer als vorher. Ich würde das so machen:
1 | for(k=0; k<10; k++) |
2 | {
|
3 | temp_array1[k] = outer_temp; |
4 | temp_start = (temp_start + temp_array1[k])/(k+1); |
5 | }
|
> ist das richtig jetzt? > for( l=0; l<49; l++) > { > temp_array2[l + 1] = temp_array2[l]; > } Formal findet in diesen Zeilen kein Arrayüberlauf mehr statt. Für dein Programm fehlen ein paar Codezeilen. Selbst mit den vorher vorhandenen Zeilen und Korrektur der Variablennamen, kann ich die Rechenvorschrift dahinter nicht sehen. Wann wird temp_middle zurückgesetzt? Es kann ja nicht sinnvoll sein, dass temp_middle endlos aufaddiert wird. Welchen Wert hat temp_middle_5s in den ersten 5s und ist das sinnvoll? Ich vermute, dass du bei den Variablendefinitionen globale Variablen mit lokalen Variablen der Funktion temp_filter() gemischt hast.
Hi, danke für den ersten Vorschlag klar verstanden... für das zweites teil will ich eigentlich alle 5 sekunden ein Wert berechnen und für die letzte phase in temp_middle_5s schreiben und durch 50 dividieren. meine interne Berechnung muss ich dann zurücksetzen, damit ich für die nächste 5 s eine neue mittelwert berechne... das zurücksetzen von temp_middle hat gefehlt wäre es so ok ? if( temp_cnt2 < 50) { for( l=0; l<50; l++) { temp_array2[l] = aussen_temp; temp_array2[l + 1] = temp_array2[l]; temp_middle = temp_middle + temp_array2[l]; } temp_cnt2++; } else { temp_middle_5s = temp_middle/50; temp_cnt2 = 0; temp_middle = 0;//neue zeile }
Hi Stefan, ich habe noch einem besseren vorschlag mit werte für temp_middle_5s bei t < 5s und reset von temp_middle bitte schau es mal und melde dich /*** Calculation of temperature middle value for every five second.***/ if( A2OUT_temp_cnt2 < 50) { for( l=0; l<49; l++) { temp_array2[l] = A2OUT_aussen_temp; temp_array2[l + 1] = temp_array2[l]; temp_middle = (temp_middle + temp_array2[l]); } if(erste_five_min)// value for the first 5 sec. { temp_middle_5s = temp_start; } A2OUT_temp_cnt2++; } else { temp_middle_5s = temp_middle/50; A2OUT_temp_cnt2 = 0; erste_five_min = FALSE; temp_middle = 0; // zurücksetzen nach 5 sec. }
Erstmal Sorry! Der Code mit temp_start ist nicht OK. Ich hatte mich nur an deiner Umgehung von Div/0 orientiert und was formal besseres formuliert. Er ist aber nicht richtig, um einen Mittelwert zu bilden. Der neue Code gefällt mir nicht. Ich befürchte, die Codebearbeitung artet in Fummelei aus, ohne dass die Aufgabenstellung durchdacht ist. Ein Anzeichen dafür ist immer, wenn mehr und mehr Spezialvariablen und if-Abfragen in den Code einfliessen. Ich verstehe nicht, welchen Mittelwert du berechnen willst und warum du Arrays verwendest. Angenommen du hast diese Temperaturen 10 11 12 10 11 15 und wenn man man grundsätzlich ein Arithmetisches Mittel (http://de.wikipedia.org/wiki/Mittelwert) nimmt, gibt es verschiedene Varianten: Variante 1: - Initialisierung des alten Mittelwerts mit 0 - Neuer Mittelwert = (Alter Mittelwert + Messwert)/2 (0+10/2) (5+11)/2 (8+12)/2 (10+10)/2 (10+11)/2 (10,5+15)/2 M=5 8 10 10 10,5 12,75 Variante 2: - Initialisierung des alten Mittelwerts mit erstem Messwert - Neuer Mittelwert = (Alter Mittelwert + Messwert)/2 (10+10)/2 (10+11/2) (10,5+12)/2 (11,25+10)/2 (10,625+11)/2 (10,8125+15)/2 M=10 10,5 11,25 10,625 10,8125 12,91 Variante 3: - Initialisierung des Mittelwerts unwichtig - Mittelwert = (Summe Messwerte)/(Anzahl Messwerte) - Beispiel (10+11+12+10+11+15)/6 M=11,5 Variante 3 ist stur der Mittelwert aus den 6 Messungen. Die zeitliche Folge wird nicht berücksichtigt. Jede andere Reihenfolge mit den gleichen 6 Zahlen ergäbe den gleichen Mittelwert. Variante 1 und 2 berücksichtigen die zeitliche Abfolge. Variante 1 nähert sich allerdings ganz langsam und erst bei genug Messungen dem Mittelwert, weil die 0 aus der Initialisierung lange das Ergebnis beeinflusst. Bsp. umgekehrte Messfolge bei Variante 2 15 11 10 12 11 10 (15+11/2) (13+10)/2 (11,5+12)/2 (11,75+11)/2 (11,375+10)/2 M=13 11,5 11,75 11,375 10,6875 Arrays können ins Spiel kommen, wenn du mehr als einen Messwert gleichzeitig in die Mittelwertberechnung einbeziehen willst (http://de.wikipedia.org/wiki/Gleitender_Mittelwert)
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.