Hi @all, ich habe jetzt schon viele threads durchgelesen raffe es aber nicht so richtig... Also ich habe ein Drehzahl Impuls von 2 Impulse bis 5000 Impulse pro Minute in etwa. Jetzt gibt es 2 Methoden die am Gängigsten sind. 1. Zeitmessung von Impuls zu Impuls 2. Anzahl der Impulse pro feste Zeiteinheit Ich denke mal am Anfang währe die 2. Variante die leichteste. Also Timer Programmieren auf meinetwegen 500ms ? Nur wie zähle ich jetzt die Impulse ? Beliebiger Portpin oder Über Interrupt ? Wenn per Interupt (INT0 od. INT1) wie ? Ich verstehe das im moment einfach nicht (prinzipieller aufbau) Habe grad irgendwie nen Denkfehler in der geschichte... Gruß Dennis
Hi Dennis in Bernau... Das richtet sich erstmal danach, wie viele Drehzahlen du parallel erfassen willst. Ist es nur eine, dann kannst du Hardwaremittel (wie Timer-ICP, Ext-Int, TI) einsetzen. Sind es mehrere, dann wirst du schon in einer Timer-ISR pollen müssen. Meinst du wirklich 2...5000 Impulse pro MINUTE? 2 Impulse pro Minute ist ja fast Stillstand. Ansonsten passt das aber in das Darstellungsformat des 16-Bit-Timers und kann per ICP erfasst werden. ICP löst einen Int aus und merkt sich in den ICP-Registern den genauen Zeitpunkt. In der ISR subtrahierst du davon den Wert der letzten "Runde". Dies muss allerdings 16-Bit erfolgen, ist dafür aber auch recht genau und hat einen großen Erfassungsbereich. Als Ergebnis erhältst du den Zeitabstand der Impulse. Eine weitere Variante wäre, einen Timer mit externem Takt (Ti) zu takten (dann ich es ein Counter) und dessen Inhalt in einer (langsamen) Timer-ISR (eines anderen Timers) auszulesen und zu löschen. Dann hast du direkt die Impulse pro Zeiteinheit. Per Ext-Int liest du in dessen ISR den Inhalt eines freilaufenden Timers (der noch andere Dinge steuern kann) ein und subtrahierst davon den Timerwert des letzten Impulses (den neuen Timerwert merken). Das ergibt den Zeitabstand der Impulse. Welches Verfahren man anwendet, richtet sich auch danach, was der AVR sonst noch so alles tun soll. Gruß... ...HanneS...
Hallo ...HanneS... aus ? ;) Ich danke Dir für Deine Antwort, habe mich glaube falsch ausgedrückt sind nicht 2-5000 Impulse p. Minute. Ich habe 1 Impuls für 2 Umdrehungen sprich maximal 10.000 Umdrehungen per Minute also maximal 5000 Impulse. Minimum währen 300 Impulse pro Minute. Bringt mich hier schon alles durcheinander... ;) Aber ich glaube da muss ich morgen nochmal in ruhe drüber grübeln, bin wohl schon zu sehr durcheinander und habe nicht wirklich verstanden was Du geschrieben hast. Gruß Dennis
hmm...1 Impuls für 2 Umdrehungen. Das hört sich nach Zündspule für einen KFZ-Motor an, richtig? Gruß Andi
Hi Dennis... Welchen AVR willst du einsetzen? Rechne mal die Impulse in Hertz um, die Zahlen sind dann aussagekräftiger. Wie realisiert man 1 Impuls bei 2 Umdrehungen? 2 Impulse pro Umdrehung halte ich für realistischer. (ist schon spät...) Wieviele Drehzahlen willst du nun parallel erfassen? Gruß... ...HanneS... vom westlichen Ende der B246, einem 650-Seelen-Dorf bei Magdeburg namens Königsborn...
Ups... Der übliche Drehzahlmesser fürs Autut... Dann ist's nur eine Messstelle... ...
Guten Morgen ;) ja es geht um einen Drehzahlmesser für einen 3 Zylinder 4-takt ;) µP ist ein ATMega8 (mein lieblingsprozessor) also auch nur eine Messstelle. ;)
@ HanneS so hab mir deinen Text jetzt nochmal durchgelesen, die Variante innerhalb einer Zeit bestimmte Impulse zu messen habe ich schnell verworfen, da ich bei 8000upm schon eine Abweichung von 2000upm habe. (bei 500ms messzeit) Also denke ich mal die ICP methode klingt am besten... Also wenn ich es recht verstanden habe. Lasse ich den Timer z.b. mit 10ms Laufen wenn ein ICP Event eintritt (Steigende flanke) - Lasse ich den Aktuellen Wert mit einem im SRAM (z.b. 0x60/0x61)gespeicherten Wert Subdrahieren - Dann Ergebnis wieder in eine SRAM Stelle (0x62/0x63) - Dann speichere ich mir den Timerwert in eine SRAM Stelle (0x60/0x61) für die "Nächste Runde" In der Main Routine führe ich dann meine berechnung durch Ergebnis aus SRAM auf Drehzahl hochrechnen. ?!?! Oder hab ich es komplett falsch verstanden ? Gruß Dennis
Juchu, ein wenig von erfolg gekrönt ;) Ich erhalte jetzt schon den Abstand der Impulse ;) Getestet hab ich es mit einem PC Lüfter bei einer Frequenz von 3,6864 Mhz und Vorteiler 1024 da bekomm ich dann eine Zähldifferenz von 25 Counterwerten. Wie kann ich jetzt aus den 25 Counterwerten z.b. eine Drehzahl berechnen? Der Prescaler ist auch noch nicht so perfekt... die Auflösung ist sehr grob. Sorry aber Mathe & Formeln war noch nie so mein Ding Gruß Dennis
f=1/t (f in 1/s, also in Hz, t in s) f=3600/t (f in 1/min (Umdrehungen je Minute), t in s) ...
@ ..HanneS... also ich bin jetzt mal auf folgendes gekommen. Wenn ich von einen Prescaler von 256 ausgehe. Anzahl GemesseneDifferenzImpulse * 69,44µS = ZeitZwischenImpulsen 1 -------------------- = Impulse pro Sekunde * 60 = Halbe Umdrehungen *2 ZeitZwischenImpulsen Nur wie ich das "Vereinfache" und in ASM berechnen kann grübeln wir jetzt schon seit mehreren Stunden... Das sind dann die punkte wo ich merke man hätte doch in der Schule aufpassen sollen ;) Gruß Dennis P.S.: HIIILLLFFEEE ;)
Hallo, wollte nur mal kurz erklären wie man pro 2 Umdrehungen nur 1 Impuls erhält. Beim Auto dreht sich die Nockenwelle mit halber Geschwindigkeit zur Kurbelwelle und wenn man am Nockenwellenrad oder am Verteiler einen Impulsgeber hat der nur einen Impuls pro Umdrehung der Nockenwelle liefert dann ist das nur 1 Impuls bei 2 Umdrehungen der Kurbelwelle. Mit der Berechnung in Assembler habe ich auch noch meine Schwierigkeiten, gibts da evtl. ne möglichkeit das ganze mit nem Basic zu machen und das dann in Assembler zu integrieren evtl. erst dissamblieren und dann übernehemn oder so?
@Thomas, ich weiß... Bin nur nicht auf die Idee gekommen, dass man sich einen Drehzahlmesser fürs Auto selbst baut. Die gibts doch wohl für'n Appel und'n Ei auf'm Schrottplatz. Ich dachte mit keiner Silbe an Carmodding. - Sorry, mein Fehler... Ansonsten brauchst du mir nix über Grundlagen der KFZ-Technik erzählen, ich habe den Lappen seit 1966 und habe jahrelang meine Brötchen hinter Lenkrädern verdient. Und das ohne Servolenkung, ABS usw. @Dennis: Du möchtest sicher Umdrehungen pro Minute angezeigt bekommen, oder? Also Impulse pro halbe Minute (müsste die selbe Zahl sein). Nun könntest du eine halbe Minute lang Impulse am Zähleingang T1 (PD5) zählen (Timer 1 als Counter) und diese direkt ausgeben. Aber das dauert zu lange (zu langsame Aktualisierung). Wenn du nun 1/100 der halben Minute, also 0,3s lang die Impulse zählst, dann bekommst du eine Zahl raus, die 1/100 der Drehzahl entspricht. Da hängste einfach 2 Nullen dran und das stimmt wieder. Oder?? Dann hast du 3 Aktualisierungen pro Sekunde, die musst du erstmal ablesen können... Also: Mit Timer0 eine Zeitbasis schaffen, die alle 300ms Timer1 ausliest und löscht. Das könnte ein Int alle 1,17ms sein, der neben der gesamten Programmsteuerung ein Register hochzählt, das dann alle 256 Ints überläuft und das Auslesen des Timer1 auslöst. Timer1 wird als Zähler geschaltet (Eingang T1, steigende oder fallende Flanke, ist egal), kein Int, kein OCR, kein ICP, nur zählen... (aber genau die Zahlen, die du aufs Display schubsen willst!) Auf diese Art ersparst du dir die gesamte Rechnerei... Gruß... ...HanneS...
Hallo, @HanneS: Ja ich habe ja auch ein 25 Jahre altes Auto ohne ABS usw. das dieses Jahr wieder angemeldet wird. Was habe ich mich über das ABS vom meinem jetzigen geärgert, das löst so früh da ist man noch garnicht an der Haftgrenze. Ob das jetzt wirklich ein Drehzahlmesser werden sol, ich denke eher das da nochmer gemachtz werden soll. Es gibt nämlich noch ne andere Lösung z.b. einen LM2907 der Wandelt eine Frequenz in eine Spannung um die kann man dann locker per A/D einlesen und weiterverarbeiten. Ansonsten kann ich mir nicht erklären warum der Impuls an der Nockenwelle abgenommen wird, das kann ja nur zur Positionsbestimmung sein.
@Thomas Olly: Ich fahre einen 15 Jahre alten Trabbi. 2 Zylinder Zweitakt, 600 Kubik, Außer Zündanlage keinerlei Elektronik, Haftreibung (für Bremse) ist bei jedem Wetter ein Thema, nicht nur bei Glatteis. Ich muss nicht mehr besonders viel fahren, daher reicht mir das Ding. Ich bin aber beruflich sehr viel mit Fahrzeugen und Hebezeugen unterwegs gewesen. Und Vieles musste selbst repariert werden. Und da wurden nicht nur Baugruppen gewechselt, da wurde noch repariert. Zurück zum Thema... Warum soll man eine Drehzahl (zeitabhängige Impulse) erst in eine Analogspannung umwandeln, um diese dann wieder zu digitalisieren? Das hätte nur Sinn, wenn die Impulse so schnell kommen, dass sie der AVR nicht mehr erfassen könnte. 3000 Umdrehungen pro Minute sind 50 Hz. Das sind 20 ms pro Impuls (bei 1 Impuls pro 1 Umdrehung). Mehr als 9000 U/min (150Hz) wird kaum auftreten. Das kann man noch gut mit dem AVR zählen... Gruß... ...HanneS...
Hallo, ja wollte damit auch nur sagen das ganze Elektronikzeug kann mir gestohlen bleiben. Das war nur ein Vorschlag um wenig Programmieraufwand zu haben da eine A/D Wandlung ja nicht viel Code benötigt und das halt leichter wäre. Als in Assembler ne Rechnung machen zu müssen. Glaube meine A/D Wandlung hat keine 10 Zeilen Code, müsste nochmal nachschauen wenns interessiert. Aber wenns wirklich ein Drehzahlmesser werden sollte kann man ja auch ein Analoginstrument nehmen das man mit dieser Analogspannung betrieben kann z.B. Wirbelstrominstrument.
@ ...HanneS..., also wenn ich das jetzt richtig verstanden habe, habe ich jetzt mal folgendes gemacht: Ich Initialisiere Timer0 mit: ldi temp1, (1<<CS00)|(1<<CS01) ; Prescaler 64 out TCCR0, temp1 ldi temp1, (1<<TOIE0) ; Overflow Interupt Aktivieren out TIMSK, temp1 Timer1: ldi temp1, (1<<CS12)|(1<<CS11) out TCCR1B, temp1 Bei 3,686400 Mhz erhalte ich dann einen Takt von 17,35µS also einen Overflow bei 4,4ms ? In der Overflow Routine: dec delay1 ; Wurde vorher auf Dec 68 Gesetzt damit hab ich ca. 301ms tst delay1 brne goout ldi delay1, 68 ; Wieder für nächste runde auf 68 setzen in xl, TCNT1L in xh, TCNT1H ; Zählerstand von Timer 1 Auslesen sts Timer1MSB, xh ; ab ins SRAM für Display Routine sts Timer1LSB, xl clr xl clr xh out TCNT1H, xh out TCNT1L, xl Ende von Timer0 Overflow SREG etc hab ich gesichert. Allerdings bekomme ich nur misst... raus was ich allerdings mit dem ICP Capture nicht hatte (ruhiger und konstanter wert) Verstehe das einfach nicht... Gruß Dennis
Timer0 für Zeitbasis nehmen Timer 1 als Zähler schalten, externen Zähltakt an T1 einstellen, Impulsleitung an T1 anschließen. Alle 300ms Timer1 auslesen und danach löschen, das Ausgelesene in Ziffern umwandeln, ans LCD schicken, 2 Nullen hinterher schicken, fertig... ...
Hi Hannes, sorry wenn ich vieleicht "Nerve" aber hab ich das Oben nicht gemacht ? Gruß Dennis P.S.: Gehöre nicht zu den Carmoddern ;) Denke sowas brauch ich bei mir nicht einbauen... ist halt nur ein gefallen für einen bekannten.
Dennis, wie du das realisierst ist doch deine Sache. Wir diskutieren hier einfach nur über die Möglichkeiten. Wenn ich das machen müsste, dann fiele mir eben diese Lösung ein. Es geht sicher auch anders. Mit der Mathematik auf ASM-Ebene habe ich es auch nicht so. Daher vermeide ich sie wenn es geht. Wenn ich also eine Frequenz bzw. Drehzahl (ist das gleiche, nur eben nicht auf die Sekunde bezogen sondern auf die Minute) anzeigen möchte, dann reiße ich mich nicht darum, die Zeit zwischen den Impulsen zu erfassen und dann den Kehrwert auszurechnen, wenn ich die Möglichkeit habe, die Umdrehungen pro Zeiteinheit zu erfassen. Aber wie gesagt, ich gehe da von mir aus. Wenn du das anders machst, so ist das für mich kein Problem. Gruß... ...HanneS...
Hi Dennis! Was hälts Du davon, wenn Du einfach einen 16 Bit-Timer von z. B. 14400Hz machst (Prescaler = 256). Den Drehgeber vom Motor oder Zündspule, was auch immer, an Int0 mit aktivem Interrupt. Immer, wenn am Int0 ein Int. ausgelöst wird, merkt sich die Int0-ISR (in ein Registerpaar oder Bytepaar im SRAM) den Timerwert von Timer1 und setzt Timer 1 zurück (auf 0x0000). Dadurch hast Du die Zeit in 1/14400 Sekunden zwischen 2 Drehsignalen. Im Main-Prog nimmst Du einfach den gemerkten Zeitwert und benutzt ihn als Divisor für eine Division wie z. B.: 432000 / Zeitwert Wenn der Motor alle 2 umdrehungen 1 Signal abgibt ergibt das bei einer Zeitlänge von 144/14400 Sekunden 3000RPM. Bei einer Zeitlänge von 143/14400 Sekunden ergibt es 3020RPM. Wenn Du eine bessere Auflösung möchtest dann mißt Du einfach mittels einem Zähler in der Int0-ISR die Zeit für mehr als von einem zum nächsten Impuls z. B. für 4 Umdrehung die nächsten 2 für 8 Umdrehungen die nächsten 4 Impulse. Dadurch verdoppelt sich allerdings auch der Dividen von 432000 auf 864000 und 1728000. Eine nötige 24Bit-Divisionsroutine, umgestellt vom original 16Bit auf 24Bit, kannst Du bei bedarf von mir haben. Gruß Andi
Hi Andi, das klingt auf jedenfall schonmal richtig gut ;) Die Methodik von ...HanneS... hab ich gestern nochmal durchprobiert (man sollte register die man benutzt nicht einfach so überschreiben patsch) Leider sind mir die 1000er und 100er Stellen zu ungenau. Vorhher habe ich mittels ICP mir den Timerwert Geschnappt mit dem alten wert subdrahiert die differenz abgespeichert. Und den neuen Timerwert als alten abgespeichert für die nächste runde. Funktioniert gut bekomme z.b. bei nem PC Lüfter ne Differenz von 25 Timertakten nur wie ich damit jetzt halt weiter rechne... Und ich denke mal da kommt jetzt deine Division ins spiel... mein Problem ich vieleicht denkbar einfache mathematik... Wie kommst du in deinem beispiel auf 430200 ? bzw. 144/14400 Die 14400 ist die f in Hz bei Prescaler 256 richtig ? Aber die 144 ? Ist das der gezählte wert ? Gruß Dennis P.S.: @...HanneS... ich danke Dir und allen anderen auf jedenfall für die hilfe.
@all, ich möchte nur noch mal kurz Anmerken, ich verlange von keinem die Aufgabe für mich zu Lösen oder den Code zu schreiben. Ich versuche es Nur zu verstehen. 1.) Den Rechenweg 2.) die Vereinfachung um in ASM damit zu rechnen. Dies ist für mich die wirklich 1. Rechenaufgabe die ich irgendwie mit dem µC mache. Und irgendwo hab ich einfach einen Denkfehler drin. Das ich mittlerweile schon nicht mehr mit dem Taschenrechner auf das ergebnis komme. Wenn ich richtig gerechnet habe (egal ob jetzt Drehzahlmesser oder irgendeine andere Frequenz) Bekomme ich bei 1 Impuls / 2 UPM sprich bei 800upm eine Taktfrequenz von 6,667 Hz. Wenn ich die Methode nutze mit fester Zeitbasis z.b. 300ms oder 500ms und die Impulse innerhalb dieser Zeitbasis zähle, hab ich bei so einer "Langsamen Taktung" eine zu hohe Ungenauigkeit messe ich länger dann hab ich zwar eine höhere Genauigkeit aber auf Kosten der Aktualisierungsgeschwindigkeit. Also kommt ja nur die Möglichkeit in betracht wie Andi und ...HanneS... (am Anfang) beschrieben hat die Zeit zwischen 2 Impulsen zu messen. Sehe ich das dann Richtig das ich eine Dynamische Anzeigenaktualisierung erhalte ? (Langsam bei 800upm schnell bei 8000upm) Also ist mein Problem ja nur noch das "Hochrechnen" der Zeit zwischen Impulsen und der eigendlich UPM (oder frequenz * 60) Und genau da hört es bei mir auf... Ich verstehe es einfach nicht. Die Messung an sich Funktioniert. Ich kann mir den Zeitabstand zwischen den Impulsen anzeigen lassen... Gruß Dennis
@Dennis Brücke: Tja, Mathematik ist doch nicht so nutzlos, wie viele Schüler denken, gell? Also, hier eine exklusive, Pisa-Kompatible Einführung in Frequenz, Drehzahl und Periodendauer: 1. Frequenz =========== Frequenz bedeutet Ereignisse, Impulse oder Takte pro Zeiteinheit. D.h. man zählt eine festgelegte Zeit lange die auftretende Ereignisse. Die Anzahl der Impulse ist gleich der Frequenz. Also z.B. 6 Schulstunden pro Tag. Oder 3 mal in's Kino pro Woche. Oder einmal pro Jahr Geburtstag feieren. Oder auch fünf mal pro Stunde "Boah ey!" sagen. Das alles sind Frequenzen. Allerdings sind sie in verschieden langen Zeiträumen gemessen und nicht direkt Vergleichbar. Darum hat man sich entschieden, die Frequenz in Ereignisse pro Sekunde anzugeben. Zu ehren des Herrn Hertz hat man diese Angabe "Hertz" getauft. Hertz bedeutet also, Ereignisse, Impulse oder Takte pro Sekunde. Und wie bekommt man nun die Frequenz raus für fünf mal pro Stunde "Boah ey!" sagen? Ganz einfach: Man muß nur wissen, wieviel Sekunden eine Stunde hat! (Eine Stunde hat übrigens 3600 Sekunden. Warum das so ist, ist ein anderes Thema und soll hier nicht weiter diskutiert werden...) D.h. 5 mal "Boah ey!" pro Stunde ist das gleiche wie 5 mal "Boah ey!" pro 3600 Sekunden! Und wie bekommt nun endlich die Frequenz in Hertz raus, also "Boah Ey!"s pro Sekunde? Ganz einfach: Durch 3600 dividieren! Also: 5 / 3600 = 0,001389 Die "Boah Ey!" Frequenz beträgt also ca. 0,001389 Hertz. 2. Drehzahl =========== Da man oft wissen möchte, wie schnell sich etwas dreht, und Angaben wie "langsame", "schneller", "sau schnell" einfach zu ungenau sind, hat man sich überlegt, man könnte doch eine gewisse Zeit lang die Umdrehungen zählen und diese Zahl angeben. Wenn Du oben aufgepasst hast, hast Du natürlich sofort bemerkt, dass die Idee "Umdrehungen eine Zeit lang zu zählen", nichts anderes als die Frequenz ist! Aber: Aus verschiedene Gründen, z.B. weil die KFZ-Leute wussten, dass der gemeine Autofahrer eine Abneigung gegen Kommas hat, haben die sich entschieden, die Umdrehungen nicht eine Sekunde lang zu zählen und das Ergebnis in Hertz anzugeben, sondern sie haben sich entschieden eine Minute lang die Umdrehungen zu zählen. Da die KFZ-Leute etwas Einfallslos sind, ist ihnen keine Einheit eingefallen, und sie sind dabei geblieben, das Ergebnis als UPM anzugeben. UPM heisst nichts anderes als "Umdrehungen pro Minute". Und jetzt kommt der Clou: Umdrehungen pro Minute kann man in Hertz umrechnen! Denn das haben wie ja oben schon gelernt. Wenn sich also ein Motor, mit fetten 3000 Umdrehungen pro Minute dreht, bedeutet das, dass sich der Motor mit 3000 Umdrehungen pro 60 Sekunden dreht. Um das in Hertz umzurechnen, muss man wieder dividieren: 3000 / 60 = 50 Also, die Umdrehungsfrequenz des Motors ist in diesem Fall exakt 50 Hertz. 3. Periodendauer ================ Irgendwann einmal, wollte ein schlauer Mathematiker oder Physiker die Umdrehungen eines Motors pro Minute bestimmen. Da aber besonders Mathematiker sehr faule Menschen sind, und der Mathematiker nicht eine Minute lang die Umdrehungen eines Motors zählen wollte hat er sich etwas überlegt: Wenn man weiss, das etwas 'n' mal pro Zeit 't' passiert, passiert dieses Ereignis alle t/n Zeiteinheiten. Also, wenn etwas 2 mal pro Sekunde vorkommt, ist der Abstand dieser beiden Ereignisse 0,5 Sekunden. Und wenn etwas 50 mal pro Sekunde vorkommt, ist der Abstand 1 / 50 = 0,02 Sekunden. Wenn man also den Zeit-Abstand zwischen zwei Ereignissen kennt, kann man ganz einfach die Frequenz bestimmen, in dem man schaut, wie oft dieser Zeitabstand in einer Sekunde reinpasst. Beispielsweise sollte ein PISA-Schüler alle 5 Minuten einen leichten Schlag auf den Hinterkopf zur Erhöhung des Denkvermögens bekommen, und der Mathematiker rechnet daraus sofort die die Frequenz aus, ohne erst eine Stunde lang zu zählen wieviel Schläge das denn nun waren. Dazu muss der Mathematiker natürlich wissen, dass eine Minute gleich 60 Sekunden ist, und somit 5 Minuten 300 Sekunden entsprechen (der Mathematiker weiss das). Also: 1 / 300 = 0,0033 Die Frequenz der Schläge beträgt somit ca. 0,0033 Hertz. Aber nun möchte der Mathematiker endlich die Umdrehungen seines neuen Motors wissen, also besorgt er sich eine Stoppuhr, und macht auf der Welle des Motors eine kleine Markierung. Sobald der Motor läuft, stopt der Mathematiker mit seiner Stopuhr, wie lange die Markierung für eine Umdrehung benötigt. Der Mathematiker stopt eine Zeit von 0,108 Sekunden. Daraus errechnet er jetzt erstmal die Frequenz: 1 / 0,108 = 9,259 Die Umdrehungsfrequenz beträgt also 9,259 Hertz. Der Motorenverkäufer hat aber seinen Motor mit UPM beworben, weil er nicht mit dem Komma umgehen kann. Der Mathematiker rechnet also ihm zuliebe die Frequenz in Hertz noch in Umdrehungen pro Minute um. Der Mathematiker weiss nämlich, dass sich der Motor in einer Minute 60 mal häufiger gedreht hat, als in einer Sekunde. Also: 9,259 * 60 = 555,56 Der Motor dreht sich also mit 555,56 Umdrehungen pro Minute. 4. Ende ======= Nun habe ich keine Lust mehr, die Geschichte weiter zu schreiben...
Denkanstoß: Du brauchst eigentlich 2 Berechnungen: - Bildung des Reziprokwertes der gemessenen Impulsabstandszeit (1/t) - Kalibrierung auf die anzuzeigende Maßeinheit. Wenn du diese zusammenfasst, musst du eine große Konstante (in der die Umrechnung auf deine Maßeinheit RPM steckt) durch deine gemessene Zeit dividieren. Da es dir vorrangig nicht darum geht, irgendwelchen kryptischen Code unverstanden abzukupfern müsstest du die Division erstmal ganz einfach beginnen. Dauert zwar, zeigt dir aber das Problem und lässt sich dann optimieren. Wie dividiert man nun ohne Taschenrechner und wenn man das "Kleine Einmaleins" nicht kennt?? Man subtrahiert (in einer Schleife) solange den Divisor vom Dividenden (und zählt dabei die Subtraktionen), bis der Dividend negativ wird. Da man nun eimal zuviel subtrahiert hat, nimmt man die letzte Zählung zurück. Wenn du das nachvollziehen kannst, kannst du es optimieren, indem du (binär, nicht dezimal) anfängst Stellen zu schieben. Damit werden es bedeutend weniger Schleifendurchläufe und es geht schneller, wird aber auch schnell unübersichtlicher bzw. schwerer durchschaubar. ...
Ups... Nix Andi, Anderer Michael war gemeint... - Sorry... (schäm) ...
@Michael, habe ja kein Problem damit wenn ich etwas nicht verstehe das es mir jemand erklären muss... aber es auf so eine Art zu tun finde ich einfach albern und auch ein wenig respektlos vor anderen Menschen die evtl. nicht ganz so viel Ahnung haben wie einer selbst. Wenn Du meinen Beitrag darüber genauer gelesen hättest, hättest Du auch gemerkt das ich schon in etwa 1 + 1 zusammenzählen kann und weis was eine Frequenz ist... aus dem "boa ey" Alter bin ich schon lange raus. Abgesehen davon das der letzte Teil doch ein wenig Informativ war. Dennoch ein höffliches Danke. @ ..HanneS, danke für den Denkanstoß dieser hat mir sehr geholfen und ich werde mich heute abend mal wieder hinsetzen und ausprobieren. Ist ja im Prinzip wie die BCD Arimetik ?! Nur nicht mit Konstanten sondern mit Messwerten ?! Gruß Dennis
Hi Dennis... Bei BCD-Umwandlung muss man auch dividieren, zwar durch Zehnerpotenzen, aber Division ist das auch. Und Division ist erstmal wiederholte Subtraktion, die man (wenn man sie richtig verstanden hat) etwas optimieren kann. Nochmal zu dem "Anderen Michael" seinen Beitrag. Ich finde ihn toll, da sachlich richtige (und verdammt wichtige!!!) Informationen so herrlich sarkastisch verpackt wurden. Wenn wir Beide hier am Kaffeetisch darüber diskutiert hätten, dann hätte ich sicherlich auch so überspitzt (sarkastisch) diskutiert. Ich mag nunmal diese Art. Sowas ist mir hundertmal lieber als ein hochwissenschaftlicher Vortrag den (fast) niemand versteht. Du brauchst dich dadurch nicht angegriffen fühlen. Sieh es einfach als "Satire mit Inhalt". Gruß... ...HanneS...
@Dennis Brücke: Also als wir noch Kinder waren, teilweise sogar noch als Jugendliche, hat uns so mancher (Erwachsener) das Sprichwort: "Betroffene Hunde bellen!" um die Ohren gehauen. Das hat bei uns meisten einen gewissen Gegenprotest hervorgerufen, weil stets ein Quäntchen Wahrheit dran war. ;->
@ Michael, nur das ich nicht gebellt habe, sondern nur ein wenig geknurrt ;) ok ...HanneS... mag recht haben "War vieleicht nur Satire von Dir" Also ;) Gruß Dennis
@Andi, danke Dir nochmal für die Formel oben. Habe das jetzt mal bei mir ausprobiert und einfach mal 14400 Hz * 60 als 24bit Zahl in meinen Registern hinterlegt. (864000) Leider hab ich jetzt noch das Problem, das die Sprünge immer um die 256 betragen. Also hab ich nochmal die division im Simulator Probiert dort hab ich schon von vorne rein einen rechenfehler drin... ich denke mal das es an meiner Divisionsroutine liegt finde aber den fehler nicht so richtig. ;*********************************************************************** ************************************************* ;.def DividentLSB = r0 ;.def DividentMSB = r1 ;.def DividentHSB = r2 ;.def DivisorLSB = r3 ;.def DivisorMSB = r4 ; ;.def HilfsLSB = r5 ;.def HilfsMSB = r6 ; ;.def ErgebnisLSB = r7 ;.def ErgebnisMSB = r8 ;*********************************************************************** ************************************************* division: clr HilfsLSB clr HilfsMSB clr ErgebnisLSB clr ErgebnisMSB inc ErgebnisLSB div_a: clc rol DividentLSB rol DividentMSB rol DividentHSB rol HilfsLSB rol HilfsMSB brcs div_b cp HilfsLSB, DivisorLSB cpc HilfsMSB, DivisorMSB brcs div_c div_b: sub HilfsLSB, DivisorLSB sbc HilfsMSB, DivisorMSB sec rjmp div_d div_c: clc div_d: rol ErgebnisLSB rol ErgebnisMSB brcc div_a ret Sorry ist noch nicht kommentiert. Gruß Dennis
Hi! Find ich gut, das Du Deine eigene 24 Bit-Division machst. Ich habe einfach die 16/16-Division (Div16u) aus dem 'avr200.asm' genommen und auf 24 Bit 'aufgebohrt'. Habe die umgebaute Routine gerade nicht zur Hand, erst heute Abend. Gruß Andi
@Andi, ganz selber gemacht ist sie nicht, habe Sie von avr-asm-tutorial ausgedruckt -> versucht zu verstehen -> und selber auf 24bit geschrieben. Allerdings ist wie gesagt noch ein grober fehler drin... z.b. 432000 / 144 = 3000 kommt bei mir 2816 raus... :( grmpf Gruß Dennis
Hi Dennis! Im Anhang die Routine für 24 Bit-Divisionen. Der Dividend kommt in die Register DD24u0, DD24u1 und DD24u2 (r16,r17 und r18) der Divisor (gemessene Zeit) in DV24u0, DV24u1 und DV24u2 (r19, r20 und r21). Das Ergebnis (Result) ist dann in DRes24u0, DRes24u1 und DRes24u2 (r16, r17 und r18) und der Rest (Remainder) in DRem24u0, DRem24u1 und DRem24u0 (r13, r14 und r15). Natürlich ist für Dich nur das Result (DRes24u0 (low-Byte) und DRes24u1 (high-Byte)) interessant das das Ergebnis - die RPM - immer nur ein 16 Bit-Ergebnis sind. Die oben genannten 144/14400 Sekunden ist das gleiche wie 10/1000, also 10ms. Teilt man nun 432000 144 ist es das selbe wie 30000 10, Ergebnis bei beiden = 3000RPM. Der Dividend ist für eine halbe Minute ausgelegt da Du ja 1 Signal für 2 Umdrehungen bekommst. Dadurch verdoppelt sich dann auch gleich das Ergebnis da die Umdrehungen bei 1 Signal auch 2, das doppelte, sind. Die Auflösung, also die Stufung, kannst Du noch verringern in dem Du mittels interner Zählvariable im Int0 nicht bis zum nächten Signal die Zeit mist, sondern die Zeit für 2 oder 4 Signale. Dazu muß dann der Dividend das doppelte oder 4 fache sein. Zeiten für ein Signal: 432000 / 144 = 3000 432000 / 143 = 3020 Bei 2 Signalen: 864000 / 288 = 3000 864000 / 287 = 3010 Bei 3 Signalen: 1728000 / 576 = 3000 1728000 / 575 = 3005 Die Stufung wird bei höheren Drehzahlen allerdings immer größer also mist man lieber die Zeit von mehr als einem Signal und bezieht das in der Division mit ein. Man kann die Auflösung auch noch zusätzlich mit einer Mittelwertberechnung verfeinern: RPMMittel = (RPMittel + RPMNew) / 2 oder RPMittel / 2 + RPMNew /2 Gruß Andi
Hoppla... der Anfang der Registerdefinition sollte so aussehen: .def drem24u0=r13 .def drem24u1=r14 .def drem24u2=r15 Keine Ahnung, warum ich das mal andersrum gemacht hatte. Gruß Andi
@Andi, danke Dir für Deine Routine, ich habe jetzt mir App200 von Atmel angeschaut. Mir nochmal den Code von avr-asm-tutorial angeschaut. Meine Routine läuft einfach nicht, sie rechnet an irgendeiner stelle falsch... :( Ich finde den Fehler einfach nicht, hat nicht irgendeiner eine Idee was ich falsch gemacht habe ? Entweder Raff ich es einfach nicht oder es so ein trivialer fehler das es schon peinlich ist... Help pls. Gruß Dennis
Hi Dennis! Wenn Du schon die 16 Bit-Version auf 24 Bit umstellst, mußt Du natürlich alle 4 Dinge, Dividend, Divisor, Result und Remainder, auf 24 Bit erweitern, also für jedes dieser Dinge ein Register dazu machen. Wo vorher 2 ROL-Befehle waren gehört ein dritter mit einem weiteren Register drunter, wo sub und sbc war gehört ein weiteres sbc drunter mit zusätzlichem Register. Die Routine Div24u benutzt Shared-Register (Dividend und Result) und spart damit 3 Register ein. Um eine ASM-Division zu verstehen muß man auf nen Blatt Papier (oder Editor) einfach mal Dividend und Divisor Bitweise darstellen und dann Befehl für Befehl das machen was in der Routine steht und auch nach dem Carry-Bit Entscheidungen treffen. Gruß Andi
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.