Hello Steve,
I have run into some problem using your code for a 16F628A with a 16x2 LCD.
I am basically making a audio frequency counter, which would then be used to control a set of 8 LED's depending upon the Input frequency on PORTB.
Keeping this in mind I tried to output the frequency on the LCD but I get jumping figures at high speed. I believe , I have to introduce a delay between the display. Secondly , connecting 10K to ground on Pin#3 with 1K in series , as your circuit says, I don't get any reading. Which means , I need some impedence matching or may be a signal conditioner.
My audio source is from my desktop computer , audio out.
my code so far -
Code:
@ __CONFIG _HS_OSC & _MCLRE_OFF & _LVP_OFF & _WDT_ON & _PWRTE_ON & _BODEN_ON
DEFINE OSC 20
;76543210
TRISB = %00000000
TRISA = %11110000
DEFINE LCD_DREG PORTB 'Define PIC port used for LCD Data lines
DEFINE LCD_DBIT 0 'Define first pin of portb connected to LCD DB4
DEFINE LCD_RSREG PORTB 'Define PIC port used for RS line of LCD
DEFINE LCD_RSBIT 5 'Define Portb pin used for RS connection
DEFINE LCD_EREG PORTB 'Define PIC prot used for E line of LCD
DEFINE LCD_EBIT 4 'Define PortB pin used for E connection
DEFINE LCD_BITS 4 'Define the 4 bit communication mode to LCD
DEFINE LCD_LINES 2 'Define using a 2 line LCD
'DEFINE LCD_COMMANDUS 2000 'Define delay between sending LCD commands
'DEFINE LCD_DATAUS 50 'Define delay time between data sent.
' 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
CMCON = 7 ' disable analog comparator
VRCON = 0 'turns off Vref for min current
' 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
if tobedisplay>=1000 then
tobedisplay=tobedisplay/10
Thousands=0
TenThousands=1
else
TenThousands=0
thousands=1
endif
else
thousands=0
tenthousands=0
endif
LCDOut $FE,$C0, "COUNT: ",DEC tobedisplay , " "
gosub DelayBetweenEachDigit
tobedisplay = OverFlowVar + TMR0
OverFlowVar = 0 ' Reset OverFlowVar
TMR0 = 0 ' reset prescaller
goto DisplayRefresh
goto DisplayRefresh
goto DisplayRefresh
goto DisplayRefresh
goto DisplayRefresh
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
Bookmarks