PIC-Lernbeispiel: 10 Hz .. 9999 Hz-Frequenzzähler
mit 4-stelliger 7-Segment-LED-Anzeige

mit PIC16F628

zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage


Ein einfaches Frequenzmessgerät von 10 Hz bis 9999 Hz
Das Messen sehr niedriger Frequenzen mit hoher Genauigkeit mit einem Zählfrequenzmesser erfordert eine lange Zählzeit. Um eine Genauigkeit von 1 Hz zu erzielen, muss die Zählzeit 1 Sekunde lang sein. Dadurch wird die Anzeige recht träge, da sie nur 1 mal pro Sekunde aktualisiert wird. Eigentlich ist das gar nicht so schlimm, da der Mensch ja auch etwas Zeit braucht, um die Anzeige zu erfassen, aber etwas schneller wäre schon schön.

Alternativ kann man auch den Abstand zwischen zwei Pulsen messen und daraus die Frequenz errechnen. Dafür beträgt die Messzeit dann nur das Reziprok der Frequenz. Für eine Frequenz von 1 Hz wäre es also auch eine Sekunde, aber schon für 10 Hz nur noch 100 ms.

Schaltung
Entwurf der Messmethode
Messverfahren
Anzeige
Nutzung einer Bibliotheksfunktion für die Division
Makros
Bedingte Assemblierung
Nebeneffekte
vereinfachte Schaltung
Mögliche Änderungen
Programmlisting


- Frequenzbereich  
10 Hz bis 9999 Hz
- Auflösung
1 Hz
- Genauigkeit
2 Hz
- Anzeige
4 Stellen auf LED
-
Eingangspegel-Low

< 1V

Eingangspegel-High
> 4V
-
Stromaufnahme

< 100 mA
Stromlaufplan des Frequenzzählers


Schaltung
Der Frequenzzähler benutzt die Hardware der 4-stellige LED-Zifferanzeige, die auch schon in anderen Lernbeispielen eingesetzt wurde. Anstelle eines 4-MHz-Keramikresonators wird ein 20-MHz-Quarz eingesetzt. Die Pind RB3 und RA4 des PIC werden vertauscht, und als PIC wird ein PIC16F628 eingesetzt. Der Widerstand R9 schützt das Pin RB3 bei zu hohen und zu niedrigen Eingangsspannungen (max. ± 50 V). Der Eingang ist extrem hochohmig. Wird er offen gelassen, dann kann er leicht als "Antenne" für Störungen (z.B. das 50Hz Netzbrummen) arbeiten. Wen das stört, der kann den Eingang über einen 100kOhm-Widerstand mit Masse verbinden.
Der Quarz anstelle eines Resonators ist nötig, um die für eine 4-stellige Anzeige nötige Genauigkeit zu erreichen. Typische Quarze haben einen fehler von 50 ppm, was 0,005% entspricht. Bei einer Mess-Frequenz von 9999 Hz entsprechen 0,005% nur einem Fehler von 0,5Hz.



Entwurf der Messmethode

funktioniert hier die Zählmethode?
Ich habe schon in einigen Beispielen Frequenzen mit Hilfe des Timers0 mit der Zählmethode gemessen. Funktioniert das auch für niedrige Frequenzen? Da eine multiplex angesteuerte LED-Anzeige (die ja auch den Timer0 benutzt) die Frequenzmessung nach der Zählmethode behindert, müsste die Anzeige während der Frequenzmessung abgeschaltet werden. Damit das nicht als störendes Flackern sichtbar wird, kann nur eine sehr kurze Messzeit (Zählzeit) gewählt werden. Dadurch ist die Messgenauigkeit nicht sehr hoch. Mit einer Zählzeit von z.B. 10 ms erreicht man eine Messgenauigkeit von nur 100 Hz. (Messauflösung ist das Reziprok der Zählzeit.) Das ist nicht akzeptabel. Längere Zählzeiten führen aber zum deutlich sichtbaren Flackern des Displays. Damit scheidet die Zählmethode hier aus

Messung der Periodendauer
Alternativ kann man die Periodendauer des Eingangssignals messen, und daraus die Frequenz errechnen. Zur Messung der Periodendauer verwende ich das Capture-Modul des PIC16F628. Das Capturemodul behindert nicht die  LED-Anzeige und verwendet nicht den Timer0. Messung und Anzeige können deshalb parallel erfolgen.
Das Capturemodul besteht im Wesentlichen aus dem Timer1, der mit z.B. 625 kHz getaktet wird. Dieser Takt wird aus dem 20-MHz-PIC-Takt gewonnen, indem er erst durch 4 (Zyklustakt) und dann durch 8 (Vorteiler des Timer1) geteilt wird. Beim Eintreffen eines Pulses vom Eingang RB3 wird der Timer1 per Software auf 0 gesetzt. Dann zählt er mit 625 kHz. Alle 1,6 Mikrosekunden erhöht sich der Wert des Timers um 1.

Beim Eintreffen des nächsten Pulses wird der Timer1 (via Capture Modul) ausgelesen. Durch das Setzen des Bits CCP1IF wird ein Interrupt ausgelöst, in dem der "gecapturete" 16-Bit-Zählwert (CCPR1H & CCPR1L) aus dem Captureregister ausgelesen wird, und nur für Berechnungen zur Verfügung steht.

Capture Modul
Um aus diesem Messwert die Frequenz in Herz zu berechnen, muss der Reziprokwert des Zählergebnisses berechnet werden, und dieser Wert mit 625000 multipliziert werden. Also gilt auch:

Frequenz = 625000/Zählwert

Die folgende Tabelle zeigt Zählwerte für einige Frequenzen. Mit steigender Frequenz wird die Zahl der gezählten 1,6us-Takte geringer. Damit steigt der Abstand zwischen zwei möglichen Rechenergebnissen deutlich an. Der Zähler arbeitet nur noch in Stufen. Ein Zählergebnis von 65 entspricht 9615 Hz, ein Zählergebnis von 64 entspricht schon 9765 Hz. Zwischenergebnisse gibt es nicht. Der durschnittliche Messfehler bei so hohen Frequenzen beträgt deshalb etwa ±75 Hz. Das ist inakzeptabel.
Dieses Problem tritt erst oberhalb von 790 Hz auf. Hier sind also zusätzlich Maßnahmen erforderlich, um ein genaues Messergebnis zu garantieren.

Frequenz [Hz]
1
10
100
500
1000
9999
Zählwert
625 000 =  0x 09 89 68
62 500 = 0x F4 24
6 250 = 0x 18 6A
1 250 = 0x 04 E2
625 = 0x 02 71
62 = 0x 00 3E
Messauflösung
0,00016%
0,0016% = 0,00016 Hz
0,016% = 0,016 Hz
0,08% = 0,4 Hz
0,16% = 1,6 Hz
1,6% = 160 Hz
Anzeigeauflösung 1Hz =
100%
10%
1%
0,2%
0,1%
0,01%


untere Frequenzgrenze
Bei Frequenzen unterhalb 9,54 Hz überschreitet das Zählergebnis den Wert 65535 und wird somit länger als 16 Bit. Der Timer1 ist aber nur 16 Bit lang. Eine Softwareerweiterung des Timer1 auf 24 Bit wäre deshalb erforderlich, um Frequenzen unterhalb von 10 Hz zu messen. Darauf verzichte ich. Der Zähler wird also erst ab ca. 10 Hz arbeiten.

hohe Frequenzen
Um bei Frequenzen oberhalb von 790 Hz ein besser aufgelöstes Messergebnis  zu erhalten, wird nicht der Abstand zweier benachbarter Pulsen gemessen, sondern die  Gesamtdauer von 4 oder 16 Perioden. Das erreicht man durch die Verwendung des 4:1- oder 16:1-Vorteilers des Capture-Einganges. Erst nach jeweils 4 bzw. 16 Eingangsimpulsen wird dann der Timer1 (via Capture Modul) ausgelesen. 

Um aus diesem Messwert die Frequenz in Herz zu berechnen, muss der Reziprokwert des Zählergebnisses berechnet werden, und dieser Wert mit 2500000 oder 10000000 multipliziert werden. Also gilt:

Frequenz = 2 500 000/Zählwert      bei Vorteiler   4:1
Frequenz = 10 000 000/Zählwert      bei Vorteiler 16:1
Genauigkeit bei 625 kHz Zähltakt:
Frequenz [Hz]
600
1000
3000
9999
Zählwert 1:1
1 041 = 0x 04 11 625 = 0x 02 71 208 = 0x 00 D0
62 = 0x 00 3E
Zählwert 16:1
16 656= 0x 41 10 10 000 = 0x 27 10 3 328 = 0x 0D 00
992 = 0x 03 E0
Messauflösung 1:1
0,1% = 0,57 Hz 0,16% = 1,6 Hz 0,23% = 6,9 Hz
1,6% = 160 Hz
Messauflösung 4:1 0,025% = 0,14 Hz 0,04% = 0,4 Hz 0,06% = 1,7 Hz
0,4% = 40 Hz
Messauflösung 16:1 0,006% = 0,04 Hz 0,01% = 0,1 Hz 0,02% = 0,4 Hz
0,1% = 10 Hz

Die obige Tabelle zeigt die erzielbare Auflösung unter Anwendung des Vorteilers. Der 4:1-Vorteiler garantiert 1 Hz Auflösung nur bis etwa 1000 Hz, so dass sich gleich der 16:1-Vorteiler empfiehlt. Damit kann bis zu 3000 Hz eine Auflösung von 1 Hz erreicht werden. Danach steigt die Auflösung auf bis zu 10 Hz am Messbereichsende an.

Ein besseres Ergebnis lässt sich durch einen höheren Takt für den Timer 1 erreichen.Bei Nutzung eines 20-MHz-Quarzes stehen für den Timer1  die Frequenzen 5 MHz, 2,5 MHz, 1,25 kHz und 625 kHz zur Auswahl. Mit 5 MHz-Zähltakt wäre der Auflösungsfehler bei 9999 Hz-Messfrequenz auf etwa 1,25 Hz verringert. Die Formeln zur Frequenzberechnung sehen dann wie folgt aus:

Frequenz = 5 000 000/Zählwert      bei Vorteiler   1:1
Frequenz = 20 000 000/Zählwert      bei Vorteiler   4:1
Frequenz = 80 000 000/Zählwert      bei Vorteiler 16:1
Genauigkeit bei 5 MHz Zähltakt:
Frequenz [Hz]
800
1000
3000
9999
Zählwert 1:1
6 250 = 0x 18 6A 5 000 = 0x 13 88 1 666 = 0x 06 82
500 = 0x 01 F4
Zählwert 4:1
25 000 = 0x 61 A8 20 000 = 0x 4E 20 6 666 = 0x 1A 0A
2 000 = 0x 07 D0
Zählwert 16:1
100 0000 = 0x 01 86 A0 80 000 = 0x 01 38 80 26 656= 0x 68 20
8 000 = 0x 1F 40
Messauflösung 1:1
0,02% = 0,13 Hz 0,02% = 0,2 Hz 0,06% = 1,8 Hz
0,2% = 20 Hz
Messauflösung 4:1 0,005% = 0,03 Hz 0,005% = 0,05 Hz 0,015% = 0,45 Hz
0,05% = 5 Hz
Messauflösung 16:1 0,001% = 0,01 Hz 0,001% = 0,013 Hz 0,004% = 0,11 Hz
0,013% = 1,25 Hz



gewähltes Messverfahren
Wie man sieht, gibt es nicht das ideale Messverfahren. Deshalb wird prinzipiell erst einmal mit 625 kHz Zähltakt und 1:1-Vorteiler gessen. Wird dabei eine Frequenz unterhalb 813 Hz (Zählergebnis > 0x0300) festgestellt, wird das Messergebnis angezeigt. Ist die Frequenz aber zwischen 813 Hz und 4882 Hz (Zählergebnis der ersten Messung 0x2FF ... 0x0100), dann erfolgt sofort eine zweite Messung mit 5 MHz Zähltakt und 4:1 Vorteiler, was zu einer 32-fach verbesserten Messauflösung führt.
Oberhalb von 4882 Hz (Zählergebnis der ersten Messung < 0x0100) erfolgt die zweite Messung mit 5 MHz Zähltakt und 16:1 Vorteiler, was zu einer 128-fach verbesserten Messauflösung im Vergleich zur ersten Messung führt.
Nur das Ergebnis dieser zweiten Messung wird nun angezeigt.

Frequenzbereich
CCP-Vorteiler
Timer1-Takt
Berechnung
10 ... 812 Hz
1:1
625 kHz
Frequenz = 625000 / Zählwert
813 ...4882 Hz
4:1
5 MHz
Frequenz = 20 000 000 / Zählwert
4882 ...9999 Hz
16:1
5 MHz
Frequenz = 80 000 000 / Zählwert

Durch eine Verzögerung wird erreicht, dass maximal 4 Messungen pro Sekunde durchgeführt werden, damit das Display nicht zu unruhig wird.Diese Verzögerung ist an die Multiplexfrequenz des LED-Displays gekoppelt.



Anzeige

Die Anzeige erfolgt multiplex in 6 Schritten. In vier Schritten leuchtet jeweils eine Displaystelle auf. Die beiden restlichen Schritte stehen für die nötigen Berechnungen zur Verfügung. Jeder Schritt ist 1,6ms lang (gesteuert vom Timer0) woraus sich eine Display-Frequenz von 100 Hz errechnet. Das sollte genügen, um eine flimmerfreie Anzeige zu garantieren.



Nutzung einer Bibliotheksfunktion für die Division

Um aus dem Zählwert des Capturemodules die Frequenz zu ermitteln, muss man 625000 oder 5000000 oder gar 80000000 durch den Messwert dividieren. Um das in kurzer Zeit zu erledigen, möchte ich eine echte Divisionsroutine verwenden. Die gibt es schon als nutzbaren Fertigbaustein in der Bibliothek AN617. Die AN617 lädt man sich von der Microchip-Homepage. Sie besteht aus dem PDF-Dokument 00617.pdf sowie dem ZIP-File 00617.zip mit den eigentlichen Bibliotheksfiles. Das ZIP-File entpackt man in ein Verzeichnis.

Diese Bibliothek stellt verschiedenen Berechnungen für ganze Zahlen mit oder ohne Vorzeichen mit bis zu 32 Bit zur Verfügung. Da 80000000 im Binärsystem bereits 27 Bit lang ist, eignet sich für unsere Zwecke die Division einer 32-Bit-Zahl durch eine 24-Bit-Zahl.
Diese Funktion heißt FXD3224S und befindet sich im Bibliotheksfile FXD24.A16. Die Routine verwendet diverse Bezeichner, die im Includefile MATH16.INC definiert sind. Wir benötigen also die Files MATH16.INC und FXD24.A16 aus dem ZIP-File. Beide Dateien kopieren wir in unser Projektverzeichnis und binden sie mit #include-Direktiven in unser Projekt ein.

....
; Includedatei für den 16F628 einbinden
    #include <P16f628.INC>
    #INCLUDE <MATH16.INC>    ; PIC16 math library definitions, belegt 0x20 bis 0x4B

...
...
    #INCLUDE <FXD24.A16>

...

Die Bibliotheksfunktion verwendet eine ganze Reihe von Rechenregistern (siehe MATH16.INC) die im RAM des 16F628 den Bereich von 0x20 bis 0x4B belegen. Dieser Bereich bleibt also für den Rest der Software tabu. Erst ab 0x4C kann ich eigene Variablen definieren.
Bevor ich nun eine Division durchführe, kopiere ich meine Zahlen in die richtigen Rechenregister des Routine (AARGB3...0 und BARGB2...0), und rufe die Routine auf. Das Ergebns steht dann in AARGB3...1.

;**************************************************************
; 32/24 bit Division     f:= f / xw
; aus der Microchip-Bibliothek AN617
; AARG := AARG / BARG
; Microchip numeriert die Bytes anders herum als ich: aufpassen!
; A0-A1-A2-A3    B0-B1-B2
; f3-f2-f1-f0    x2-x2-x0
Div24
    MOVFW    f0
    MOVWF    AARGB3
    MOVFW    f1
    MOVWF    AARGB2
    MOVFW    f2
    MOVWF    AARGB1
    MOVFW    f3
    MOVWF    AARGB0
    MOVFW    xw0
    MOVWF    BARGB2
    MOVFW    xw1
    MOVWF    BARGB1
    MOVFW    xw2
    MOVWF    BARGB0

    CALL    FXD3224S

    MOVFW    AARGB3
    MOVWF    f0
    MOVFW    AARGB2
    MOVWF    f1
    MOVFW    AARGB1
    MOVWF    f2
    return

Wenn man von vornherein bei der Programmentwicklung beabsichtig, eine Bibliotheksfunktion zu nutzen, dann kann man auch gleich die Register der Funktion in der eigenen Software nutzen. Ich habe aber die Biblitheksfunktion zu einem recht späten Zeitpunkt in das Programm hineingebaut, um die Berechnung zu beschleunigen. Dadurch musste ich diese umfangreichen Kopierereien in der Routine Div24 verwenden. Nun ja, im Ergebnis habe ich eine schnelle Divisionsroutine.




Makros

Mit der #define-Direktive lassen sich Bezeichner definieren, die im Programm für bestimmte Texte verwendet werden können. Stößt der Assembler (Preprozessor) später im Programmcode auf so einen Bezeichner, dann ersetzt er ihn durch den definierten Text.

De Text kann auch komplette Assemblerbefehle enthalten, wie im folgenden Beispiel zu sehen:

...
#define    Ziffer0_aus    bsf    PORTA, 3    ; Ziffer0 aus
#define    Ziffer0_an     bcf    PORTA, 3    ; Ziffer0 an

...

Nach dieser Definition können Ziffer0_aus und Ziffer0_an im Quelltext verwendet werden, und der Assembler setzt selbsttätig dafür die richtigen bcf- oder bsf-Befehle ein. Das verbesser die Lesbarkeit des Codes.



Bedingte Assemblierung

Definierte Bezeichner kann man auch benutzen, um bestimmte Teile des Quelltextes "abzuschalten" oder "einzuschalten".  Dafür gibt es die #ifdef und #endif-Deklarationen (gibt es auch in der Sprache C)

Mit #ifdef und #endif kann man einen Programmabschnitt wie mit Klammern einschließen. Stößt der Assembler (Preprozessor) bei seiner Arbeit auf so einen Programmabschnitt, so prüft er, ob er den Bezeichner hinter #ifdef kennt. Ist das nicht der Fall, dann wird der gesamte Programmblock ignoriert. Das folgende Beispiel zeigt das. In diesem Fall wird der Programmabschnitt verwendet, da der Bezeichner Haleluja bereits bekannt ist. Er wurde vorher definiert.

...
#define    Haleluja
...

#ifdef
Haleluja

; hier kann Programmcode stehen

#endif
...

Es gibt auch noch eine #else-Direktive. Mit der sich eine #ifdef-#else-#endif -Konstruktion bauen lässt, die zwei alternative Programmblöcke enthält. Ja nachdem ob der hinter #ifdef stehende Bezeicher bekannt ist, wird der Programmblock zwischen #ifdef und #else oder der Programmblock zwischen #else und #endif verwendet.
Das Folgende Beispiel ist ein Ausschnitt aus dem Frequenzzählerprogramm. Es definiert 8 Makros. Je nachdem, ob der Bezeichner "Treiber" definiert ist, werden die 8 Makros aber unterschiedlich definiert.

...
#define    Treiber            ; Treibertransistor vorhanden
...
; Makros
#ifdef Treiber

; das sind die Makros fuer ein LED-Display mit Treibertransistoren an den Anoden
#define    Ziffer0_aus    bsf    PORTA, 3    ; Ziffer0 aus
#define    Ziffer1_aus    bsf    PORTA, 2    ; Ziffer1 aus
#define    Ziffer2_aus    bsf    PORTA, 1    ; Ziffer2 aus
#define    Ziffer3_aus    bsf    PORTA, 0    ; Ziffer3 aus
#define    Ziffer0_an     bcf    PORTA, 3    ; Ziffer0 an
#define    Ziffer1_an     bcf    PORTA, 2    ; Ziffer1 an
#define    Ziffer2_an     bcf    PORTA, 1    ; Ziffer2 an
#define    Ziffer3_an     bcf    PORTA, 0    ; Ziffer3 an

#else

; das sind die Makros fuer ein LED-Display mit direkter Ansteuerung der Anoden ohne Treiber
#define    Ziffer0_aus    bcf    PORTA, 3    ; Ziffer0 aus
#define    Ziffer1_aus    bcf    PORTA, 2    ; Ziffer1 aus
#define    Ziffer2_aus    bcf    PORTA, 1    ; Ziffer2 aus
#define    Ziffer3_aus    bcf    PORTA, 0    ; Ziffer3 aus
#define    Ziffer0_an     bsf    PORTA, 3    ; Ziffer0 an
#define    Ziffer1_an     bsf    PORTA, 2    ; Ziffer1 an
#define    Ziffer2_an     bsf    PORTA, 1    ; Ziffer2 an
#define    Ziffer3_an     bsf    PORTA, 0    ; Ziffer3 an

#endif
...




Nebeneffekte

Das Multiplexen der Anzeige erfolgt mittels einer einfachen Programmschleife und dem Timer0. Der Timer0 wird so eingestellt, dass er alle 3,3 ms das T0IF-Flag setzt. Der Timer0-Interrupt ist aber nicht erlaubt. Stattdessen wird das T0IF-Flag einfach in einer Schleife abgefragt, und wenn das Bit gesetzt ist, wird in die Anzeigeroutine gesprungen, um die nächste Stelle des Displays anzuzeigen.
Das CCP-Modul löst am Ende jeder Messung einen Interrupt aus, damit der Messwert aus dem CCP-Modul in die Rechenroutinen übernommen werden kann.

Werden versehentlich extrem hohe Frequenzen an den Eingang des Frequenzzählers angelegt, dann erfolgen die Interrupts des CCP-Moduls so dicht hintereinander, dass der PIC zu nichts anderem mehr kommt. Das bedeutet insbesondere, dass er sich nicht mehr um das Multiplexen des Displays kümmert. Die Anzeige bleibt "stehen", nur allerhöchstens eine Stelle des Displays leuchtet nun, diese dafür aber mit viel höherer Helligkeit. Dieser Effekt tritt erst bei Frequenzen von weit über 300 kHz auf, man könnte ihn also verbachlässigen, unschön ist es aber trotzdem.

Eine einfache (wenn auch nicht sehr elegante) Lösung des Problems ist der Einsatz des Watchdogtimers (WDT). Dieser wird in der Konfiguration aktiviert, und er würde immer nach ca. 18ms einen Reset des PICs auslösen, wenn er nicht regelmäßig durch den Befehl clrwdt  zurückgesetzt werden würde. Das Zurücksetzen erfolgt immer dann, wenn durch den Timer0 die Displaymultiplexroutine aufgerufen wird. Da dieser Aufruf normalerweise alle 3,3ms erfolgt, bekommt der WDT also normalerweise auch nichts zu tun. Nur wenn extrem hohe Eingangsfrequenzen das Multiplexen blockieren, wird der PIC neu gestartet, was im Display ein '----' oder '____' erzeugt.

; Anzeigeschleife
disploop
    btfss   INTCON, T0IF
    goto    disploop
    clrwdt                ; watchdog zuruecksetzen bevor 18 ms vorbei sind (7..33 ms)
    bcf     INTCON, T0IF
    call    Display
    goto    disploop




vereinfachte Schaltung

Kann man nicht auf die Treibertransitoren verzichten?

Im Prinzip schon, dann muss der PIC aber den Gesamtstrom des Displays verkraften. Wie man an nebenstehender Schaltung erkennt, müssen RA0..RA3 den Strom von bis zu 7 Segmenten liefern. Aus diesem Grunde müssen die Segmentströme klein gewählt werden, und die strombegrenzenden Segmentwiderstände müssen entsprechend groß ausgelegt werden.
Widerstände von 680 Ohm bewirken Segmentströme von je 5 mA. Die Pins RA0..RA3 werden kurzfristig mit bis zu 35mA belastet. Aufgrund des Multiplexverfahrens ist das noch zulässig, der Durchschnittsstrom liegt dabei immer unter 6mA.

Die geringen Ströme erfordern hocheffektive Displays. Ein geeigneter Typ ist das Display "Kingsbright SA39-11SRWA", das bei Reichelt für unter der Bezeichnung "SA39-11 RT" für etwa 0,50 Euro/Stück erhältlich ist.

Die nötige Anpassung der Software beschränkt sich auf eine Invertierung der Signale an den Pins RA0..RA3.
Stromlaufplan ohne Transistoren



Mögliche Änderungen
noch keine


Programmlisting

Version mit Treibertransistoren

Version ohne Treibertransistoren


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage

Autor: sprut
erstellt: 15.12.2009
letzte Änderung: 25.03.2010