logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATtiny13][bascom] Wyłącznik czasowy.

Manio95 16 Sie 2010 09:40 3938 17
REKLAMA
  • #1 8403093
    Manio95
    Poziom 21  
    Witam
    Stworzyłem urządzenie, które wyłącza przekaźnik po żądanym czasie który wybiera się poprzez naciśnięcie guzika.
    Do wyboru są trzy czasy 4h, 6h i 8h.
    Guziki są podłączone do PB0 PB1 i PB2 i do masy a tranzystor do PB3.
    Problem mam z programem.
    Myślałem, że wystarczy godziny przeliczyć na sekundy i podać po komendzie

    Ale jednak to nie działa.
    Jaka jest komenda aby program odczekał np. te 4 godziny i na PB3 znów było 0?
    Poprzedni (niedziałający) program wyglądał tak:

    $regfile = "attiny13.dat"
    $crystal = 1200000
    Config Pinb.2 = Input
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    Config Portb.3 = Output
    Set Pinb.2
    Set Pinb.0
    Set Pinb.1
    Reset Portb.3
    
    Do
    If Pinb.2 = 0 Then
    Set Portb.3
    Wait 14400
    Reset Portb.3
    End If
    If Pinb.1 = 0 Then
    Set Portb.3
    Wait 21600
    Reset Portb.3
    End If
    If Pinb.0 = 0 Then
    Set Portb.3
    Wait 28800
    Reset Portb.3
    End If
    Loop
    End

    Dziękuję za wszelką pomoc.
  • REKLAMA
  • #2 8403194
    tadzik85
    Poziom 38  
    Zainteresuj się licznikami. Tu nawet sterowanie jest niemożliwe. Skoro stan przycisków sprawdzasz co 4, 6 lub 8h tylko raz.
  • REKLAMA
  • #3 8403310
    Manio95
    Poziom 21  
    A ile maksimum można odczekać komendą Wait ?
  • #4 8403432
    tadzik85
    Poziom 38  
    tego nie wiem, ale tak długich opóźnień tą instrukcją nie stosuje się ponieważ procesor zajmuje się tylko tym. poza tym jak wspomniałem nie masz możliwości zmiany czasu. musiałbyś dokładnie trafić na zakończenie odliczania. Mówiąc krotko zła koncepcja programu.
  • #5 8403452
    Manio95
    Poziom 21  
    tadzik85 napisał:
    tego nie wiem, ale tak długich opóźnień tą instrukcją nie stosuje się ponieważ procesor zajmuje się tylko tym.

    Bo u mnie ma zajmować się tylko tym.


    tadzik85 napisał:
    . poza tym jak wspomniałem nie masz możliwości zmiany czasu.

    Taka możliwość nie jest mi potrzebna.
  • #6 8403539
    tadzik85
    Poziom 38  
    wiec zmniejsz wartość opóźnienia wait i to zamknij w pętli for.
  • #7 8403686
    Manio95
    Poziom 21  
    tadzik85 napisał:
    wiec zmniejsz wartość opóźnienia wait i to zamknij w pętli for.

    Nie bardzo wiem o co chodzi bo w dziedzinie mikrokontrolerów jestem jeszcze raczkujący.
  • #8 8403688
    arktik1
    Poziom 27  
    1.Zadeklaruj jakąś zmienną jako licznik.
    2.Ustaw sobie WAITMS by zajmował ok 1 sekundy.
    3.Ustaw licznik by liczył do 60.
    Otrzymasz wtedy około 1 minutę.
    Potem pomnóż to 60 przez ilość minut jakie chcesz odliczyć i zamknij to wszystko w pętli przerwań.
    Nie jest to dokładny sposób odmierzania czasu.

    Dodano po 2 [minuty]:

    jeśli chcesz gotowca to napisz...
  • REKLAMA
  • #9 8403748
    Manio95
    Poziom 21  
    Jeśli można prosić nie tyle gotowca co jakiś przykład to już dam sobie radę.
  • #10 8403753
    arktik1
    Poziom 27  
    No tak, tylko że w tym twoim attiny13 nic się nie zmieści, żadna deklaracja zmiennej.

    Dodano po 1 [minuty]:

    Masz tu:
    
    $regfile = "attiny25.dat"
    $crystal = 1200000
    Config Portb = &B001000
            Portb = &B110111
    Dim X As Integer
    
    X = 0
    
    Do
    Debounce Pinb.0 , 0 , Czas1 , Sub
    Debounce Pinb.1 , 0 , Czas2 , Sub
    Debounce Pinb.2 , 0 , Czas3 , Sub
    
    Loop
    End
    
    
    Czas1:
    
    Portb.3 = 1
    Do
    Incr X
    If X = 60 Then                                              '* czas minut
    X = 0
    Portb.3 = 0
    Return
    End If
    Waitms 1000                                                 'ustawić czas trwania 1 SEC.
    Loop
    
    Czas2:
    
    Portb.3 = 1
    Do
    Incr X
    If X = 60 Then                                              '* czas minut
    X = 0
    Portb.3 = 0
    Return
    End If
    Waitms 1000                                                 'ustawić czas trwania 1 SEC.
    Loop
    
    Czas3:
    
    Portb.3 = 1
    Do
    Incr X
    If X = 60 Then                                              '* czas minut
    X = 0
    Portb.3 = 0
    Return
    End If
    Waitms 1000                                                 'ustawić czas trwania 1 SEC.
    Loop
    

    ale co najmniej do ATTINY 25.
    :D
  • #11 8403889
    Manio95
    Poziom 21  
    No dobra.
    Dzięki za pomoc i dobre chęci ale miałem zamiar wykonać to na tym co mam już w domu czyli attiny13.
    Jeszcze coś popróbuje zrobić i zobaczę co wyjdzie.
    Jeśli miałbym dokupować jakiś mikroprocesor to wolę attiny2313 i dodać więcej opcji, jakiś wyświetlacz.
  • REKLAMA
  • #12 8405291
    landy13
    Poziom 31  
    arktik1 napisał:
    No tak, tylko że w tym twoim attiny13 nic się nie zmieści, żadna deklaracja zmiennej.

    Zmieści się. Tylko trzeba zmniejszyć stos, który Bascom ustawia domyślnie na cały RAM.
  • #13 8405442
    janbernat
    Poziom 38  
    I wykorzystać Timer- który ATtiny13 ma.
  • #14 8405551
    lukego
    Poziom 17  
    Options->Compiler->Chip

    HW Stack 32
    Soft Stack 8
    Framesize 24

    W sumie 64 bajty czyli tyle ile ma RAM w ATTiny13

    Zmniejsz do np.

    HW Stack 16
    Soft Stack 8
    Framesize 8

    I będziesz mógł deklarować zmienne
  • #15 8405572
    arktik1
    Poziom 27  
    Faktycznie, zapomniałem o tym.
    Teraz działa:
    
    $regfile = "attiny13.dat"
    $crystal = 1200000
    Config Portb = &B001000
            Portb = &B110111
    
    $hwstack 16
    $swstack 8
    $framesize 8
    
    Dim X As Integer
    
    X = 0
    
    Do
    Debounce Pinb.0 , 0 , Czas1 , Sub
    Debounce Pinb.1 , 0 , Czas2 , Sub
    Debounce Pinb.2 , 0 , Czas3 , Sub
    
    Loop
    End
    
    
    Czas1:
    
    Portb.3 = 1
    Do
    Incr X
    If X = 60 Then                                              '* czas minut
    X = 0
    Portb.3 = 0
    Return
    End If
    Waitms 10                                                   'ustawić czas trwania 1 SEC.
    Loop
    
    Czas2:
    
    Portb.3 = 1
    Do
    Incr X
    If X = 60 Then                                              '* czas minut
    X = 0
    Portb.3 = 0
    Return
    End If
    Waitms 10                                                   'ustawić czas trwania 1 SEC.
    Loop
    
    Czas3:
    
    Portb.3 = 1
    Do
    Incr X
    If X = 60 Then                                              '* czas minut
    X = 0
    Portb.3 = 0
    Return
    End If
    Waitms 10                                                   'ustawić czas trwania 1 SEC.
    Loop
    
  • #16 8407035
    Manio95
    Poziom 21  
    Już sobie poradziłem.
    Może jest to trochę prymitywne rozwiązanie ale ważne, że działa tak jak chciałem.
    
    $regfile = "attiny13.dat"
    $crystal = 1200000
    Config Pinb.2 = Input
    Config Pinb.0 = Input
    Config Pinb.1 = Input
    Config Portb.3 = Output
    Set Pinb.2
    Set Pinb.0
    Set Pinb.1
    Reset Portb.3
    
    Do
    If Pinb.2 = 0 Then
    Set Portb.3
    Wait 7200           'czekaj dwie godziny
    Wait 7200           'czekaj dwie godziny - razem cztery
    Reset Portb.3
    End If
    If Pinb.1 = 0 Then
    Set Portb.3          
    Wait 7200             'czekaj dwie godziny
    Wait 7200             'czekaj dwie godziny
    Wait 7200             'czekaj dwie godziny - razem sześć
    Reset Portb.3
    End If
    If Pinb.0 = 0 Then
    Set Portb.3          
    Wait 7200            'czekaj dwie godziny
    Wait 7200            'czekaj dwie godziny
    Wait 7200            'czekaj dwie godziny
    Wait 7200            'czekaj dwie godziny - razem osiem 
    Reset Portb.3
    End If
    Loop
    End
    
  • #17 8407456
    arktik1
    Poziom 27  
    No, nie dość że prymitywne to nie można zrezygnować z wybranej funkcji.:D
  • #18 8407487
    Manio95
    Poziom 21  
    Ale to i lepiej dla mnie, że nie można zrezygnować z wybranej funkcji.
    Problem rozwiązany.
    Dziękuję za dobre chęci, ale dalej się zastanawiam, ile można maksimum wpisać przy wait bo jak piszę 14400-cztery godziny to nie działa a 7200-dwie godziny to już działa. Myślę, że max to 9999ale nie mam czasu sprawdzić.
    Temat zamknięty.
REKLAMA