(Yes, I'm reading up on Read-Modify-Write right now)
My entire code for 16F1936:
The probes are attached to pin-side of 10K resistor on LEDs (10K shouldn't matter according to me).Code:' Change log ' 2024-08-18 Convert from 16F1937 @ ERRORLEVEL -301 ; turn off ADC clock ignored message @ ERRORLEVEL -306 ; turn off crossing page boundary message '*********************************************************************** ' Default in file: PBP3_1\DEVICES\PIC16F1936.PBPINC * ' List in file: PBP3_1\DEVICE_REFERENCE\PIC16F1936.INFO * ' Note: PIC18 devices, the __CONFIG directive has * ' been superceded by the CONFIG directive * '*********************************************************************** #CONFIG __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _VCAPEN_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_LO & _LVP_OFF #ENDCONFIG ;--- Defines ------------------------------------------------------------------- DEFINE OSC 32 DEFINE LCD_DREG PORTB ' Set LCD data port DEFINE LCD_DBIT 0 ' Set starting data bit DEFINE LCD_RSREG PORTC ' Set LCD register select port DEFINE LCD_RSBIT 5 ' Set LCD register select bit DEFINE LCD_EREG PORTC ' Set LCD enable port DEFINE LCD_EBIT 4 ' Set LCD enable bit DEFINE LCD_BITS 4 ' Set LCD bus size DEFINE LCD_LINES 4 ' Set number of lines on LCD DEFINE LCD_COMMANDUS 1000 ' Set command delay time in microseconds DEFINE LCD_DATAUS 50 ' Set data delay time in microseconds define CCP4_REG PORTC ' PWM Pulse out to LCD contrast DEFINE CCP4_BIT 1 ' 2N2907 PNP with 1K on base define CCP5_REG PORTC ' PWM Pulse out to LCD backlight DEFINE CCP5_BIT 2 ' 2N2222A NPN with 1K on base DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 Define HSER_BAUD 115200 DEFINE HSER_CLROERR 1 ' Clear overflow automatically DEFINE HSER_SPBRGH 0 DEFINE HSER_SPBRG 68 ;--- Setup registers ----------------------------------------------------------- SPLLEN CON %1 ' PLL enable IRCF CON %1110 ' to enable 8 MHz SCS CON %00 ' system clock determined by FOSC OSCCON = (SPLLEN << 7) | (IRCF << 3) | SCS BAUDCON.3 = 1 ' Enable 16 bit baudrate generator ;--- Setup analog pins to digital ---------------------------------------------- ANSELA = %00000000 ANSELB = %00000000 'ANSELC = %00000000 ' No analog on port C 'ANSELD = %00000000 ' No port D 'ANSELE = %00000000 ' No analog on port E ;--- Setup Port directions ----------------------------------------------------- TRISA = %00000111 ' Pin A7 = ...available ' Pin A6 = ...available ' Pin A5 = ...available ' Pin A4 = ...available ' Pin A3 = ...available ' Pin A2 = SPST ' Pin A1 = WiperB ' Pin A0 = WiperA TRISB = %00000000 ' Pin B7 = iCSP clock ' Pin B6 = ICSP data ' Pin B5 = Blink LED1 ' Pin B4 = Blink LED2 ' Pin B3 = LCD data D7 ' Pin B2 = LCD data D6 ' Pin B1 = LCD data D5 ' Pin B0 = LCD data D4 TRISC = %10000000 ' Pin C7 = RX ' Pin C6 = TX ' Pin C5 = LCD RS ' Pin C4 = LCD EN ' Pin C3 = ...available ' Pin C2 = PWM LCD backlight ' Pin C1 = PWM LCD contrast ' Pin C0 = ...available 'TRISD = %00000000 ' No port D ' TRISE = %00000000 ' Pin E3 = MCLR ;--- Setup constants ----------------------------------------------------------- ;--- Setup pins ---------------------------------------------------------------- Enc1_WiperA var PORTA.0 Enc1_WiperB var PORTA.1 Enc1_SPST VAR PORTA.2 BlinkLED1 VAR PORTB.5 ' Switch these ON/OFF to determine time BlinkLED2 VAR PORTB.4 ' required to execute a section of code ;--- Setup variables ----------------------------------------------------------- Enc1_previous var BYTE Enc1_rotation var BYTE Enc1_direction VAr BYTE HPWMcontrast var BYTE HPWMbacklight var BYTE USARTcounter VAr WORd ' Used to show program is looping Enc1_counter VAr WORd ' Used to display encoder movement ;--- Program initialization ---------------------------------------------------- BlinkLED1 = 0 BlinkLED2 = 0 HPWM 2,100,1953 ' LCD contrast (V0 pin) HPWM 1,180,1953 ' LCD backlight (LED anode) USARTcounter = 0 Enc1_previous = 0 Enc1_rotation = 0 Enc1_direction = 0 Enc1_counter = 0 goto Start ;--- Subroutines --------------------------------------------------------------- Start: Pause 500 ' Let PIC and LCD stabilize LCDOUT $FE, 1 : Pauseus 1 LCDOUT $FE, $80, "ROTARY ENCODER TEST" : Pauseus 1 Mainloop: BlinkLED1 = 1 ' Top of LOOP on Logic 2 probe BlinkLED2 = 0 if USARTcounter < 65025 then ' To show program is working USARTcounter = USARTcounter + 1 else USARTcounter = 0 endif ' Wiper Chart: ' ============ ' A B ' --- --- ' 0 0 ' 1 0 /\ CCW ' 1 1 ' 0 1 \/ CW ' 0 0 ' ' Careful, EC11 30 detents 15 pulses will move from 00 to 11 if Enc1_WiperA = 0 and Enc1_WiperB = 0 then ' See wiper chart above if Enc1_previous = 01 then ' 2 digits to follow chart better Enc1_direction = 1 ' 1=CW, 0=CCW Enc1_rotation = 1 ' Motion occurred else if Enc1_previous = 10 then Enc1_direction = 0 ' 0=CCW Enc1_rotation = 1 ' Motion occurred else Enc1_direction = 0 ' Not relevant without motion Enc1_rotation = 0 ' No motion occurred endif endif Enc1_previous = 00 ' Save wiper position endif if Enc1_WiperA = 1 and Enc1_WiperB = 0 then if Enc1_previous = 00 then Enc1_direction = 1 Enc1_rotation = 1 else if Enc1_previous = 11 then Enc1_direction = 0 Enc1_rotation = 1 else Enc1_direction = 0 Enc1_rotation = 0 endif endif Enc1_previous = 10 endif if Enc1_WiperA = 1 and Enc1_WiperB = 1 then if Enc1_previous = 10 then Enc1_direction = 1 Enc1_rotation = 1 else if Enc1_previous = 01 then Enc1_direction = 0 Enc1_rotation = 1 else Enc1_direction = 0 Enc1_rotation = 0 endif endif Enc1_previous = 11 endif if Enc1_WiperA = 0 and Enc1_WiperB = 1 then if Enc1_previous = 11 then Enc1_direction = 1 Enc1_rotation = 1 else if Enc1_previous = 00 then Enc1_direction = 0 Enc1_rotation = 1 else Enc1_direction = 0 Enc1_rotation = 0 endif endif Enc1_previous = 01 endif if Enc1_rotation = 1 then if (Enc1_WiperA = 0 and Enc1_WiperB = 0) or _ (Enc1_WiperA = 1 and Enc1_WiperB = 1) then if Enc1_direction = 1 then Enc1_counter = Enc1_counter + 1 ' Turned 1 position CW else if Enc1_counter > 0 then Enc1_counter = Enc1_counter - 1 ' Turned 1 position CCW endif endif endif endif BlinkLED1 = 0 ' Bottom of IFs on Logic 2 probe BlinkLED2 = 1 hserout ["#:", DEC5 USARTcounter,_ " C:", dec3 Enc1_counter,_ " A:", DEC1 Enc1_WiperA,_ " B:", DEC1 Enc1_WiperB,_ " SW:", DEC1 Enc1_SPST, 10] BlinkLED1 = 0 ' After HSEROUT on Logic 2 probe BlinkLED2 = 0 LCDOUT $FE, $D4, "C:", dec3 Enc1_counter,_ " A:", DEC1 Enc1_WiperA,_ " B:", DEC1 Enc1_WiperB,_ " SW:", DEC1 Enc1_SPST : Pauseus 1 BlinkLED1 = 0 ' After LCDOUT on Logic 2 probe BlinkLED2 = 0 goto mainloop end
Both LEDs are never HIGH at the same time, and yet they don't blink as expected...?
![]()


)


Bookmarks