Code:
define CODE_SIZE 48
define OSC 8
Include "modedefs.bas" ' Mode definitions for Serout
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 12 ' 9600 Baud @ 8MHz, 0.16%
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 12 ' 9600 Baud @ 8MHz, 0.16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
''''''''THIS IS WHAT I NORMAL USE TO CONFIGURE TX/RX for SERIAL
'DEFINE DEBUG_REG PORTC
'DEFINE DEBUG_BIT 5
'DEFINE DEBUG_BAUD 9600
'DEFINE DEBUG_MODE 1 ' 1 = inverted, 0 = true
'DEFINE DEBUGIN_REG PORTC
'DEFINE DEBUGIN_BIT 7
'DEFINE DEBUGIN_MODE 1 ' 1 = inverted, 0 = true
Switch4 var PortD.0
Switch3 var PortE.2
Switch2 var PortC.0
Switch1 var PortC.3
MotorSpeed var PortC.1
Population var PortC.2
Enable4 var PortD.1
Enable3 var PortD.2
Enable2 var PortD.3
Enable1 var PortD.4
Input1 var PortB.1
Input2 var PortB.4
Input3 var PortB.3
Input4 var PortD.7
LCD var PortD.5
WTX Var PortC.5
WRX var PortC.7
StandAlone var PortD.6
RPM var word
Duty1 Var Word
Duty2 Var Word
Duty3 Var Word
Duty4 Var Word
Duty1S data word 200 '20% Duty Cycle
Duty2S data word 400 '20% Duty Cycle
Duty3S data word 600 '20% Duty Cycle
Duty4S data word 800 '20% Duty Cycle
HighCycle var word
LowCycle var word
BCD1 var byte
BCD10 var byte
TotalRate var word
TotalRate1 var word
TotalRate2 var word
TotalRate3 var word
TotalRate4 var word
RPM1 var word
RPM2 var word
RPM3 vaR WORD
RPM4 VAR WORD
MotorCount var byte 'Tracks motorspeed input
HighTime1 var word
LowTime1 var word
HighTime2 var word
LowTime2 var word
HighTime3 var word
LowTime3 var word
HighTime4 var word
LowTime4 var word
TotalTime1 var word
TotalTime2 var word
TotalTime3 var word
TotalTime4 var word
Freq var word
UpperLimit VAR word
LowerLimit VAR word
ChannelCount var byte
TotalTime var word
MaxTotalTime var word
UnitID var byte
EPDID var byte
Rate1 var word
Rate2 var word
Rate3 var word
Rate4 var word
T1 var word 'Used to measure RPM
T2 var word 'Used to measure RPM
T3 var word 'Used to measure RPM
RSTATE1 var byte
RSTATE2 var byte
RSTATE3 var byte
RSTATE4 var byte
GoodBad var bit
Prefix con $FE
LcdCls CON $51
CursorPS con $45
Backlight con $53
Contrast con $52
INTCON.7 = 1
INTCON.6 = 1
INTCON2.7 = 1 'Pull Ups disabled
ADCON0 = 0 'A/D OFF
ANSEL0 = %00010000 'All analogue channels to digital except AN4
ANSEL1 = %00000000 'All analogue channels to digital
TRISA = %111111 'PortA to inputs
TRISB = %00100000 'PortB to outputs, except B5----------------------------------------------------04
TRISC = %10010110 'PortC, Switch3 and Switch4 outputs; Motorspeed and Population inputs
TRISD = %01000000 'PortD, Switch 1 output; Enable1-4
TRISE = %011
PWMCON0=%01111111 'All odd PWMs enabled, all independent
PTCON0 = %00001000 '2.0khz=00000100 2.9khz=00000000 '400hz/20Mhz=00001000
Freq= 249 '2.0kHz=249 2.9kHz=50000 '400hz/20mHz=50000
LowerLimit=100 '200 is 6%
UpperLimit=1000 '1000=100% (Max is 3332 3000 is 90% for 2.9khz)
PTPERL =Freq.LowByte '
PTPERH =Freq.HighByte
Symbol Capture = PIR2.0 ' CCP2 capture flag
Symbol Overflow = PIR1.0
Overflow = 0 '
PWMCON1 = 1 ' updates enabled, overrides sync w/timebase
PTCON1 = %11000000 ' PWM time base is ON, counts up 500hz
FLTCONFIG = %00000000 ' enable fault A, cycle-by-cycle mode
RCSTA.7=1 'SPEN serial port enable bit
INTCON = 0 ' Interrupts off
CCP2CON = %00000101 ' Capture mode, capture on rising edge
T2CON = %10000001 ' TMR1 prescale=1, clock=Fosc/4, TMR1=on
T1CON = %10010001 ' TMR1 prescale=1, clock=Fosc/4, TMR1=on
rpm=0
TotalTime1=0
MaxTotalTime=20000
pause 100
Serout2 LCD, 84, [Prefix,LcdCLS]
pause 10
SEROUT2 LCD,84, [Prefix,CursorPS,0, "EPD HSERINTEST"]
pause 2000
Serout2 LCD, 84, [Prefix,LcdCLS]
'::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX_INT, _Get_char, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
'::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::
@ INT_ENABLE RX_INT ; enable external (INT) interrupts
goto OverISRs:
Get_char:
HSERIN 100, BadData, [wait ("I"),RPM.LowByte,rpm.highbyte,RSTATE1,RSTATE2,RSTATE3,RSTATE4]
GoodBad=1
goto GoodData
BadData:
goodBad=0
GoodData:
@ INT_RETURN
OverISRs:
RunAround:
gosub DisplayData
goto RunAround
DisplayData:
If GoodBad = 1 then
SEROUT2 LCD,84, [Prefix,CursorPS,0, "Good Data"]
else
SEROUT2 LCD,84, [Prefix,CursorPS,0, "Bad Data"]
endif
GoodBad = 0
return
MeasureRPM:
If MotorCount = 1 then
If Enable1 = 0 then
High Switch1
Low Switch2
Low Switch3
Low Switch4
gosub Get_RPM
hightime1=HighCycle
lowtime1=lowcycle
TotalTime1 = HighTime1+LowTime1
endif
endif
If MotorCount = 2 then
If Enable2 = 0 then
Low Switch1
High Switch2
Low Switch3
Low Switch4
gosub Get_RPM
hightime2=HighCycle
lowtime2=lowcycle
TotalTime2 = HighTime2+LowTime2
endif
EndIf
If MotorCount = 3 then
If Enable3 = 0 then
Low Switch1
Low Switch2
High Switch3
Low Switch4
gosub Get_RPM
hightime3=HighCycle
lowtime3=lowcycle
TotalTime3 = HighTime3+LowTime3
endif
Endif
If MotorCount = 4 then
If Enable4 = 0 then
Low Switch1
Low Switch2
Low Switch3
High Switch4
gosub Get_RPM
hightime4=HighCycle
lowtime4=lowcycle
TotalTime4 = HighTime4+LowTime4
endif
endif
If MotorCount = 4 or Motorcount >4 then
MotorCount = 1
else
MotorCount = MotorCount + 1
endif
return
NoRPM:
HighCycle = 0 ' High pulse width = T2 - T1
LowCycle = 0
overflow = 0
return
Get_RPM:
pauseus 300
Capture = 0
CCP2CON = %00000101
overflow = 0
WHILE Capture=0 and overflow=0
WEND
If OVerflow=1 then
goto NoRPM
endif
T1.HighByte = CCPR2H : T1.LowByte = CCPR2L
Capture = 0
CCP2CON.0 = 0
WHILE Capture=0 and overflow=0
Wend
If OVerflow=1 then
goto NoRPM
endif
T2.HighByte = CCPR2H : T2.LowByte = CCPR2L
Capture = 0
CCP2CON.0 = 1
WHILE Capture=0 and overflow=0
Wend
If OVerflow=1 then
goto NoRPM
endif
T3.HighByte = CCPR2H : T3.LowByte = CCPR2L
CCP2CON = 0
HighCycle = T2-T1
LowCycle = T3-T2
return
BCD:
BCD1=PORTA
BCD1=BCD1 & $0F
BCD1=BCD1^ $0F
Unitid=bcd1
' BCD1=PORTA
' BCD1=BCD1 & $F0
' BCD1=BCD1^ $F0
' BCD1 = BCD1 >>4
' Unitid=bcd1
return
Bookmarks