hallo nun habe ich den frequenzzähler "fast" fertig. die sprintf() fkt. habe ich durch eine funktion ersetzt die peter danneger geschrieben hat. ich habe die auf seiner homepage gefunden. @peter an dieser stelle möchte ich dich fragen ob es dir nichts ausmacht wenn ich diese fkt. einfach so benutze. aber damit konnt ich ca.20% code eingesparren! nun habe ich nur noch ein kleines problem: und zwar der timer0 der mir anhand meines eingangssignal (fallende flanke) hochgezählt wird, hat nicht jedes mal genau den gleichen wert. und zwar weicht der wert immer +-1 ab. was könnte das sein? hat vieleicht jemand eine idee? beste grüsse und danke für eure hilfe gruss tobias
Hi Tobias, ja, alles was ich veröfffentliche, kannst Du ruhig benutzen. Der Grund, warum ich diese Routine entwickelt habe ist, daß sprintf() nicht die Ausgabe in der technischen Schreibweisse erlaubt (Zehnerpotenzen von 3, 6, 9 usw.). Das die Zählerwerte um +-1 abweichen ist vollkommen klar. Alle Digitalisierungen könne nur in ganzen Schritten arbeiten. Der Grund, warum daß bei mir keine Rolle spielt, ist hier beschrieben: http://www.specs.de/users/danni/appl/soft/c51/frequenc/index.htm Ich zähle immer volle Perioden der Eingangsfrequenz. Peter
hallo peter ich habe deine messroutine von deiner home-page mal angeschaut.ich blicke da aber noch nicht ganz durch. könntest du mir nicht kurz erklären wie du die timer startest und stopst? wäre sehr froh um ein paar tips. tobias
noch kurz wie ich es bis jetzt programiert habe. eine 1-0 flanke des eingang signals (auf int0 und t0) startet mir beide timer gleichzeitig. dann warte ich eine gewisse zeit (so lange wie ich sicher brauche um die tiefste frequez zu messen) nach diesem delay stopt mir die nächste 1-0 flanke des eingangsignal beide timer wieder. somit sollte ich doch sicherstellen können das der timer für das eingangssignal immer volle perioden misst. oder nicht? auf jeden fall habe ich immer noch den gleichen fehler wie vorher. anbei der aktuelle c-code. tobias
ich habe noch folgende änderung vorgenommen: in der interruptroutine int0.... IRQ_VECTOR(ext_int0,IRQ_INT0) void ext_int0 (void) interrupt { EX0 = 0; flag_it0++; if(flag_it0==1){ TR0=1; TR1=1; #asmline nop; TH0=0; TL0=0; TH1=0; TL0=0; } if(flag_it0==2){ TR0=0; TR1=0; } } ....die timer werte werden nach dem start noch einmal zurückgesetzt. leider habe ich immer noch einen fehler von +-1Hz! ich weiss wirklich nicht mehr weiter wo noch ein fehler sein könnte. bin um alle hilfe dankbar. gruss tobias
Hi, wenn das zu messende Signal exakt ein vielfaches des "Torsignals" hat müsste der Fehler verschwinden. Da Du in der Praxis das nie hinbekommst ist der Fehler +/-1 "Gottgegeben" Du kannst die Genauigkeit nur durch Vergrößerung der "Torperiode" erhöhen. Ein Fehler +/-1 bleibt dann zwar, ist aber relaiv kleiner. Bsp: Messsignal 100Hz = 10ms Torsignal 1Hz = 1s => Messwert 99 oder 100 oder 101 => Fehler +/- 1% Messsignal 100Hz = 10ms Torsignal 0,1Hz = 10s => Messwert 99,9 oder 100,0 oder 100,1 => Fehler +/- 0,1% Messsignal 100Hz = 10ms Torsignal 0,01Hz = 100s = Messwert 99,99 oder 100,00 oder 100,01 = Fehler +/- 0,01% usw. Gruß UBoot-Stocki
Wenn man einen flankengetriggerten Interrupt freigibt, wird der natürlich auch sofort ausgeführt, wenn vorher schon mal eine Flanke erfolgte. Deshalb sollte man vor der Freigabe immer erst das Interruptflag zurücksetzen. Siehe mein Beispielkode: IE0 = 0; EX0 = 1; // wait until next count pulse Peter
hallo peter besten dank, ist halt das erste mal das ich mit interrupts arbeite. jetzt funktioniert es wie geswünscht! tobias
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.