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

[BASCOM][attiny2313]Program z timerem

wojtek9104 20 Paź 2010 20:04 1576 5
REKLAMA
  • #1 8643507
    wojtek9104
    Poziom 16  
    Witam.
    Napisałem sobie taki program, początkowo bez timerów lecz nie działał jak chciałem,
    Zrobiłem z timerem i niestety nic to nie dało.

    Program wygląda tak:
    
    $regfile = "attiny2313.dat"                                 'typ proca
    $crystal = 1000000                                          'taktowanie
    
    Config Portb = Input                                        'port b  jako wejścia
           Portb = &B00111111                                   
    Config Portd = Output                                       'pprt d jako wyjścia
           Portd = &B0000000                                    'wszędzie stan spoczynkowy-0
    
    Config Timer1 = Timer , Prescale = 64
    On Timer1 Podprogram
    
    Enable Interrupts
    Enable Timer1
    
    Timer1 = 49911                                              'wpisanie wartosci 49911 do timera
    
    
    Do
    Loop
    End
    
    
    Podprogram:
    Timer1 = Timer1 + 49911
    
    If Pinb.0 = 0 And Pinb.1 = 0 Then
    Wait 2
    Portd.0 = 1
    Waitms 100
    Portd.0 = 0
    End If
    
    
    If Pinb.0 = 1 And Pinb.1 = 0 Then
    Wait 50
    Portd.1 = 1
    Waitms 500
    Portd.1 = 0
    Waitms 500
    Portd.1 = 1
    Waitms 500
    Portd.1 = 0
    Wait 5
    End If
    
    If Pinb.0 = 0 And Pinb.1 = 1 Then
    Portd.1 = 1
    Else
    Portd.1 = 0
    End If
    
    Return


    No i mam taki problem że, jeśli warunek poniżej będzie spełniony, program czeka 50 sekund i nawet gdy w tym czasie warunek ten się zmieni i według założeń powinien działac kolejny warunek, muszę zaczekac aż minie te 50 sekund :
    If Pinb.0 = 1 And Pinb.1 = 0 Then
    Wait 50
    Portd.1 = 1
    Waitms 500
    Portd.1 = 0



    Przeczytałem helpa i artykuł o timerach ale nie znalazłem odpowiedzi jak mam zrobic aby było dobrze.

    Może mi ktoś powiedziec jak to zrobic?
  • REKLAMA
  • #2 8643592
    arktik1
    Poziom 27  
    Stosując polecenie WAIT, WAITMS, itd , powodujesz że Uc nie robi nic więcej tylko odlicza WAIT.
    Nie możesz stosować WAIT jeśli chcesz by kontroler sprawdzał coś jeszcze gdy liczy czas.
    Najprostsze rozwiązanie to zadeklarować jakąś zmienną do liczenia czasu.
    Wtedy zmienna liczy czas a Uc sprawdza dalej warunki.
  • REKLAMA
  • #3 8643916
    wojtek9104
    Poziom 16  
    Szukam teraz zmiennej którą mógł bym to zrobic ale widze tylko takie które odpowiadają za wyświetlanie znaków na lcd, i funkcie matematyczne. podejrzewam że zmienna ma w jakiś sposób odczytywac wartośc licznika z timera?

    Mógł byś podac dokładniejsza nazwę tej zmiennej lub przykład?
  • REKLAMA
  • #4 8643976
    arktik1
    Poziom 27  
    "Szukam teraz zmiennej którą mógł bym to zrobić"
    Robisz sobie żarty, czy na prawdę nie wiesz co to zmienna?
  • REKLAMA
  • #5 8644107
    wojtek9104
    Poziom 16  
    wychodzi na to że nie wiem. Przeglądam właśnie książke Marcina Wiązania, ale nie znalazłem aby do zmiennej były przyporządkowane wartości czasu.
  • #6 8644561
    arktik1
    Poziom 27  
    Możesz zrobić to tak:
    
    Dim Zmienna As Word
    
    Do
    
    If Pinb.0 = 0 And Pinb.1 = 0 Then
    Incr Zmienna
    If Zmienna = 20 Then
    Portd.0 = 1
    End If
    If Zmienna = 21 Then
    Portd.0 = 0
    End If
    If Zmienna = 22 Then Zmienna = 0
    Else
    Zmienna = 0
    End If
    
    Waitms 100
    
    Loop
    

    Zmienna jest liczona do 20 czyli ok 2 sekund, ponieważ 20 x Waitms 100 = 2000.
    A 2000 ms to 2 sec.
    W pętli jest dodane Waitms 100 po to by nie stosować bardzo dużych wartości w liczeniu zmiennej przez program i z drugiej strony jest to tak małe opóźnienie że nie będzie powodowało złego działania twojego programu.
    W takim rozwiązaniu Uc powtarza cały czas pętlę i sprawdza inne warunki.
    Jeśli zmienna dojdzie do 20 czyli ok 2 sekund to zostanie ustawiony Portd.0 = 1, potem odczeka 100ms i ustawi Portd.0 = 0.
    Jest to jedno z wielu rozwiązań, czasem je stosuje jeśli nie zależy mi na dokładności co do ms.

    Dodano po 3 [minuty]:

    Oczywiście nazwa ZMIENNA to tylko przykład .
    Może być : w, s, g, tert, paluszek, oko, itd.
REKLAMA