Ein Interruptservice wird mir 400 Hz angesprochen. Nun soll ein Wert pro Sekunde um 8% wachsen. Also addier ich zu dem Wert pro Interrupt-Ereignis 8%/400Hz. Stimmt das ... ich glaub nicht. Steh aber gerade total auf'm Schlauch ... brauche hilfe! Grüße
Wie oft wird der Interrupt ausgelöst, mit 400 Hz, hab ich das richtig gelesen? Pro Sekunde 8% sind wohl für einen Interrupt: 0,08 : 400 Kann man ja fast im Kopf ausrechnen.
Klar! Danke euch. Ich glaub ich sollte mich mal auf's Ohr legen! ;-)
Ich hau mich auch gleich aufs Ohr, aber meiner Meinung nach falsch: nach 400x ist der Wert um 8,3% gewachsen: 1,0002^400 = 1,0833 (Stichwort: Zinseszins) Was du willst ist 1,08^(1/400) = 1,0001924211134082521262781155983 Wobei ich bezweifle, dass der AVR das so genau rechnen kann, insbesondere könnte es sein dass sich durch so oftmaliges Anwenden einer Float-Operation irgendwelche Rundungsfehler hochschaukeln. Gruß Roland
Die Zinseszins-Rechnung greift nur, wenn man jedes Mal, also bei jedem Interrupt berechnet: neuer Wert = alterWert*0,08/400 Wenn aber von einem Startwert ausgegangen wird, so ergibt sich: neuerWert = Startwert*0,08/400 + alterWert Die Frage ist nur, welche Aufgabenstellung ist korrekt? Das kann nur Gert klären.
Also angenommen ich Starte bei Null. Dann soll der Wert mit 8% pro Sekunde steigen. Bei 400Hz sollte er ja dann nach 12.5 Perioden bei 100% sein: (0.08/400)*400)*12.5=1 Aber irgendwas mach ich glaube ich noch falsch ...
> Bei 400Hz sollte er ja dann nach 12.5 Perioden bei 100%sein: Das hat mit 400Hz noch gar nichts zu tun: (100%)/(8%/s) = 12,5s > Aber irgendwas mach ich glaube ich noch falsch ... Ja, warum? Was stimmt nicht? Wo ist der Wert nach 12,5 Sekunden? Mit welchen Zahlen rechnest du (integer oder float)?
Wenn bei Null gestartet wird, ist auch nach 12,5 s der Wert immer noch Null. 8% von Null sind Null. Mir fallen sofort 'zig Prozentrechnungswitze ein, viele über Blondinen.
Was solls denn werden? Eine Art Anstiegsbegrenzung? Oder eine Rampe oder was? Gib mal paar mehr Infos und vielleicht ein zwei Beispiele. Wo kommen Werte her, die 8% je Sekunde steigen sollen...?
> 8% von Null sind Null. >>> Bei 400Hz sollte er ja dann nach 12.5 Perioden bei 100% sein Es soll offenbar einfach bei jedem Timertic ein Wert dazuaddiert werden, bis nach 12,5 sec der Wert 1 erreicht ist. Manche verwechseln das mit Prozentrechnen ;-) Das ist wie mit der einen Frage: Auf einem Teich mit einer Oberfläche von 0,8765km² wachsen Seerosen mit einer Oberfläche von 17,6789dm². Jeden Tag verdoppelt sich die Anzahl der Seerosen. Schon nach 22 Tagen ist die gesamte Teichfläche mit Seerosen bedeckt. Frage: wann war der Teich zur Hälfte bedeckt? Wer die Antwort weiß: bitte noch ein wenig warten, dass auch andere ihren Spass haben ;-)
Genau, eine Rampe soll das werden um ein sprunghaftes Eingangssignal linear zu verzögern. Wenn z.B. das Eingangssignal von Null auf 50% des max. Wertes springt, soll der Wert nur mit 8% pro Sekunde steigern. Vielleicht drücke ich mich mit den %_Wert auch falsch aus ... bin gerade total verwirrt
Also das mit den Seerosen weiß ich (hoff ich doch). Das ja mal ein gutes Zeichen ;-) Hast das von 9live ;-)
> Hast das von 9live ;-)
Nein, auswendig gelernt ;-)
Es ist erstaunlich, wie oft man mit solchen simplen Aufgaben eine
Stammtischrunde zu lang anhaltenden Diskussionen anregen kann.
9Live :-)) Versuch doch mal Dein Problem in eine einfache Geradengleichung zu packen. y= mx +b Das hilft vielleicht.
>>> Hast das von 9live ;-) >> Nein, auswendig gelernt ;-) > 9Live :-)) Mann, ich wusste gar nicht, dass es sowas wie 9live gibt (zu dieser Bildunglücke stehe ich und ich werde die auch nicht weiter ausmerzen). So ein Pech, das ist echt miserables Timing, dass die dort irgendwo auch gerade diese Frage gestellt haben :-/ Also eine andere: Ich habe zwei halbvolle Weingläser, eines enthält Weißwein, das andere Rotwein (100ml). Jetzt nehme ich jetzt einen Teelöffel (z.B. 5ml) Weißwein heraus, schütte den in den Rotwein, rühre den dann um, und nehme danach einen Teelöffel dieses Gemischs heraus un schütte den zurück in den Weißwein. Habe ich jetzt mehr Weißwein im Rotwein oder umgekehrt oder was?
> Genau, eine Rampe soll das werden um ein sprunghaftes Eingangssignal > linear zu verzögern. Wenn z.B. das Eingangssignal von Null auf 50% des > max. Wertes springt, soll der Wert nur mit 8% pro Sekunde steigern. > Vielleicht drücke ich mich mit den %_Wert auch falsch aus ... bin gerade > total verwirrt Das wird nie eine Rampe, wenn du einmal pro Sekunden einen Wert um einen Prozentsatz erhöhst. Das wird bestenfalls eine Art Treppe. Aber nur dann eine Art Treppe, wenn du dich erst mal einigst WOVON die verfl*chten 8% genommen werden sollen. Von einem festen Startwert, vom gewünschten Endwert, oder von dem gerade eingestellten Wert? In allen Fällen ist 0 dabei ein sehr ungünstiger Wert. Prozentangaben sind RELATIVE Angaben. Solange du dich nicht darauf einigst "relativ wozu" kommt halt irgendein Mist raus. So, und wenn das eine Rampe werden soll, willkommen im Land des Abtasttheorems. Zu beantworten ist die Frage, was für eine Abtastfrequenz man mindestens braucht, um aus (künstlich erzeugten) Daten ein vorgegebenes Signal (Anstieg mit einer vorgegebenen Steilheit) (re)konstruieren zu können. Dazu wiederum die Frage, bis zur welcher Oberwelle, also wie genau, man besagtes Signal konstruieren möchte. Nicht von dem Begriff Abtastfrequenz verwirren lassen. Hier wird nicht abgetastet, doch es die gleiche Frequenz, mit der man die Ausgangswerte ändert (ändern muss) um ein vorgegebenes Signal zu erreichen. Viel Spaß beim rechnen.
>Habe ich jetzt mehr Weißwein im Rotwein oder umgekehrt oder was?
Es ist genauso viel Rotwein im Weißwein, wie Weißwein im Rotwein.
Ich habe es damals selbst nicht geglaubt, bis ich nachgerechnet habe...
Matthias Lipinsky wrote: >>>Habe ich jetzt mehr Weißwein im Rotwein oder umgekehrt oder was? >> Es ist genauso viel Rotwein im Weißwein, wie Weißwein im Rotwein. > Ich habe es damals selbst nicht geglaubt, bis ich nachgerechnet habe... Ja, denn ich könnte z.B. einen Teelöffel nehmen, der genau 100ml fasst. Dann gehts einfacher mit dem Rechnen ;-)
> Ich habe es damals selbst nicht geglaubt, bis ich nachgerechnet habe...
Hab ich auch mal gemacht, ist aber nicht noetig. Hinterher ist in beiden
Glaesern gleichviel drin, da kann das garnicht unterschiedlich sein.
Kannst du mir erklären, warum es genauso viel Rotwein im Weißwein, wie Weißwein im Rotwein ist??? verstehs ned :-(
Dito. Wenn ich eine bestimmte Anzahl an 'Weißweinteilchen' in den Rotwein gebe und nehme anschließend ein Gemisch aus 'Weißweinteilchen' + 'Rotweinteilchen' mit der Bedingung dass die Summe der Teilchen Konstant sein muss, dann muss ich weniger 'Rotweinteilchen' als 'Weißweinteilchen' haben (wenn gilt: Weißweinteilchen != 0)
ups... war noch nicht fertig. ...weniger Rotweinteilchen im Gemisch natürlich. Wenn ich jetzt die wenigeren Rotweinteilchen in den Weiswein gebe habe ich weniger Rotweinteilchen im Weißwein als andersrum... verstehs auch nicht...
lippy hat Recht! Also rechne es doch bitte nach! Dreisatz wirst du ja wohl noch können.
Becher A | Becher B ------------------------------------------------ 1000 Einheiten Rotwein | 1000 Einheiten Weißwein << 100 Einheiten 1000 Einheiten Rotwein | 900 Einheiten weißwein + 100 Einheiten Weißwein | 100 Einheiten Gemisch >> 910 Einheiten Rotwein | 910 Einheiten Weißwein + 90 Einheiten Weißwein | + 90 Einheiten Rotwein
Wobei mir meine Rechnung nicht so gefällt. Denn 100 Einheiten eines Gemisches 10:1 besteht nicht aus 90+10 Einheiten, das wäre 9:1... *denkz
mhhh... Also was ich vor habe: Ich starte bei 0. Der Wert soll um 8 Einheiten pro Sekunde zunehmen.Endwert ist 100. Getaktet werden soll der Zuwachs von dem 400 Hz Signal. Dann wäre doch der Zuwachs pro Interrupt-Wreignis 8/400. Das wäre dann doch die Steigung der Rampe, oder?
@dgoersch: Fast richtig. In den Gläsern befinden sich nachher 909,090909... Einheiten Rotwein | 909,090909... Einheiten Weißwein + 90,909090... Einheiten Weißwein | + 90,909090... Einheiten Rotwein
Becher A | Becher B ------------------------------------------------ 1000 Einheiten Rotwein | 1000 Einheiten Weißwein << 100 Einheiten 1000 Einheiten Rotwein | 900 Einheiten weißwein + 100 Einheiten Weißwein | ^^^^^^^^^^^^^^^^^ Verhältniss 10:1 100 Einheiten Gemisch >> 910 Einheiten Rotwein | 910 Einheiten Weißwein + 90 Einheiten Weißwein | + 90 Einheiten Rotwein ^^^^^^^^^^^^^^^^ Verhältniss 9:1 <= Fehler ! Besser: 909,09... Einheiten Rotwein | 909,09... Einheiten Weißwein + 90,90... Einheiten Weißwein | + 90,90... Einheiten Rotwein Gruß, Klaus
Seerose verdoppel sich. Also war der See am Tag bevor er ganz bedeckt war, halb bedeckt!?
O.k. ich habs auch nachgerechnet - stimmt schon. .... Becher A | Becher B ------------------------------------------------ 1000 Einheiten Rotwein | 1000 Einheiten Weißwein << 100 Einheiten 1000 Einheiten Rotwein | 900 Einheiten weißwein + 100 Einheiten Weißwein | 100 Einheiten Gemisch >> 909,09... Einheiten Rotwein | 909,09...Einheiten Weißwein + 90,90.. Einheiten Weißwein | + 90,90.. Einheiten Rotwein *Gemisch besteht aus: 90,90.. Einheiten (R) und 9,09.. Einheiten (W) @Axel Rühl Auf die Seerosen kommt man schnell, wenn man sich überlegt, dass sie sich jeden Tag verdoppeln... na kleiner Tip jeden Tag VERDOPPELN... ;)
Was ist mit meinem Problem? <schluchtz> ... naja, Spaß MUSS ja auch sein. Also nur weiter mit euren Rätseln! :-)
Gert wrote: > mhhh... > Also was ich vor habe: Ich starte bei 0. Der Wert soll um 8 Einheiten > pro Sekunde zunehmen.Endwert ist 100. Getaktet werden soll der Zuwachs > von dem 400 Hz Signal. Dann wäre doch der Zuwachs pro Interrupt-Wreignis > 8/400. Das wäre dann doch die Steigung der Rampe, oder? Ganz genau. Das hat aber nichts mit Prozent zu tun. Bei jedem Interrupt wird dein bisheriger Wert um einen 'konstantes' Delta erhöht.
>Das hat aber nichts mit Prozent zu tun. >Bei jedem Interrupt wird dein bisheriger Wert um einen 'konstantes' >Delta erhöht. Also sieht deine 440Hz-Routine etw so aus: pseudocode:
1 | ISR (440Hz) |
2 | {
|
3 | differenz = (eingang - ausgang); |
4 | if ( differenz > X ) differenz = X; |
5 | else if ( differenz < X ) differenz = -X; |
6 | |
7 | ausgang = ausgang + differenz; |
8 | |
9 | }
|
... und wenn die Augangswert 0..100 % sind. Ist dann 8% pro Sekunde richtig ausgedrückt? Meine Routine sieht quasi so aus:
1 | ISR (440Hz) |
2 | {
|
3 | |
4 | if ( ausgabe < eingabe ){ausgabe+=8/440} |
5 | |
6 | }
|
Der Wert wächst aber ca. doppelt so schnell an wie erwartet
Gert wrote: > ... und wenn die Augangswert 0..100 % sind. Sind auch nur Zahlen. Dein Wert soll dann in einer bestimmten Zeit von 0 bis 100 rauffahren. Ob das Prozent oder Äpfel oder Schrittmotorpulse sind, ist unerheblich. Du musst in einer bestimmten Zeit eine Variable vom Startwert zum Endwert interpolieren. >
1 | > ISR (440Hz) |
2 | > { |
3 | >
|
4 | > if ( ausgabe < eingabe ){ausgabe+=8/440} |
5 | >
|
6 | > } |
7 | >
|
8 | >
|
> > Der Wert wächst aber ca. doppelt so schnell an wie erwartet Dann sieh dir mal die Timerwerte an. Obiges (offensichtliche Problem mal beiseite gelassen), erhöht ausgabe in 1 Sekunde um den Wert 8. Aber nur dann, wenn die ISR wirklich 440 mal in der Sekunde aufgerufen wird.
Mal mit konkreten Zahl. Angenommen du hast eine Variable X. Die soll alle Werte von 129 bis 546 durchlaufen. Und zwar in 12 Sekunden. Die Frage ist daher, um welchen Wert muss x jeweils erhöht werden? In 12 Sekunden, wird die ISR 12 * 440 = 5280 mal aufgerufen. x soll einen Bereich von 546 - 129 = 417 durchlaufen. Also muss x bei jedem ISR Aufruf um 417 / 5280 = 0.07897 erhöht werden. Die 0.07897 sind im Grunde nichts anderes als die Steigung der Geraden, die du durch die Punkte 0/129 und 12/546 gelegt hast Jetzt kannst du den Spiess aber auch Umdrehen. Du willst x wieder alle Werte durchlaufen lassen, von 129 bis 546. Und zwar soll x in 1 Sekunde um 8% von (546-129) zunehmen. 546 - 129 = 417. 8% davon sind 33.36 In 1 Sekunde muss x also um 33.26 größer werden. (Daraus folgt sofort, dass x für den kompletten Ablauf 12.5 Sekunden brauchen wird, den 417 / 33.36 sind 12.5) Wenn x in 1 Sekunde um 33.26 zunehmen soll, dann muss es daher in einem ISR Aufruf (der ja 440 mal in der Sekunde erfolgt) um 33.26/440 = 0.07559 zunehmen.
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.