Autor Tema: On - Off Pic/LCD con interrupcion EXT.  (Leído 1800 veces)

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

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
On - Off Pic/LCD con interrupcion EXT.
« en: 22 de Abril de 2014, 12:06:02 »
hola saludos a todos necesito que me digan si estoy haciendo bien esta interrupcion para apagar el LCD y mandar a dormir el pic.
lo simule en proteus y anda perfecto asi como fisicamente, el tema que me queda dudas es como implementar el antirebote del pulsador
ya que me lo sigue generando fisicamente.

Gracias  :)

Código: [Seleccionar]
#include <16F877A.h>
#use delay(clock=20M)
#include <lcd_portb_V1.c>
#fuses HS,NOPUT,NOPROTECT,NOWDT
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#bit ON_OFF = 0x06.0  //PIN_B0

int cont=0;

#INT_EXT
void RB0(){

cont++;//CONTADOR DE PULSACIONES EN RBO
}


void Menu()
    {
while (TRUE)
{
// TEST ON LED & LCD

while(!input(PIN_B0));
    {
    if(cont == 1)
    {
    lcd_send_byte(0x00,LCD_ON); // ENCIENDE LCD
    output_high(pin_c7); // ENCIENDO LED
    delay_ms(500);
    printf(LCD_PUTC, "\f");
    lcd_gotoxy(1,1);   lcd_putc("TEST ON");
    lcd_gotoxy(1,2);   lcd_putc("LCD ON & PIC");
    }

 else (!input(PIN_B0));
 
     if (cont == 2)
     {
     output_low(pin_c7); // APAGO LED
     delay_ms(500);
     lcd_gotoxy(1,1);   lcd_putc("TEST OFF");
     lcd_gotoxy(1,2);   lcd_putc("LCD OFF & PIC");   
     delay_ms(900);
     lcd_send_byte(0x00,LCD_OFF); //APAGA LCD
     cont=0;
     sleep(); // MANDA A DORMIR PIC
     delay_cycles(1);
     }
    }
    }
   }
void main(){

set_tris_c(0x00);
set_tris_d(0x00);
set_tris_b(0b01110001);
output_b(0x00);
output_c(0x00);

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   enable_interrupts(L_TO_H);
   lcd_init();
   port_b_pullups(false);
   lcd_gotoxy(1,1); printf(lcd_putc, "TEST OK ");
   lcd_gotoxy(1,2);   lcd_putc("LCD ON & PIC");
   Menu();
}

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: On - Off Pic/LCD con interrupcion EXT.
« Respuesta #1 en: 22 de Abril de 2014, 12:09:12 »
Hola, no entiendo está linea

Código: C
  1. else (!input(PIN_B0));

el else no debe llevar argumentos
"Nada es imposible, no si puedes imaginarlo"

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
Re: On - Off Pic/LCD con interrupcion EXT.
« Respuesta #2 en: 22 de Abril de 2014, 12:29:34 »
uhh si se me quedo pegado ese argumento que no hace nada.. igual mi duda es si el antirebote del pulsador esta bien
implementado.


Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: On - Off Pic/LCD con interrupcion EXT.
« Respuesta #3 en: 22 de Abril de 2014, 12:41:45 »
después de que incrementas tu contador, tienes un delay con el que intentas eliminar el antirebote, sin embargo, recuerda que la interrupción puede ocurrir aunque estés dentro de un delay.
cuando incrementas tu variable dentro de la interrupción podrías desactivar la misma y activarla hasta después del delay
"Nada es imposible, no si puedes imaginarlo"

Desconectado Mr.pelax

  • PIC10
  • *
  • Mensajes: 19
Re: On - Off Pic/LCD con interrupcion EXT.
« Respuesta #4 en: 22 de Abril de 2014, 15:56:17 »
Ahora modifique el codigo est aun poco mas pulido  :mrgreen: , en la simulacion funciona de 10 ahora falta probarlo fisicamente,
adjunto codigo  :mrgreen:

saludos

Código: [Seleccionar]
#include <16F877A.h>
#use delay(clock=20M)
#include <lcd_portb_V1.c>
#fuses HS,NOPUT,NOPROTECT,NOWDT
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#bit ON_OFF = 0x06.0  //PIN_B0

int cont=0;
unsigned int8 Rebote=100;


#INT_EXT
void RB0(){

          if(ON_OFF == 1)
          {delay_ms(rebote);}      // Antirrebote
          cont++;     
          }

void Menu()
     {
while (TRUE)
           {
 if(cont == 1)
    {
    lcd_send_byte(0x00,LCD_ON);
    output_high(pin_c7); // comienza codigo
    delay_ms(500);
    printf(LCD_PUTC, "\f");
    lcd_gotoxy(1,1);   lcd_putc("TEST ON");
    lcd_gotoxy(1,2);   lcd_putc("LCD ON & PIC");
    }

   else if (cont == 2)
     {
     output_low(pin_c7); //
     delay_ms(500);
     lcd_gotoxy(1,1);   lcd_putc("TEST OFF");
     lcd_gotoxy(1,2);   lcd_putc("LCD OFF & PIC");   
     delay_ms(900);
     lcd_send_byte(0x00,LCD_OFF); //APAGA LCD
     cont=0;
     sleep();
     delay_cycles(1);
     }
    }
}
void main(){

set_tris_c(0x00);
set_tris_d(0x00);
set_tris_b(0b01110001);
output_b(0x00);
output_c(0x00);

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   enable_interrupts(L_TO_H);
   lcd_init();
   port_b_pullups(false);
   lcd_gotoxy(1,1); printf(lcd_putc, "TEST OK ");
   lcd_gotoxy(1,2);   lcd_putc("LCD ON & PIC");
   Menu();
}

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: On - Off Pic/LCD con interrupcion EXT.
« Respuesta #5 en: 22 de Abril de 2014, 16:13:18 »
otro detalle, para configurar la interrupción externa se usa la función

ext_int_edge(l_to_H)

en lugar de esta:
enable_interrupts(L_TO_H);
"Nada es imposible, no si puedes imaginarlo"


 

anything