Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega8][BASCOM]Przerywacz pracy wycieraczek

10 Paź 2008 22:10 1676 6
  • Poziom 10  
    Witam. Znalazłem kiedyś, zdaje się że nawet na elektrodzie, program napisany dla AT89C2051 którego zadaniem było sterowanie czasowe wycieraczkami samochodowymi.
    Code:
    ' Przerywacz pracy wycieraczek o programowanym czasie 
    
    '
    '$sim
     
    $regfile = "89c2051.dat"
    $crystal = 12000000
     
    Wajchain Alias P3.2               'Wejscie z dzwigni sterowania wycieraczka
    Wajcha1in Alias P3.3             'Wejœcie z dêwigni - praca ci¹gùa
    Przekaznik Alias P1.2            'Wyjscie sterujace przekaznikiem
     
    Dim Przerwa As Byte     'Czas przerwy miedzy "wahnieciami" wycieraczki
    Dim Stan As Byte
     'Zmienne do mierzenia roznych czasow
    Dim Czaswajchy As Byte
    Dim Czasmachaczki As Byte
    Dim Czasprzerwy As Byte
     'Zmienne pomocnicze do badania stanu wajchy (tlumienie drgan)
    Dim Up As Bit , Up1 As Bit
     
    Dim Wajcha As Bit  'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
    Dim Wajcha1 As Bit  'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
     
    Dim Machaczka As Bit , Machaj As Bit
     
    Dim Totaltime As Byte
    'Stany:
    ' 0 - nic siê nie dzieje, badamy stan wajchy
    '     jesli wajcha=ON - rozpoczynamy pomiar czasu i idziemy do stanu 1
    ' 1 - mierzymy czas + badamy wajche
    '     jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
    '     jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
    ' 2 - Sprawdzamy czy wajcha 1 jest on - jeœli tak to do stanu 0, jeœli nie to:
    '     Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
    '     Jesli uplynelo 15 sekund - idziemy do stanu 0
    '     Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
    ' 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> zaczynamy mierzyc czas i do stanu 2
     
    Set Przekaznik   ' Wylacz gdyby po resecie przypadkiem procek zapomnial
    Set Wajchain      ' Ustaw na 1 jako "do czytania"
    Call Stanwajchy    ' Ustaw stan wajchy
    Reset Machaczka
    Reset Machaj
     
    Stan = 0
     
    Przerwa = 50       ' Czas na pocz¹tek przerwy 50 * 100ms = 5s
     
    Totaltime = 0
    ' Gùówna pêtla programiku
    While 1 = 1
        Call Stanwajchy()          ' To czeka ok. 20 ms
        Call Stanwajchy1()           ' Tu te¿ czeka ok. 20 ms
        If Stan = 0 Then Call Stan0
        If Stan = 1 Then Call Stan1
        If Stan = 2 Then Call Stan2           ' Tu czeka extra 20ms
        If Stan = 5 Then Call Stan5
        Call Przeliczczasy
        Call Obslugamachaczki
     
    ' czekaj do peùnych 100ms --> 59ms (2x20ms+59ms plus narzut programu pi razy drzwi 1ms ?)
        Waitms 59
     
    'Jesli nic sie nie dzieje przez 25 sekund to wejdz w stan uspienia
        If Stan = 0 Then
           inc totaltime
           If Totaltime >= 250 Then
              On Int0 Proc_int0
              Enable Interrupts
              Enable Int0
              Idle
              nop
              Disable Interrupts
           End If
        Else
           Totaltime = 0
        End If
    Wend
     
    Sub Stanwajchy
       Up = Wajchain
       Waitms 20
       Up1 = Wajchain
       If Up = Up1 Then
          If Up = 1 Then
             Reset Wajcha
          Else
             Set Wajcha
          End If
       End If
    End Sub
     
    Sub Stanwajchy1
       Up = Wajcha1in
       Waitms 20
       Up1 = Wajcha1in
       If Up = Up1 Then
          If Up = 1 Then
             Reset Wajcha1
          Else
             Set Wajcha1
          End If
       End If
    End Sub
     
    Sub Stan0
    ' 0 - nic siê nie dzieje, badamy stan wajch. Jesli wajcha=ON - rozpoczynamy pomiar czasu w "czaswajchy"
    ‘ i idziemy do stanu 1
       If Wajcha = 1 Then
          Stan = 1
          Czaswajchy = 0
    ' Zainicjuj machanie wachaczk¹
          Call Startmachaczki()
       End If
    End Sub
     
    Sub Stan1
    ' 1 - mierzymy czas (czaswajchy) + badamy wajche
    '     jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
    '     jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
    '             a jesli = OFF to jeszcze do stanu 2
      If Czaswajchy > 10 Then
         If Wajcha = 1 Then
    '         Call Stopmachaczki
             Stan = 5
         Else
             Stan = 2
             Call Stopmachaczki
         End If
      Else
         ' Czas od wlaczenia wajchy <= 1s
         If Wajcha = 0 Then
             Stan = 2
             Call Stopmachaczki
         End If
      End If
    End Sub
     
    Sub Stan2
    ' 2 - Sprawdzamy czy wajcha1 jest on i wajcha = off - jeœli tak to do stanu 0, jeœli nie to:
    '     Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
    '     Jesli uplynelo 15 sekund - idziemy do stanu 0
    '     Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
      If Wajcha1 = 1 Then
         If Wajcha = 0 Then
            Stan = 0
            Exit Sub
         End If
      End If
      If Czaswajchy > 160 Then                                    '160=150+10 ktore juz wczesnij naliczyl
          Stan = 0
          Exit Sub
      End If
      ' Jeszcze nie uplynelo 15 sekund
      If Wajcha = 1 Then
         Przerwa = Czaswajchy
         'Nowy czas przerwy nie moze byc mniejszy od 2 sekund
         If Przerwa < 20 Then Przerwa = 20
    '     Call Startmachaczki
         Machaj = 1
         Czasmachaczki = Czaswajchy
         Stan = 5
      End If
    End Sub
     
    Sub  Stan5  '  stan  5 - Czekamy az wylaczy wajche. Jesli wylaczy -> stan 0
       If Wajcha = 0 Then
           Call Stopmachaczki
           Czaswajchy = 0
           Stan = 0
       End If
    End Sub
     
    Sub Przeliczczasy
      inc czaswajchy  ' Ta zmienna sluzy do obslugi chodzenia po stanach w zalezosci od stanu wajchy
    End Sub
     
    Sub Obslugamachaczki
    ' Minelo 0,5 sekundy ? Wylacz przekaznik
      If Czasmachaczki >= 5 Then Machaczka = 0
     If Machaj = 1 Then
          If Czasmachaczki >= Przerwa Then
             Machaczka = 1
             Czasmachaczki = 0
          End If
    '  Else
    '     Machaczka = 0
      End If
     If Machaczka = 1 Then
         Reset Przekaznik
      Else
         Set Przekaznik
      End If
      inc czasmachaczki
     
    End Sub
     
    Sub Startmachaczki
       Machaj = 1
       Czasmachaczki = 0
       Machaczka = 1
    '   Reset Przekaznik
    End Sub
     
    Sub Stopmachaczki
       Machaj = 0
    '   Machaczka = 0
    End Sub
    Proc_int0:
       nop
    Return


    Postanowiłem go zaadoptować do ATmega8 i moja propozycja jest taka:
    Code:
         'Przerywacz pracy wycieraczek o programowanym czasie
    
                                                                '
                                                                '$sim
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Pind.0 = Input
    Config Pind.1 = Input
    Config Pinc.5 = Output

    Wajchain Alias Pind.0      'Wejscie z dzwigni sterowania wycieraczka
    Wajcha1in Alias Pind.1    'Wej.cie z dęwigni - praca ciągůa
    Przekaznik Alias Pinc.5    'Wyjscie sterujace przekaznikiem

    Dim Przerwa As Byte     'Czas przerwy miedzy "wahnieciami" wycieraczki
    Dim Stan As Byte
                                        'Zmienne do mierzenia roznych czasow
                                        'Zmienne do mierzenia roznych czasow
    Dim Czaswajchy As Byte
    Dim Czasmachaczki As Byte
    Dim Czasprzerwy As Byte
                                       'Zmienne pomocnicze do badania stanu wajchy (tlumienie drgan)
    Dim Up As Bit , Up1 As Bit
    Dim Wajcha As Bit         'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
    Dim Wajcha1 As Bit      'Stan dzwigni sterowania wycieraczkami: 1=ON, 0=OFF
    Dim Machaczka As Bit , Machaj As Bit
    Dim Totaltime As Byte

    Declare Sub Stanwajchy
    Declare Sub Stanwajchy1
    Declare Sub Stan0
    Declare Sub Stan1
    Declare Sub Stan2
    Declare Sub Stan5
    Declare Sub Przeliczczasy
    Declare Sub Obslugamachaczki
    Declare Sub Startmachaczki
    Declare Sub Stopmachaczki
     ' Stany:
     ' 0 - nic się nie dzieje, badamy stan wajchy
     ' jesli wajcha=ON - rozpoczynamy pomiar czasu i idziemy do stanu 1
     ' 1 - mierzymy czas + badamy wajche
     ' jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
     ' jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
     ' 2 - Sprawdzamy czy wajcha 1 jest on - je.li tak to do stanu 0, je.li nie to:
     ' Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
     ' Jesli uplynelo 15 sekund - idziemy do stanu 0
     ' Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
     ' 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> zaczynamy mierzyc czas i do stanu 2
    Set Przekaznik  ' Wylacz gdyby po resecie przypadkiem procek zapomnial
    Set Wajchain     ' Ustaw na 1 jako "do czytania"
    Call Stanwajchy   ' Ustaw stan wajchy
    Reset Machaczka
    Reset Machaj
    Stan = 0
    Przerwa = 50     ' Czas na początek przerwy 50 * 100ms = 5s
    Totaltime = 0
     ' Gůówna pętla programiku
    Do
    Call Stanwajchy    ' To czeka ok. 20 ms
    Call Stanwajchy1  ' Tu też czeka ok. 20 ms
    If Stan = 0 Then Call Stan0
    If Stan = 1 Then Call Stan1
    If Stan = 2 Then Call Stan2     ' Tu czeka extra 20ms
    If Stan = 5 Then Call Stan5
    Call Przeliczczasy
    Call Obslugamachaczki
    ' czekaj do peůnych 100ms --> 59ms (2x20ms+59ms plus narzut programu pi razy drzwi 1ms ?)
    Waitms 59
    'Jesli nic sie nie dzieje przez 25 sekund to wejdz w stan uspienia
    If Stan = 0 Then
    Incr Totaltime
    If Totaltime >= 250 Then
    On Int0 Proc_int0
    Enable Interrupts
    Enable Int0
    Idle
    nop
    Disable Interrupts
    End If
    Else
    Totaltime = 0
    End If
    Loop

    Sub Stanwajchy
    Up = Wajchain
    Waitms 20
    Up1 = Wajchain
    If Up = Up1 Then
    If Up = 1 Then
    Reset Wajcha
    Else
    Set Wajcha
    End If
    End If
    End Sub

    Sub Stanwajchy1
    Up = Wajcha1in
    Waitms 20
    Up1 = Wajcha1in
    If Up = Up1 Then
    If Up = 1 Then
    Reset Wajcha1
    Else
    Set Wajcha1
    End If
    End If
    End Sub

    Sub Stan0
    ' 0 - nic się nie dzieje, badamy stan wajch. Jesli wajcha=ON - rozpoczynamy pomiar czasu w "czaswajchy"
    ' i idziemy do stanu 1
    If Wajcha = 1 Then
    Stan = 1
    Czaswajchy = 0
    ' Zainicjuj machanie wachaczką
    Call Startmachaczki()
    End If
    End Sub

    Sub Stan1
    ' 1 - mierzymy czas (czaswajchy) + badamy wajche
    ' jesli przed uplywem 1 sekundy Wajcha=off - idziemy do stanu 2
    ' jesli po uplywie 1 sekundy Wajcha dalej = ON - idziemy do stanu 5
    ' a jesli = OFF to jeszcze do stanu 2
    If Czaswajchy > 10 Then
    If Wajcha = 1 Then
    ' Call Stopmachaczki
    Stan = 5
    Else
    Stan = 2
    Call Stopmachaczki
    End If
    Else
    ' Czas od wlaczenia wajchy <= 1s
    If Wajcha = 0 Then
    Stan = 2
    Call Stopmachaczki
    End If
    End If
    End Sub

    Sub Stan2
    ' 2 - Sprawdzamy czy wajcha1 jest on i wajcha = off - je.li tak to do stanu 0, je.li nie to:
    ' Mierzymy dalej czas przez nastepne 15 sekund (wajcha jest OFF)
    ' Jesli uplynelo 15 sekund - idziemy do stanu 0
    ' Jesli wajcha = ON - zapamietujemy nowy czas i idziemy do stanu 5
    If Wajcha1 = 1 Then
    If Wajcha = 0 Then
    Stan = 0
    Exit Sub
    End If
    End If
    If Czaswajchy > 160 Then      '160=150+10 ktore juz wczesnij naliczyl
    Stan = 0
    Exit Sub
    End If
    ' Jeszcze nie uplynelo 15 sekund
    If Wajcha = 1 Then
    Przerwa = Czaswajchy
    'Nowy czas przerwy nie moze byc mniejszy od 2 sekund
    If Przerwa < 20 Then Przerwa = 20
    ' Call Startmachaczki
    Machaj = 1
    Czasmachaczki = Czaswajchy
    Stan = 5
    End If
    End Sub

    Sub Stan5      ' stan 5 - Czekamy az wylaczy wajche. Jesli wylaczy -> stan 0
    If Wajcha = 0 Then
    Call Stopmachaczki
    Czaswajchy = 0
    Stan = 0
    End If
    End Sub

    Sub Przeliczczasy
    Incr Czaswajchy   
    ' Ta zmienna sluzy do obslugi chodzenia po stanach w zalezosci od stanu wajchy
    End Sub

    Sub Obslugamachaczki
    ' Minelo 0,5 sekundy ? Wylacz przekaznik
    If Czasmachaczki >= 5 Then Machaczka = 0
    If Machaj = 1 Then
    If Czasmachaczki >= Przerwa Then
    Machaczka = 1
    Czasmachaczki = 0
    End If
    ' Else
    ' Machaczka = 0
    End If
    If Machaczka = 1 Then
    Reset Przekaznik
    Else
    Set Przekaznik
    End If
    Incr Czasmachaczki
    End Sub

    Sub Startmachaczki
    Machaj = 1
    Czasmachaczki = 0
    Machaczka = 1
    ' Reset Przekaznik
    End Sub
    Sub Stopmachaczki
    Machaj = 0
    ' Machaczka = 0
    End Sub
    Proc_int0:
    nop
    Return

    Niestety pomimo pozytywnych testów w BASCOM-AVR program nie działa. Czy ktoś ma może jakieś sugestie co jest nie tak. Albo posiada ktoś może gotowy program napisany pod ATmega8?

    Pozdrawiam Jarek
  • Poziom 10  
    Aha, czyli najlepiej usiąść i napisać od nowa.
  • Poziom 38  
    @oj toteż napisał, że przepisał na avry:>
    On wie że są !=.
    A może co nie działa na avrze?:>
    Kompiluje się?
  • Poziom 10  
    kompiluje bezbłędnie
  • Pomocny post
    Poziom 38  
    Przekaznik Alias Pinc.5 powinno być alias portc.5;)
    Tutaj mamy 3 rejestry do obsługi portu, nie jak w 51 1;P
  • Poziom 10  
    @Balu, dziękuję za sugestię, dodatkowo dopatrzyłem się bardzo istotnej sprawy, że należy jeszcze ustawić
    Code:

    Set Portd.0
    Set Portd.1

    Bo w przeciwnym razie zaczynają dziać się cuda ;) tzn. zaczyna się dziwnie wzbudzać. Początki są trudne ;) zajęło mi to którąś godzinę zanim na to wpadłem.
    Poza tym już wszystko działa.
    Pozdrawiam