Hi. I am trying to make this Rotary Encoder work with DT-INTS on a 16F1827 device.
It gets once in the interrupt routine and never seem to exit.
Here is the code so far driving me crazy.
Thanks,Code:ASM __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_ON & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __config _CONFIG2, _WRT_OFF & _PLLEN_ON & _LVP_OFF & _STVREN_OFF & _BORV_25 ENDASM DEFINE OSC 32 OSCCON= %11110000 'PLL enabled, Internal RC-8MHz ' Set LCD Data port DEFINE LCD_DREG PORTA ' Set starting Data bit (0 or 4) if 4-bit bus DEFINE LCD_DBIT 0 ' Set LCD Register Select port DEFINE LCD_RSREG PORTA ' Set LCD Register Select bit DEFINE LCD_RSBIT 4 ' Set LCD Enable port DEFINE LCD_EREG PORTB ' Set LCD Enable bit DEFINE LCD_EBIT 3 ' Set LCD bus size (4 or 8 bits) DEFINE LCD_BITS 4 ' Set number of lines on LCD DEFINE LCD_LINES 2 ' Set command delay time in us DEFINE LCD_COMMANDUS 1500 ' Set data delay time in us DEFINE LCD_DATAUS 44 INCLUDE "DT_INTS-14.bas" ' Base Interrupt System INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts 'Initializing Registers PORTB = 0:PORTA = 0 TRISB = $33 TRISA = 0 ADCON0 = 0 ADCON1 = 0 ANSELA = 0 ANSELB = 0 INTCON = $88 ' Binary 10001000 IOCBP=$30 IOCBN=$30 OPTION_REG = 0 WPUB=$33 eeprom 0,[2,0,3,1,1,3,0,2] led var portb.4 Flag var bit wsave VAR BYTE $70 SYSTEM ' alternate save location for W Q_New var Byte Q_Old var byte M_Count var byte [4] P_Count var byte [4] Q_Count var word temp var byte clear For Q_Old = 0 to 3 Read Q_Old,M_Count[Q_Old] Read Q_Old + 4,P_Count[Q_Old] Next Q_Old Q_Count = 0 Q_New = 0 Q_Old = 0 Flag = 0 ASM INT_LIST macro ; IntSource, Label, Type, Resetflag? INT_Handler IOC_INT, _Encoder, pbp, yes endm INT_CREATE ; Creates the interrupt processor ENDASM @ INT_ENABLE IOC_INT ; enable external (INT) interrupts '---------------------------- Initialize LCD ---------------------------- Lcdout $fe, 1 ' Clear LCD screen Lcdout "System Ready" ' Display message Pause 500 ' Wait .5 second Q_Count=50 Goto Main_Loop Encoder: ' ISR Q_New = PortB.5 + PortB.5 + PortB.4 ' get port status If M_Count[Q_Old] = Q_New then ' if M_Count code satisfied then minus temp=temp+1 if temp=4 then temp=0 Q_Count = Q_Count - 1 Flag = 1 ' set flag to true to update display endif goto Q_Skip endif If P_Count[Q_Old] = Q_New then ' if M_Count code satisfied then plus temp=temp+1 if temp=4 then temp=0 Q_Count = Q_Count + 1 Flag = 1 endif ' set flag to true to update display endif Q_Skip: Q_Old = Q_New toggle portb.6 ' update Q_Old Byte @ INT_RETURN Main_Loop: if Flag = 1 then Lcdout $fe, 1 ' Clear LCD screen Lcdout dec Q_Count ' Display encoder position (counts) Flag = 0 ' reset flag to false, display updated endif pause 100 goto Main_Loop
Ioannis




Bookmarks