MezData-Logo Lösungen Button :ISP: Lösung Frequenzmessung

MODULE freqmes
"Frequenzmessung mit 2-stelliger Anzeige 
"Systemtakt (Y0) so abgleichen, da&Mac223; rechter Dezimalpunkt mit 1 Hz blinkt
"zu messende Frequenz (TTL!) an E/A-Pin 30
@dcset; 

DECLARATIONS "************* Ein- und Ausg‰nge *************************************
" Schaltungs-Eing‰nge
  messfreq            PIN 30;                  "zu messende Frequenz 
  systemtakt          PIN 11;                  "Takt f¸r Torzeit und Steuerung 10Hz

" synchroner Dezimalz‰hler 00-99 z‰hlt die Anzahl der Impulse pro 1 Sekunde
  ctrZbit3..ctrZbit0  NODE ISTYPE'BUFFER,REG'; "Flipflops Dezimal-Z‰hler Zehner
  ctrEbit3..ctrEbit0  NODE ISTYPE'BUFFER,REG'; "Flipflops Dezimal-Z‰hler Einer
  ctrZ  =  [ctrZbit3..ctrZbit0];                     "Zusammenfassung Z‰hler Zehner
  ctrE  =  [ctrEbit3..ctrEbit0];                     "                       Einer

" asynchrones R¸cksetzen der Dezimalz‰hler
  ctrreset            NODE;                    "interne Hilfslogik notwendig weil
                "when (ctrsteuer.q == 11) then ctrE.ar = 1; nicht funktioniert !!!

" Codeumsetzer-Ausg‰nge BCD/7-Segment
  a2,b2,c2,d2,e2,f2,g2 PIN 38,37,40,41,42,43,44 ISTYPE'BUFFER,com'; "Anzeige Einer
  a1,b1,c1,d1,e1,f1,g1 PIN 4,3,6,7,8,9,10       ISTYPE'BUFFER,com'; "Anzeige Zehner

" Z‰hler Steuerung. Zahlen 0-9: Torzeit, 10: Latch¸bernahme, 11: Reset Impulsz‰hler
  ctrsteuerbit3..ctrsteuerbit0   NODE ISTYPE'BUFFER,REG'; "
  ctrsteuer = [ctrsteuerbit3..ctrsteuerbit0];             "Z‰hler Steuerung

" Latch zum Speichern der alten Anzeige-Ergebnisse w‰hrend der neuen Messung
  latchout7..latchout0           NODE ISTYPE'BUFFER,REG'; "8-Bit-Latch
  latchZ = [latchout7..latchout4];                        "4 Bit f¸r jeden Z‰hler
  latchE = [latchout3..latchout0];

" Blinkender Punkt zum Abgleich des Systemtakts, mu&Mac223; 1Hz anzeigen
  punkt                PIN 39 ISTYPE'BUFFER,COM';     "Dezimalpunkt rechte Anzeige
  ctrblink3..ctrblink0 NODE   ISTYPE'BUFFER,REG';
  ctr1Hz = [ctrblink3..ctrblink0];

"*************  Funktionstabelle Anzeige Einer ***********************************
TRUTH_TABLE (latchE -> [a2,b2,c2,d2,e2,f2,g2]) "
 	0 -> [1,1,1,1,1,1,0]; "       LEDs high-aktiv!
		1 -> [0,1,1,0,0,0,0];	" 		       a
		2 -> [1,1,0,1,1,0,1];	"	        ---
		3 -> [1,1,1,1,0,0,1];	"	     f | g | b
		4 -> [0,1,1,0,0,1,1];	"	        ---
		5 -> [1,0,1,1,0,1,1];	"	     e | d | c
		6 -> [1,0,1,1,1,1,1];	"	        ---
		7 -> [1,1,1,0,0,0,0];
		8 -> [1,1,1,1,1,1,1];
		9 -> [1,1,1,1,0,1,1];

"************* Funktionstabelle Anzeige Zehner ***********************************
TRUTH_TABLE (latchZ -> [a1,b1,c1,d1,e1,f1,g1]) "
 	0 -> [1,1,1,1,1,1,0];
		1 -> [0,1,1,0,0,0,0];
		2 -> [1,1,0,1,1,0,1];
		3 -> [1,1,1,1,0,0,1];
		4 -> [0,1,1,0,0,1,1];
		5 -> [1,0,1,1,0,1,1];
		6 -> [1,0,1,1,1,1,1];
		7 -> [1,1,1,0,0,0,0];
		8 -> [1,1,1,1,1,1,1];
		9 -> [1,1,1,1,0,1,1];

 EQUATIONS
"********* 2-stelliger Impulsz‰hler Einerstelle = ctrE, Zehnerstelle = ctrZ *******
         "w‰hrend der Steuerungsz‰hler von 0 bis 9 z‰hlt, darf der 
         "2-stellige Dezimalz‰hler die eintreffende Impulse z‰hlen = Torzeit
 when (ctrE.q == 9)                                    "wenn      -> dann
   then { ctrE.d = 0;                                  "E=9       -> E=0
          when (ctrZ.q == 9) 
            then { ctrZ.d = ctrZ.q; ctrE.d = ctrE.q; } "E=9, Z=9  -> stehenbleiben
            else ctrZ.d = ctrZ.q +1;                   "E=9, Z<>9 -> Z weiterz‰hlen
        } 
   else { ctrE.d = ctrE.q + 1;                         "E<>9      -> E weiterz‰hlen
          ctrZ.d = ctrZ.q;                             "E<>9      -> Z unver‰ndert
        }
 ctrE.ar = ctrreset;                              "asynchroner Reset Impulsz‰hlers
 ctrZ.ar = ctrreset;

"********* Steuerungsz‰hler 0-11 *************************************************  
 when (ctrsteuer.q == 11)               "Z‰hlerstand 11
   then { ctrsteuer.d = 0;              "synchrones R¸cksetzen Steuerungsz‰hler
          ctrreset = 1;                 "asynchrones R¸cksetzen setzen Impulsz‰hler
        }
   else  ctrsteuer.d = ctrsteuer.q+1;   "weiterz‰hlen Steuerungsz‰hler

 when (ctrsteuer.q == 9)                "beim folgenden Z‰hlerstand 10
   then { latchZ.d = ctrZ.q;            "Speichern Impulsz‰hlerstand in die Latch
          latchE.d = ctrE.q;
        }                
   else { latchZ.d = latchZ.q;          "sonst Latchinhalt unver‰ndert
          latchE.d = latchE.q;
        }  
 
"********* 1 Hz - Blinker ********************************************************
 when (ctr1Hz.q == 9) then ctr1Hz.d = 0;  "Zähler 0..9       
                      else ctr1Hz.d = ctr1Hz.q+1;
 when (ctr1Hz.q > 4) then punkt = 1;      "5 bis 9: Dezimal-Punkt rechts leuchtet
                     else punkt = 0;      "0 bis 4: Dezimal-Punkt rechts dunkel

"********* Takte *****************************************************************
 ctrZ.clk      = messfreq;   "Takt fuer synchronen Impulszaehlers 
 ctrE.clk      = messfreq;        "
 ctrsteuer.clk = systemtakt; "Steuerung und Latch erhalten den Systemtakt von 10 Hz
 latchZ.clk    = systemtakt;
 latchE.clk    = systemtakt;
 ctr1Hz.clk    = systemtakt;

TEST_VECTORS 

( [messfreq,systemtakt] -> 
  [ctrsteuerbit3..ctrsteuerbit0,ctrreset,ctrZbit3..ctrZbit0,ctrEbit3..ctrEbit0] );

 @repeat 12 { [.c.,.c.] -> [.x.,.x.,.x.,.x.,.x.,.x.,.x.,.x.,.x.,.x.,.x.,.x.,.x.];}

END

 Simulationsergebnis: