Ahí val el código. La simulación no la puedo enviar, porque al darme ese error no me genera el .HEX. Otra vez gracias
Hola veo que lograste avanzar bastante, pero aun así te comento al igual que lo hago con lo demás compañeros, algo que aprendí en 4 años desde que empece con lo de programación y todavía sigo aprendiendo, es tener un orden de pasos a seguir a la hora de realizar un código, esto como observación y como consejo,
ya que hasta el que tiene mas experiencia si no lo hace de una forma ordenada hasta una coma puede hacerle perder mucho tiempo, solo por no saber donde se encuentra esa coma por el desorden en el código.
Ahora continuando con tu código, hace poco como comente mas arriba empece a utilizar el modulo pwm por hardware lo cual me pareció interesante como practica, ahora para lograrlo tuve que al igual que tu investigar y leer y seguir investigando hasta que me di cuenta que casi todo estaba en la hoja de datos de micro ahora voy hacer un pequeño resumen de como se trabaja con el modulo pwm de pic.
Todos lo módulos de los micro tienen o están ligados a uno o varios registros de lectura o escritura, para configuración o control. Estos registros generalmente de 8 bits 10 bits 16 bits.
Para configuración normalmente son de 8 bit del 0 al 7.
Dependiendo de cada registro varia su compresión, a que me refiero con esto, que puede haber un bit de registro que sea para una sola configuración o varios bit igual para una sola configuración.
En si el modulo no se llama PWM, se llama CCP.
Que es modulo de:
Captura/Comparación y PWM = Modulación de Ancho de Pulso
Entonces lo primero que tenemos es que este modulo tiene tres maneras de operar
y por lo tanto lo primero que vamos hacer configurar el modulo y para eso debemos buscar
el registro que nos permita eso.
Datos de la sección 9 de la hoja de datos del 16F628A.
9.0 CAPTURE/COMPARE/PWM (CCP) MODULE
El módulo CCP (Captura / Comparación / PWM) contiene una
Registro de 16 bits que puede funcionar como un registro de captura de 16 bits o
como un registro comparacion de 16 bits, o como registro PWM
maestro / esclavo para ciclo de trabajo. La Tabla 9-1 muestra la
recursos temporizador de las modalidades del módulo CCP.
Módulo CCP1
Captura / Comparación / PWM Registro1 (CCPR1) está compuesta
de dos registros de 8 bits: CCPR1L (byte bajo) y
CCPR1H (byte alto). El registro CCP1CON en el registro de los controles de
la operación de CCP1. Todos son de lectura y escritura.
Información adicional sobre el módulo CCP está disponible
en el manual de referencia de medio rango PICmicro ™,
(DS33023).
Registro de control "CCP1CON" del modulo CCP1 es lo que nos permite seleccionar el modo de operación a continuación veamos ese registro:
U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
— — CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
bit 7 bit 0
Donde:
U = bit no implementado R = bit puede leerse
0 = bit es borrado W = bit puede escribirse
Descripción de cada bit:
7 y 6 no estas implementados
bit 5-4 CCP1X:CCP1Y: PWM Bits menos significativos
Capture Mode: Unused
Compare Mode: Unused
PWM Mode: Estos bits son los dos bits menos significativos del ciclo de trabajo de PWM. Los ocho MSB se encuentran en CCPRxL.
bit 3-0 CCP1M3:CCP1M0: CCPx Bits de Selección de Modo
0000 = Capture/Compare/PWM off (resets CCP1 module)
0100 = Capture mode, cada flanco de bajada
0101 = Capture mode, cada flanco ascendente
0110 = Capture mode, cada 4th de flanco ascendente
0111 = Capture mode, cada 16th de flanco ascendente
1000 = Compare mode, establecer la salida en el arranque (CCP1IF bit is set)
1001 = Compare mode, borrar la salida en el arranque (CCP1IF bit is set)
1010 = Compare mode, generar interrupción por software en el arranque (CCP1IF bit is set, CCP1 pin is
unaffected)
1011 = Modo de comparación, evento especial trigger (CCP1IF bit is set; CCP1 resets TMR1
11xx = Modo PWM
Hasta aquí espero todo se entienda, disculpen la traducción es gracias a google.
Ahora luego de analizar un poco este registro, no mucho solo un poco, si lo que vamos es a trabajar con PWM creo que estas mas que sobre entendido como debe quedar configurado el
registro CCP1CON.
Por si acaso por acá dejo la configuración:
Seleccionamos el modo de PWM con los bits del 0 al 3, quedando solo 2 y 3 en 1 sin importar los bits 1 y 0.
Ahora en ese mismo capitulo 9, nos muestra una tabla con los módulos y sus respectivas fuentes de temporizacion, para el caso del PWM nos especifica que se hace uso del Timer2, estar pendiente de este dato ya que cambia entre pic igual hay que estar pendiente de todo.
Ahora en una sección mas abajo la 9.3 de la hoja de datos del 16F628A, ahora si mas especifico nos indica como trabaja el modulo, como se hacen los cálculos, etc...
En fin todo lo que necesitamos saber para manejar el PWM. Ahora de todo eso hay algo bien interesante una pagina mas abajo en una sección que es la siguiente:
Lo llamaría pasos a seguir para trabajar con el modo PWM
9.3.3 SET-UP FOR PWM OPERATION
Indica lo siguiente: Según traducción directa de la hoja en google
Los siguientes pasos se deben tomar cuando se configura
el módulo CCP para la operación PWM:
1. Establezca el periodo PWM escribiendo al registro PR2.
2. Ajuste el ciclo de trabajo del PWM escribiendo en
CCPR1L del registro CCP1CON los bits <5 y 4> .
3. Hacer el pin CCP1 una salida en la limpieza de la
TRISB <3> bits.
4. Establecer el valor de preescaler TMR2 y habilitar Timer2
escribiendo en T2CON.
5. Configure el módulo CCP1 para la operación PWM.
Ahora dentro de estos pasos algo importante que hasta el momento no hemos hablado de frecuencia, dentro de la misma sección hay otra tabla que nos habla de cual es la frecuencia mínima dependiendo del oscilador usado y el divisor osea el presscaler. Para el caso
de usar un crystal de 20Mhz la frecuencia mínima es de 1.22Khz. Lo que significa que no podemos trabajar por debajo de esa frecuencia.
Bueno esto es solo una orientación ya luego colocare un PDF mas detallado de todo, de igual forma espero les sea útil como lo es para mi esta información.
Ahora como traducimos toda esa información en el PBP la parte facil
.
Primero vamos con las definiciones que hasta el momento estaba bastante bien el compañero Oskaring.
Nota: Todo lo siguiente esta en el manual de PBP versión ingles que esta en la web.
Definimos para el caso del 16F628A en modo PWM 3 parámetros.
El puerto y el numero de bit o pin por donde se va a sacar la señal PWM.
definición del puerto donde se encuentra la salida del PWM para el caso del 16F628A puerto B
DEFINE CCP1_REG PORTB ‘ Channel 1 port
definición del bit o pin de salida del PWM para el caso del 16F628A pin o bit 3
DEFINE CCP1_BIT 3 ‘ Channel 1 bit
La siguiente definición es la del registro de temporizacion que puede variar dependiendo del pic. Para el caso del 16F628A solo es el TIMER2 por que solo tiene un PWM.
DEFINE HPWM1_TIMER 2 'Hpwm channel 1 timer
Ahora ya finalizando el comando HPWM y su estructura.
HPWM Channel,Dutycycle,Frequency
CHANNELl ó CANAL tiene que ser un numero o una variable definida con un numero
esto lo digo por que gracias al compañero Oskaring realice unas pruebas y no funcionaron y fue porque se quería colocar una variable en el channel, el problema fue que esa variable era del PORTB.3 que de echo era por donde sale la señal PWM, pero en este caso lo que espera este comando es un numero no un bit de un puerto y por eso no la toma, así que no queda de otra que usar un numero directo o una variable o constante que tenga el numero del canal a utilizar. Para PBP lo maximo en canales son 4 así que el numero no puede ser mayor.
Dutycycle ó Ciclo de Trabajo, se refiere a otro numero pero esta ves comprendido entre 0 y 255 donde 0 = 0% y 255 = 100%. Puede ser una variable o constante de 0 a 255.
Frecuencia como dije antes hay una tabla en la hoja de datos de cada pic que lo especifica. Cuanto es lo mínimo, para el caso del 16F628A es de 1.22Khz con 20Mhz
Con 4Mhz 245Hz según manual PBP en ingles.
Entonces un ejemplo seria:
Código:
@ DEVICE PIC16F628A
@ DEVICE XT_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE BOD_Off
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF
DEFINE OSC 4
DEFINE CCP1_REG PORTB 'Channel 1 port
DEFINE CCP1_BIT 3 'Channel 1 bit
DEFINE HPWM1_TIMER 2 'Hpwm channel 1 timer
TRISA = %00000000
TRISB = %00000000 'Pin 3 del Puerto B como salida
PORTA = %00000000
PORTB = %00000000
Dutycycle VAR WORD
INICIO:
FOR Dutycycle = 0 TO 255
HPWM 1,Dutycycle,1000 'Va de 0% A 100% y repite el ciclo
PAUSEUS 200
NEXT
GOTO INICIO
Bueno hasta aca espero halla despejado mas las dudas y a su vez halla abierto mas la curiosidad por aprender y curiosear mas del mundo de los pic y de todo lo que llevan por dentro.
Cualquier cosa me avisan saludosss y mucho éxito
PD: Disculpen los moderadores si escribí demás.