# Obtener tren de pulsos con PIC



## xvladx (Ene 4, 2011)

Hola amigos como estas.
Necesito obtener en alguna salida de un PIC un tren de pulsos con las siguientes caracteristicas:

1) Cantidad de impulsos: 40
2) tiempo total del tren de pulsos 100us.
3) Cada uno de los 40 impulsos deberia tener un ciclo en alto de unos 1.75us (micro segundos) y en bajo unos 0,75us (microsegundos). 
4) Todo este tren de 40 impulsos deberia repetirse a frecuencias seleccionables de 625Hz, 1250Hz y 2500Hz, es edcir que este tren de 40 impulsos deberia repetirse 625, 1250 y 2500 veces por segundo.

Sinceramente estoy un poco o bastante desorientado de como encarar el tema. Hay alguna instruccion con PicBasic que pueda utilizar para resolver el problema?? He intentado analizar con PWM del PicBasic Pro pero no le encuentro aun la forma de utilizarlo.

Desde ya les agradezco a todos por los comentarios
Saludos

Flavio


----------



## MVB (Ene 4, 2011)

Personalmente no creo que el PWM sea la respuesta, tambien creo que se debe utilizar emsamblador para realizar esto, pues se debe tener un control muy preciso de los tiempos.
Al ser tiempos tan cortos, el PIC debe trabajar a altra frecuencia, con un cristal de 20 mghz cada instrucion toma 200ns para ejecutarse, con lo cual creo que se puede obtener una muy buena aproximacion a los requerimientos que planteas.

En el adjunto dejo parte del codigo que hice, no se si la aproximacion hecha sea validad, pues no he logrado los tiempos en alto y en bajo exactos que pides.
Tambien hice las rutinas para trabajar a diferentes frecuencias, calcule el periodo de cada frecuencia, entonces lo que hago es crear el tren de pulsos (100µs), y luego hacer una espera hasta llegar a ese periodo..

Espero que te sirva para algo, y disculpa la organizacion del codigo, hacia un buen tiempo no programaba algo en assembler.


----------



## xvladx (Ene 5, 2011)

Hola MVB. Muchas gracias por la informacion. Si bien entiendo muy poco de Assembler, me pude dar cuenta con tu codigo que iba a ser imposible conformar el tren de pulsos requerido con la instruccion PWM.
Por lo que pude ver y corregime si me equivoco, la idea de el codigo que escribiste es sacar 40 pulsos por un PIN y generar las demoras necesarias para obtener los casi 1.75us (Demora 40) y los 0.75us (Demora 30). COmo has calculado los tiempos en alto y en bajo?

Muchas gracias y un saludo


----------



## MVB (Ene 5, 2011)

Te voy explicar el funcionamiento del programa, no lo hice ayer por que era tarde y tenia sueño 

Realmente lo que dices no es correcto, esas demoras que estas leyendo son utilizadas para sacar los pulsos a 625hz, 1250 y 2500 como describiste en el post, pero mas adelante te explico eso.

Comencemos por lo basico, cada instrucion en assembler tiene un tiempo ejecucion preciso, que viene dado por 4/Fosc, dado que el oscilador es del 20 Mghz, el tiempo de intrucion viene dado es 4/20000000 = 200 ns o 0.2µs, algunas intruciones requieren un tiempo de ejecucion doble, como por ejemplo goto, call etc. Pero no entremos en este detalle.

La intrucion nop, como su nombre lo indica, no hace nada, simplemente se utiliza para crear demoras.

Pulsos lo que hace es sacar los 40 pulsos por el PINB1, lo primero que hacemos es mover un 40 a una variable, esta se utiliza como un contador del numero de pulsos a enviar.
Ahora lo que hace Bucle1 es hacer un ciclo de ese tren, la instrucion bsf pone en alto el pin, 
y luego tenemos 7 nop, que lo que hacen es crear una demora de 1.4µs, y luego ponemos el pin en cero con bcf,  entonces, desde que se pone en alto el pin b0 hasta que se pone en bajo transcurren 1.6 µs, (1.4 de la nop + 0.2 que tarda en ejecutarse la instrucion bcf PORTB,1).
Ahora lo que hace decfsz, disminuye en uno la variable aux, si esta llega a cero salta una instrucion, es decir, se saltaria el goto, asi saldria del bucle. Pero preocupemonos de cuando no salta, llama a goto y lo que hace es empezar de nuevo el ciclo.
Vamos entonces a calcular el tiempo que permanece en bajo.
(0.2 us de decfsz, 0.4 de goto, y 0.2 de bsf ), para un total de 0.8us en bajo.

Y ahora tenemos que elciclo total demora 2.4us, 0.1us menos de lo que requerias, pero con este PIC es imposible crear un retardo de 0.1us, pues la maxima velocidad que sorporta es de 20mghz.

Si hacemos un poco de cuentas, 2.4*40 = 96 us, eso tarda mas o menos el tren de pulsos, digo mas o menos por que hay unos retardos del llamado call, de return que no he tenido en cuenta. Para adaptarse a los 100us que pediste, agrege esos 24 nop, para crear una demora, pero ahi hay un error XD, deberian ser 20 nop, con esos 20 obtengo una demora de 4 us, haciendo que el tren dure aproximadamente 100us.

Ya tenemos lista la parte que saca un TREN DE pulsoS.

Ahora para lo de las frecuencias.
Comencemos por la de 625 hz, que tiene un periodo de 1.6 ms, o 1600us, pero tambien me di cuenta que la de 1250 tiene un periodo de 0.8ms y la de 2500 de 0.4 ms, entonces lo que hice fue:
Crear una rutina (en realidad la cree con el programa PDEL ver SP1), para una demora de 0.3 ms,  y crear una rutina para una demora de 0.4 ms.
Asi, para generar la onda de 2500 hz, creo un pulso (100us) y espero 0.3ms, asi obtengo un periodo de 0.4ms.
Y con las otras hice basicamente lo mismo, solo que agregando mas espera para completar el periodo necesario.


Lo que hacen estas funciones es crear esa onda por SIEMPRE en el PIC, en inicio haces      call _2500Hz y crea la onda de _2500Hz, esta seria la parte que falta por mejorar, como escojer cual onda generar.
No se que ideas tengas sobre eso.

Espero haber sido lo suficientemente claro,

Saludos


----------



## xvladx (Ene 5, 2011)

Extremadamente claro lo tuyo MVB, creo que lo entendi perfectamente.
No seria indicado tambien hacer que el PIC emita los 40 impulsos y que un Pin de interrupcion interrumpa al llegar a los 40. El tiempo que permanece sin emitir pulsos sera de 1/2500, 1/1250, etc. pasado este tiempo vuelve a emitir los impulsos. Que opinas?
Mil gracias por tu ayuda.Impecable.


----------



## MVB (Ene 5, 2011)

Pues en el diseño tengo planteado algo similar a lo que indicas, solo que sin usar interrupciones. No lo veo muy claro usando interrupciones, la duda mia es de que forma deberias selecionar la frecuencia para generar. Varios pulsadores?.


----------



## xvladx (Ene 5, 2011)

La idea es usar un solo pulsador que secuencialmente recorra las frecuencias a seleccionar.


----------



## guigo (Jun 10, 2011)

PULSOUT POTRB.5,100

envia un pulso de 1 mseg.a pin 5 ( a 4 Mhz)

HPWM O PWM, GENERA GENERA TREN PWM

HPWM 1 , 100 , 1000
HPWM 1 , 100 , 1000

TREN DE PULSOS CON DUTY CICLE DE 100 A 1000 OSC POR SEGUNDO
DUTY CICLE ES EL QUE DA EL ANCHO DE PULSO




xvladx dijo:


> Hola amigos como estas.
> Necesito obtener en alguna salida de un PIC un tren de pulsos con las siguientes caracteristicas:
> 
> 
> ...


----------



## kichanito (Ago 6, 2011)

soi nuevo en electronica.. me podrian ayudar a generar un tren de pulsos con compuertas o con un pic.. que esta asu ves  podamos controlar las salidas del pulso del reloj con un potenciometro...


----------



## lubeck (Ago 6, 2011)

> me podrian ayudar a generar un tren de pulsos con compuertas o con un pic.. que esta asu ves podamos controlar las salidas del pulso del reloj con un potenciometro...



Explica mejor lo que quieres hacer....

asi suena a que con un poderoso 555 lo puedes hacer... eso es lo que necesitas???

(si no sabes que es el 555 googlea)


----------



## kichanito (Ago 7, 2011)

lo que pasa, necesitamos controlar la posicion angular de  un motor cd con un potenciometre, pero ammm no nos dejan usar el 555, asi que no tengo idea la verdad como  hacerle..jeje te agradeceria si me ayudan va?


----------



## lubeck (Ago 7, 2011)

kichanito dijo:


> lo que pasa, necesitamos controlar la posicion angular de  un motor cd con un potenciometre, pero ammm no nos dejan usar el 555, asi que no tengo idea la verdad como  hacerle..jeje te agradeceria si me ayudan va?



entonces no veo la necesidad de un tren de pulsos...

compra un 16f87XA (o similar)y con el conversor A/D determinas la posicion...

existen potenciometros de 360º que te van al pelo...(No recuerdo precio pero al rededor de 12usd) 

ahora existe otra posibilidad... compra un servomotor para jueguetes a escala o radiocontrol... esos no se manejan con tren de pulso sino con modulación de ancho de pulso (PWM) (bueno algunos)


----------



## guigo (Ago 8, 2011)

lubeck dijo:


> Explica mejor lo que quieres hacer....
> 
> asi suena a que con un poderoso 555 lo puedes hacer... eso es lo que necesitas???
> 
> (si no sabes que es el 555 googlea)





TE RECOMIENDO....
http://perso.wanadoo.es/luis_ju/

ALLI ENCONTRAS CURSOS DE ELECTRONICA BASIC, DIGITAL, CONTROL DE MOTORES PAP, ETC.
EN EL MODULO EBASICA ENCONTRAS LA APLICACION QUE NECESITAS Y HASTA MAS.
SI QUERES APRENDER MICROS EN EL MODULO PIC, ENCONTRAS LO BASICO. AUNQUE PRIMERO LEETE EL MODULO DE EDIGITAL.

YO SOY MAS NUEVO EN ESTO QUE MI ABUELITA CUANDO NACIO PERO GRACIAS A ESTE FORO Y ALGUNOS LINKS MAS, HE APRENDIDO MUCHO.

MI META ES CONOCERTODOS LOS LENGUAJES...SI QUERES APRENDER A PROGRAMAR EN BASIC SIGA ESTE FORO DESDE EL PRINCIPIO, INVESTIGUE, LEA, EMPAPESE COMO DECIMOS AQUI EN MEDELLIN, VUELVASE UN GOMOZO, ETC.

SALUDOS...



xvladx dijo:


> hola amigos como estas.
> Necesito obtener en alguna salida de un pic un tren de pulsos con las siguientes caracteristicas:
> 
> 1) cantidad de impulsos: 40
> ...



nose si ya te respondieron...

Te voy a aclarar la idea....

Vos queres sacar un tren con unos parametros que la verda yo veo confuso .porque?

Mmm

en basic vos tenes una instruccion.

Hpwm.

La etructura completa es hpwm x,y,z donde x es el pin que saca un tren de pulsos. Llamese pwm interno o modulo interno pwm, en el data sheet lo vemos como ccp1 en micros que tienen 1 solo modulo ccp. Y es los bits que van de 0 a 255, este endica el acho de pulso osea, u tren de pulso de un 50% equvale a 127, y zes la frequiencia. Segun entiendo un poco tus intenciones, necesitascalcular. Hecharle matematic a la cuestion porque yo puedo persivir en tu cuestionamiento una idea no muy clara en la pregunta. Espero que la resta aportada te sirva.



xvladx dijo:


> Hola amigos como estas.
> Necesito obtener en alguna salida de un PIC un tren de pulsos con las siguientes caracteristicas:
> 
> 1) Cantidad de impulsos: 40
> ...



nose si ya te respondieron...

Te voy a aclarar la idea....

Vos queres sacar un tren con unos parametros que la verda yo veo confuso .porque?

Mmm

en basic vos tenes una instruccion.

Hpwm.

La etructura completa es hpwm x,y,z donde x es el pin que saca un tren de pulsos. Llamese pwm interno o modulo interno pwm, en el data sheet lo vemos como ccp1 en micros que tienen 1 solo modulo ccp. Y es los bits que van de 0 a 255, este endica el acho de pulso osea, u tren de pulso de un 50% equvale a 127, y zes la frequiencia. Segun entiendo un poco tus intenciones, necesitascalcular. Hecharle matematic a la cuestion porque yo puedo persivir en tu cuestionamiento una idea no muy clara en la pregunta. Espero que la resta aportada te sirva.


BASIC TE LO HACE.. . 

LA COSA ES QUE TENES QUE LEER CUANTO DURA EN um EL PASO DE UN BIT A OTRO....

EN POCAS PALABRAS....BUSCATE EL FUNCIONAMIENTO DE UN SERVO OOOO...

LEETE EL MODULO QUE TE ADJUNTE...SI ALGO ME COMENTAS A VER COMO TE FUE...


----------



## themagve (Sep 11, 2011)

Hola a tods.... Necisto de su ayuda... tengo un gran problema.... se los expongo:
Programar  un PIC  de tal manera que:
-	Genere un tren de pulsos sabiendo que el periodo es 3t,  en la primera parte del periodo toma el valor de cero ( 0 ) apagado, en la segunda  parte toma el valor de uno  ( 1 )  prendido y por ultimo en la tercera parte del periodo toma de nuevo el valor de cero( 0 ) apagado. Y así sucesivamente. Como se puede ver en la (figura 1).
Luego hacer que en el pulso 118 debería tomar el valor de uno ( 1 ) pero toma el valor de (0), y en el pulso 119 comienza de nuevo el bucle en cero (0) apagado, como se puede ver en( figura 2) y ahí terminaría el programa con un bucle infinito. (terminando en el pulso 146 en cero y comenzando de nuevo en el pulso uno en cero)

-	Por otro lado, generar otro tren de pulsos parecido al tren de pulsos A solo que en este caso se desfasa en 77 pulsos.
**(donde la frecuencia del colck es 9.4KHz) o 3t=3.2x10^(-4).....
Porfavor y que programa utilizan para este problema y quemar en el PIC seria de gran ayuda, de ante mano muchas gracias....


----------



## guigo (Sep 11, 2011)

mira en la parte de arriba de tu mensaje. hay un archivo que se llama basic stamp
conoces el lenguaje basic?. como tal te recomendaria leer las instrucciones o comandos:HPWM,pulsout. estas te pueden solucionar el problema. en mi caso conosco mas HPWM pero segun tú, necesitas producir 2 trenes en un micro. entonces te recomiendo leer ambas instrucciones aunque con programa y logica lo podes desarrollar como?...sabes programar en basic?....de lo contrario debes aprender y este foro es lo maximo para....

suerte con tu proyecto.


----------



## kingpyro (Dic 29, 2015)

pues necesito el tren de pulsos de 300kHz usando instrucciones de sub rutinas ya sabes call, go to, y el temporizador TMR0 resulta que con un cristal de 20Mhz tengo mi frecuencia de 166.666 kHz aproximadamente ojo soy nuevo en el ámbito de ensamblador y me veo limitado a usar solo el pic 16f84A ya que es el único en el que tengo practica
aquí el código 

```
__config _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ; 0x3FF1
    LIST P=16F84A
    #include <P16F84A.INC>
    
  CBLOCK 0x0C
  ENDC
#DEFINE salida PORTB,3

;ZONA DE CODIGOS

    Org 0
inicio
    BSF STATUS,RP0       ; acceso al banco 1
    BCF salida           ; esta linea configura la salida
    MOVLW 0x00           ; b\'00000000\'  d\'000\'
    MOVWF OPTION_REG     ; prescaler de 2 para el TMR0
    BCF STATUS,RP0       ; acceso al banco 0
Principal 
    BSF salida           ;la variable salida toma el valor alto 
    CALL Timer0    ;durante este tiempo
    BCF salida           ;la variablesalida pasa a nivel bajo
    CALL Timer0    ;durante este tiempo
    GOTO Principal       ;

;sub rutina TIMER0
;
;con el simulador se obtienen unos tiempos para la onda cuadrada
;de 300kHZ (deseados)
;
TMR0_Carga EQU -d\'1\'    ;el TMR0 tiene 8 bits osea (256-1=255)
                                     ;con ayuda del simulador MPLAB
Timer0
    MOVLW TMR0_Carga         ;  carga el timer 0
    MOVWF TMR0                    ; !!Bank!! TMR0 - OPTION_REG
    BCF INTCON,T0IF               ;resetea el flag de desbordamiento del TMR0
Timer0_Rebosamiento
    BTFSS INTCON,T0IF             ;¿se ha producido rebosamiento?
    GOTO Timer0_Rebosamiento      ;todavia no, repite        
    RETURN
    End
```
me han recomendado usar un prescaler de 16 en vez del de 2 no se si eso valla a funcionar ya que el prescaler es un divisor de frecuencias eso me confunde un poco ya que no se configurarlo.
bueno espero que me puedan ayudar a mejorar el codigo


----------

