frequenzcounter fast fertig

Gast #35463
Lesenswert?

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:
#35464
Lesenswert?

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 #35465
Lesenswert?

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 #35466
Lesenswert?

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 #35467
Lesenswert?

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 #35468
Lesenswert?

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
#35469
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren