Hello again,
M E Labs has a lot of code samples, many of you have examples there, and here is a sample from mister_e that I believe will do what I need without all the overhead associated to using latches. I am posting it here as the download from ME Labs has some cut paste errors, specificly duplicate IF THEN loop which upset my compiler's little tummyI modified mister_e's code only enough to port it to a 16F628A, . . . Great piece of work Steve ! Thank You !
Code:' Pulse counter ' ============= ' ' File name : Count_Display.bas ' Company : Mister E ' Programmer : Steve Monfette ' Date : 27/12/2004 ' Device : PIC16F84A-20/P ' ' ' This program display to 3 x 7 segments dislay the result of ' pulses count on PORTA.4 pin/sec. ' ' Hardware connection : ' --------------------- ' 1. 3 X 7 segments display on PORTB<7:0> ' 2. 3 X PNP transistor on PORTA<3:0> to drive common anode ' of each 7 segments display ' ' ' Programming mode and PIC define ' ------------------------------- ' @ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF CMCON=7 ' ADDED FOR PIC16F628A DEFINE OSC 20 ' use 20 MHZ oscillator ' I/O Definition ' -------------- ' TRISA = %11111000 ' PORTA : <2:0> outputs to common Anode of 7 segment ' 1. PORTA.0 More significant ' 2. PORTA.2 Less significant ' : PORTA.4 input for signal ' TRISB = 0 ' PORTB connected to 7 segments ' B0 : segment a ' B1 : segment b ' B2 : segment c ' B3 : segment d ' B4 : segment e ' B5 : segment f ' B6 : segment g ' B7 : segment decimal dot ' Internal EEPROM definition ' -------------------------- ' data @0,192,249,164,176,153,146,130,248,128,144 ' table to convert ' numbers to 7 segments ' pattern output when ' drive invert ' Interrupt and register definition ' --------------------------------- OPTION_REG = %1111000 ' TMR0 clock source : RA4/T0CKI ' increment on low to high transition ' Prescaler assign to WDT ' WDT rate 1:1 ' INTCON = %10100000 ' Enable global interrupt ' Disable EE write interrupt ' Enable TMR0 overflow interrupt ' Variable definition ' ------------------- ' DisplayPort var PORTB ' Port for 7 Segments ClockInput var PORTA.4 ' Input pin for signal _7Seg1 con 14 ' enable more significant 7 segment display _7Seg2 con 13 ' enable mid significant 7 segment display _7Seg3 con 11 ' enable less significant 7 segment display Digit_1 var byte ' Hundreds digit Digit_2 var byte ' Tenth digit Digit_3 var byte ' Unit digit ToBeDisplay var word ' Result of count to be send to 7 segment display Display var byte ' Temp variable DisplayLoop var byte ' Delay var word ' Variable for Delay loop OverFlowVar var word ' Thousands var bit ' Flag for count >= 1000 & < 10 000 TenThousands var bit ' Flag for count >= 10 000 ' Variable and software initialisation ' ------------------------------------ ' tobedisplay = 0 ' set initial value of count TMR0 = 0 ' reset prescaller On interrupt GoTo SetVarToBeDisplay MainLoop: ' MainLoop ' --------- ' ' 1. display the result of the count on RA4 pin ' 2. refresh display ' 3. reset Timer0 ' 4. reload prescaler. ' ' Duration of the procedure : 1 sec ' fine tuned by DelayBetweenEachDisplay Sub ' ' Looping 1 sec and get results of the pulse count in ' TMR0 + OverFlowVar ' DisplayRefresh: ' ' Testing amount of count ' ----------------------- ' ' Get the result of count and place decimal point flag ' on the according 7 segments ' If tobedisplay>= 1000 Then tobedisplay = tobedisplay / 10 Else tenthousands = 0 thousands = 1 EndIf ' ' convert digit to 7 segment output pattern ' ----------------------------------------- display=ToBeDisplay dig 2 ' Read hundreds digit read display, digit_1 ' Convert hundreds if thousands==1 then digit_1=digit_1 & $7F ' enable decimal dot ' by clearing PORTB.7 display=ToBeDisplay dig 1 ' Read tenths digit read display, digit_2 ' Convert tens if tenthousands==1 then digit_2=digit_2 & $7F ' enable decimal dot ' ' by clearing PORTB.7 display=ToBeDisplay dig 0 ' Read units digit read display, digit_3 ' Convert units ' ' ' Send digit to 7 segments ' ------------------------ For displayloop = 0 To 111 ' loop for about 1 sec ' display hundreds ' ---------------- PORTA=_7seg1 ' enable hundreds 7 segment displayport = digit_1 ' display GoSub DelayBetweenEachDigit ' display tenth ' ------------- PORTA=_7seg2 ' enable tenth 7 segment displayport = digit_2 ' display GoSub DelayBetweenEachDigit ' display units ' ------------- PORTA=_7seg3 ' enable unit 7 segment displayport = digit_3 ' display GoSub DelayBetweenEachDigit Next tobedisplay = OverFlowVar + TMR0 OverFlowVar = 0 ' Reset OverFlowVar TMR0 = 0 ' reset prescaller GoTo DisplayRefresh DelayBetweenEachDigit: ' DelayBetweenEachDigit ' --------------------- ' Produce delay of about 3 mSec ' ' Fine tuned with MPLAB StopWatch to get MainLoop = 1 sec ' For delay = 1 To 307 @ nop Next @ nop @ nop @ nop @ nop @ nop @ nop @ nop Return disable SetVarToBeDisplay: ' ' SetVarToBeDisplay ' ----------------- ' interrupt routine of TMR0 overflow ' ' Reset prescaller ' Reset overflow flag ' OverFlowVar = OverFlowVar + 256 INTCON.2 = 0 ' clear overflow flag TMR0 = 0 ' reload TMR0 Resume enable END


I modified mister_e's code only enough to port it to a 16F628A, . . . Great piece of work Steve ! Thank You !


Bookmarks