Bascom - Wyłączenie urządzeń po zadanym czasie


Witam
Mam problem z (trywialnym dla niektórych) programem jaki napisałem.
Zasada działania ma być następująca.Trzy urządzenia są załączane wyłączane po przez przez kolejne przyciski S1,S2,S3
dodatkowo jest sygnalizacja diodami,które urządzenie jest załączone.Ten fragment działa.Postanowiłem dołożyć czujnik podczerwieni PIR który wykrywa ruch w pomieszczeniu(jak ktoś jest 1 jak brak 0)Przy braku osoby w pokoju ma po określonym czasie (zawartym w programie np.20 minut) wyłączyć wszystkie urządzenia.
I ten fragment kodu nie działa
Napisałem dwie wersje pierwsza bez timera druga z timerem programowym.Proszę o uwagi gdzie tkwi błąd.
Jestem mega początkującym w Bascomie i programowaniu wiec proszę o łagodne potraktowanie ;)

Wersja 1

$regfile = "attiny2313.dat "                                'model proca
$crystal = 4000000                                          'taktowanie
 
$hwstack = 8
$swstack = 8
$framesize = 8
 
Config Portb = Output
Portb = &B00011100
Config Portd = Input
Portd = &B1111111
 
Dim Zegar As Word                                           'zmienna czasowa
Dim Minuta As Word                                          'zmienna minut
 
 
'********************************PRZYPISANIE ZMIENNYCH
 
S1 Alias Pind.0
S2 Alias Pind.1
S3 Alias Pind.2
Pir Alias Pind.3
 
Dioda_1 Alias Portb.5
Dioda_2 Alias Portb.6
Dioda_3 Alias Portb.7
 
Lampa Alias Portb.2
Zasilacz Alias Portb.3
Lutownica Alias Portb.4
 
'*******************************PROGRAM GLOWNY
Poczatek:
Do
 
Debounce S1 , 0 , Switch1 , Sub
Debounce S2 , 0 , Switch2 , Sub
Debounce S3 , 0 , Switch3 , Sub
 
 
 
If Pir = 0 Then                                             'wyłączenie po czasie
 Incr Zegar
  If Zegar > 55000 Then
  Zegar = 0
  Incr Minuta
  Reset Dioda_2
 
  End If
 
End If
 
If Minuta = 10 Then
 Reset Dioda_1
  Reset Dioda_2
  Reset Dioda_3
  Set Lampa
  Set Zasilacz
  Set Lutownica
End If
 
Loop
 
Switch1:
 
Toggle Dioda_1
Toggle Lampa
Goto Poczatek
 
Switch2:
 
Toggle Dioda_2
Toggle Zasilacz
Goto Poczatek
 
Switch3:
 
Toggle Dioda_3
Toggle Lutownica
Goto Poczatek
 
Return
 
End

Wersja 2

$regfile = "attiny2313.dat "                                'model proca
$crystal = 4000000                                          'taktowanie
 
$hwstack = 8
$swstack = 8
$framesize = 16
 
 
Config Portb = Output                                       'port B jako wyjscie
Portb = &B00011100                                          'ustawiam jedynki na zalaczeniu urzadzen
Config Portd = Input                                        'port D jako wejście
Portd = &B1111111                                           'podciagamy jedynke do włączników
 
Dim S As Byte                                               'zmienna do timera sekundy
Dim M As Byte                                               'zmienna do timera minuty
 
Config Timer1 = Timer , Prescale = 64                       'Konfiguracja Timera
 Enable Interrupts :
 Enable Timer1 : On Timer1 Prztimer1
 
'********************************PRZYPISANIE ZMIENNYCH
 
S1 Alias Pind.0                                             'wlacznik lampy
S2 Alias Pind.1                                             'wlacznik zasilacza
S3 Alias Pind.2                                             'wylacznik lutownicy
Pir Alias Pind.3                                            ' czujnik obecnosci PIR
 
Dioda_1 Alias Portb.5                                       'sygnalizacja zalaczenia lampy
Dioda_2 Alias Portb.6                                       'sygnalizacja zalaczenia zasilacza
Dioda_3 Alias Portb.7                                       'sygnalizacja zalaczenia lutownicy
 
Lampa Alias Portb.2                                         'zalaczenie lampy
Zasilacz Alias Portb.3                                      'zalaczenie zasilacza
Lutownica Alias Portb.4                                     'zalaczenie lutownica
 
'*******************************PROGRAM GLOWNY
Poczatek:
Do
 
Debounce S1 , 0 , Switch1 , Sub                             ' odczytywanie wejscia S1
Debounce S2 , 0 , Switch2 , Sub                             ' odczytywanie wejscia S2
Debounce S3 , 0 , Switch3 , Sub                             ' odczytywanie wejscia S3
 
Loop
 
Switch1:
 
Toggle Dioda_1
Toggle Lampa
Goto Poczatek
 
Switch2:
 
Toggle Dioda_2
Toggle Zasilacz
Goto Poczatek
 
Switch3:
 
Toggle Dioda_3
Toggle Lutownica
Goto Poczatek
 
 
Prztimer1:
 
Load Timer1 , 62500                                         'Program obsługi przerwania co 1s
If Pir = 0 Then                                             '
    Incr S
    If S = 60 Then
       S = 0
 Reset Dioda_2
 
       Incr M
 
    End If
End If
 
If M = 1 Then                                               ' dwadziescia minut mija nastepuje wylaczenie sprzetu
        M = 0
 Set Lampa
 Set Zasilacz
 Set Lutownica
 Reset Dioda_1
 Reset Dioda_2
 Reset Dioda_3
End If
 
Return
 
End




Portret użytkownika mirley

RE: timer bascom

Sprawdzałeś czy przerwanie timera działa co sekundę.... wstaw tam tylko polecenia

Load Timer1 , 62500                                         'Program obsługi przerwania co 1s
toggle Dioda_2

i sprawdź czy miga z dobrą częstotliwością.

W drugim kroku możesz przypisać w timerze na druga diodę stan końcówki Pir aby się upewnić że stan jest dobrze czytany...

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

RE:timer bascom

Zrobiłem tak jak podałeś i dioda mruga.
Dodatkowo dodałem warunek w petli

If Pir = 0 And M = 30 Then   'Jeżeli czujnik nie wskazuje obecności i czas 30s minie to wyłącza Diode_2
    M = 0
    Reset Dioda_2
    End If

i w timerze

Prztimer1:
 
Load Timer1 , 10000                                         'Program obsługi przerwania co 1s
 S = 1
 Toggle Dioda_1
 Incr M
 If M = 31 Then
 M = 0
 End If

To dioda 2 wylacza sie ale nie po czasie 30s tylko kilka sekund
Z ciekawości pytam dlaczego tak sie rozbiega.Dodam,że dioda z timera mruga co 1s

Portret użytkownika EDC

Odp. Timer Bascom

Zerknij na taki sposób rozwiązania dla Twojego kodu ;)

$regfile = "attiny2313.dat "                                'model proca
$crystal = 4000000                                          'taktowanie
 
$hwstack = 40
$swstack = 16
$framesize = 32
 
 
Config Portb = Output                                       'port B jako wyjscie
Portb = &B00011100                                          'ustawiam jedynki na zalaczeniu urzadzen
Config Portd = Input                                        'port D jako wejście
Portd = &B1111111                                           'podciagamy jedynke do włączników
 
Dim S As Byte                                               'zmienna do timera sekundy
Dim M As Byte                                               'zmienna do timera minuty
 
Config Timer1 = Timer , Prescale = 64                       'Konfiguracja Timera
 Enable Interrupts :
 Enable Timer1 : On Timer1 Prztimer1
 
'********************************PRZYPISANIE ZMIENNYCH
 
S1 Alias Pind.0                                             'wlacznik lampy
S2 Alias Pind.1                                             'wlacznik zasilacza
S3 Alias Pind.2                                             'wylacznik lutownicy
Pir Alias Pind.3                                            ' czujnik obecnosci PIR
 
Dioda_1 Alias Portb.5                                       'sygnalizacja zalaczenia lampy
Dioda_2 Alias Portb.6                                       'sygnalizacja zalaczenia zasilacza
Dioda_3 Alias Portb.7                                       'sygnalizacja zalaczenia lutownicy
 
Lampa Alias Portb.2                                         'zalaczenie lampy
Zasilacz Alias Portb.3                                      'zalaczenie zasilacza
Lutownica Alias Portb.4                                     'zalaczenie lutownica
 
'*******************************PROGRAM GLOWNY
 
Const Czas_do_wylaczenia = 1200                             ' 20minut  (60s x 20 = 1200)
Dim Odliczaj As Word
 
Do
 
Debounce S1 , 0 , Switch1 , Sub                             ' odczytywanie wejscia S1
Debounce S2 , 0 , Switch2 , Sub                             ' odczytywanie wejscia S2
Debounce S3 , 0 , Switch3 , Sub                             ' odczytywanie wejscia S3
  If Pir = 1 Then Odliczaj = Czas_do_wylaczenia             'jakikolwiek ruch przedłuża czas
Loop
 
Switch1:
 
Toggle Dioda_1
Toggle Lampa
 Odliczaj = Czas_do_wylaczenia
Return                                                      'powrót
 
Switch2:
 
Toggle Dioda_2
Toggle Zasilacz
 Odliczaj = Czas_do_wylaczenia
Return
 
Switch3:
 
Toggle Dioda_3
Toggle Lutownica
 Odliczaj = Czas_do_wylaczenia
Return
 
 
Prztimer1:
 
Load Timer1 , 62500                                         'Program obsługi przerwania co 1s
  If Odliczaj > 0 Then
   Decr Odliczaj                                            '
 
    If Odliczaj = 0 Then                                    'to sie wykona tylko raz ponieważ
                                                            'zamkniete jest w IF Odliczaj > 0
     Set Lampa
     Set Zasilacz
     Set Lutownica
     Reset Dioda_1
     Reset Dioda_2
     Reset Dioda_3
 
    End If
  End If
 
Return
 
End

-

BARTek
Moja strona