Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
02/05/2013 #2501


Hola PauJef,

Pues este es un ejemplo donde se captura por toki usando el timer1, ya te toca seguir mirando para agregar el pwm, espero te sea de ayuda.
Código:
'PICBASIC PRO program to demonstrate using Timer1 gate in single-pulse mode to capture single pulse event times.
' Description : PICBASIC PRO program to demonstrate using Timer1 gate
' in single-pulse mode to capture single pulse event times.

Device = 16F877A
Xtal = 20

All_Digital true
'Declaration for LCD 
       Declare LCD_Type = 0         ;LCD is Alpha
       Declare LCD_DTPin = PORTD.4  ;LCD data line starting port.pin
       Declare LCD_ENPin = PORTD.1  ;LCD EN line
       Declare LCD_RSPin = PORTD.0  ;LCD RS line
       Declare LCD_Interface = 4    ;LCD 4 line interface
       Declare LCD_Lines = 2
	 
  Dim	Pval As Word    ' Holds pulse time from Timer1
  
  GoSub Init    ' Hardware initialization routine  
	    
'Clear
   
	mainloop:
	   PORTB.4 = 1   ' Toggle RB4 on Timer1 gate pin high
       PORTB.4 = 0   ' Toggle Timer1 gate pin low to stop Timer1	    
	   Pval.LowByte = TMR1L  ' Read Timer1 value
	   Pval.HighByte = TMR1H	    
	   Print At 2,1, "pulsos",Dec Pval	    
	  ' GoSub Reset1   ' Clear Timer1 count & reset T1 gate
	   DelayMS 500   
	   GoTo mainloop ' Do it forever
	    
	Reset1:
	   TMR1H = 0    
	   TMR1L = 0
	   Return
	    
	Init:
       TRISC.0=1	    
	   TRISB = %00100000  ' RB5 = input for T1 gate, RB4 = output to gate
	   PORTB = 0          ' Hold T1 gate low at start	    
	   T1CON = %00000011  ' Timer1 on, incremento por tocki   
       Return
	   End
03/05/2013 #2502

Avatar de inspector gadget

hola expertos, estoy practicando un conteo en un display de 7 segmentos, pero no se como acceder y manejar la eeprom del 16f628a, lo que intento es conservar el conteo, cuando desenergize el chip, y cuando retorne la alimentación, que el conteo siga desde donde quedo antes de que la alimentación se interrumpiera, también me interesa como y cuando emplear y acceder a una memoria externa, pero ya posteare mis inquietudes cuando mis practicas lleguen a ese punto. espero me puedan colaborar y gracias por su tiempo.


di var byte
dat VAR BYTE
TRISB = 0

prog:
for di=0 to 15
lookup di,[64,121,36,48,25,18,2,120,0,16,8,3,70,33,6,14],dat
portb=dat
pause 500
next di
goto prog
END

---------- Actualizado después de 37 minutos ----------

bien, podria alguien explicarme como usar las declaraciones EEPROM, READ Y WRITE para tratar de usarlas en el ejemplo anterior, o al menos con un ejercicio basico, ya que desconociendo como usarlas, es imposible hacer avances en el codigo...ojala alguien tenga la voluntad de orientarme ya que mi duda es clara, y es lo que pretendo aprender en este CURSO PROGRAMACION EN PBP...gracias.
03/05/2013 #2503
Moderador

Avatar de D@rkbytes

inspector gadget dijo: Ver Mensaje
hola expertos, estoy practicando un conteo en un display de 7 segmentos, pero no se como acceder y manejar la eeprom del 16f628a, lo que intento es conservar el conteo, cuando desenergize el chip, y cuando retorne la alimentación, que el conteo siga desde donde quedo antes de que la alimentación se interrumpiera, también me interesa como y cuando emplear y acceder a una memoria externa, pero ya posteare mis inquietudes cuando mis practicas lleguen a ese punto. espero me puedan colaborar y gracias por su tiempo.


di var byte
dat VAR BYTE
TRISB = 0

prog:
for di=0 to 15
lookup di,[64,121,36,48,25,18,2,120,0,16,8,3,70,33,6,14],dat
portb=dat
pause 500
next di
goto prog
END

---------- Actualizado después de 37 minutos ----------

bien, podria alguien explicarme como usar las declaraciones EEPROM, READ Y WRITE para tratar de usarlas en el ejemplo anterior, o al menos con un ejercicio basico, ya que desconociendo como usarlas, es imposible hacer avances en el codigo...ojala alguien tenga la voluntad de orientarme ya que mi duda es clara, y es lo que pretendo aprender en este CURSO PROGRAMACION EN PBP...gracias.
Aquí adjunto un proyecto con lo que deseas hacer.
El sistema está basado en la interrupción por RB0 cuando se produce un corte eléctrico.
Se mantiene alimentado al PIC por medio de un capacitor y un diodo que separa la fuente principal.
El capacitor debe ser de un valor tal, que lo mentenga alimentado durante un breve período.
(Tiempo suficiente para poder escribir en la EEPROM interna), usé uno de 2200µF.

Las recomendaciones a tener en cuenta para que funcione bien, son:
.- Configurar el fuse BOREN (Brown Out Reset) en OFF
.- Procurar evitar carga excesiva del PIC en los periféricos.
En este ejemplo usé un display de ánodo común para tal efecto.
El proyecto funciona tanto en la simulación, como físicamente.
Se incluyen programa, esquema y simulación.

Espero les sirva como referencia. Suerte
Archivos Adjuntos
Tipo de Archivo: rar 16F628A Blackout.rar (97,5 KB (Kilobytes), 125 visitas)
08/05/2013 #2504

Avatar de ferdy575

ferdy575 dijo: Ver Mensaje
hola a todos, les cuento que ando haciendo un dimmer para la sala de TV a control remoto y tengo estos 2 códigos:
para el transmisor el código es:
Código:
;***************************************
;transmisor 16f84a con potenciometro   *
;***************************************
include "modedefs.bas"
trisb=0
portb=0
pos var byte		
dim1 var portb.1           
mainloop: 
Pot porta.0,127,pos
pos = pos / 2 + 100
        serout dim1,T2400,[6,6,"ok",#pos]        
 Goto mainloop		
        End
y para el receptor el código es:
Código:
'*******************************************************
'receptor 16f84a serie                                 *
'*******************************************************
include "modedefs.bas"
trisa=1
porta=1
trisb=0
portb=0
pos var byte  'aquí guardamos el valor de la posición
dimin var porta.0
dim   var portb.0
pulsout servo,150
principal:
serin dimin,T2400,100,reset,#pos 'función serin en porta.0
pos = pos 
pulsout dim,pos
serout portb.1,T2400,[6,6,"ok",#pos]
goto principal
reset:
pulsout dim,150 ; aquí sera el punto medio de iluminación   
goto principal
la verdad son códigos creados por el compañero D@rio pero con algunas reformas pero no me quieren funcionar, a ver sí me pueden ayudar y les encuentran los errores además quisiera saber sí puedo enviar la información de varios potenciometros al mismo receptor y como lo puedo hacer como seria la reforma del código emisor y como seria la reforma del código receptor pues me gustaría controlar tambien por ejemplo las cortinas y el ventilador; les agradezco de antemano
definitivamente no le he podido hallar donde estará el error que no permite que funcione el código
09/05/2013 #2505

Avatar de reyvilla

Hola muy buenas, vuelvo después de un tiempo por acá de nuevo un saludos a todos los compañeros. Voy a retornar aportando soluciones en lo que pueda por acá.
Empiezo con el amigo ferdy575, Amigo he trabajado con modulos RF un tiempo incluso llegue a trabajarlos bidireccionamente y no es nada sencillo, lo primero que noto en tu codigo es la configuración de los fuses no se si la haces de forma manual y por eso lo menciono. Aparte algo que me ayudo a solucionar problemas con los módulos RF es ver si trasmitian y recibian la información los microcontroladoes y para eso me hice un pequeño cable con un conector rs-232 y utilizando únicamente el pin 5 GND y el pin2 RX y con ayuda del virtual terminal del PBP podía ver si efectivamente estaba enviando la información y el microcontrolador y si el receptor la estaba recibiendo, esto conectando el cable de gnd a l gnd del circuito y el cable de rx al tx del circuito o a la salida del RX del modulo RF. Por el momento esto el dia de mañana te adjunto una imagen del cable que hice y si me da chance un vídeo de como lo uso. Por otro lado que módulos estas usando?
10/05/2013 #2506


Hola compañeros, y siempre gracias por todo lo aquì aprendido.
El tema es que pese a que todavía estoy en pañales en programación, me animé a hacerme un simulador amanecer-anochecer para el acuario por pwm, modificando un poco el programa de rtc ds1307 con pic 16f628a del libro de Carlos Reyes. En la simulacíon todo anda correcto pero en la práctica la posición 16 de la segunda linea parpadea y nada mas. Si se les ocurre alguna idea les estarìa muy agradecido (estoy a poco de quedarme calvo de pensar).
Archivos Adjuntos
Tipo de Archivo: rar PbP-y-Simulacion.rar (19,0 KB (Kilobytes), 83 visitas)
10/05/2013 #2507


Hola! estoy entrando al mundo de los conversores A/D, en este caso utilizo un PIC 16F877A para covertir y enviar una señal por puerto serie y visualizar en labview. El problema es el siguiente cuando lo simulo en el proteus puedo observar desde el virtual terminal que hay una conversión y envío de datos, sin embargo al cnectarlo virtualmente con el labview o el serial comunicator del PBP (por medio del programa virtual serial port driver) no logro transferir nada. No logro encontrar donde esta el error.

el programa es el siguiente:

include "modedefs.bas"
@ device XT_OSC
define osc 4
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
dato var byte
adcon1=%1110
inicio:
pause 300
ADCON0=%1000001
pauseus 50
ADCON0.2=1
pauseus 50
dato=ADRESH
pause 300
serout portc.7,N9600,[dato]
pause 300
goto inicio
end
10/05/2013 #2508

Avatar de ferdy575

reyvilla dijo: Ver Mensaje
Hola muy buenas, vuelvo después de un tiempo por acá de nuevo un saludos a todos los compañeros. Voy a retornar aportando soluciones en lo que pueda por acá.
Empiezo con el amigo ferdy575, Amigo he trabajado con modulos RF un tiempo incluso llegue a trabajarlos bidireccionamente y no es nada sencillo, lo primero que noto en tu codigo es la configuración de los fuses no se si la haces de forma manual y por eso lo menciono. Aparte algo que me ayudo a solucionar problemas con los módulos RF es ver si trasmitian y recibian la información los microcontroladoes y para eso me hice un pequeño cable con un conector rs-232 y utilizando únicamente el pin 5 GND y el pin2 RX y con ayuda del virtual terminal del PBP podía ver si efectivamente estaba enviando la información y el microcontrolador y si el receptor la estaba recibiendo, esto conectando el cable de gnd a l gnd del circuito y el cable de rx al tx del circuito o a la salida del RX del modulo RF. Por el momento esto el dia de mañana te adjunto una imagen del cable que hice y si me da chance un vídeo de como lo uso. Por otro lado que módulos estas usando?
Hola Rey
Gracias por mirar mi código, a ver tecuento lo de los fuses los configuro manualmente y los módulos usados son el TXR434 y el RXR434 la verdad ya he probado los módulos con los HT12D y Ht12E y me funcionaron bien sin embargo voy a hacer la prueba del cable como me dices te agradezco mucho tu ayuda
10/05/2013 #2509

Avatar de reyvilla

ferdy575 dijo: Ver Mensaje
Hola Rey
Gracias por mirar mi código, a ver tecuento lo de los fuses los configuro manualmente y los módulos usados son el TXR434 y el RXR434 la verdad ya he probado los módulos con los HT12D y Ht12E y me funcionaron bien sin embargo voy a hacer la prueba del cable como me dices te agradezco mucho tu ayuda
Hola yo tengo los TLP434 emisor y receptor que trabajan a 315Mhz y los he trabajado bastante y funcionan muy bien, con respecto al cable te dejo las imágenes para que veas de que te hable, el cable verde de la imagen va conectado al tierra osea al GND del circuito que va a trasmitir y el cable azul directo al pin TX del pic ó al RX dependiendo de lo que quieras probar, si es la recepción del modulo RF o la trasmisión del pic. Un ejemplo si lo primero que quieres probar es que el pic si esta enviando la información lo conectas directo al pin del pic que esta conectado al emisor RF. Y si lo que quieres es saber si el pic esta recibiendo la señales RF lo conectas al Pin de salida del modulo RF. Y allí ya a través del hiperterminal del PBP veras como llegan la señales, ten en cuenta que seguro veras cuando conectes al pin del salida del receptor del RF vas a ver mucha basura y eso es por que el receptor recibe todas las señales que esta en el ambiente a esa frecuencia, lo importante es que puedas ver que en un momento si este recibiendo los datos que tu le envías. Avísame cualquier cosa o dudas que tengas... Mucho éxito

---------- Actualizado después de 16 minutos ----------

Oskaring dijo: Ver Mensaje
Hola compañeros, y siempre gracias por todo lo aquì aprendido.
El tema es que pese a que todavía estoy en pañales en programación, me animé a hacerme un simulador amanecer-anochecer para el acuario por pwm, modificando un poco el programa de rtc ds1307 con pic 16f628a del libro de Carlos Reyes. En la simulacíon todo anda correcto pero en la práctica la posición 16 de la segunda linea parpadea y nada mas. Si se les ocurre alguna idea les estarìa muy agradecido (estoy a poco de quedarme calvo de pensar).
Hola amigo Oskarin, estuve revisando tu código y observo que el PWM que usas es por emulación o soft, debido a esto limitas al microcontrolador hacer otras cosas mientras ejecuta s el pwm por soft. En estos días me decidí a realizar varias pruebas y verificar las diferencias de cada una de las características de los microntroladores que traen ya ellos internamente y los emulados por el PBP. Entre ventajas y desventajas de ese modulo PWM existe un muy importante entre el PWM emulado del PBP y el de Hardware del PIC. Y es que el PBP mantiene ocupado al PIC para ejecutar el PWM que en si tarda un tiempo a menos que sea lo único que vayas a realizar no te lo recomiendo. En cambio el que trae el PIC por Hardware con sus registros etc... Se mantiene constante y ejecutándose mientras el PIC puede realizar cualquier otra tarea sin perturbar el ciclo de trabajo ni frecuencia del PWM. Y ya veras que al saber trabajar con este modulo del pic es muy facil y practico. Por otra parte una desventaja de este modulo es que es uno solo ya quisieran mucho que fueran mas, pero bueno con este puedes multiplexar o incrementarlo con compuertas pero ya ese es otro tema. Ahora como utilizas ese modulo pues revisa un poco la hoja del micro y busca la sección de PWM para el 16F628A y cualquier duda me avisas. Éxito...
Imágenes Adjuntas
Tipo de Archivo: jpg 20130510_225953.gnghjpg.jpg (248,9 KB (Kilobytes), 20 visitas)
Tipo de Archivo: jpg 20130510_225800.jpg (136,5 KB (Kilobytes), 17 visitas)
11/05/2013 #2510

Avatar de reyvilla

zal dijo: Ver Mensaje
Hola! estoy entrando al mundo de los conversores A/D, en este caso utilizo un PIC 16F877A para covertir y enviar una señal por puerto serie y visualizar en labview. El problema es el siguiente cuando lo simulo en el proteus puedo observar desde el virtual terminal que hay una conversión y envío de datos, sin embargo al cnectarlo virtualmente con el labview o el serial comunicator del PBP (por medio del programa virtual serial port driver) no logro transferir nada. No logro encontrar donde esta el error.

el programa es el siguiente:

include "modedefs.bas"
@ device XT_OSC
define osc 4
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
dato var byte
adcon1=%1110
inicio:
pause 300
ADCON0=%1000001
pauseus 50
ADCON0.2=1
pauseus 50
dato=ADRESH
pause 300
serout portc.7,N9600,[dato]
pause 300
goto inicio
end
Hola amigo zal, unas observaciones para tu código, al igual que mencione al amigo ferdy575, ten en cuenta los fuses ya sea que lo hagas en forma manual o en tu código, lo otro debes definir cuales pines de los puertos van hacer salidas y cuales van hacer entradas los I/O, estoy ya que si vas a leer un pin de cualquier puerto ya sea digital o análogo lo debes configurar como entrada ya que de lo contrario no vas a poder leerlo. Otra cosa que debes tomar en cuenta es la configuración del A/D los registros ADCON0 y ADCON1 tienen configuraciones bien estrictas que deben de coincidir de lo contrario puedes confundirte con respecto a lo que esta leyendo el PIC y lo que tu crees que esta leyendo, esto por que una de las configuraciones es la justificación o forma de ordenar el valor obtenido por el A/D si es justificado a la derecha o a la izquierda. En esa misma idea debes tomar en cuenta que en tu código estas configurando el ADCON0 con cada lectura y debes tomar en cuenta que el bit 2 del ADCON0 es un bit de estatus del A/D y seteo por lo tanto es un bit que puedes leer y escribir, "ADCON0.2=1", esto iniciaría la lectura del A/D y para saber si ya termino de leer, valga la redundancia debes leer el bit 2 de ADCON0 y seria algo asi, (IF adcon.2 = 0 then) que seria lo mismo que preguntar si ya termino la lectura del A/D, para entonces saber si ya puedes copiar el dato obtenido en ADRESH ó ADRESL, y trasmitirlo. Continuando con el ADCON0, como te indicaba estas configurándolo con cada vuelta del loop que hiciste en tu código, en la primera linea después del inicio colocaste "ADCON0=%1000001", donde estas configurando desde el bit 6 hasta el bit 0, y donde el bit 0 = 1, bit1 = 0, bit2= 0, bit3 = 0, bit4= 0, bit5= 0, bit6=1 y bit7= 0, el bit 7 queda en 0 por definición si no se especifica, el bit 7 y 6 son los ADCS1:ADCS0 con los cuales especificas el reloj que vas a utilizar y ademas tienes el ADCS2 que es el bit 6 de ADCON1 que ayuda a lo mismo de selección de reloj, en tu caso que el ADCON1 = %1110, quedan del bit 4 al 7 en 0 y los demás bit 0 = 0, bit1 = 1,bit2 = 1, bit3 = 1. Por lo cual tu A/D quedaría configurado de la siguiente manera:

ADCON0 =01000001

ADCS2 = bit 6 del ADCON1
ADCS1:ADCS0 = bit 7-6 de ADCON0

ADCS2:ADCS1:ADCS0: A/D Conversion Clock Select bits (ADCON0 bits in bold)
001 FOSC/8

bit 5-3 CHS2:CHS0: Analog Channel Select bits
000 = Channel 0 (AN0)

bit 2 GO/DONE: A/D Conversion Status bit
When ADON = 1: Cuando ADON = 1
1 = A/D conversion in progress (setting this bit starts the A/D conversion which is automatically
cleared by hardware when the A/D conversion is complete). La conversion esta en progreso.
0 = A/D conversion not in progress. La conversion no esta en progreso.

bit 1 Unimplemented: Read as ‘0’

bit 0 ADON: A/D On bit
1 = A/D converter module is powered up. Enciende el A/D
0 = A/D converter module is shut-off and consumes no operating current. Apaga el A/D


ADCON1 =00001110

bit 7 ADFM: A/D Result Format Select bit
0 = Left justified. Six (6) Least Significant bits of ADRESL are read as ‘0’.

bit 6 ADCS2:

ADCS2:ADCS1:ADCS0: A/D Conversion Clock Select bits (ADCON0 bits in bold)
001 FOSC/8

bit 5-4 Unimplemented: Read as ‘0’

bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits

AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF- C/R
1110 D D D D D D D A VDD VSS 1/0

Con lo cual tenemos seleccionado el Análogo digital 0, con un reloj de Fosc/8, estoy creo que es cuando quieres sincronizar de alguna manera el muestreo. Normalmente yo utilizo Frc ya que tendrías que sacar un calculo en función a tu selección de reloj con respecto al oscilador que estas usando y la frecuencia de la señal Análoga. Estas disparando GO sin tomar en cuenta si ya termino la conversión y estas leyendo el registro ADRESH igual sin saber si ya la conversión termino.

Otra cosa es que en el PBP existe un comando que te lo facilita mas que se llama ADCIN donde únicamente colocas algo así: "ADCIN 0, dato", y ya tienes toda la conversión resumida allí. Claro esta ese comando no indica ninguna configuración es solo la lectura y guarda el valor obtenido en la variable.
A parte con respecto a lo de la transmisión no le veo ningún problema, lo que si veo es que colocaste el A/D con 10-bit y la variable de A/D osea dato de 8-bit, debes estar pendiente ya que puede cambiarte el valor al superar los 256 que es el valor máximo de la variable.

Conclusión: Revisa lo comentado y luego cualquier cosa me avisas si tienes dudas. Éxito
12/05/2013 #2511


Muchisimas gracias Reyvilla por tomarse la molestia de echarle un ojo al código.
Como me recomendó, intenté utilizar la modulación por hardware, pero al utilizar HPWM y compilar en microcode studio plus me devuelve el siguiente mensaje:
Macro HPWM?TCC not found in macro file. Alguna sugerencia? Otra vez gracias compañeros.
12/05/2013 #2512

Avatar de reyvilla

Oskaring dijo: Ver Mensaje
Muchisimas gracias Reyvilla por tomarse la molestia de echarle un ojo al código.
Como me recomendó, intenté utilizar la modulación por hardware, pero al utilizar HPWM y compilar en microcode studio plus me devuelve el siguiente mensaje:
Macro HPWM?TCC not found in macro file. Alguna sugerencia? Otra vez gracias compañeros.
Hola si colocas el código seria mas fácil de ver donde esta el error, lo otro seria si tienes alguna simulación también ayudaría.
13/05/2013 #2513


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
Archivos Adjuntos
Tipo de Archivo: rar Al2.rar (1,7 KB (Kilobytes), 52 visitas)
13/05/2013 #2514

Avatar de reyvilla

Oskaring dijo: Ver Mensaje
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.
14/05/2013 #2515

Avatar de ferdy575

hola a todos vengo nuevamente a molestar por estos lados.
solo por practicar y estudiar más sobre programación estoy haciendo un circuito donde controlo un servo con un potenciometro y envió una señal serial a otro pic para que accione otro servo al mismo tiempo pero no logro que el segundo pic haga trabajar el segundo servo, aquí les pongo los archivos para que los vean a ver sí me pueden ayudar les agradezco su colaboración.
Archivos Adjuntos
Tipo de Archivo: rar pruebas serie.rar (12,9 KB (Kilobytes), 53 visitas)
14/05/2013 #2516

Avatar de reyvilla

ferdy575 dijo: Ver Mensaje
hola a todos vengo nuevamente a molestar por estos lados.
solo por practicar y estudiar más sobre programación estoy haciendo un circuito donde controlo un servo con un potenciometro y envió una señal serial a otro pic para que accione otro servo al mismo tiempo pero no logro que el segundo pic haga trabajar el segundo servo, aquí les pongo los archivos para que los vean a ver sí me pueden ayudar les agradezco su colaboración.
Hola de nuevo compañero, vi el circuito y los códigos, pensando que vería algo mas completo, tu código solo tiene unos detalles, aun le falta un montón para que quede al 100% pero ya funciona, revisa bien los cambios realizados y analiza todo y cualquier duda me comentas saludosss
Archivos Adjuntos
Tipo de Archivo: rar pruebas serie2.rar (45,1 KB (Kilobytes), 77 visitas)
17/05/2013 #2517

Avatar de ferdy575

reyvilla dijo: Ver Mensaje
Hola de nuevo compañero, vi el circuito y los códigos, pensando que vería algo mas completo, tu código solo tiene unos detalles, aun le falta un montón para que quede al 100% pero ya funciona, revisa bien los cambios realizados y analiza todo y cualquier duda me comentas saludosss
Hola Rey gracias por mirar mi proyecto lo hiciste funcionar perfectamente te felicito eres un monstruo para esta vaina lo analice todo y hay algunas cosas que no entiendo, todos sabemos que la programación se basa en escribir pequeñas frases mágicas que hacen que el pic haga lo que queremos pero hay unas frasesitas que pusiste y no entiendo su funcionamiento por ejemplo:

Dutycycle VAR WORD
clear


que función tiene?

if pos > pos2 + 5 or pos < pos2 - 5 then
pos2 = pos


que función tiene? por que añadiste la variable pos2 y la haces comparar con la variable pos?
¿que obtenemos con esto?

tampoco entiendo como funciona el tema de los corchetes en la función SEROUT y además agregaste 2 números que no se de donde te salieron ¿como sabes que valor se debe usar en esta función?:

Serout portb.1,T2400,["ok",#pos,10,13]

no se de donde te salio el 10 y el 13 y en el receptor tambien hiciste un cambio importante en esta misma función cuando escribes:

serin sigin,T2400,10,inicio,["ok"],#pos

aquí sacaste la variable del corchete por que este cambio?, me perdonas tanta preguntadera pero tú sabes que "no hay preguntas tontas sino tontos que no preguntan" y "quien no pregunta no aprende jamas" he venido siguiendo esta pagina desde el inicio y gracias a ustedes he aprendido muchísimo sobre este tema y les estoy muy agradecido pero yo siempre quiero aprender muy bien lo que me gusta y me perdonan sí llego quizá a fastidiar con tanta molestadera pero hay cosas que ni en los libros de programación se encuentran y veo que ustedes si las saben no se de donde saben tanto y agradezco que las publiquen para así aprender de ustedes nuevamente gracias a todos por su colaboración
17/05/2013 #2518


Hola..."ferdy575"para colaborar algo te aclaro algunas dudas de las que tenes...

Dutycycle VAR WORD 'define la variable llamada Dutycycle a valor a Word (0 a 65535)
clear ' coloca todas las variables a valor 0 para limpiarlas

Sic "...no se de donde te salio el 10 y el 13 ..." 10 es el valor decimal de Line Feed o avance de linea que hace que se avance una linea hacia abajo y el 13 es el valor decimal del Carriage Return o retorno de carro comúnmente llamado "Enter" en el teclado

Sic"serin sigin,T2400,10,inicio,["ok"],#pos" Espera 10 si no va a Inicio y si recibe la frase literal "ok" y lo que llega a continuación lo guarda en la variable "pos" de forma decimal.

Todo esto lo encontrás en la ayuda del compilador la cual deberías consultar ante cualquier duda de ese tipo.

Saludos.

Ric.
17/05/2013 #2519

Avatar de reyvilla

ferdy575 dijo: Ver Mensaje
Hola Rey gracias por mirar mi proyecto lo hiciste funcionar perfectamente te felicito eres un monstruo para esta vaina lo analice todo y hay algunas cosas que no entiendo, todos sabemos que la programación se basa en escribir pequeñas frases mágicas que hacen que el pic haga lo que queremos pero hay unas frasesitas que pusiste y no entiendo su funcionamiento por ejemplo:

Dutycycle VAR WORD
clear


que función tiene?

if pos > pos2 + 5 or pos < pos2 - 5 then
pos2 = pos


que función tiene? por que añadiste la variable pos2 y la haces comparar con la variable pos?
¿que obtenemos con esto?

tampoco entiendo como funciona el tema de los corchetes en la función SEROUT y además agregaste 2 números que no se de donde te salieron ¿como sabes que valor se debe usar en esta función?:

Serout portb.1,T2400,["ok",#pos,10,13]

no se de donde te salio el 10 y el 13 y en el receptor tambien hiciste un cambio importante en esta misma función cuando escribes:

serin sigin,T2400,10,inicio,["ok"],#pos

aquí sacaste la variable del corchete por que este cambio?, me perdonas tanta preguntadera pero tú sabes que "no hay preguntas tontas sino tontos que no preguntan" y "quien no pregunta no aprende jamas" he venido siguiendo esta pagina desde el inicio y gracias a ustedes he aprendido muchísimo sobre este tema y les estoy muy agradecido pero yo siempre quiero aprender muy bien lo que me gusta y me perdonan sí llego quizá a fastidiar con tanta molestadera pero hay cosas que ni en los libros de programación se encuentran y veo que ustedes si las saben no se de donde saben tanto y agradezco que las publiquen para así aprender de ustedes nuevamente gracias a todos por su colaboración
Hola de nuevo me alegra que te intereso, lo primero que preguntas es que esa variable como te fijas no esta siendo usada en ninguna parte ademas te deje varios DEFINE y otra parte del código como como comentario y es así por que la finalidad es que si te animas a utilizar en vez de PULSOUT el HPWM creo seria mejor ya que si leíste lo que escribí con respecto a como funciona y no es muy complicado si lo aplicas en la practica notaras la diferencia entre HPWM y PUSOUT. Entre hoy y mañana lo subo completo para que veas como funciona.

La sentencia if pos > pos2 + 5 or pos < pos2 - 5 then
pos2 = pos
,
Se refiere a que si la lectura del potencio metro cambia con respecto a la ultima referencia guardada en la variable pos2 entonces envía la nueva posición al otro pic. Esto para evitar estar enviando constantemente la misma posición al otro pic si ya el otro la tiene.

Ejemplo: Si el potenciometro mide 100 ese valor se guarda en pos digamos que eso pone al servoen 30 grados y envía al otro pic para que coloque el servo a 30 grados también.

Ahora para evitar que este enviando constantemente el valor 100, lo que hice antes de enviar el dato fue guardar ese mismo dato en otra variable llamada pos2, esto para luego compararla con la lectura actual del potenciometro que se guarda en pos.
Entonce lo que indica eso es:

Si la variable pos es mayor pos2 + 5 o si la variable pos es menor que pos2 - 5 entonces.
le sume 5 por que el valor del potenciometro es muy dinámico y puede variar entre una lectura y otra y esto hace que a si no muevas el potenciometro el valor cambie.

Y esto se debe a que lo que realmente esta sucediendo es que el pin donde esta conectado el potenciometro en un momento es salida y en otro momento es entrada. Esto lo encontré en las librerías del PBP.
El comando POT, convierte el pin donde esta el potencimetro en salida para cargar el condensador y luego lo convierte en entrada para ver cuanto tarda en descargarse el condensador y eso va a depender del valor que tenga en ese momento el potenciometro.

Un dato que no te había mencionado es que el poenciometro no debes conectarlo a VCC ya que el mismo pic se encarga de eso enviando un 1 al potenciometro como te comente arriba.

Entonces luego de que el detecta que el valor de pos + 5 es diferente de pos2 mas o menos lo que hago es igualar nuevamente los valores de pos y pos2.

Ahora con : Serout portb.1,T2400,["ok",#pos,10,13]

El 10 y 13 son comando en ASCII http://es.wikipedia.org/wiki/ASCII notaras que uno es para indicar que se desplace a la siguiente linea y el otro retorno de carro, que en si es que se desplace al comienzo de la linea.


En el receptor : serin sigin,T2400,10,inicio,["ok"],#pos

Saque la variable por que no va dentro de los corchetes te recomiendo tener el manual de PBP para que no te confundas ya que a mi me paso y busque en google y lo descargue en español y en ingles y estos me han ayudado bastante.

El "ok" se refiere a algo que se puede llamar como comando de start o bits de start y es para indicarle al receptor que solo en caso de recibir esos comando es entonces cuando va a guardar el valor que le sigue en la variable pos.

Y no te preocupes por fastidiar siempre y cuando sea para aprender no tengo problemas eso es lo importante ya que no se trata solo de lo que tu aprendes si no también de lo que yo aprendo explicándote. Cualquier cosa me avisas.

PD: Compañero ricbevi gracias por el apoyo espero no haber enredado mucho la cosa en un rato subo el ejemplo completo para que lo vean funcionando y así se entienda mejor.
20/05/2013 #2520

Avatar de inspector gadget

hola xpertos, como sigo experimentando con contadores con displays 7 segmentos y gracias a la ayuda de ustedes he entendido el concepto de la multiplexacion. Ahora tengo la duda sobre las interrupciones en el pic 16f628, si estoy empleando todo el puerto b para manejar atravez de un deco cuatro displays (unidades,decenas,centenas,millares mas los cuatro transistores para multiplexar), ¿puedo trabajar con las interrupciones pero con pulsadores conectados en el puertoa? sucede que necesito emplear las interrupciones en un contador, ya que mientras el contador corre descendentemente, quiero tener la posibilidad de aumentar el tiempo de conteo, pero sin esperar que el tiempo llegue hasta 00:00, gracias por su tiempo y espero alguna respuesta para ponerme manos a la obra y postear los avances en el codigo y seguir la politica de no pedir ayuda sin antes no habeer al menos intentar resolverlo por mi cuenta.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.