Odmierzanie czasu


Witam musze zroibć program któy po naciśnięciu switcha odliczy mi 5 min i załóżmy jak za 3 godizny nacisne znowu microswitch to znowu oldiczy mi 5min i otworzy port.
Ale nie wiem jak sie do tego zabrac.Wiem że musze użyć timer0 lub timer1.
Napisalem sam począttek:

$regfile = "m8def.dat"
$crystal = 12000000
Pind.0 = Input 'port Do Otwarcia
Pind.1 = Output                                             'Microsiwtch

Bardzo proszę o pomoc:)




Portret użytkownika mirley

Re: timer

Na początek zapoznaj się z programem do mojego timera fotograficznego i timera kuchennego bo oba działają na takiej zasadzie jak chcesz...

-

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 rgbled

Witam

Przenalizowałem kod z timera fotograficznego i mam coś takiego:

$regfile = "m8def.dat"
$crystal = 12000000
Pind.0 = Input                                              'triak
Pind.1 = Output                                             'Microsiwtch
Sw_port Alias Pind.1
Triak Alias Portd.0
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
'**************  Petla glowna ******************
'***********************************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
 
  End If
Loop
End
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:                                                  'co 4ms
  Timer0 = 5
  Flaga_4ms = 1
  If Odliczanie = 1 Then
    Incr Dzielnik
    If Dzielnik = 25 Then
      Dzielnik = 0
 
      If Licz_01s = 0 Then
 
        Decr Licz_01s
 
      End If
    End If
  Else
    Dzielnik = 0
  End If
Return
 
If Pind.1 = 0 Then
Start Timer0

Wiem że brakuje mi zmiennych.Nie wiem również gdzie mam pwisać zeby mi odliczył 5 min.W moim przypadku timer0 ma zacząć liczyć jak nacisne microswitch, czy to powino wyglądać tak:

If Pind.1 = 0 Then
Start Timer0

-

Pozdro :)

Portret użytkownika mirley

Re: Timer

Poza pętlą do loop nie może być niczego do czego nie dałeś etykiety ani return bo to ie będzie działało. Program powinien mniej więcej tak wyglądać:

$regfile = "m8def.dat"
$crystal = 12000000
Pind.0 = Input                                              'triak
Pind.1 = Output                                             'Microsiwtch
Sw_port Alias Pind.1
Triak Alias Portd.0
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
'**************  Petla glowna ******************
'***********************************************
Do
  If Flaga = 1 Then  'wykonuje się co (256*250)/12000000 sekund
    Flaga = 0
 
    'tumożesz sobie zrobić licznik odliczający  jednostkowe czasy. Np jeśli ustawisz flagę żeby działała co 4ms to wystarczy napisać
 
   incr dziel
   if dziel = 250 then 
     dziel = 0
     'tutaj akcja co 1s na odliczanie sekund
   end if
 
 
  'tutaj obsługa przycisku (bez żadnych wait) zrobiona na podobnej zasadzie jak u mnie, na liczniku
   if pinx.y = 0 then
     incr licznik
     if licznik = xxxx then   ilość impulsów zanim przycisk zareaguje
       licznik = 0
       'reakcja na przycisk
 
     end if
   else
     licznik
   end if
 
  End If
 
Loop
End
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:                                                  'co 4ms
  Timer0 = 6     'tu się ustawia początkową wartość timera , czyli ilość impulsów 256-6=250 impulsów
                 'zmienna flaga ustawiana jest zatem z częstotliwością 12000000/(256*250)
  Flaga = 1
Return

TO jest zarys programu, jak działa musisz zrozumiec samemu. Dopisac zmienne i na podstawie wzoru który podałem obliczyc taką wartość timera żeby dobrze ustawiał zmienna flaga co określony czas. Np dla 4ms i kwarca 16MHZ trzeba ustawić timer=6, (tam mam chyba błąd w programie bo 5 daje częstotliwośc mniejszą). Dla 12MHz kwarca będzie to inna wartość

CO do stop timer to nie ma potrzeby jego wyłączania. Wystarczy odpowiedni if w obsłudze przycisku.

Ustaw ten timer i zobacz czy dioda w pętli głównej miga poprawnie np co 1s

-

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 drowning_man

odp

Jeśli dobrze rozumiem... po naciśnięciu uSwitch'a ma się załączać triak na 5min i tak za każdym razem gdy naciśniesz uSwitch?

Portret użytkownika rgbled

tak zgadza sie:)

tak zgadza sie:)

-

Pozdro :)

Portret użytkownika drowning_man

odp

Najprościej chyba będzie tak:

$regfile "m8def.dat"
$crystal = 8000000
 
Config Pind.0 = Output
Config Pinb.5 = Input
S Alias Pinb.5
Triak Alias Portd.0
 
Set Portb.5
 
Do
 
If S = 0 Then
Waitms 20
If S = 0 Then
Triak = 1
Wait X                                                      'zamiast 'x' wpisz sobie na ile s  ma się załączyć triak/przekaźnik
Triak = 0
 
End If
End If
Loop

Testowałem ten program z przekaźnikiem załączanym przez ULN2803A i działa tak jak chciałeś. Ustawienia pinów to sobie żmien jak chcesz, mi pasowało akurat tak podłączyć układ.

Portret użytkownika rgbled

Mi nie działa ustawiłem soibe

Mi nie działa ustawiłem soibe porty i kwarc na 12mhz.Po załączneku całści zarówka mi sie świecie nie wyłącza sie po określonym casie, i jak nacine switch to mi gaśnie a po ponownym naciśnicu u switch zero reakcji:(

Bardzo proszę o pomoc:)

-

Pozdro :)

Portret użytkownika drowning_man

odp

A jak to podłączyłeś? Przez układ ULN2803A? Jeśli inaczej to wrzuć schemat.

Portret użytkownika rgbled

pod triaki na uniwersalnej

pod triaki na uniwersalnej płytce mirelego:)

-

Pozdro :)

Portret użytkownika mirley

Re: Odmierzanie czasu

Jak chcesz uruchomic to z triakiem na mojej płytce to tam masz włączane triaki niskim stanem logicznym. Zamień "Triak=1" na "Triak=0" i na odwrót. Na początku programu daj "triak = 1"

Poza tym jeśli chcesz precyzyjnie odmierzać czas to wait się do tego nie nadaje. Zależy czy chcesz mieć 5min policzone czy około 5min to musisz się zdecydować na określoną wersję programu

-

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 rgbled

Witam, zrobiłem jak Pan

Witam, zrobiłem jak Pan powidział i działa:) Odlicza mi około 1min 13s.Raczej nie jest mi potrzebny aż tak dokładny czas bo to ma zalączć pompke do wody w kuchni jak sie będzie zmywalo żeby była odrazu gorąca a nie żeby trzeba było spuszczać zimną:)Ale ma pytanie jeżeli ustawiłem to na 60s to za każdym razenm będzie taki sam odhył czasu od ustawionego?I czy za każdym razem ten czas będze mniejszy czy większy?I terz głowne pyytanie:D Czy taki sposób odmierzania czasu nie zawiesie atmegi8?

Bardzo proszę o odpowidzi na moje pytnia:)

-

Pozdro :)

Portret użytkownika drowning_man

odp

Sprawdz sobie kilka razy jaki jest czas to będziesz wiedział jaki jest "odhył" :-). Dlaczego miałoby to zawiesić atmegę? Jest to tak prosty program, że raczej nie ma szans:-) u mnie działał dobrze, a testowałem go kilka godzin, wciskając co jakiś czas uSwitcha:-).