Autor Tema: (SOLUCIONADO) SHUT DOWN para backlight de un LCD?  (Leído 1805 veces)

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

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
(SOLUCIONADO) SHUT DOWN para backlight de un LCD?
« en: 23 de Octubre de 2014, 13:26:01 »
 :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/
Estimados:

Voy a explicar bien que es lo que quiero intentar porque no se aun si es posible.
Tengo un proyecto que esta armado funcionando y maneja un lcd, a los fines de ahorrar energia, quisiera que pasados 30 segundos (aprox) de inactividad por parte del usuario, se apague el backlight del LCD, y si el usuario toca una tecla (Preferentemente cualquiera) que se ilumine nuevamente el Backlight, para ello e pensado implementar un timer que despues de 30 segundos apague el LED.

El problema que tengo actualmente es que no conozco ninguna funcion de CCS que este escuchando los PORTX del micro como lo hace kbhit() con la UART, dado que este proyecto tambien cuenta con un puerto serie debug, tambien puedo levantar al backlight cuando conecte la notebook para hacer debug.

Bueno dejo abierta la consulta mientras sigo pensando como implementar y veo la ayuda de CCS por si aparece algo.

Saludos! :laugh:
« Última modificación: 24 de Octubre de 2014, 12:03:23 por BINARIO »
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Como hacer un time out para el backlight de un LCD?
« Respuesta #1 en: 23 de Octubre de 2014, 14:00:04 »
Consegui un ejemplito interesante que estoy comenzando a estudiar y a simular, me pongo con esto a ver si sale, cualquier data estoy mirando asi que el que se quiera sumar es bienvenido!

Código: [Seleccionar]
#include <18F448.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#use delay(clock=8000000)
#case

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#ignore_warnings 202

#byte port_a=0xf80

void scan_pushbutton(void);
void restart_countdown(void);

unsigned long GLOBAL_keypad_inactivity_timer;
unsigned int GLOBAL_button_flag;

enum
{
    STATE_BACKLIGHT_OFF,
    STATE_BACKLIGHT_ON
};

#INT_TIMER1                        // This function is called every time
void clock_isr()                   // timer 1 overflows (65535->0), which is
{                                   // approximately 19 times per second for
                                   // this program.
    if (GLOBAL_keypad_inactivity_timer > 0)
    {
        GLOBAL_keypad_inactivity_timer--;
    }
}

void main(void)
{
    int state;
    restart_countdown();

    setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
    set_timer1(0);
    enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);

    state = STATE_BACKLIGHT_OFF;

    printf ("Start: Backlight initially OFF\r\n");

    while (1)
    {
        scan_pushbutton(); // This updates the state of the pushbutton.

        switch (state)
        {
            case STATE_BACKLIGHT_OFF:
                if (GLOBAL_button_flag)
                {
                    printf ("Turn on LCD here.\r\n");
                    printf ("    restart x-minute timer\r\n");
                    restart_countdown();
                    state = STATE_BACKLIGHT_ON;
                }
                break;

            case STATE_BACKLIGHT_ON:
                if (GLOBAL_button_flag)
                {
                    printf ("    restart x-minute timer\r\n");
                }
                else if (GLOBAL_keypad_inactivity_timer == 0)
                {
                    printf ("Turn off LCD here.\r\n");
                    state = STATE_BACKLIGHT_OFF;
                }
                break;
           
            default:
                break;
        }
    }

       
}

void scan_pushbutton(void)
{
    if (GLOBAL_button_flag)
    {
        if (port_a & 0x10) // input has gone up
        {
            delay_cycles(10);
            if (port_a & 0x10)
            {
                GLOBAL_button_flag = 0;
            }
        }
    }
    else
    {
        if (!(port_a & 0x10))
        {
            delay_cycles(10);
            if (!(port_a & 0x10))
            {
                GLOBAL_button_flag = 1;
            }
        }
    }
}

// 8000000/(4*1*65535) * 60 minutes/sec * 2 minutes = 3662
void restart_countdown(void)
{
    GLOBAL_keypad_inactivity_timer = 3662;
}
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: Como hacer un time out para el backlight de un LCD?
« Respuesta #2 en: 23 de Octubre de 2014, 14:50:04 »
Lo que hice en su momento cuando necesite esto es poner una variable y que cada tecla le cargue un valor cuando era tocada, y un timer que iba decrementando ese valor en una interrupcion, si por ejemplo, le cargas 30 y no tocas nada en 30 segundos ejecuta una acción, si le cargas 30 y a los 10 segundos tocas otra tecla, le vuelves a cargar 30 en el código de esta ultima tecla, y por lo tanto se reinicia el ciclo.

Salutes.
Nico.

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Como hacer un time out para el backlight de un LCD?
« Respuesta #3 en: 23 de Octubre de 2014, 15:31:29 »
Si nico, pense en lo mismo siempre trabajando con el timer, encontre dentro de la ayuda de CCS una interrupcion #INT BUTTON, pero al parecer el micro que ocupo no la soporta, voy a implementar lo que vos decis de ultima en alguna parte del programa hago un if ( RBA0 || RBA1 || RBA02 || RBA03....)

Lo unico que me parece que lo que vos decis, no funcionaria, porque cuando toques una tecla la variable general de teclado que queres implementar, cambiaria de estado, por ejemplo:

TOCAR TECLA RA0 ---> TECLADO =1
TOCAR TECLA RA1 ---> TECLADO =1

Pero para evaluar la condicion deberias tener esa variable en 0 pasado el timer, como hiciste vos para volverla a cero sin que todo el esquema deje de funcionar?
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Como hacer un time out para el backlight de un LCD?
« Respuesta #4 en: 23 de Octubre de 2014, 15:35:01 »
Lo que hice en su momento cuando necesite esto es poner una variable y que cada tecla le cargue un valor cuando era tocada, y un timer que iba decrementando ese valor en una interrupcion, si por ejemplo, le cargas 30 y no tocas nada en 30 segundos ejecuta una acción, si le cargas 30 y a los 10 segundos tocas otra tecla, le vuelves a cargar 30 en el código de esta ultima tecla, y por lo tanto se reinicia el ciclo.

Salutes.
Nico.

Perdona hay entendi, decrementas la variable en la interrupcion.
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Como hacer un time out para el backlight de un LCD?
« Respuesta #5 en: 23 de Octubre de 2014, 19:03:55 »
EN HORA BUENA!  :-/ :-/ :-/ :-/ :-/

Quedo solucionado! sobre todo por la ayuda aportada por el amigo nico. se agradece de verdad.

aca dejo el codigo

Código: [Seleccionar]
#include <18f46k22.h>                                                           //Incluimos el archivo cabezera del micro
//----------- CLOCK DE 4 MHz -------------------------------------------------

#use delay( clock = 4000000 )                                                  //Cristal  de 20 MHz 

#fuses XT,NOWDT                                                                 //Cristal de >4Mhz, sin Watch Dog Timer


//----------- DIRECCIONAMIENTO DE PUERTOS -------------------------------------
#BYTE TRISA = 0xF92                                                            // TRISA
#BYTE PORTA = 0xF80                                                            // PORTA
#BYTE TRISB = 0xF93                                                            // TRISB
#BYTE PORTB = 0xF81                                                            // PORTB
#BYTE TRISC = 0xF94                                                            // TRISC
#BYTE PORTC = 0xF82                                                            // PORTC
#BYTE TRISD = 0xF95                                                            // TRISD
#BYTE PORTD = 0xF83                                                            // PORTD
#BYTE TRISE = 0xF96                                                            // TRISE
#BYTE PORTE = 0xF84                                                            // PORTE
//------------------------------------------------------------------------------

#define PORTE 2 = PIN_E2



//----------------------VARIABLES GLOBALES--------------------------------------
long int contador=0;

//------------------------------------------------------------------------------



//------------- TEMPORIZADORES ------------------------------------------------

//------------- TIMER0 SHUT DOWN BACKLIGHT LCD --------------------------------
#int_TIMER0

void TIMER0_isr(void)
{
 set_timer0 (0x10);
 
         
 if (contador == 500)
 {
  output_toggle(PIN_E2);
  contador=0;
  bit_clear(PORTB, 1);
 }
 bit_set (PORTA, 2);
 contador++;
}
//-----------------------------------------------------------------------------

void main()
{
 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2 );
 set_timer0 (0x10);
 enable_interrupts(INT_TIMER0);
 enable_interrupts(global);

 TRISB = 0b00000001;

 bit_set(PORTB, 1);
 for(;;)
 {
   if (bit_test (PORTB, 0) )
   {
       bit_set (PORTB, 1);
       contador=0;
   }     
               
 
 }
}

Adjunto tambien la simulacion en ISIS, le cambie la extension a .txt solo tienen que colocar la extension .DSN y ya pueden ejecutarlo.

Saludos!
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: (SOLUCIONADO) SHUT DOWN para backlight de un LCD?
« Respuesta #6 en: 29 de Octubre de 2014, 23:14:11 »
Buenas, disculpas por la demora, pero esto de tener hijos a veces no deja tiempo para nada.

Que bueno que te funciono, tal como decis decremento o incremento la variable en la interrupción, y luego en el programa solo la evalúo.

Saludos.
Nico.