www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik frequenzcounter fast fertig


Autor: tobias hofer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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/freq...

Ich zähle immer volle Perioden der Eingangsfrequenz.


Peter

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tobias hofer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tobias hofer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo peter

besten dank, ist halt das erste mal das ich mit interrupts arbeite.
jetzt funktioniert es wie geswünscht!

tobias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.