CCP1CON and CCP2CON strange behaviour - need some advice


Closed Thread
Results 1 to 14 of 14

Hybrid View

  1. #1
    Join Date
    Oct 2009
    Posts
    583

    Default CCP1CON and CCP2CON strange behaviour - need some advice

    Need some help here,

    I have an 18F4520 which has the ability for multiple PWM outputs via CCP1 and CCP2 pins. The code I'm using originally came from a friend who had this working on an 18F2550, but for some reason when ported to an 18F4520 the output on PORTC.2 pulses at around twice per second whilst the output is set. The PWM is working as the pulses start very dim and increase in brightness as the value in the variable is increased and decreases as the variable value is reduced, rather than the LED remaining lit through out the settings. The output on PORTC.1 works fine, in that the LED starts off dim, fades up to full brightness and then fades down to zero.

    I've looked at the data sheet (which could be written in Klingon for all I care), and think everything is set right as the LED does increase and decrease in brightness. But I'm at a loss as to what is causing the LED to flash. Here is the bulk of the cod, and would welcome some pointers.

    Firstly the includes

    Code:
    '****************************************************************
    ' Include files and configure timers
    
    DEFINE WRITE_INT 1
    INCLUDE "DT_INTS-18.bas"                        ; Base Interrupt System
    INCLUDE "ReEnterPBP-18.bas"
    ASM
    INT_LIST  macro    ; IntSource,          Label,  Type, ResetFlag?    
            INT_Handler     TMR1_INT,  _MyTimer,   PBP,  yes
        endm
        INT_CREATE               ; Creates the interrupt processor
    endasm
    
    T1CON = %00000001                               ; free-running, 1:1 prescaler
    @   INT_ENABLE   TMR1_INT                       ; enable Timer1 interrupts
    
    ENABLE DEBUG
    
    '****************************************************************
    and now the configs

    Code:
    '****************************************************************
    'Port settings
    
    CCP1CON = %00001100             ' 
    CCP2CON = %00001100             '     
    TRISA  = %00000111              'set PORTA as all output apart from 0,1,2
    TRISB  = %00000011              'set PORTB as all output apart from 0&1
    TRISC  = %01011111              '
                         
    SCLpin var PORTC.3               ' RTC pin - clk
    SDApin var PORTC.4               ' RTC pin - data
    '****************************************************************
    and now the main part of the code

    Code:
    '****************************************************************
    ;Initialization
    
    init:
        LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250 ' Initialize LCD
    option=1   
    Blue_Day_Cycle = NIGHT
    White_Day_Cycle = NIGHT
        b_cnt = 0
        w_cnt = 0
        
    gosub   read_eeprom     'Read in the data needed for the lighting periods  
    gosub  Calc_Fade
    
    '****************************************************************     
    ;************        Main Program Loop              *************
    '****************************************************************
    
    Main:
    
    If SetButton=0 then                                 ; jump to programming
        goto mainmenu
    endif
    
    timeH=(RTCHour>>4)                               'convert the BCD format of the hours register and store in variable timeH
    timeH=(timeH &$03)*10
    timeH=timeH+(RTCHour&$0F)
    
    timeM=(RTCMin>>4)
    timeM=(timeM &$07)*10
    timeM=timeM+(RTCMin&$0F)                         'convert the BCD format of the mins register and store in variable timeM
    
    
    'if B_On_Time_H = timeH and B_On_Time_M = timeM then Blue_Day_Cycle = DAWN
    'if W_On_Time_H = timeH and W_On_Time_M = timeM then White_Day_Cycle = DAWN
    'if B_Off_Time_H = timeH and B_Off_Time_M = timeM then Blue_Day_Cycle = DUSK
    'if W_Off_Time_H = timeH and W_Off_Time_M = timeM then Blue_Day_Cycle = DUSK
    
    'if B_On_Time_H = timeH and B_On_Time_M = timeM then Blue_Day_Cycle = DAWN
    
    gosub calc_fade
    
        
    '*** Do BLUE daily cycle
        select case Blue_Day_Cycle
        case DAWN
        lcdout $FE,$94,"BL: DAWN "
            if b_cnt = B_Fadein_time and B_PWM < B_Max then
                B_PWM = B_PWM + 1
                b_cnt = 0
            endif
            if B_PWM = b_max then
                Blue_Day_Cycle = DAY
            endif
        case DAY
        lcdout $FE,$94,"BL: DAY  "
            if timeH = B_Off_Time_H and timeM = B_Off_Time_M then
                Blue_Day_Cycle = DUSK
                b_cnt = 0
            endif 
        CASE DUSK
        lcdout $FE,$94,"BL: DUSK "
            if b_cnt >= B_Fadeout_time and B_PWM > B_Min then
                B_PWM = B_PWM - 1
                b_cnt = 0
            endif
            if B_PWM = b_min then 
                Blue_Day_Cycle = NIGHT
            endif
        case NIGHT
        lcdout $FE,$94,"BL: NIGHT"
            if timeH = B_On_Time_H and timeM = B_On_Time_M then
                Blue_Day_Cycle = DAWN
                b_cnt = 0
            endif 
        end select
    
    '*** Do WHITE daily cycle
        select case White_Day_Cycle
        case DAWN
        lcdout $FE,$94+11,"WT: DAWN "
            if w_cnt = w_Fadein_time and W_PWM < w_max then
                W_PWM = W_PWM + 1
                w_cnt = 0
            endif
            if W_PWM = W_max then White_Day_Cycle = DAY
        case DAY
        lcdout $FE,$94+11,"WT: DAY  "
            if timeH = W_Off_Time_H and timeM = W_Off_Time_M then
                White_Day_Cycle = DUSK
                w_cnt = 0
            endif 
        CASE DUSK
        lcdout $FE,$94+11,"WT: DUSK "
            if w_cnt >= w_Fadeout_time and W_PWM > w_min then
                W_PWM = W_PWM - 1
                w_cnt = 0
            endif
            if W_PWM = W_min then White_Day_Cycle = NIGHT
        case NIGHT
        lcdout $FE,$94+11,"WT: NIGHT"
            if timeH = W_On_Time_H and timeM = W_On_Time_M then
                White_Day_Cycle = DAWN
                w_cnt = 0
            endif 
        end select
        hpwm 1,W_PWM,1500        
        hpwm 2,B_PWM,1500
    
    
    lcdout $FE,$80,"BLUES  ",dec3 (B_PWM *100)/255,"%"
    lcdout $FE,$C0,"WHITES ",dec3 (W_PWM *100)/255,"%"
    
        OWOUT DQ, 1, [$CC, $44]                 ' Start temperature conversion
        OWOUT DQ, 1, [$CC, $BE]                 ' Read the temperature
        OWIN DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE]
        temperature = temperature */ 1600
        lcdout $FE,$D4+11,"TEMP ",DEC(temperature / 100)," C"
    	
    
    I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl]  ; read DS1307 chip
    If RTCHour.6=1 then
    			
    CounterA=(RTCHour>>4)&$01                           ' Work-Out 12 or 24 hour Display for Hours
    else
    CounterA=(RTCHour>>4)&$03
    endif
    CounterA=CounterA*10+(RTCHour&$0F)                  ' Display Hours appropriately for 12 or 24 hour Mode 
    If RTCHour.6=1 then			
    LCDOut $FE,$D4,#CounterA
    else
    LCDOut $FE,$D4,#CounterA Dig 1,#CounterA Dig 0
    endif
    LCDOut ":",#(RTCMin>>4)&$0F,#RTCMin&$0F
    
        
    GOTO Main 
    
    '****************************************************************     
    ;************        Main Program Loop END          *************
    '****************************************************************
    ' Timer used to scale the PWM pulse
     MyTimer:
        Tick_Tmr = Tick_Tmr + 1
        if Tick_Tmr >149 then     ;179
            Tick_Tmr = 0
            b_cnt = b_cnt + 1
            W_cnt = W_cnt + 1
        endif  
    @  INT_RETURN
    '****************************************************************

  2. #2
    Join Date
    Oct 2009
    Posts
    583


    Did you find this post helpful? Yes | No

    Default Re: CCP1CON and CCP2CON strange behaviour - need some advice

    I've been trying to resolve this for days... would welcome some pointers as to what is happening here

  3. #3
    Join Date
    Oct 2009
    Posts
    583


    Did you find this post helpful? Yes | No

    Default Re: CCP1CON and CCP2CON strange behaviour - need some advice

    OK...

    Looked at the original code for the 2550 and the config settings are

    Code:
    asm
    __CONFIG    _CONFIG1L, _PLLDIV_1_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L  
    __CONFIG    _CONFIG1H, _FOSC_XTPLL_XT_1H & _FCMEM_OFF_1H & _IESO_OFF_1H 
    __CONFIG    _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L  & _BORV_2_2L  & _VREGEN_ON_2L   
    __CONFIG    _CONFIG2H, _WDT_OFF_2H 
    __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H 
    __CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L 
    endasm
    Note the CCP2MX fuse setting. So I added this to the fuse settings for the 4520

    Code:
    ASM 
      __CONFIG    _CONFIG1H, _OSC_HSPLL_1H
      __CONFIG    _CONFIG2L, _PWRT_ON_2L  
      __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
      __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H 
      __CONFIG    _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
    ENDASM
    But get "symbol not previously defined (CCP2MX_ON_3H)"

    So I checked the INC file to see that everything was commented out, and it was

    Code:
    ;****************************************************************
    ;*  18F4520.INC                                                 *
    ;*                                                              *
    ;*  By        : Leonard Zerman, Jeff Schmoyer                   *
    ;*  Notice    : Copyright (c) 2008 microEngineering Labs, Inc.  *
    ;*              All Rights Reserved                             *
    ;*  Date      : 09/15/08                                        *
    ;*  Version   : 2.60                                            *
    ;*  Notes     :                                                 *
    ;****************************************************************
            NOLIST
        ifdef PM_USED
            LIST
            "Error: PM does not support this device.  Use MPASM."
            NOLIST
        else
            LIST
            LIST p = 18F4520, r = dec, w = -311, w = -230, f = inhx32
            INCLUDE "P18F4520.INC"   ; MPASM  Header
            ;__CONFIG    _CONFIG1H, _OSC_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
            ;__CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
            ;__CONFIG    _CONFIG3H, _CCP2MX_PORTC_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
            ;__CONFIG    _CONFIG4L,  _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
            NOLIST
        endif
            LIST
    EEPROM_START	EQU	0F00000h
    BLOCK_SIZE	EQU	64
    But noticed the way the fuse was worded so copied that to the PBP code thus

    Code:
    ASM 
      __CONFIG    _CONFIG1H, _OSC_HSPLL_1H
      __CONFIG    _CONFIG2L, _PWRT_ON_2L  
      __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
      __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_PORTC_3H 
      __CONFIG    _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
    ENDASM
    It compiled fine, but the LED on PORTC.2 (CCP1CON) still flashes whilst the LED fades up and down and the case statement is anything other than NIGHT (off) It's as if something is taking the pin low at regular interval

    I would really appreciate some help here guys

  4. #4
    Join Date
    Oct 2009
    Posts
    583


    Did you find this post helpful? Yes | No

    Default Re: CCP1CON and CCP2CON strange behaviour - need some advice

    LOL - it does the same thing if I comment out the settings

    Code:
    '****************************************************************
    'Port settings
    
    'CCP1CON = %00001100             ' 
    'CCP2CON = %00001100             '     
    TRISA  = %00000111              'set PORTA as all output apart from 0,1,2
    TRISB  = %00000011              'set PORTB as all output apart from 0&1
    TRISC  = %01000000              '
    T2CON     = %00000100  ' Timer2 ON + 1:1 prescale
                         
    SCLpin var PORTC.3               ' RTC pin - clk
    SDApin var PORTC.4               ' RTC pin - data
    '****************************************************************
    so it appears to be ignoring the code altogether

  5. #5
    Join Date
    Oct 2009
    Posts
    583


    Did you find this post helpful? Yes | No

    Default Re: CCP1CON and CCP2CON strange behaviour - need some advice

    100 views and not one comment or suggestion... surely someone has some idea as to what's happening ????

  6. #6
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,605


    Did you find this post helpful? Yes | No

    Default Re: CCP1CON and CCP2CON strange behaviour - need some advice

    Hi,
    I think you need to try and recreate the issue with as little code as possible. Start from scratch, can you get a steady duty cycle out of both modules without the aditional on/off toggling or does the toggling happen as soon as you try to get PWM out on PortC.2?

    /Henrik.

Similar Threads

  1. Strange IT behaviour
    By MikeBZH in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 10th February 2012, 09:00
  2. Strange behaviour
    By financecatalyst in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 8th October 2009, 22:35
  3. Strange Serout Behaviour
    By bluesmoke in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 12th August 2009, 04:12
  4. Strange ADC behaviour
    By ruijc in forum mel PIC BASIC Pro
    Replies: 28
    Last Post: - 12th December 2007, 20:03
  5. strange int behaviour
    By tom in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 17th November 2005, 15:41

Members who have read this thread : 0

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