SOLVED: Why is BlinkLED2 high at same time as BlinkLED1?


+ Reply to Thread
Results 1 to 2 of 2
  1. #1
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    2,956

    Question SOLVED: Why is BlinkLED2 high at same time as BlinkLED1?

    (Yes, I'm reading up on Read-Modify-Write right now )

    My entire code for 16F1936:

    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
    The probes are attached to pin-side of 10K resistor on LEDs (10K shouldn't matter according to me).

    Name:  Encoder probe b.png
Views: 42
Size:  21.5 KB


    Both LEDs are never HIGH at the same time, and yet they don't blink as expected...?

    Name:  Encoder probe a.png
Views: 42
Size:  53.4 KB
    My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.

    Not as dumb as yesterday, but stupider than tomorrow!

  2. #2
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    2,956


    Did you find this post helpful? Yes | No

    Default Re: SOLVED: Why is BlinkLED2 high at same time as BlinkLED1?

    Confirmed.

    Use LAT to define pin variables, not PORT.

    Name:  Encoder probe c.png
Views: 40
Size:  41.3 KB


    So much better. Now I can use the pins to check timing of rotary encoders.
    Last edited by Demon; - 19th August 2024 at 19:05.
    My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.

    Not as dumb as yesterday, but stupider than tomorrow!

Similar Threads

  1. Dreaded <target device ID 3FFF> - SOLVED
    By Demon in forum PIC Programmers
    Replies: 3
    Last Post: - 13th May 2023, 18:45
  2. Free energy finally solved
    By Demon in forum Off Topic
    Replies: 2
    Last Post: - 20th January 2014, 19:05
  3. Solved: notes on annoying little issues
    By Probotics in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 26th May 2008, 20:02
  4. Hanging on SERIN2 - SOLVED!
    By blainecf in forum Serial
    Replies: 1
    Last Post: - 13th July 2006, 17:55
  5. Dmx Solved !!!!!!!
    By oscar in forum mel PIC BASIC Pro
    Replies: 18
    Last Post: - 2nd July 2005, 21:57

Members who have read this thread : 3

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts