• .
  • Willkommen im Forum!
  • Alles beim Alten...
  • Du hast kaum etwas verpasst ;-)
  • Jetzt noch sicherer mit HTTPS
Hallo, Gast! Anmelden Registrieren


Funktionsgenerator
Wie wandelt man long-Werte in zig Stellen BCD-ASCII um, wenn der kostnix-Compiler die long-Bearbeitung unterbindet? Die I-Net-Gemeinde hilft... Smile

(Source bei mir auf dem Schirm wunderschön eingerückt... misstrau )

Code:
//============================================================================
// Quadruple Precision (32-bit) unsigned Binary to BCD conversion
// bcd9 to bcd0 comprise one ten digit unpacked Binary-Coded-Decimal number.
//  The upper nibble of each digit is zero (00008421). bcd9 is the MS-Digit.
// lval3 to lval0 comprise a four-byte (32-bit) binary accumulator.
//  lval3 is the MS-Byte.
// The 32-bit binary number in lval in converted to a ten digit BCD number.
// Anm.: für andere Bit- und Ditit-Anzahlen nur die Arrays umdimensionieren.
// Quelle: http://www.piclist.com/techref/member/BB-LTL-/index.htm

unsigned char lval[4], bcd[10];

void ltoa(void)
{
    unsigned char digcnt = sizeof(bcd);

    FSR = bcd;            // bcd-array löschen
    do {
      INDF = 0;            // pic-pointer nehmen
      FSR++;            // pointer weiterstellen
    } while(--digcnt);        // alle digits abarbeiten

    unsigned char bitcnt = sizeof(lval) * 8;   // algorithmus aus der quelle
    do {
      lval[0] = rl(lval[0]);       // Shift 32-bit accumulator
      lval[1] = rl(lval[1]);       //  left to
      lval[2] = rl(lval[2]);       //   put ms-bit
      lval[3] = rl(lval[3]);       //    into Carry

      FSR = bcd;            // Point to address of least significant bcd digit
      digcnt = sizeof(bcd);        // inner loop digit counter
      do {
        INDF = rl(INDF);        // Shift Carry into bcd digit
        W = INDF - 10;        // Subtract ten from digit then
                    //  check and adjust for decimal overflow
        if(Carry) INDF = W;        // If Carry = 1 (result >= 0)
                    //  adjust for decimal overflow
        FSR++;            // Point to next bcd digit
      } while(--digcnt);        // Decrement digit counter
    } while(--bitcnt);        // Decrement bit counter

    digcnt = sizeof(bcd);
    FSR = bcd;            // bcd-array in ascii umwandeln
    do {
      INDF += '0';            // pic-pointer nehmen
      FSR++;            // pinter weiterstellen
    } while(--digcnt);        // alle digits abarbeiten
}
 
kennst Du den schon?
http://www.watterott.com/de/Breakout-Boa...-Generator
...mit der Lizenz zum Löten!
 
Ist ja wieder ein DDS...

...mit DDS mag ich mich noch nicht anfreunden, weil der gerade bei den hohen Frequenzen fies jittert, was für Wobbeleien schlecht ist.

Daran können auch die typischen nachgeschalteten Filter (die auf dem Board noch nicht mal drauf sind) nichts ändern. Dies kann man schön im Datenblatt des Chips bei einer Ausgangsfrequenz von 16 MHz (Fig. 18) sehen - die Nebenwelle wächst und kommt immer näher an den Träger, je höher die Ausgangsfrequenz wird. Und das sind geschönte Grafiken, weil der ausgegebene Sinus die Nebenwelle deutlich mindert.

Sobald ich damit jedoch einen Rechteck mit hoher Frequenz produziere, hab ich restlos verloren. Das ist wohl auch der tiefe Grund, warum AD so gerne Sinus ausgibt und sich nur bei sehr wenigen Chips auf Rechteck einlässt.

Ein typischer Takt bei 50 MHz Quarz und 10 MHz out wäre ein 2:3:2:3:2:3...-Verhältnis mit dem Effekt, dass die beiden Trägerfrequenzen (8.3 MHz und 12.5 MHz) exakt gleich groß sind. Wie soll man damit ein Filter mit 10.7 MHz untersuchen?

Weiterhin hatten wir ja begriffen, dass alle zeitdiskreten Verfahren übel sind, wenn sie asymmetrische Schwingungsformen produzieren sollen. Wenn man beispielsweise ein Verhältnis 1:10 erzeugen will, so erzwingt das eine Reduzierung der Ausgangsfrequenz in genau diesem Verhältnis. Eine Unart, unter der auch hochwertige DDS-Generatoren leiden.

Ich halte einen mit 50MHz getakteten DDS-Baustein für bis maximal 1 MHz Ausgangsfrequenz geeignet.
 
Ja mit den Limitierungen der zeitdiskreten Verfahren hast Du sicher recht.
...mit der Lizenz zum Löten!
 
So.. heute hab ich (voraussichtlich) endlich mal wieder Zeit. Nur heute Abend die Weihnachtsfeier. Mal gucken, wie ich heute mit dem Frequenzzähler vorankomme.

Mann motz Warum immer so ein Stress zum Jahresende? misstrau
 
Endlich, endlich, endlich komme ich mal wieder zum Basteln.

Der Frequenzzähler läuft Smile
 
Ich bin hochzufrieden. Heart

In 3,5ms wandelt er die 32 Bit in BCD um. Inkl. Unterdrückung der führenden Nullen, Komma und Punkten zur 1000er-Trennung sowie Autoranging mit MHz/kHz/Hz-Anzeige und Ausgabe der bis zu 16 Zeichen auf dem seriellen Display.

Morgen muss ich noch ein bisschebn Feinkram fuddeln... aber grundsätzlich ist der Frequenzzähler im Sack.
 
machs nicht so spannend...zeig endlich ein bild Cool
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Hatte ich doch schon....

Klick

....zusätzlich taucht nun auf dem Display "27,125.358 MHZ" auf oder "12,345 KHZ" oder "53 HZ"
 
Dieses komische DVM zeigt nicht 20 Hz sondern 19.036 Hz überrascht

Und dabei beträgt die Messzeit des DVM eine halbe Sekunde. motz

Also scheinen die im DVM bei niedrigen Frequenzen die Periodendauer des Signals als Torzeit zu nehmen, damit einen Referenzoszillator zu zählen und dann die Division zu rechnen. überrascht überrascht überrascht

Das soll mein Frequenzzähler auch können! motz
 
Die verwenden im DVM u.a. diesen....

http://www.cyrustek.com.tw/spec/ES51966.pdf

....Chip!

Dazu noch ein Controller, ein LCD-Treiber und ein AD737 true RMS-Converter. Feinste Technik. Hätte ich in dem Teilchen gar nicht erwartet.
 
Aha... der misst also Frequenz und Periodendauer simultan. Und der Controller holt sich den Schmadder ab und entscheidet sich dann für den am besten geeigneten Wert, rechnet Perdiodendauer ggfls. in Frequenz um und stellts immer als Frequenz dar.

Ei verbibscht... da ist dieses lütte DVM doch so einigen "hochwertigen" Frequenzzählern weit überlegen.

Hoffentlich krieg ich die Division noch in dem PIC unter.
 
der DVM chip kann 400MHz überrascht
heftig Cool
welches multimeter is das denn?
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Naja... wenn man bedenkt, dass der eingesetzte ? 1,-- 8-Pin-PIC (12F629) auch schon 50 MHz zählen kann, dann relativiert sich das. Wink

Das VC860 ist von Conrad.
 
Ich bin wahrlich kein großer Fan des Conrad-Programmes,
aber die Voltcraft DVMs scheinen ihr Geld wert zu sein.
...mit der Lizenz zum Löten!
 
Ich bau gerade die Periodendauermessungs-Weichware in den PIC ein. Scheint locker zu passen. misstrau
 
Passen tuts mühelos. Nun wär ich nur glücklich, wenn es auch funktionieren würde motz
...aber ich sitz im Moment wieder dran... hinterhältig
 
Immer wenn ich Zeit finde, bin ich schon ziemlich dumpf in der Birne. Und immer wenn ich frisch bin, finde ich keine Zeit. Rolleyes

Wie auch immer... der Erfolg zählt:

[Bild: 1_counter1.JPG]
[Bild: 1_counter2.JPG]
[Bild: 1_counter3.JPG]
[Bild: 1_counter4.JPG]
[Bild: 1_counter5.JPG]

PIC 12F629 im DIL8. Zeitbasis 20MHz-Quarz. Messzeit immer 500ms. Auflösung 1/10 Hz. PIC-Programmspeicher erst halbvoll. Von 2 Hz bis 50 MHz.
 
nett Heart

ich versuch mich gerade an nem L-C messgerät...
    Don't worry about getting older.  You're still gonna do dump stuff...only slower
 
Ich hab mal einen L-Tester gebáut nach folgendem Prinzip:
Die Spule LX liegt im Rückkopplunszweig eine selbstschwingenden
Gatters. 'Von dessen Eingang geht ein Widerstand an Ref = Ubatt/2.
Dieser Widerstand stellt den Strom durch Lx ein.
Am Ausgang entsteht ein Rechteck, dessen Periodendauer proportional
der Induktivität ist.
Zur Anzeige wird ein Dual-Slope
DVM-Modul etwas modifiziert, wie das geht weisst Du sicher selbst.
Das Teil arbeitet bei mir von 1uH-20mH.
Die hohe Frequenz, die sich bei kleinen Induktivitäten einstellt,
macht übrigens durchaus Sinn!
...mit der Lizenz zum Löten!