frequenzcounter fast fertig

Gast #35463
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
Angehängte Dateien:
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
Gast
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
Gast
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
Angehängte Dateien:
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.