If I revert to the Old_Bits/New_Bits logic it now works:
Code:
DEFINE OSC 20 ' Set oscillator 20Mhz
' ***************************************************************
' Device Fuses
' ***************************************************************
#CONFIG
__config _CONFIG1, _FOSC_HS & _WDTE_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF
__config _CONFIG2, _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LVP_OFF
#ENDCONFIG
' ***************************************************************
' Initialization
' ***************************************************************
DEFINE CCP3_REG PORTA
DEFINE CCP3_BIT 2
ANSELA.0 = 0 ' Digital only on roatary encoder B pin
ANSELA.1 = 0 ' Digital only on roatary encoder A pin
ANSELA.2 = 0 ' Digital only on CCP3 pin
TRISA = %00000011 ' Make PortA pins 0-1 input for rotary encoder
INTCON = %10001000 ' Global int enabled, IOCI enabled, IOCI flag bit 0 clr
IOCAP.0 = 1 ' Enable positive (rising edge) change
IOCAP.1 = 1 ' Enable positive (rising edge) change
IOCAN.0 = 1 ' Enable negative (falling edge) change
IOCAN.1 = 1 ' Enable negative (falling edge) change
IOCAF.0 = 0 ' Clear interupt-on-change flag
IOCAF.1 = 0 ' Clear interupt-on-change flag
Old_Bits VAR BYTE
New_Bits VAR BYTE
RotEncDir VAR BIT ' 1=CW, 0=CCW
' Rot Enc pin A connected to PortA.1;
' Rot Enc pin B connected to PortA.0
Old_RPM VAR BYTE
I VAR BYTE
' ***************************************************************
' Includes
' ***************************************************************
INCLUDE "EE_Vars.PBP" ' Requires MPASM assembler
' Go to "View > Compile and Program Options..."
' On "Assembler" tab, check "Use MPASM"
' (no need to change any of the default settings)
' --> copy file to PBP main folder (i.e. c:\pbp)
MotorRPM VAR BYTE : @ EE_var _MotorRPM, BYTE, 100
;PortNacelleDir VAR BYTE : @ EE_var _PortNacelleDir, BYTE, 0 ' 0 = CCW (inwards)
' 1 = CW (outwards)
INCLUDE "DT_INTS-14.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts
' --> copy both files to PBP main folder
' (i.e. c:\pbp)
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler IOC_INT, _Rot_Encoder, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE IOC_INT ; Interrupt-on-Change interrupt
' Set default values
Old_RPM = MotorRPM
Old_Bits = PORTA & (%00000011)
' Spin up motor to saved value of _MotorRPM
IF MotorRPM > 1 THEN
FOR I = 0 to MotorRPM
pause 30
HPWM 3, I, 20000
NEXT I
EndIf
Main:
IF MotorRPM <> Old_RPM Then
Old_RPM = MotorRPM
GOSUB motorhpwm
@ EE_write_var _MotorRPM ; save the new number to EEPROM
EndIF
GOTO Main
motorhpwm:
HPWM 3, MotorRPM, 20000 ; Tried 245 Hz but it made the motor too loud.
; Supposedly, anything above 20kHz is above
; human hearing
RETURN
end
' ***************************************************************
' [IOC - interrupt handler]
' ***************************************************************
Rot_Encoder:
New_Bits = PORTA & (%00000011)
IF (New_Bits & %00000011) = (Old_Bits & %00000011) Then DoneRotEnc
RotEncDir = New_Bits.1 ^ Old_Bits.0
IF RotEncDir = 1 Then
; CW rotation - increase speed but only to a max of 255
IF MotorRPM < 255 then MotorRPM = MotorRPM + 1
Else
' CCW rotation - decrease speed to a min of 0
IF MotorRPM > 0 Then MotorRPM = MotorRPM - 1
EndIF
DoneRotEnc:
Old_Bits = New_Bits
IOCAF.0 = 0 ' Clear interrupt flags
IOCAF.1 = 0
@ INT_RETURN
Bookmarks