: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 Ausgnge *************************************
" Schaltungs-Eingnge
messfreq PIN 30; "zu messende Frequenz
systemtakt PIN 11; "Takt f¸r Torzeit und Steuerung 10Hz
" synchroner Dezimalzhler 00-99 zhlt die Anzahl der Impulse pro 1 Sekunde
ctrZbit3..ctrZbit0 NODE ISTYPE'BUFFER,REG'; "Flipflops Dezimal-Zhler Zehner
ctrEbit3..ctrEbit0 NODE ISTYPE'BUFFER,REG'; "Flipflops Dezimal-Zhler Einer
ctrZ = [ctrZbit3..ctrZbit0]; "Zusammenfassung Zhler Zehner
ctrE = [ctrEbit3..ctrEbit0]; " Einer
" asynchrones R¸cksetzen der Dezimalzhler
ctrreset NODE; "interne Hilfslogik notwendig weil
"when (ctrsteuer.q == 11) then ctrE.ar = 1; nicht funktioniert !!!
" Codeumsetzer-Ausgnge 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
" Zhler Steuerung. Zahlen 0-9: Torzeit, 10: Latch¸bernahme, 11: Reset Impulszhler
ctrsteuerbit3..ctrsteuerbit0 NODE ISTYPE'BUFFER,REG'; "
ctrsteuer = [ctrsteuerbit3..ctrsteuerbit0]; "Zhler Steuerung
" Latch zum Speichern der alten Anzeige-Ergebnisse whrend der neuen Messung
latchout7..latchout0 NODE ISTYPE'BUFFER,REG'; "8-Bit-Latch
latchZ = [latchout7..latchout4]; "4 Bit f¸r jeden Zhler
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 Impulszhler Einerstelle = ctrE, Zehnerstelle = ctrZ *******
"whrend der Steuerungszhler von 0 bis 9 zhlt, darf der
"2-stellige Dezimalzhler die eintreffende Impulse zhlen = 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 weiterzhlen
}
else { ctrE.d = ctrE.q + 1; "E<>9 -> E weiterzhlen
ctrZ.d = ctrZ.q; "E<>9 -> Z unverndert
}
ctrE.ar = ctrreset; "asynchroner Reset Impulszhlers
ctrZ.ar = ctrreset;
"********* Steuerungszhler 0-11 *************************************************
when (ctrsteuer.q == 11) "Zhlerstand 11
then { ctrsteuer.d = 0; "synchrones R¸cksetzen Steuerungszhler
ctrreset = 1; "asynchrones R¸cksetzen setzen Impulszhler
}
else ctrsteuer.d = ctrsteuer.q+1; "weiterzhlen Steuerungszhler
when (ctrsteuer.q == 9) "beim folgenden Zhlerstand 10
then { latchZ.d = ctrZ.q; "Speichern Impulszhlerstand in die Latch
latchE.d = ctrE.q;
}
else { latchZ.d = latchZ.q; "sonst Latchinhalt unverndert
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:
