Autor Tema: [SOLUCIONADO] Testeando los modulos del 16f887  (Leído 2443 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carl47D

  • PIC16
  • ***
  • Mensajes: 160
[SOLUCIONADO] Testeando los modulos del 16f887
« en: 20 de Septiembre de 2014, 00:25:08 »
Saludos a todos, estoy empezando a programar pic´s con asm, e hice un programa para checar el CCP1 usando el pwm, el micro que uso es el 16f887, con reloj interno de 500 KHz. la frecuencia del pwm si me da igual a los calculos, el problema que tengo es que calculo un Duty Cycle de 24.9% ~ 25% y la simulacion de proteus me arroja un duty de alrededor de 16%. Acá el codigo y adjunto la simulacion de proteus, no se como checar/corregir lo del duty
Gracias de antemano  :-/

Código: [Seleccionar]
list p=16f887
#include <p16f887.inc>

ERRORLEVEL -302

__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF & _DEBUG_OFF

__CONFIG _CONFIG2, _BOR40V & _WRT_OFF

CBLOCK 0X20
CONTA_1
CONTA_2
ENDC

ORG 0X0000
GOTO CONFIGURACION

;***************************************************
; PWM Period = [(PR2)+1] * 4 * Tosc * TMR2 Prescaler
; = [255+1] * 4 * [1 / 500 khz] * 1
; = [256] * 4 * 2 uS * 1
; PWM Period = 2.048 mS
;
; PWM Frec   = 1 / PWM Period
; = 1 / 256 uS
; PWM Frec = 488.28125 Hz
;
; Pulse Width= (CCPR1L:CCP1CON<5:4>) * Tosc * (TMR2 Prescaler)
; = 255 * (1 / 500 kHz) * 1
; Pulse Width= 510 uS
;
; (CCPR1L:CCP1CON<5:4>)
; Duty Cycle = ----------------------
; 4 (PR2 + 1)
; 255
; Duty Cycle = ------
; 1024
; Duty Cycle = 24.9%
;
; log[4(PR2+1)]
; Resolution = -------------- bits
;   log(2)
; Resolution = 10 bits
;
;****************************************************

CONFIGURACION MOVLW B'00000100' ;Configuracion del T2CON
;'-0000---' Postscaler 1:1
;'-----1--' Timer2 activado
;'------00' Prescaler 1:1
MOVWF T2CON
MOVLW B'00001101' ;Configuracion del CCP1CON (PWM Mejorado)
;'00------' Single output P1A Modulado, P1B, P1C y P1D pines de puerto
;'--00----' LSB del Duty Cycle
;'----1101' Modo PWM, P1A y P1C activos en alto, P1B y P1D activos en bajo
MOVWF CCP1CON
MOVLW B'00001101' ;Configuracion del CCP2CON
;'--00----' LSB del Duty Cycle
;'----1101' Modo PWM
MOVWF CCP2CON
MOVLW B'00010000' ;Configuracion del CCPR1L
MOVWF CCPR1L ;Duty Cycle del 25%  (0x100)

BSF STATUS,RP0 ;Banco 1
MOVLW B'00110111' ;Configurar reloj interno a 500 kHz
MOVWF OSCCON
MOVLW B'11111111' ;Cargamos 255 al registro PR2
MOVWF PR2 ;Obtenemos un PWM con Frec de 3906.25 Hz
CLRF TRISC ;Puerto C como salida
MOVLW B'10000000' ;Configuracion PWM1CON
MOVWF PWM1CON
MAIN
NOP
GOTO MAIN
END



Edito: Era el valor que estaba cargando al registro CCPR1L, olvide que el valor tiene que incluir los bits CCP1CON<5:4>, para ser un total de 10 bits, no de 8
« Última modificación: 27 de Septiembre de 2014, 02:15:33 por Carl47D »

Desconectado Carl47D

  • PIC16
  • ***
  • Mensajes: 160
Re: [SOLUCIONADO] Testeando el PWM del 16f887
« Respuesta #1 en: 27 de Septiembre de 2014, 02:06:40 »
 :-/ Despues de haber podido hacer funcionar el modulo CCP usando el PWM, hice mas programas, como comente voy iniciando la programacion en ASM, tratare de subir mas programas para ayudar a los que vamos iniciando en esto, me incluyo, si tienen sugerencias o metodos mas faciles para ir testeando los modulos seria de mucha ayuda que me lo hagan saber.  :oops:

Con este programa inicie el modulo ADC
Código: [Seleccionar]
list p=16f887
#include <p16f887.inc>

ERRORLEVEL -302

__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF & _DEBUG_OFF

__CONFIG _CONFIG2, _BOR40V & _WRT_OFF

CBLOCK 0X20
CONTA_1
CONTA_2
ENDC

ORG 0X0000
GOTO CONFIGURACION


CONFIGURACION BSF STATUS,RP0 ;Banco 1
MOVLW B'01100111' ;Configurar reloj interno a 4MHz
MOVWF OSCCON
MOVLW B'11111111' ;Configurar PuertoA como entrada
MOVWF TRISA
MOVLW B'00000000' ;Configurar PuertoB como salida
MOVWF TRISB
MOVWF TRISC ;Configurar PuertoC como salida
MOVLW B'10000000' ;Configuracion ADCON1
;1------- Justificado a la derecha
;--0----- Referencia Vss
;---0---- Referencia Vdd
MOVWF ADCON1
BSF STATUS,RP1 ;Banco 3
MOVLW B'00000001' ;Configurar A0 como analogica
MOVWF ANSEL
MOVLW 0x00
MOVWF ANSELH
BCF STATUS,RP1 ;Banco 0
BCF STATUS,RP0
MOVLW B'11000001' ;Configuracion ADCON0
;11------ Reloj ADC
;--0000-- Canal analogico AN0
;------0- GO/DONE
;-------1 ADC Habilitado
MOVWF ADCON0

CONVERSION CALL RETARDOCONV ;Retardo (40 uS) conversion
BSF ADCON0,GO
BTFSC ADCON0,GO ;Termino la conversion
GOTO $-.1 ;NO, salta 1 atras
BSF STATUS,RP0 ;Banco 1
MOVF ADRESL,W ;7-0 bits conversion -> W
BCF STATUS,RP0 ;Banco 0
MOVWF PORTB ;W -> PuertoB
MOVF ADRESH,W ;9-8 bits conversion -> W
MOVWF PORTC ;W -> PuertoC
CALL RETARDO2TDA ;Retardo 2Tda (10 uS) antes de la sig conversion
GOTO CONVERSION


RETARDOCONV
MOVLW d'9'
MOVWF CONTA_1
NOP
DECFSZ CONTA_1,F
GOTO $-.2
RETURN

RETARDO2TDA
MOVLW d'2'
MOVWF CONTA_2
NOP
DECFSZ CONTA_2,F
GOTO $-.2
RETURN

END

Al correr la simulacion en Proteus todo parece estar bien, pero a la hora de checarlo ya en fisico, los 3 bits menos significativos siempre estan encendidos, y a la hora de llegar a la maxima resistencia del potenciometro los leds no encienden bien, con esto me refiero a que apenas y prenden y parecen "vibrar", alguna sugerencia para poder solucionar este problema?
« Última modificación: 27 de Septiembre de 2014, 02:12:01 por Carl47D »

Desconectado Carl47D

  • PIC16
  • ***
  • Mensajes: 160
Re: [SOLUCIONADO] Testeando el PWM del 16f887
« Respuesta #2 en: 27 de Septiembre de 2014, 02:08:49 »
Con este codigo pude controlar el ciclo de trabajo del PWM usando el modulo ADC, lo cheque en proteus y parece funcionar, cualquier sugerencia sera bien recibida.
Este todavia no lo checo en fisico, la duda mas grande que tengo es como poder almacenar los 2 bits menos significativos de la conversion en los registros del pwm CCP1CON<5:4>, justifique la conversion a la izquierda para que asi estos bits sean los menos significativos y no me afecten tanto, algun metodo para poder llevarlo a cabo?

Código: [Seleccionar]
list p=16f887
#include <p16f887.inc>

ERRORLEVEL -302

__CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF & _DEBUG_OFF

__CONFIG _CONFIG2, _BOR40V & _WRT_OFF

CBLOCK 0X20
CONTA_1
CONTA_2
ENDC

ORG 0X0000
GOTO CONFIGURACION

CONFIGURACION
; CONFIGURACION ADC
MOVLW B'01000001' ;Configuracion ADCON0
;01------ Reloj Fosc / 8
;--0000-- Canal analogico AN0
;------0- GO/DONE
;-------1 ADC Habilitado
MOVWF ADCON0
BSF STATUS,RP0 ;Banco 1
MOVLW B'01100111' ;Configurar reloj interno a 4MHz
MOVWF OSCCON
MOVLW B'11111111' ;Configurar PuertoA como entrada
MOVWF TRISA
CLRF TRISB ;Configurar PuertoB como salida
CLRF TRISC ;Configurar PuertoC como salida
MOVLW B'00000000' ;Configuracion ADCON1
;0------- Justificado a la izquierda
;--0----- Referencia Vss
;---0---- Referencia Vdd
MOVWF ADCON1
BSF STATUS,RP1 ;Banco 3
MOVLW B'00000001' ;Configurar A0 como analogica
MOVWF ANSEL
MOVLW 0x00
MOVWF ANSELH

;***************************************************
; PWM Period = [(PR2)+1] * 4 * Tosc * TMR2 Prescaler
; = [255+1] * 4 * [1 / 4 Mhz] * 1
; = [256] * 4 * .25 uS * 1
; PWM Period = 0.256 mS
;
; PWM Frec   = 1 / PWM Period
; = 1 / 0.256 mS
; PWM Frec = 3906.25 Hz
;
; Pulse Width= (CCPR1L:CCP1CON<5:4>) * Tosc * (TMR2 Prescaler)
; = Variable con el ADC * (1 / 4 MHz) * 1
; Pulse Width= 0.25 uS min. - 63 uS max.
;
; (CCPR1L:CCP1CON<5:4>)
; Duty Cycle = ----------------------
; 4 (PR2 + 1)
; 1020
; Duty Cycle = ------
; 1024
; Duty Cycle = 99.6% max
;
; log[4(PR2+1)]
; Resolution = -------------- bits
;    log(2)
; Resolution = 10 bits
;
;****************************************************
;CONFIGURACION PWM
BCF STATUS,RP1 ;Banco 1
;MOVLW B'00110111' ;Configurar reloj interno a 500 kHz
;MOVWF OSCCON
MOVLW B'11111111' ;Cargamos 255 al registro PR2
MOVWF PR2 ;Obtenemos un PWM con Frec de 3906.25 Hz
;CLRF TRISC ;Puerto C como salida
MOVLW B'10000000' ;Configuracion PWM1CON
MOVWF PWM1CON
BCF STATUS,RP0 ;Banco 0
MOVLW B'00000100' ;Configuracion del T2CON
;'-0000---' Postscaler 1:1
;'-----1--' Timer2 activado
;'------00' Prescaler 1:1
MOVWF T2CON
MOVLW B'00001101' ;Configuracion del CCP1CON (PWM Mejorado)
;'00------' Single output P1A Modulado, P1B, P1C y P1D pines de puerto
;'--00----' LSB del Duty Cycle
;'----1101' Modo PWM, P1A y P1C activos en alto, P1B y P1D activos en bajo
MOVWF CCP1CON
MOVLW B'00001101' ;Configuracion del CCP2CON
;'--00----' LSB del Duty Cycle
;'----1101' Modo PWM
MOVWF CCP2CON
;MOVLW B'01000000' ;Configuracion del CCPR1L
;MOVWF CCPR1L ;Duty Cycle del 25%  (0x100)

;CONVERSION ADC


CONVERSION CALL RETARDOCONV ;Retardo (40 uS) conversion
BSF ADCON0,GO
BTFSC ADCON0,GO ;Termino la conversion
GOTO $-.1 ;NO, salta 1 atras
MOVF ADRESH,W ;9-2 bits conversion -> W
MOVWF PORTB ;W -> PORTB
MOVWF CCPR1L ;W -> CCPR1L
CALL RETARDO2TDA ;Retardo 2Tda (10 uS) antes de la sig conversion
GOTO CONVERSION


RETARDOCONV
MOVLW d'9'
MOVWF CONTA_1
NOP
DECFSZ CONTA_1,F
GOTO $-.2
RETURN

RETARDO2TDA
MOVLW d'2'
MOVWF CONTA_2
NOP
DECFSZ CONTA_2,F
GOTO $-.2
RETURN

END
« Última modificación: 27 de Septiembre de 2014, 03:41:33 por Carl47D »