Code:
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE ADC_BITS 100
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
SDA var PORTC.4
SCL var PORTC.3
BTN1 VAR PORTD.0 ' BUTON 1
symbol So = PORTE.0 ' Serial output pin
symbol capture = PIR1.2 ' CCP1 capture flag
symbol overflow = PIR1.0 ' Timer1 overflow flag
TRISA = %11111111
TRISB = %00000001
ADCON1 = %10000010
ADD VAR WORD
ADDO VAR WORD
FX VAR WORD
f2 var word
VOLT VAR WORD
AMPER VAR WORD
y var word
F1 VAR WORD
per var word
fre var word
MS VAR WORD
period VAR WORD ' Word variable that stores the value
sec var byte
mnt var byte
hour var byte
day var byte
month var byte
year var byte
CCP1CON = %00000100 ' Enable the CCP1 capture, falling edge
T1CON = %00000001 ' TMR1 prescale=1, and turn it on (1uS per count)
BOOT:
LCDOut $fe, 1
LCDOut " "
LCDOut $fe,$c0," "
pause 6
ADD =10
loop:
IF (capture = 0) Then loop ' Wait here until captured
period.lowbyte = CCPR1L ' Store the captured value in
period.highbyte = CCPR1H ' period variable
IF overflow = 0 Then ' Skip the output if the timer overflowed
' So=period
goto adcloop
EndIF
capture = 0 ' Clear the capture flag
reset:
IF (capture = 0) Then reset ' Wait for beginning of next period
TMR1L = 0 ' Clear Timer1 low register
TMR1H = 0 ' Clear Timer1 high register
capture = 0 ' Clear capture flag
overflow = 0 ' Clear overflow flag
goto loop
ADCLOOP:
ADCIN 0, VOLT
PAUSE 40
ADCIN 1, AMPER
amper = (amper */ 15)>>2
i2cread SDA,scl,%10100000,2,[sec,mnt,hour,day,month]
CKP =1
year.3 = 1
year.2 = 0
year.1 = day.6
year.0 = day.7
month.5 =0
month.6 =0
month.7 =0
'day.5 =0
day.6 =0
day.7 =0
pause 25
f1 = period / 100
f1 = 10000 / f1
y = 10000/ f1
y = y*100
if y > period then
f2 =">"
else
f2 ="<"
endif
LCDOut $fe, 1
Lcdout hex2(hour),hex2(mnt),hex2(Sec), "-", hex2(day),".", hex2(month),"." , hex2(year)
LCDOut $fe,$c0,"V="
Lcdout dec VOLT
lcdout " I="
Lcdout dec AMPER
LCDOut " F"
Lcdout F2,"=",dec F1
ADD = ADD +1
I2CWRITE SDA,SCL,$A6,ADD,[ADD],BOGUS
PAUSE 50
IF BTN1 THEN OKU
GoTo loop ' Do it forever
OKU :
FOR ADDO =10 TO ADD
I2CREAD SDA,SCL,$A7,ADDO,[FX],BOGUS
PAUSE 25
SEROUT2 So,84,[DEC ADDO ,"--", DEC(FX), 13,10]
PAUSE 50
NEXT
GOTO LOOP
bogus:
LCDOut $fe,1, "timed out" ' I2C command timed out
Pause 1000
RETURN
End
Bookmarks