Autor Tema: Economizar Backlight  (Leído 3428 veces)

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

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Economizar Backlight
« Respuesta #15 en: 16 de Agosto de 2008, 21:22:52 »
ese programa me gusta mas ya q no estoy seguro si se puede hacer PIN_B=!PIN_B. Los seteos a simple vista estan bien... sobra el primer enable_interrupts(global); porq despues lo pones mas abajo de nuevo.
Lo q veo es q estas cargando el timer1 con 0xFFFF... te comento q el timer1 no va decreciendo, sino al reves, y cuando llega a 0x10000 desborda. Por lo tanto si lo cargas con 0xFFFF va a desbordar al cabo de 1tick...
Otra cosa q podrias hacer, es usar el modulo pwm.

saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Economizar Backlight
« Respuesta #16 en: 16 de Agosto de 2008, 21:25:35 »
Hago esto pero si cambio el numero de set_timer no varia nada.
Los seteos de los timers del main que puse arriba estan bien?

#int_timer1
clockisr2()
{

      set_timer1(0xFFFF);
      if(Iluminacion == 1)
         Iluminacion =0 ;
      else
         Iluminacion = 1;
      output_bit(PIN_B0,Iluminacion);
}



Es demasiada alta la frecuencia de encendido y apado que generás poniendo 0xFFFF en el timer_1.
Además, la instrucción outout_bit(byte,bit) debería ir fuera del if. Así como está no va a apagar nunca.

Vamos a suponer que para que no se note el destello queremos unos 100hz de encendidos y apagados por segundo.
Supongamos un tiempo de trabajo(duty) del 50% para simplificar los cálculos. No creo que sea tan estricto aunque tal vez buscando un duty adecuado economices aún más energía y no se note el parpadeo.

Volviendo: 100 Hz. Entonces queremos que apague y encienda 200 veces en total por segundo...
Vamos a la matematica tan bonita(y que lo lamento, pero intentar programar sin utilizar cálculos matemáticos es como querer escribir un libro sin saber un idioma...). La matemática es la herramienta base de casi todas las ciencias formales.

Entonces: 1 seg / 200 = 5 ms(milisegundos)

Debemos hacer entonces que el pin PORTB,0 invierta su estado cada 5 ms.(Supongo que usas 8Mhz)

T1 = (65536 - precarga) * Preescaler * 4 / Fosc

Sabemos el T1 que deseamos. Es 5 milisegundos(o bien, 5000 us que es lo mísmo)
Has elegido en tu programa un preescaler de 1:1. Probemos a ver si logramos ese número...

Quedaría:

5000us= (65536 - precarga) * 1 * 4 /  8000000 us
5000us= (65536 - precarga) * 1 * 0.5 us
5000us= (65536 - precarga) * 0.5 us
2500= 65536 - precarga
precarga= 65536-2500
precarga=63036

Eso nos haría que el Timer1 desborde cada 5ms.

Entonces, el código quedaría:

#int_timer1
clockisr2()
{
      set_timer1(63036);
      PIN_B0=!PIN_B0;
}

Y debería encender y apagar 100 veces por segundo. 50% del tiempo encendido, 50% del tiempo apagado.
Si deseas cambiar el % de encendido/apagado, deberás cargar al timer1 con valores distintos. Se puede hacer con el mísmo tipo de cálculos.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Economizar Backlight
« Respuesta #17 en: 16 de Agosto de 2008, 23:53:43 »
Muchas gracias a todos por la ayuda que me estan dando.
Acabo de compilar esto y me marca este error.

Excepting LVALUE such como una variable name or * expresion --   PIN_B0=!PIN_B0
Esto no seria lo mismo que hacer esto? De esta forma lo simulo, prende y apaga en un 1 segundo solo 3 veces.

#int_timer1
clockisr2()
{

      set_timer1(63036);
      if(Iluminacion == 1)
         Iluminacion =0 ;
      else
         Iluminacion = 1;
 
     output_bit(PIN_B0,Iluminacion);
}


Si hago esto, no parpadea, pero no estoy seguro de que este alargando la vida del back, osea si realmente esta permaneciendo un tiempo considerable apagado.
Igualmente quiero ver la forma que me estan diciendo ustedes porque realmente no se como hacerlo funcioanar.

#int_timer1
clockisr2()
      output_bit(PIN_B0,0);
      delay_us(200);
      output_bit(PIN_B0,1);
}

Otra duda. Partiendo de esta cuenta.
5000us= (65536 - precarga) * 0.5 us

(65536 - 63036) * 0.5 me da 1250 no 5000us, como llego a este resultado?
« Última modificación: 17 de Agosto de 2008, 00:29:01 por pablo »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Economizar Backlight
« Respuesta #18 en: 17 de Agosto de 2008, 14:20:45 »
Otra duda. Partiendo de esta cuenta.
5000us= (65536 - precarga) * 0.5 us

(65536 - 63036) * 0.5 me da 1250 no 5000us, como llego a este resultado?

Pues, fácil...te equivocas...como lo hice yo..y listo! :D :D :D
Ahhh...era para ver si estabas atento a lo que te decia... :D :D
Fuera de broma, me equivoqué. Corregilo.

Saludos

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Economizar Backlight
« Respuesta #19 en: 17 de Agosto de 2008, 15:40:40 »
Jaja, bueno, por lo menos quiere decir que entendi lo que me explicaste.
Tengo un problema ahora mas raro.
Hice un programita exclusivo para probar esto y funciona perfecto, desde una precarga de 45000 en adelante. Menor valor de precarga ya se nota el parpadeo.
Ahora el tema es que lo quiero implementar en mi soft y parpadea hasta con la mayor frecuencia.
Estoy usando el timer1 exclusivamente para el back y solo para eso. Puede algun delay del programa o de otro timer interferir en los tiempos del timer1?

Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Economizar Backlight
« Respuesta #20 en: 17 de Agosto de 2008, 19:39:35 »
Si. Puede. Si utilizás demoras o subrutinas durante las cuales el CCS deshabilita las interr, te va a suceder eso.

Fijate que al compilar te deben salir unos mensajes de que el CCS deshabilitó las interr. en ciertas líneas de programa.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pablo

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 253
Re: Economizar Backlight
« Respuesta #21 en: 17 de Agosto de 2008, 20:08:09 »
Si, aparecio 22 veces. Osea que entonces no voy a poder hacer esto no? El PWM por hard no deberia verse afectado por nada no? Esta seria la unica forma que tengo de hacerlo o hay otro metodo?

De la unica forma que lo logre fue poner un manteniendolo apagado pero no por mas de 200us. Nada.
De esta forma
output_bit(PIN_B0,0);
delay_us(200);
output_bit(PIN_B0,1);
Pero de esta forma no se realmente cuanto tiempo permanece prendido hasta que se vuelve  a apagar.

Se te ocuerre otra forma de hacer esto?



 

anything