Autor Tema: Realizar temporización de tabla de valores XC8  (Leído 4670 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Realizar temporización de tabla de valores XC8
« Respuesta #15 en: 05 de Mayo de 2017, 00:13:12 »
Pero no tiene sentido.. Podrias usar el TIMER1 y tomar los 8 bits de mas peso (ahi tendrias tus 8bits), lo cual el micro lo haria rapido ya que los registros son de 8 bits y es simplemente tomar el registro superior de esos 16bits, es decir no tenes que implementar nada, la otra que se me ocurrio es poder hacer:

Código: C
  1. rps = 3906/(periodo>>8);

Lo cual imagino lo podriamos hacer mucho mas rapido. Debo simular el codigo para ver que cantidad de ciclos toma y el error que lleva.. Deberias empezar a probar vos con el excel y el mplab asi te acostumbras para otra ves. De alli tomar la decision que corresponda obviamente.
« Última modificación: 05 de Mayo de 2017, 00:15:35 por KILLERJC »

Desconectado romanm

  • PIC10
  • *
  • Mensajes: 12
Re:Realizar temporización de tabla de valores XC8
« Respuesta #16 en: 06 de Mayo de 2017, 04:16:14 »
Muchas gracias estimado, estoy ajustando los prescalers/postcaler y todo parece concordar bastante bien. Mañana voy a tratar de implementar el nuevo código y estoy avisando los resultados, gracias de nuevo por tu tiempo!

Desconectado romanm

  • PIC10
  • *
  • Mensajes: 12
Re:Realizar temporización de tabla de valores XC8
« Respuesta #17 en: 06 de Mayo de 2017, 20:27:32 »
Hola KILLER buenas noches de nuevo, te comento lo que hice en el día de hoy.
Configuré los prescalers de los timers 1 y 2, y el Postcaler del Timer2, también pasé de usar un cristal de 4MHz a uno de 8MHz (Este cambio lo tuve en cuenta para el cálculo de todos los tiempos y demás).

La tabla en cuestión me queda algo así:
const uint8_t tabla[256] = {162,159,.........,17}; (Éstos son los valores que se van a cargar en PR2 para la temporización)

Luego, con el modo captura y Timer1 obtengo las revoluciones, y trabajo solamente con la parte alta del TMR1, que los valores me quedan excelentes desde 11 hasta 244, puedo entrar a la tabla tranquilamente con esos valores. La interrupción me queda así:

    if(PIR1bits.CCP1IF == 1)      
    {       
        PIR1bits.CCP1IF = 0;      
        rps = TMR1H;   
        TMR1 = 0;
    }   

Por otro lado, dentro del main tengo:

while(1)
{
    if(rps > 194 && rps < 244)
    {
      PR2 = (tabla[rps]);
      T2CONbits.TMR2ON = 1;
     }
}

En la interrupción del Timer2 envío los pulsos.

Ahora el problema es el siguiente, no me entra mas en la tabla, no se porque motivo. Antes cuando hacía la división si lo hacía, pero se quedaba atrasado. Ahora haciendo esto y evitando la división no entra mas en la tabla directamente, le estoy errando en algo?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Realizar temporización de tabla de valores XC8
« Respuesta #18 en: 06 de Mayo de 2017, 20:38:54 »
Podrias poner el codigo completo ?

Ademas, contempla agregar una proteccion para cuando ocurre un overflow del Timer1 ( en caso que la cuenta sea mas de 65535 pasaria a 0 y podrias considerar que tiene muchos mas rps ) asi que el flag del TMR1 te seria util
« Última modificación: 06 de Mayo de 2017, 20:42:00 por KILLERJC »

Desconectado romanm

  • PIC10
  • *
  • Mensajes: 12
Re:Realizar temporización de tabla de valores XC8
« Respuesta #19 en: 06 de Mayo de 2017, 20:41:54 »
si mañana lo subo, ahora no estoy en la pc donde lo estoy haciendo, por eso pongo partes.

Lo del Timer1 si es verdad, pero no es "tan" importante en este momento porque ese problema no lo estoy teniendo, al menos anda bien el programa pero falta que entre en la tabla. El programa tiene que empezar a ingresar en la tabla a partir de las 2000 rpm, es por ese motivo que no me afecta tanto que desborde a muy bajas revoluciones
« Última modificación: 06 de Mayo de 2017, 20:44:08 por romanm »

Desconectado romanm

  • PIC10
  • *
  • Mensajes: 12
Re:Realizar temporización de tabla de valores XC8
« Respuesta #20 en: 06 de Mayo de 2017, 21:05:51 »
Estoy leyendo un artículo y tal vez el problema está en que estoy realizando la lectura con el Timer1 corriendo, y supuestamente hacer eso podría generar un overflow.
Voy a intentar apagando el TMR1, leyendo su registro y luego volver a activarlo inmediatamente, tal vez puede que esté sucediendo eso y por ese motivo al producirse el overflow el valor de rps que estoy leyendo siempre sea inferior a 194 y por eso nunca entra en la tabla.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Realizar temporización de tabla de valores XC8
« Respuesta #21 en: 07 de Mayo de 2017, 00:14:22 »
Ese caso nunca seria el tuyo romanm, ya que estas utilizando solo la parte superior ( los 8 bits superiores) de esos 16 bits. Es decir debes leer una sola ves.

El problema que comentas radica en si por ejemplo el TMR1L tiene 0xFF y el TMR1H tiene 0x01 y lees el TMR1H guardas el valor y luego lees el TMR1L puede que mientras leiste el TMR1H el TMR1L incremente y pase el total a 0x0200, entonces si luego lees el TMR1L obtendrias como resultado 0x0100 lo cual es un problema, en ese micro (otros poseen algunas salvedades para esto).
Lo mismo con la escritura, si supones que  tenes 0x01FF y queres ponerlo a 0, y comenzas con TMR1H, en el transcurso que pusiste TMR1H a 0 y que pongas el TMR1L a 0, puede ocurrir que incremente dejandolo en 0x0100, Lo cual es otro error.

Pero como vos solo lees el TMR1H ( o lo que te interesa es esto ) no deberias tener problema alguno.