Hi All,
I am working my way through the process of setting up a 10-Bit PWM channel using a PIC16F1509 and have hit a major hurdle - I am stumped and don't know what to do.
My project is for an RGB LED Controller using slider pots to control the PWM signal being fed to the RGB LEDs.
I have the basic principle operating using HPWM commands but this limits the control to 8-bits and I want to take advantage of the device's 10-bit PWM capability.
Using the calculation in the datasheet, I can achieve 10-bit PWM resolution for my desired 250Hz PWM frequency with a 4MHz internal oscillator, PR2 = 255 and TMR2 Prescale = 16
My problem is when I try to set the PWM1CON register or load the high and low PWM duty cycle registers.
My code is as follows:
When I try to compile this code I get syntax error messages for the following lines:
PWM1CON = %11000000
PWM1DCH = POT1.HIGHBYTE
PWM1DCL = POT1.LOWBYTE
I cannot see anything wrong with the syntax in these three lines of code. Can anyone shed some light on what it is wrong?
I am using PBP3 (Version 3.0.5.4)) and MCS (Version 5.0.0.0)
Cheers
Barry
VK2XBP
I am working my way through the process of setting up a 10-Bit PWM channel using a PIC16F1509 and have hit a major hurdle - I am stumped and don't know what to do.
My project is for an RGB LED Controller using slider pots to control the PWM signal being fed to the RGB LEDs.
I have the basic principle operating using HPWM commands but this limits the control to 8-bits and I want to take advantage of the device's 10-bit PWM capability.
Using the calculation in the datasheet, I can achieve 10-bit PWM resolution for my desired 250Hz PWM frequency with a 4MHz internal oscillator, PR2 = 255 and TMR2 Prescale = 16
My problem is when I try to set the PWM1CON register or load the high and low PWM duty cycle registers.
My code is as follows:
Code:
'****************************************************************
'* Name : RGB_LED_Controller_16F1509.pbp *
'* Author : Barry Phillips *
'* Notice : Copyright (c) 2015 Baztronics *
'* : All Rights Reserved *
'* Date : 27/02/2015 *
'* Version : 1.0 *
'* Notes : RGB LED Controller using PIC16F1509 *
'* : *
'****************************************************************
#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__config _CONFIG2, _WRT_OFF & _STVREN_OFF & _LPBOR_OFF & _LVP_OFF
#ENDCONFIG
OSCCON= %01101000 'Internal 4MHz Oscillator
DEFINE OSC 4 'Internal RC Oscillator 8MHz
' Connect LCD D4 to RB4 (Pin 13)
' Connect LCD D5 to RB5 (Pin 12)
' Connect LCD D6 to RB6 (Pin 11)
' Connect LCD D7 to RB7 (Pin 10)
' Connect LCD R/S to RC3 (Pin 7)
' Connect LCD E to RC6 (Pin 8)
' Connect POT1 to RA0 (Pin 19)
' Connect POT2 to RA1 (Pin 18)
' Connect POT3 to RC0 (Pin 16)
' Connect POT4 to RC2 (Pin 14)
' Connect PWM1 to RC5 (Pin 5)
' Connect PWM2 to RC7 (Pin 9)
' Connect PWM3 to RA2 (Pin 17)
' Connect PWM4 to RC1 (Pin 15)
' Connect SW1 to RA5 (Pin 2)
' Connect SW2 to RA1 (Pin 3)
' Connect SW3 to RA3 (Pin 4)
@ ERRORLEVEL -306 ' Turn off "Crossing page boundary" error message
' Define LCD registers and bits
Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTC
Define LCD_RSBIT 3
Define LCD_EREG PORTC
Define LCD_EBIT 6
Define LCD_BITS 4
Define LCD_LINES 4
Pause 500
DEFINE ADC_BITS 10 'Set number of bits in result (8, 10 or 12)
DEFINE ADC_CLOCK 3 'Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 'Set sampling time in microseconds
TRISA = %00111011 'Set PORTA.0, 1, 3, 4 & 5 as digital inputs
TRISB = %00000000 'Set PORTB as all digital outputs
TRISC = %00000101 'Set PORTC.0 & 2 as digital inputs
ANSELA = %00000011 'Set PORTA.0 & 2 as analog inputs
ANSELB = %00000000 'Disable PORTB analog inputs
ANSELC = %00000101 'Set PORTC.0 & 2 as analog inputs
ADCON0 = %00000001 'Enable ADC
ADCON1 = %11010000 'Right Justify
'Fosc/16
'Vref connected to Vdd
FVRCON.7 = 0 'Disable Fixed Voltage Reference
CM1CON0.7 = 0 'Disable Comparitor 1
CM2CON0.7 = 0 'Disable Comparitor 2
INTCON.7 = 0 'Disable Interrupts
T2CON = %00000110 'Enable TMR2 and set PreScale to 16
' Set up PWM Registers
PWM1CON = %11000000
PR2 = %11111111
POT1 VAR WORD
POT2 VAR WORD
POT3 VAR WORD
POT4 VAR WORD
ScaledPot1 VAR WORD
Dummy VAR WORD
LCDOUT $FE, $1
LCDOUT $FE, $80, " ** BAZTRONICS ** "
LCDOUT $FE, $C0, "RGB LED Controller "
LCDOUT $FE, $94, " Version 1.1 "
LCDOUT $FE, $D4, " "
Pause 2000
LCDOUT $FE, $1
Start:
ADCIN 0, POT1
LCDOUT $FE, $80, "POT1 = ", DEC POT1, " ", DEC ScaledPot1, " "
ADCIN 1, POT2
LCDOUT $FE, $C0, "POT2 = ", DEC POT2, " "
ADCIN 4, POT3
LCDOUT $FE, $94, "POT3 = ", DEC POT3, " "
ADCIN 6, POT4
LCDOUT $FE, $D4, "POT4 = ", DEC POT4, " "
Pause 100
PWM1DCH = POT1.HIGHBYTE
PWM1DCL = POT1.LOWBYTE
GOTO Start
End
PWM1CON = %11000000
PWM1DCH = POT1.HIGHBYTE
PWM1DCL = POT1.LOWBYTE
I cannot see anything wrong with the syntax in these three lines of code. Can anyone shed some light on what it is wrong?
I am using PBP3 (Version 3.0.5.4)) and MCS (Version 5.0.0.0)
Cheers
Barry
VK2XBP