Witam!
Od jakiegoś czasu buduję bardzo prostą centralkę alarmową i wszystko ładnie śmiga, ale na mojej drodze pojawiła się kolejna przeszkoda - nie mam pojęcia jak sprawić aby w momencie wykrycia zdarzenia alarm zachowywał się w sposób jaki bym sobie życzył. Sprawa wygląda następująco: w momencie wykrycia zdarzenia od razu włączany jest sygnał dźwiękowy, a ja chciałbym aby użytkownik miał chwilę czasu na podejście do urządzenia i ewentualne rozbrojenie za pomocą klawiatury. Sprawa wyglądała prosto w odwrotnej sytuacji - danie użytkownikowi czasu an opuszczenie strefy. W urządzeniu wykorzystuję dwa przerwania - do jednego pinu poprzez bramkę NAND podłączone są czujki ruchu, do drugiego podłączone przez bramkę NAND są guziki klawiatury. Poniżej zamieszczam kod obsługi obu przerwań:
Naruszenie strefy:
Naciśnięcie guzika na klawiaturze:
W tym wypadku obsługiwane są tylko 3 guziki - ich stan sprawdzany jest po kolei za pomocą multipleksera. Pierwszy guzik uzbraja system (i tu bardzo topornie rozwiązałem sprawę oczekiwania aż użytkownik opuści strefę - wyłączam przerwania, czekam trochę, a następnie włączam przerwania). Guzik drugi rozbraja system/wyłącza alarm. Trzeci guzik w sumie nic nie robi poza wydaniem dźwięku
I tu mam problem jak zmusić urządzenie aby po wykryciu przerwania z czujki poczekał jakiś czas aż naciśnie się guzik 2 - jeśli się nie naciśnie dopiero włączy alarm. Mógłbym to rozwiązać równie topornie, ale to nie po prostu nie działa - mikrokontroler bawi się w robienie pętli z procedury waitms() i nic sobie nie robi z naciskania guzika, a chciałbym żeby reagował podczas całego czasu oczekiwania jeśli ktoś wciśnie ten guzik.
Mam nadzieję, że wyraziłem się dość jasno o co mi chodzi
z góry dzięki za pomoc
pozdrawiam
herszt
Od jakiegoś czasu buduję bardzo prostą centralkę alarmową i wszystko ładnie śmiga, ale na mojej drodze pojawiła się kolejna przeszkoda - nie mam pojęcia jak sprawić aby w momencie wykrycia zdarzenia alarm zachowywał się w sposób jaki bym sobie życzył. Sprawa wygląda następująco: w momencie wykrycia zdarzenia od razu włączany jest sygnał dźwiękowy, a ja chciałbym aby użytkownik miał chwilę czasu na podejście do urządzenia i ewentualne rozbrojenie za pomocą klawiatury. Sprawa wyglądała prosto w odwrotnej sytuacji - danie użytkownikowi czasu an opuszczenie strefy. W urządzeniu wykorzystuję dwa przerwania - do jednego pinu poprzez bramkę NAND podłączone są czujki ruchu, do drugiego podłączone przez bramkę NAND są guziki klawiatury. Poniżej zamieszczam kod obsługi obu przerwań:
Naruszenie strefy:
SIGNAL(SIG_INTERRUPT0)
{
if(stan==1) {
write_command(0x1) ;
write_command(0x80) ;
write_text(" NARUSZENIE") ;
write_command(0x0C0);
write_text(" STREFY") ;
LCD_LED_ON ;
PORTB |= _BV(3) ;
}
}
Naciśnięcie guzika na klawiaturze:
SIGNAL(SIG_INTERRUPT1)
{
PORTB = PORTB|0b00000000 ;
waitms(3) ;
if(bit_is_clear(PINB,2))
{
sound(50) ;
if(stan==0)
{
cli() ;
write_command(0x1) ;
write_command(0x80) ;
write_text(" UZBRAJANIE") ;
write_command(0x0C0);
write_text(" SYSTEMU") ;
LCD_LED_ON ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(50) ;
waitms(500) ; waitms(500) ; waitms(500) ; sound(200) ;
stan = 1 ;
sei() ;
}
}
PORTB = PORTB&0b11111100 ;
PORTB = PORTB|0b00000001 ;
waitms(3) ;
if(bit_is_clear(PINB,2))
{
sound(50) ;
if(stan==1)
{
stan = 0 ;
write_command(0x1) ;
write_command(0x80) ;
write_text(" ROZBRAJANIE") ;
write_command(0x0C0);
write_text(" SYSTEMU") ;
LCD_LED_ON ;
PORTB &= ~_BV(3) ;
waitms(500) ;
}
}
PORTB = PORTB&0b11111100 ;
PORTB = PORTB|0b00000010 ;
waitms(3) ;
if(bit_is_clear(PINB,2))
{
sound(50) ;
}
PORTB = PORTB&0b11111100 ;
czuwanie() ;
}
W tym wypadku obsługiwane są tylko 3 guziki - ich stan sprawdzany jest po kolei za pomocą multipleksera. Pierwszy guzik uzbraja system (i tu bardzo topornie rozwiązałem sprawę oczekiwania aż użytkownik opuści strefę - wyłączam przerwania, czekam trochę, a następnie włączam przerwania). Guzik drugi rozbraja system/wyłącza alarm. Trzeci guzik w sumie nic nie robi poza wydaniem dźwięku
Mam nadzieję, że wyraziłem się dość jasno o co mi chodzi
z góry dzięki za pomoc
pozdrawiam
herszt
