Autor Tema: Ayuda para Generador de temporización  (Leído 7094 veces)

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

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Ayuda para Generador de temporización
« en: 07 de Enero de 2007, 16:18:16 »
Hola chicos:

Quiero hacer un generador de temporización con un PIC dedicado. Como estoy un poco verde os agradecería me dierais un empujoncito. Las señales que quiero obtener están en la imagen que adjunto (por aquello de una imagen vale más...).

El clock de partida es de 10 MHz.

1 señal de 400 KHz
1 impulso de Reset de 20 KHz
2 señales de contador de 20kHz
4 señales de impulsos de 15 a 17 uSEC

Mis dudas son:

1.- ¿Hay algún PIC pequeño que pueda hacerlo y si es así cuál o cuáles modelos?
2.- ¿Puedo utilizar PICBasic o debería utilizar ASM?

Bueno, pues eso es todo, aunque si alguien tiene algún ejemplo complejo de temporización pues sería la pera.

Gracias y Feliz Año Nuevo

virolay
Quod natura non dat Salmantica non praestat

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #1 en: 11 de Enero de 2007, 13:36:37 »
Hola de nuevo:

Bueno, no sé si es que he puesto una burrada o qué. Esperaba una respuesta, siquiera para decirme que, en efecto estoy más verde que una lechuga.

Mientras tanto he tratado de entender el funcionamiento de un PIC, el 16F628 y he tratado de sacar los 400 kHz a partir del timer0 pero no consigo entender cómo gobernarlo. Con un clock de 10 MHz no consigo subir de 10 kHz.

Utilizo este programa:
   DEVICE = 16F628A
    XTAL = 10
   
    PORTB_PULLUPS = ON
    TRISB = %00000000 ' Make all pins on PORTB outputs
   
    Dim TRUE As 1
    Dim FALSE As 0

' REGISTERS ASSOCIATED WITH TIMER0
' TMR0: 8-BIT REGISTER
' INTCON.7: GIE Global interrupt enable/disable
' INTCON.5: T0IE Overflow Interrupt Flag
' INTCON.2: T0IF Overflow Interrupt Enable
' OPTION.5: T0CS Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
' OPTION.4: T0SE TMR0 Source Edge Select bit (1 = Incr. on HL transition on RA4/T0CKI/CMP2 pin
'                                             0 = Incr. on LH transition on RA4/T0CKI/CMP2 pin)
' OPTION.3: PSA Prescaler Assignment bit (1 = Prescaler assigned to WDT;
'                                         0 = Prescaler assigned to the TMR0 module
' OPTION.2: PS2
' OPTION.1: PS1
' OPTION.0: PS0

   
    Dim T0IF As INTCON.2 ' TMR0 Overflow Interrupt Flag
    Dim T0IE As INTCON.5 ' TMR0 Overflow Interrupt Enable
    Dim INTERRUPTS_ON As INTCON.7 ' Global interrupt enable/disable
   
    Dim PS0 As OPTION_REG.0 ' Prescaler ratio bit-0
    Dim PS1 As OPTION_REG.1 ' Prescaler ratio bit-1
    Dim PS2 As OPTION_REG.2 ' Prescaler ratio bit-2
    Dim PSA As OPTION_REG.3 ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)
    Dim T0CS As OPTION_REG.5 ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4)
   
'-----------------------------------------------------
' TMR0 = 255 - (0.0000025/(4/10.000.000)) = 249
 Dim TMR0_RELOAD_VAL as 255 - (0.0000025/(4/10.000.000)) 'PARECE QUE REDONDEA Y SE QUEDA EN 255
'-----------------------------------------------------   
    Dim REFRESHED As Bit ' FLAG TO SAY COUNT REFRESHED
'-------------------------'
    ON_INTERRUPT PULSE_COUNT ' DEFINE WHERE TO JUMP TO ON AN INTERRUPT
'-------------------------'
   
    GoTo INITIALISE ' JUMP ALL INT CODE
   
'----- INTERRUPT CODE -------------------
PULSE_COUNT:
    TMR0 = TMR0 + TMR0_RELOAD_VAL ' RELOAD THE TIMER
    ' Puede que sea una forma rudimentaria de generar una señal
    if portb.0 = true then
       portb.0 = false
       else
       portb.0 = true
    endif
    T0IF = FALSE ' CLEAR INTTERUPT FLAG
    Context Restore ' RELOAD THE SYSTEM VARS   
   
'------ END OF INTERRUPTS CODE ----------
   
'------ INTIALISE ALL REGS --------------
    INITIALISE:
    PS0 = 0
    PS1 = 0
    PS2 = 0
    T0CS = 0 ' TMR0 CLOCK FROM MAIN OSC
    PSA = 1 ' IN THIS INSTANCE PRESCALER IS ASSINED TO WATCHDOG
    T0IF = 0 ' CLEAR INTERRUPT FLAG
    T0IE = TRUE ' ENABLE TMR0 INTERRUPTS
    TMR0 =  TMR0_RELOAD_VAL ' LOAD THE TIMER   
    'REFRESHED = FALSE ' DONT MAKE FIRST READ UNTIL MAIN INT HAS OCCURED
    'Output PORTB
    INTERRUPTS_ON = TRUE ' START THE WHOLE THING RUNNING   

'------ MAIN CODE BELOW HERE -------------
    Cls
   
    LOOP:
   
    GoTo LOOP
   
    Stop


Por favor, decidme algo, aunque solo sea que no se puede hacer con un PIC.

Quod natura non dat Salmantica non praestat

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Ayuda para Generador de temporización
« Respuesta #2 en: 11 de Enero de 2007, 16:20:25 »
Citar
El clock de partida es de 10 MHz.

1 señal de 400 KHz
1 impulso de Reset de 20 KHz
2 señales de contador de 20kHz
4 señales de impulsos de 15 a 17 uSEC

Mis dudas son:

1.- ¿Hay algún PIC pequeño que pueda hacerlo y si es así cuál o cuáles modelos?
2.- ¿Puedo utilizar PICBasic o debería utilizar ASM?

Hola creo que la forma más facil para conseguir los trenes de pulsos es utilizar el PWM lo que pasa es que si necesitas sacar las tres señales a la vez(no lo has especificado) necesitaras un PIC con tres canales(PWM) y el que comentas (16F628A) no tiene ninguno...

Respecto al tren de impulsos es tan facil como "subir y bajar consecutivamente" una linea y esperar el periodo que quieras... en principio si no tienes que hacer más cosas al mismo tiempo no hace falta que utilices timers... pero si decides hacer los trenes de pulsos con PWM necesitarás aprender como funcionan...

No te puedo ayudar con la programación porque no tengo ni idea de PBP y Proton...

Saludos y animo!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Ayuda para Generador de temporización
« Respuesta #3 en: 11 de Enero de 2007, 17:17:15 »
Para utilizar el PWM no sé si te dé frecuencias tan altas.

No recomendaría utilzar el TMR0 ya que es de 8 bits, además que tu 16F268A tiene un PWM; si ocupas 3 señales a la vez y lo quieres hacer por PWM deberás usar un PIC que tenga 3 PWM (el 16F767 creo).

Veo que usas basic y al parecer el PROTON, you uso Basic pero en PBP o lo puedes hacer en ensamblador.
Revisa esto:
http://www.rentron.com/Infrared_Communication.htm
http://www.interq.or.jp/japan/se-inoue/e_pic7_4.htm#1
http://www.microengineeringlabs.com/resources/samples/pbp/hardpwm.bas
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #4 en: 13 de Enero de 2007, 14:44:41 »
Gracias manwenwe y Mario, creí que lo que había puesto era algo absurdo.

Bueno, he revisado lo del PWM y me parece que será una excelente idea aunque todavía estoy en los primeros pasos, concretamente en entender y hacer funcionar un timer. He elegido el TMR0 por el predivisor, lo que me parecía estupendo para bajar desde un clock alto, sin embargo no consigo acerlo funcionar.

Profudizando en el 16f628 y el TMR0 he encontrado esta equación:

  Tiempo = Inicio x Predivisor x (4/Fosc) siendo Inicio = 255 -TMR0

y poniendo un oscilador de 8 MHz y el predivisor a 1, o sea, asignado al WDT, según el valor de TMR0 me sale el tiempo y la frecuencia siguiente:


TMR0   Inicio   TIEMPO   FRECUENCIA
 254      1   0,0000005   2000000
 253      2   0,000001   1000000
 252      3   0,0000015   666666,6667
 251      4   0,000002   500000
250      5   0,0000025   400000
 249      6   0,000003   333333,3333


Con TMR0=250 consigo los 400 KHz, sin embargo, emulando con el Proteus, el frecuencímetro mide 3,78KHz, o sea, bastante lejos de lo que se supone que debe salir.

¿Puede ser que esto se deba a que se están sumano un montón de ciclos de instrucción?. ¿Debería probar en assembler y si es así alguien tiene alguna rutina que pueda insertar en el Proton+?.

Perdonad tanta pregunta pero esto era uno de mis primeras cosas depués de hacer parpadear un LED y me he atascado.
Quod natura non dat Salmantica non praestat

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #5 en: 13 de Enero de 2007, 17:05:47 »
Bueno, bueno, bueno. Creo que ya he dado en el clavo aunque me quedo corto.

Tal como decía en mi mensaje anterior, sospechaba que el Proton+ metiera mucho retardo ejecutando instrucciones y así ha sido. Ahora le meto lo siguiente:


1.- Más o menos dejo todo el inicio en Proton+, lo único que pasa es que se retrasa el inicio del clok pero eso no importa para lo que me propongo.
2.- Dejo el TMR0 a 255, o sea, se desborda de inmediato
3.- Le meto un cristal de 20MHz
4.- Hago una rutina de interrupción en Assembler:

ISR:
ASM
    MOVF    PORTB,W  ; Coge el contenido de PORTB y lo pone en W
    XORLW   H'FF'    ; Conmuta todos los bits
    bcf         INTCON,INTF    ; Borra el flag de interrupción
    bsf         INTCON,INTE    ; Vuelve a habilitar las interrupciones
    retfie                               ; retorno desde una interrupción                 
ENDASM
'Context Restore 'Creo con retfie es suficiente


5.- El MAIN también lo pongo en assembler

ASM
    BEGIN
    GOTO BEGIN
ENDASM   


y ahora el frecuencímetro me lee 294,118 KHz, ¿Alguien tiene alguna sugerencia para que pueda llegar hasta los 400 ó 500 KHz?.

La verdad es que avanzo muy lentamente y agradecería sobremanera alguna sugerencia que me orientara o me hiciera desistir de utilizar un PIC como generador de temporización.

Gracias.
Quod natura non dat Salmantica non praestat

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Ayuda para Generador de temporización
« Respuesta #6 en: 13 de Enero de 2007, 20:30:27 »
Hola.

No se cuál es tu afán de utilizar el TMR0 para generar una frecuencia en un pic que cuenta con PWM, si es requerimiento pues ni modo pero, si no lo es te recomiendo que utilices el módulo de ancho de pulso.

Si deseas generar 400 kHz con un cristal de 10 Mhz entonces:
periodo= 1/400 kHz = 2.5 µseg

En el módulo de CCP para PWM utilizas el timer 2 como base para generar esa frecuencia. Utiliza un registro llamado PR2 donde se carga el valor deseado para generar esa frecuencia. Utilizas también los preescaladores del TMR2, los cuales son de 1:1,1:4,1:16; entonces (página 66 del manual del 16F628):
Preescalador de 1 para encontrar el valor de PR2
4*1*400 kHz   = 1.6 MHz
10 MHz/1.6MHz  = 2.5
6.25-1               = 5.25----->5 porque no podemos ponerle decimales al PR2


Ahora vemos lo que en realidad nos generará. De la ecuación (10MHz / (4 * TMR2 prescale value * 400 KHz)) - 1= PR2 despejamos la frecuencia y sustituimos PR2 (5):
f= fosc/((4 * TMR2 prescale value * (PR2+1))
f= 10 MHz/((4*1*(5+1))
f= 10 MHz/24
f= 416.666 kHz


Si utilizas proton plus, tengo entendido que existe una instrucción para generar frecuencias en hardware, algo asi como:
HPWM canal, civlo de trabajo, frecuencia                o algo asi.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #7 en: 14 de Enero de 2007, 09:28:53 »
Hola Mario  :-/:

Gracias a tu explicaciones por fin he visto la luz. No no se trataba de que tuviera fijación con el TMR0, se trataba de pura ignorancia. Sé para lo que sirve un PWM así que no imaginé que pudiera utilizarlo para esto, parecía más fácil usar predivisores, contadores, etc.

Bueno, al menos tengo lo que decías, exactamente 416,666 kHz, lo cuál ya me sirve para ir avanzando. Este es el fuente en PROTON+, me parece que es bastante similar al PBP.

' Prueba del PWM hardware
' Salida de una señal de 400kHz (algo más...)
      
      Device 16F628a
      Declare XTAL 10
      DECLARE CCP1_PIN PORTB.3    ' Declara el pi3 del PortB como salida PWM
       
      
        PR2 = 5                           ' PR2 calculado según Mario
        CCPR1L = 3                    ' No tengo ni idea de cómo se calcula pero con un 3 funciona al 50%
        CCP1CON = %00001100  ' Pone el CCP1 en PWM
   T2CON   = %00000100     ' Pone en marcha el Timer2 ON y el predivisor a 1:1
      
Loop:   
      
      Goto Loop               




Nuevamente gracias.

virolay
Quod natura non dat Salmantica non praestat

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Ayuda para Generador de temporización
« Respuesta #8 en: 15 de Enero de 2007, 05:08:08 »
Para lo del ciclo de trabajo utilizas la otra fórmula:
PWM duty cycle = (CCPR1L:CCP1CON<5:4>) •Tosc • (TMR2 prescale value)

para saber cuántos bits de resolución necesitaremos utilizamos la fórmula:
log [(Fosc/Fpwm)]/log (2) = bits de resolución

primero:
log(10MHz/416.666kHz) = log(24)= 1.38
log(2) =0.301
1.38/0.301 = 4.58 bits

lo cual nos dice que utlizaremos solo 5 bits para el ciclo de trabajo, con el CCPR1L basta.

Para saber qué valor colocar en CCPR1L si queremos un ciclo de trabajo del 50% utilizamos la fórmula del principio despejada para CCPR1L:
(PR2 + 1) * preescalador TMR2 * 50% ciclo de trabajo = valor para CCPRL1
(5 + 1) * 1 * 0.50 = 6 * 0.50 = 3--->esto va en CCPRL1


De ahí sale el 3, recuerda que si PR2=X número, significa que X es el periodo, donde el periodo es continuo en el tiempo teniendo una frecuencia de 1/X donde podemos tener desde 0% a 100% de ciclo de trabajo.
Por lo que si PR2 = 6, entonces 3 µseg serán altos y 3 µseg serán bajos para un ciclo de 50%, 4 para un 60%, etc.

Se planteo el preescalador a 1 con 10MHz de cristal, quizá puedas generar los 400 kHz con otras variantes para ver si consigues mejor precisión en la frecuencia. Te recomiendo leas http://ww1.microchip.com/downloads/en/DeviceDoc/33023A.pdf el capítulo 14, sección 14.5.2.2 Minimum Resolution, en la página 212, viene un ejemplo.


Agregado:
Un PIC pequeño puede ser el 12F683.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #9 en: 15 de Enero de 2007, 14:07:07 »
Hola Mario:

Digo yo que estaba clarísimo  :lol:. Entre que mi inglés está bastante oxidado y los años no perdonan  :(, ya no soy capaz de entender una simple ecuación salvo que me las pongan como tú haces.

Gracias por tu paciencia,

P.S. Por cierto, la instrucción HPWM de Proton tan sólo acepta frecuencias de hasta 32kHz
Quod natura non dat Salmantica non praestat

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Ayuda para Generador de temporización
« Respuesta #10 en: 16 de Enero de 2007, 01:54:50 »
Entonces utiliza el HPWM para las otras frecuencias (20kHz).

Todos empezamos asi, sabiendo nada, unos saben mas nada que otros  :lol:, pero entre todos se puede.

Luego publicas lo que hiciste, si se puede, ya que si es para una empresa y te matarán si liberas los secretos, pues, no sería recomendable  :D.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #11 en: 16 de Enero de 2007, 08:28:12 »
Hola Mario:

La verdad es que me gustaría poder publicarlo ya que sería la prueba de que lo he conseguido aunque me temo que tardaré un poco. Se trata de hacer un controlador para un Sensor de Radar UWB. Como por tus respuestas te supongo con una buena formación académica, no me extenderé en explicarte lo de la UWB. Me he metido a hacer un Generador de Temporización con un PIC para que pueda ser "programable", de esa forma podré cambiar y/o ajustar los tiempos a los alcances, por ejemplo. Otro PIC deberá hacer de puro controlador.

Bueno, buscando otras cosas, en un foro me encontré con el enlace siguiente:

PICMultiCalc.zip

además de resolver los tedioso cálculos de PWM, te fija los valores límite y encima hay más calculadores que sospecho deben ser tan interesantes como el PWM.

Saludos,

Quod natura non dat Salmantica non praestat

Desconectado virolay

  • PIC12
  • **
  • Mensajes: 50
Re: Ayuda para Generador de temporización
« Respuesta #12 en: 16 de Enero de 2007, 09:26:40 »
Hola otra vez:

Visitando la página del autor del PICMultiCalc he encntrado una nueva versión aún más completa. Pongo una imagen de la ventana principal para que te hagas una idea.

Aquí no hay enlace directo, hay que ir a esta página:

http://www.mister-e.org/pages/utilitiespag.html

PICMultiCalc:

   All you need to calculate PIC Timers, PWM, USART, EUSART, ADC, Comparator register value in few clicks!

   USART and EUSART calcs also provide a code generation tool for Melabs PICBASIC PRO.

   New features added:
        v 1.2.0 (January 5, 2007)
       A/D Calc: Add a ‘copy PBP ADC DEFINEs to clipboard’
                            button.
     
       Comparator Vref : Calculate and show all Vref results
                                               according to Vdd and CVRR values.

        v 1.1.0 (January 2, 2007)
       A/D Calc: Calculate the minimum acquisition time and   
                            conversion clock according to your crystal
                            and analog source impedance.

       SERIN/OUT2: Calculate the mode value for PBP SERIN2
                                      and SEROUT2. Could also be compatible
                                      with BasicStamp and PROTON
                                      SERIN/SEROUT.

Click here to download


y pulsar el enlace "Click here to Download". Por cierto, encima pone los DEFINES para PBP.

Saludos,
Quod natura non dat Salmantica non praestat

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Ayuda para Generador de temporización
« Respuesta #13 en: 17 de Enero de 2007, 04:27:36 »
Interesante la aplicación.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee


 

anything