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

[ATmega8][BASCOM]Przerywacz pracy wycieraczek

rekja 10 Paź 2008 22:10 2087 6
REKLAMA
  • #1 5619695
    rekja
    Poziom 11  
    Witam. Znalazłem kiedyś, zdaje się że nawet na elektrodzie, program napisany dla AT89C2051 którego zadaniem było sterowanie czasowe wycieraczkami samochodowymi.
    ' 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:
         '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
  • REKLAMA
  • #2 5620007
    oj
    Poziom 42  
    AT89C2051 ≠ AVR
  • REKLAMA
  • #3 5620355
    rekja
    Poziom 11  
    Aha, czyli najlepiej usiąść i napisać od nowa.
  • REKLAMA
  • REKLAMA
  • #5 5620443
    rekja
    Poziom 11  
    kompiluje bezbłędnie
  • #7 5622416
    rekja
    Poziom 11  
    @Balu, dziękuję za sugestię, dodatkowo dopatrzyłem się bardzo istotnej sprawy, że należy jeszcze ustawić
    
    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
REKLAMA