desktop

Curso de programación de PIC en PICBasic Pro

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(y)

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 (y)



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 :cry: 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...
 

Adjuntos

  • 20130510_225953.gnghjpg.jpg
    20130510_225953.gnghjpg.jpg
    248.9 KB · Visitas: 22
  • 20130510_225800.jpg
    20130510_225800.jpg
    136.5 KB · Visitas: 19
Última edición:
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 (y)
 
Última edición:
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.
 
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.
 
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 :cool:.

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(y)

PD: Disculpen los moderadores si escribí demás.
 
Última edición:
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.
 

Adjuntos

  • pruebas serie.rar
    12.9 KB · Visitas: 70
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
 

Adjuntos

  • pruebas serie2.rar
    45.1 KB · Visitas: 104
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(y)
 
Última edición:
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.
 
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(y)

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. :apreton: (y)

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.
 
Última edición:
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.
 
Buenas por fin tuve algo de tiempo libre, por acá les dejo el sistema de los dos pic que se comunican vía serial y controlan los servos por HPWM, revisen y cualquier cosa me avisan saludos.
 

Adjuntos

  • pruebas seriehpwm.rar
    48.7 KB · Visitas: 104
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.

Hola...para trabajar con interrupciones debes consultar donde se pueden usar en cada pic en particular en la hoja de datos correspondientes...en el caso del pic 16F628 es en el puerto B exclusivamente.
Saludos.

Ric.
 
Hola...para trabajar con interrupciones debes consultar donde se pueden usar en cada pic en particular en la hoja de datos correspondientes...en el caso del pic 16F628 es en el puerto B exclusivamente.
Saludos.

Ric.

gracias por tu respuesta, si eso estaba viendo, lo que intentare hacer es multiplexar con el puerto a y usar las interrupciones por cambio de estado de RB.0 a RB.4...a ver como me va y ya subire avancs en el codigo y las dudas que seguro se me presentaran, ojala me pudan ayudar.
 
hola amigos del foro, quiero pedirles su ayuda por favor, yo soy radio aficionado y quiero implementar este
frecuencimetro a mi equipo casero, he encontrado parte de este codigo el cual abria que agregar lineas para
que cuente hasta 20mhz ò tal vez mas.. de ante mano gracias
pd: yo solo entiendo ò estoy mas familiarizado con pbp, tengo 2 tipos de pic el pic16f84a y el 16f628a
 

Adjuntos

  • FRECUENCIMETRO PBP.rar
    13 KB · Visitas: 117
Buenas por fin tuve algo de tiempo libre, por acá les dejo el sistema de los dos pic que se comunican vía serial y controlan los servos por HPWM, revisen y cualquier cosa me avisan saludos.

hola Rey te cuento que entusiasmado por el progreso que tuviste con este proyecto y viendo que en el proteus funciona perfectamente lo monte en el protoboard y que crees :cry: NO funciona lo he revisado por todos lados y no simplemente no funciona no se que estara pasando con este bicho:(
 
hola amigos del foro, quiero pedirles su ayuda por favor, yo soy radio aficionado y quiero implementar este
frecuencimetro a mi equipo casero, he encontrado parte de este codigo el cual abria que agregar lineas para
que cuente hasta 20mhz ò tal vez mas.. de ante mano gracias
pd: yo solo entiendo ò estoy mas familiarizado con pbp, tengo 2 tipos de pic el pic16f84a y el 16f628a

OFF TOPIC:
Hola...hay un problema y es que no es posible medir frecuencias altas de esa forma...lo que buscas lo encontrás NO EN BASIC y sí en asembler en la pagina de OM3CPH busca en el Google.
Saludos.

Ric.
 
hola Rey te cuento que entusiasmado por el progreso que tuviste con este proyecto y viendo que en el proteus funciona perfectamente lo monte en el protoboard y que crees :cry: NO funciona lo he revisado por todos lados y no simplemente no funciona no se que estara pasando con este bicho:(

Hola exactamente que no funciona, no lee el adc no se mueven los motores, no envia la señal serial? Especifica un poco, yo lo montaría en físico pero no cuento con un servo motor. Por lo tanto no tengo como saber que es lo que no funciona, tal vez mañana compre un servo para probar. Pero igual indícame que no te funciona.

PD: Cuales son las especificaciones de los servo motores que estas usando.
 
gracias ricbevi !! por el dato me sirvió de mucho, entiendo y hasta cuanto podría contar ò medir con
un pic16f628a en pbp?? gracias saludos
 
Atrás
Arriba