TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Mr.pelax 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 :)
#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();
}
-
Hola, no entiendo está linea
el else no debe llevar argumentos
-
uhh si se me quedo pegado ese argumento que no hace nada.. igual mi duda es si el antirebote del pulsador esta bien
implementado.
-
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
-
Ahora modifique el codigo est aun poco mas pulido :mrgreen: , en la simulacion funciona de 10 ahora falta probarlo fisicamente,
adjunto codigo :mrgreen:
saludos
#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();
}
-
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);