Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'********************** Placa Entrenadora (PIC EBadic) ***************************************
'NOMBRE:16F88_Pic_EBasic_LCD_CCP1_PWM_ADC
'MICRO: PIC16F88/8Mhz reloj interno
'Fecha/Autor: 6/08, By COS
'Version: 1.0
'Uso del modulo CCP1 trabajando en el modo PWM.
'*********************************************************************************************
'-------------------------------------Puertos del LCD-----------------------------------------
Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
Define LCD_COMMANDUS = 1000 'Tiempo de espera despues de ejecutar un comando del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 '[Tiempo de espera despues de inicializar el Display,
'solo se ejecuta una vez en mseg.]
'*********************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1 'Ignora los valores de Waitms, solo simulacion
'--------------------------------------Reasignacion de nombres--------------------------------
Symbol led_amarillo = PORTA.7 'led amarillo
Symbol led_verde = PORTB.0 'led verde
Symbol luz_lcd = PORTB.3 'iluminacion del lcd
'------------------------------------declaracion de variables---------------------------------
Dim adc As Word 'contendra el valor de la entrada ADC trabajando a 10bit
Dim duty_cycle As Word 'tiempo a On de la señal
Dim calculo As Long 'variable auxiliar para calculos con 32bit
'------------------------------------Definicion de puertos--------------------------------
ANSEL = %00010000 'los pin I/O digitales y RA4 analogico
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
TRISA.4 = 1 'como entrada (RA4, adc)
TRISA.6 = 1 'como entrada (RA6, tecla S1)
TRISA.5 = 1 'como entrada (RA5, tecla S2)
PORTB.3 = 1 'luz lcd a on (RB3) y PWM (CCP1)
PORTA.7 = 1 'led amarillo a off (RA7), negado
PORTB.0 = 1 'led verde a off (RB0), negado
'----------------------Inicializa el Timer2 y el modulo CCP1 en modo PWM-------------------------
PR2 = %11111001 'periodo de la señal para 500Hz
CCPR1L = %00000000 'comienza con valor 0 (RB3=0), maximo duty cycle 1111100111 = 999
CCP1CON.CCP1X = 0
CCP1CON.CCP1Y = 0
CCP1CON.CCP1M3 = 1 'modo pwm
CCP1CON.CCP1M2 = 1 'modo pwm
T2CON.T2CKPS0 = 1 'prescaler, 1x = 1:16
T2CON.T2CKPS1 = 1
T2CON.TMR2ON = 1 'activa el Timer2
'------------------------------------Inicio----------------------------------------------------
Lcdinit 'inicializa el lcd sin cursor
WaitMs 1000 'espera 1Seg
Lcdout "Pruebas con CCP1" 'escribe en el lcd
Lcdcmdout LcdLine2Home 'seleciona la linea dos como proxima para escritura
Lcdout "PWM MODE (CCP1)" 'escribe en el lcd
WaitMs 3000 'espera 3Seg
Lcdcmdout LcdLine1Clear 'borra el display,linea 1
'------------------------------------rutina del Programa--------------------------------------
main: 'comienza el programa principal
Adcin 4, adc 'lee la entrada analogica RA4 y guarda el valor en la variable adc
calculo = (adc * 999) / 1023 'calcula el valor del duty segun el valor leido en el adc
duty_cycle = calculo 'cambia de long a word
CCP1CON.CCP1X = duty_cycle.1 'carga bits menos significativos del duty
CCP1CON.CCP1Y = duty_cycle.0 'carga bits menos significativos del duty
duty_cycle = ShiftRight(duty_cycle, 2) 'desplaza la variable duty_cycle dos bit a la derecha
CCPR1L = duty_cycle 'carga los bit mas significativos del duty
calculo = (adc * 100) / 1023 'calcula el duty cycle en %
duty_cycle = calculo 'pasa de long a word
Lcdcmdout LcdLine1Home 'pone cursor del LCD al principio de linea
Lcdout "ADC ", #adc, " ", "DT %", #duty_cycle, " " 'Inprime datos en el display
Goto main 'impide que termine el programa principal
End 'es conveniente ponerlo siempre segun el manual