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

[attiny2313][Bascom] źle działający stoper

kkrryyss1 04 Lut 2011 20:27 2118 5
REKLAMA
  • #1 9103814
    kkrryyss1
    Poziom 11  
    Witam wszystkich.
    Oto mój problem .W ramach podstawowej nauki programowania postanowiłem trochę przerobić program zawarty w książce"Mikrokontrolery dla początkujących". Chodzi o program C012a --stoper. Program z książki steruje stoperem przy pomocy dwóch przycisków :S1- start , S2- stop. Ja próbuję tak go zmienić by przycisk S1 na zmianę załączał i wyłączł stoper. W pewnym sęsie mi się to udało , ale nie każde naciśnięcie S1 powoduję prawidłowe zadziałanie stopera. Czasami trzeba likakrotnie nacisnąć przycisk żeby wystartował lub się zatrzymał.
    Moim zdaniem coś jest nie tak z poleceniem "toggle pomoc", chyba przyciśnięcie S1 nie zawsze trafia w odpowiedni stan zmiennej "pomoc" . Proszę o pomoc jak to poprawić.
    'C012a      Bardzo prosty stoper 0,1-sekundowy  , załącz -wyłącz S1
                'w trakcie odliczania czasu załączony T2
    
    $regfile = "attiny2313.dat"
    $crystal = 4000000
    
    Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
    Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit , Pomoc As Bit , Flaga As Bit
    
    Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
    Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
    
    Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
    Pomoc = 1
    On Timer0 Co4ms
    
    
    Do : Loop : End          'to jest główny program - pusta nieskończona pętla
    
    Co4ms:                   'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
    
    Timer0 = 6               'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
    Toggle Pomoc
    
    If Pind.0 = 0 And Pomoc = 1 Then Licz = 1       'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
    
    If Pind.0 = 0 And Pomoc = 0 Then Licz = 0       'sprawdź stan S1 i ewentualnie zakończ zliczanie czasu
    
    If Licz = 1 Then         'tylko wtedy, gdy stoper ma liczyć czas
       Incr 100ms            'co 4ms zwiększ wartość licznika o nazwie 100ms
    
    
       If 100ms = 25 Then    'skróc cykl licznika 100ms właśnie do 100ms
          100ms = 0          'czyli 0,1 sekundy
          Incr Dziesek       'co 0,1s zwiększ stan licznika dziesiatych części sekundy
          If Dziesek = 10 Then       'ten licznik liczy do dziesieciu
             Dziesek = 0     'czyli cykl trwa 1 sekundę
             Incr Sekjed     'co 1 sekundę  zwiększ licznik jednostek sekund
             If Sekjed = 10 Then
                Sekjed = 0   'co 10 sekund
                Incr Sekdzies       'zwiększ stan licznika dziesiatek sekund
                   If Sekdzies = 6 Then       'liczy do 6 bo minuta ma 60 sekund
                      Sekdzies = 0
                      Incr Minjed       'co 60 sekund zwiększ stan licznika minut
                         If Minjed = 10 Then Minjed = 0       '0...9 minut
                   End If    'więc maksymalny stan licznika to:
             End If          '9 minut, 59 sekund i 9 dziesiatych sekundy
          End If
       End If
    End If
    
    Incr Ktorywysw : If Ktorywysw = 4 Then Ktorywysw = 0       'skróć cykl: 0...3
    'Portd = &B1111111        ' wygaś wyświetlacze
     Portd.3 = 1
     Portd.4 = 1
     Portd.5 = 1
     Portd.6 = 1
    
    Select Case Ktorywysw    ' obsługa wyświetlacza
    Case 0:                  'wyświetl zawartość licznika jednostek
       Portb = Lookup(dziesek , Tabela)       'najpierw przepisz do PortB kody
       Portd.3 = 0           'potem włącz T3 - wyświetlacz jednostek
    Case 1:                  'wyświetl zawartość licznika dziesiątek
       Portb = Lookup(sekjed , Tabela)       'najpierw przepisz do PortB kody
       Portb.7 = 0           'włącz punkt dziesiętny
       Portd.4 = 0           'potem włącz T4 - wyświetlacz dziesiątek
    Case 2:                  'wyświetl zawartość licznika setek
       Portb = Lookup(sekdzies , Tabela)       'przepisz do PortB kody
       Portd.5 = 0           'włącz T5 - wyświetlacz setek
    Case 3:                  'wyświetl zawartość licznika tysięcy
       Portb = Lookup(minjed , Tabela)       'przepisz do PortB kody
       Portb.7 = 0           'włącz punkt dziesiętny
       Portd.6 = 0           'włącz T6 - wyświetlacz tysięcy
    End Select
    
    Return                   'koniec procedury obsługi przerwania
    
    Tabela:                  'potrzebna do wyświetlenia cyfr 0...9
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
  • REKLAMA
  • #2 9104052
    jacekk232
    Poziom 17  
    Witam.
    Przyciski tak reagują bo stan zmiennej Pomoc zmienia się za każdym razem wywołania przerwania (co 4ms) i to nie zależnie od stanu wciśnięcia przycisku. A jej stan powinien się zmienić tylko po wciśnięciu przycisku i to jednorazowo. Dopiero puszczenie przycisku powinno pozwolić na kolejną zmianę stanu zmiennej Pomoc. Ja bym w ogóle nie dawał tej zmiennej tylko po wciśnięciu przycisku zmieniał stan zmiennej Licz.

    Do obsługi przycisku wykorzystaj przykład z ćwiczenia c09d.
  • REKLAMA
  • REKLAMA
  • #4 9108405
    kkrryyss1
    Poziom 11  
    Zrobiłem jak radził jacekk232 , ale nadal nie mogę zatrzymać stopera przyciskiem S1.
    Startt = 0               ' zmienne pomocnicze
    Licz = 0
    
    On Timer0 Co4ms
    
    Do                       'to jest główny program - pusta nieskończona pętla
    Loop
    End
    
    Co4ms:                   'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
    
    Timer0 = 6               'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
    
    
    If Pind.0 = 0 Then       'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
       Startt = 1
       Licz = 1
    Else
       If Startt = 1 Then
          Startt = 0
       End If
    End If
    
    If Licz = 1 Then         'tylko wtedy, gdy stoper ma liczyć czas
       Incr 100ms            'co 4ms zwiększ wartość licznika o nazwie 100ms
    


    a jak dodam polecenie licz = 0 , to stoper zlicza tylko przy przyciśniętym S1.

    [code]Startt = 0 ' zmienne pomocnicze
    Licz = 0

    On Timer0 Co4ms

    Do 'to jest główny program - pusta nieskończona pętla
    Loop
    End

    Co4ms: 'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms

    Timer0 = 6 'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów


    If Pind.0 = 0 Then 'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
    Startt = 1
    Licz = 1
    Else
    If Startt = 1 Then
    Startt = 0
    Licz = 0
    End If
    End If


    If Licz = 1 Then 'tylko wtedy, gdy stoper ma liczyć czas
    Incr 100ms 'co 4ms zwiększ wartość licznika o nazwie 100ms
    [code]

    proszę o dalsze wskazówki[/code]
  • REKLAMA
  • Pomocny post
    #5 9110684
    jacekk232
    Poziom 17  
    Spróbuj zrobić tak
    Co4ms:                   'procedura obsługi przerwania od Timera T/C0 wykonywana co 4ms
    Timer0 = 6                                                  'załaduj do Timera0, żeby zliczył 250 (=256-6) impulsów
    Incr Licznik
    If Licznik = 6 Then                                         'zmienna Licznik liczy do 6 aby
       Licznik = 0                                              'sprawdzanie stanu przycisku następowało
       If Pind.0 = 0 Then                                       'co ok.24ms
          If Pomoc = 1 Then                                     'jeśli zmienna Pomoc ustawioma
             Toggle Licz                                        'włącz/wyłącz odliczanie
             Pomoc = 0                                          'wyzeruj Pomoc aby zmiana Licz nastąpiła jednorazowo
          End If
       Else
          Pomoc = 1                                             'jeśli przycisk puszczony ustaw Pomoc aby
       End If                                                   'umożliwić następną zmianę stanu Licz po
    End If                                                      'wciśniąciu przycisku
    
    
    If Licz = 1 Then         'tylko wtedy, gdy stoper ma liczyć czas
       Incr 100ms            'co 4ms zwiększ wartość licznika o nazwie 100ms
  • #6 9111389
    kkrryyss1
    Poziom 11  
    jacekk232 -zrobiłem jak poradziłeś i wszystko jest tak jak chciałem. Teraz w ramach ćwiczenia spróbuję zastosować radę kolegi xury .
    Wszystkim serdecznie dziękuję za pomoc.
    Krzysztof.
REKLAMA