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

Obrotomierz AVT2711 na attiny2313

514242 07 Lip 2009 11:04 3888 10
REKLAMA
  • #1 6747909
    514242
    Poziom 20  
    Witam.
    Próbuję złożyć obrotomierz samochodowy na mikrokontrolerze Attiny2313.
    Wykorzystuję do tego kit z AVT2711. Chciałem wykorzystać program z tego układu. Różnica jest w mukrokontrolerach, a artukule jest 89C2051 a ja chcaiłem to zrobić na attiny i wynik pokazywać na wyświetlaczu alfa numerycznym. Jednak coś mi nie wychodzi. Odpalam układ na sucho tzn. wejście z cewki zapłonowej przykładam do +5V z częstotliwością kika raz na sek a na wyświetlaczy pokazuje 0.
    Czy może ktoś sprawdzić mi program?


    Kod "mojego" programu
    
    'Samochodowy obrotomierz
    'Marcin Wiązania
    'E-mail: mwiazani@poczta.fm
    
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    'Config Timer0 = Timer , Gate = Internal , Mode = 1
    Config Timer1 = Timer                 ', Gate = Internal , Mode = 1
    
    
    
    On Timer1 Zw_licz_czasu                                     'przerwonia obslugi przpelnienia timera0
    'On Timer1 Obs_wysw                                          'przerwanie od timer1 obslugujace wyswietlacz led
    On Int1 Pomiar                                              'przerowania obslugi pomiaru
    
    Dim Wynik As Word                                           'obliczony wynik predkosci RPM
    Dim Temp As Word                                            'zmienna pomocnicza do obliczen
    Dim Zm_pom As Long                                          'zmienna przechowujaca ilosc zliczonych impulsow podczas jednego obrotu
    Dim Zez_pom As Bit                                          'flaga zezwolenia na pomiar
    Dim Pom_zak As Bit                                          'flaga informujaca o zakonczeniu pomiaru
    Dim Licz_czas As Byte                                       'pomocniczy licznik czasu
    Dim Br_syg As Byte                                          'zmienna licznikowa graku impulsow na wejsciu
    '----------------Wyswietlacz-------------------------------------------
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2
    
    Cls
    Cursor Off
    
    
    'Priority Reset Timer0
    'Set Tcon.2
    'Disable Int0
    Enable Timer1
    Enable Int1
    'Counter1 = 61800                                            'wartosc poczatkowa timera1
    Start Timer1
    Wynik = 0
    Set Zez_pom
    Reset Pom_zak
    Br_syg = 0
    Enable Interrupts
    
    Locate 2 , 1
    Lcd "Test"
    Wait 1
    Cls
    
    Do
                                                            'petla glowna programu
      If Pom_zak = 1 Then                                       'jezeli pomiar zakonczony to
        Disable Timer1                                          'zablokuj timer0
        Temp = Counter1                                         'odczytaj wartosc timera0
        Zm_pom = Zm_pom + Temp                                  'dodaj ja do wartosci zmiennej zm_pom
        Temp = 60000000 / Zm_pom                                'oblicz predkosc ze wzoru 60*1MHz/zm_pom
     '   If Jp = 0 Then                                          'jezeli zwora zalozona to podziel
      '    Temp = Temp / 1.5                                     'wynik przez 2 gdy na obrot przypadaja dwa zaplony
      '  End If
        Wynik = Temp                                            'zapiasz wynik do zmiennej wynik
        Reset Pom_zak                                           'zeruj flage zezwolenia na obliczenie predkosci
        Set Zez_pom                                             'ustaw flage zezwalajaca na pomiar
        Zm_pom = 0                                              'wyzeruj zmienne
        Licz_czas = 0
        Enable Timer1
      Else                                                      'w przeciwnym wypadku
        If Wynik > 0 And Br_syg = 65 Then                       'jezeli wynik >0 oraz wartosc br_syg=65 to
          nop
          nop
          nop
          Decr Wynik                                            'zmniejsz zmienna wyniku
        End If
    
          Locate 2 , 1
          Lcd Wynik
    
      End If
    Loop                                                        'koniec petli glownej programu
    End
    
    Zw_licz_czasu:                                              'przerwanie przepelnienia timera0
    
    Zm_pom = Zm_pom + 65536                                     'dodaj wartosc 65536 (licznik pracuje jako 16-bitowy)
      Incr Licz_czas                                            'zwieksz zmienna licz_czas
      If Licz_czas = 10 Then                                    'jezeli wartosc tej zmiennej osiagnie 10 to
        Stop Timer1                                             'zatrzymaj timer0
        Set Zez_pom                                             'ustaw flage zezwolenia na pomiar
        Br_syg = 0                                              'wyzeruj zmienna br_syg
      End If
    Return
    
    Pomiar:                                                     'przerwanie od wejscia int1
      If Zez_pom = 1 Then                                       'jezeli flaga zezwolenia pomiaru ustawiona to
        Counter1 = 0                                            'wyzeruj timer0
        Start Timer1                                            'start timer0
        Reset Zez_pom                                           'wyzeruj flage zezwolenia na pomiar
      Else                                                      'w przeciwnym wypadku
        Stop Timer1                                             'zatrzymaj timer0
        Set Pom_zak                                             'ustaw flage pomiar zakonczony
      End If
      Br_syg = 0
    Return
    
    'Obs_wysw:                                                   'przerowanie od timer1 obslugujace multipleksowanie wyswietlacza
    '  If Br_syg <> 65 Then                                      'jezeli br_syg<>65 to
    '    Incr Br_syg                                             'zwieksz wartosc zmiennej br_syg
    '  End If
    '  Counter0 = 61800                                          'wartosc poczatkowa timera1
    '  Start Timer0
    '
    '  Locate 2 , 1
    '  Lcd Wynik
    
    '  Set Gr1                                                   'wylacz wszystkie grupy diod led
    '  Set Gr2
    '  Set Gr3
    '  Set Gr4
    '  Set Gr5
    '  Select Case Nr_gr_led                                     ' zaleznosci od numeru grupy diod led wykonaj
    '    Case 1 :
    '      Call Przel_gr1                                        'wywolaj podprogram obslugi grupy1
    '      P1 = Gr(1)                                            'wystaw wartosc zmiennej gr(1) na port P1
    '      Reset Gr1                                             'wlacz grupe 1
    '    Case 2 :                                                'dla grupy 2 itd
    '      Call Przel_gr2
    '      P1 = Gr(2)
    '      Reset Gr2
    '    Case 3 :
    '      Call Przel_gr3
    '      P1 = Gr(3)
    '      Reset Gr3
    '    Case 4 :
    '      Call Przel_gr4
    '      P1 = Gr(4)
    '      Reset Gr4
    '    Case 5 :
    '      Call Przel_gr5
    '      P1 = Gr(5)
    '      Reset Gr5
    '  End Select
    '  Incr Nr_gr_led                                            'zwieksz zmienna okreslajaca numer grupy
    '  If Nr_gr_led = 6 Then                                     'jezeli zmienna = 6 to
    '    Nr_gr_led = 1                                           'zapisz do niej wartosc 1
    '  End If
    'Return
    


    W załączniku oryginalny program autorstwa p. Marcina Wiązania oraz artykuł z EDW.
    Będę wdzięczny za wszelkie wskazówki.

    Pozdrawiam
  • REKLAMA
  • #2 6748592
    janwinnicki
    Poziom 15  
    A z jakiego czujnika w samochodzie chcesz wziąć informację o obrotach ?
  • REKLAMA
  • #3 6751172
    514242
    Poziom 20  
    Z cewki zapłonowej.
  • REKLAMA
  • #4 6761623
    Freddy
    Poziom 43  
    Co to za auto, nie ma innych źródeł ? W tej chwili autka mają doprowadzone przecież informacje o obrotach do komputera.
  • #5 6762769
    514242
    Poziom 20  
    To tylko Tico, więc żadnego komputera nie ma. Bardzo chciałem uruchomić ten obrotomierz. Podprogram Pomiar się wykonuje ale dalej 0. Podejrzewam, że nie startuje timer.
  • #6 6778752
    514242
    Poziom 20  
    Nastąpiły niewielkie postępy.
    Udało się uruchomić wewnętrzny timer, ale wynik bardzo odbiega od rzeczywistego. Najczęściej pokazuje wynik 0 lub jakąś liczbę jedno czy dwu cyfrową. Bardzo rzadko jest to liczba trzycyfrowa.

    Program teraz wygląda tak:
    
    'Samochodowy obrotomierz
    'Marcin Wiązania
    'E-mail: mwiazani@poczta.fm
    
    $regfile = "attiny2313.dat"
    $crystal = 12000000
    
    Config Timer0 = Timer , Prescale = 1024                     'Gate = Internal , Mode = 1
    Config Timer1 = Timer , Prescale = 1                        ', Gate = Internal , Mode = 1
    Config Int1 = Falling
    
    
    On Timer1 Zw_licz_czasu                                     'przerwonia obslugi przpelnienia timera0
    On Timer0 Obs_wysw                                          'przerwanie od timer1 obslugujace wyswietlacz led
    On Int1 Pomiar                                              'przerowania obslugi pomiaru
    
    Dim Wynik As Word                                           'obliczony wynik predkosci RPM
    Dim Temp As Word                                            'zmienna pomocnicza do obliczen
    Dim Zm_pom As Long                                          'zmienna przechowujaca ilosc zliczonych impulsow podczas jednego obrotu
    Dim Zez_pom As Bit                                          'flaga zezwolenia na pomiar
    Dim Pom_zak As Bit                                          'flaga informujaca o zakonczeniu pomiaru
    Dim Licz_czas As Byte                                       'pomocniczy licznik czasu
    Dim Br_syg As Byte                                          'zmienna licznikowa graku impulsow na wejsciu
    '----------------Wyswietlacz-------------------------------------------
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2
    
    Cls
    Cursor Off
    
    
    'Priority Reset Timer0
    'Set Tcon.2
    'Disable Int0
    Enable Interrupts
    Enable Timer1
    Enable Timer0
    Enable Int1
    Timer0 = 0                                                  'wartosc poczatkowa timera1
    Start Timer0
    Wynik = 0
    Set Zez_pom
    Reset Pom_zak
    Br_syg = 0
    
    
    
    
    Do
                                                            'petla glowna programu
      If Pom_zak = 1 Then                                       'jezeli pomiar zakonczony to
         Disable Timer1                                         'zablokuj timer0
     '   Temp = Counter1                                         'odczytaj wartosc timera0
         Temp = Timer1
        Zm_pom = Zm_pom + Temp                                  'dodaj ja do wartosci zmiennej zm_pom
        Temp = 60000000 / Zm_pom                                'oblicz predkosc ze wzoru 60*1MHz/zm_pom
     '   If Jp = 0 Then                                          'jezeli zwora zalozona to podziel
          Temp = Temp / 1.5                                     'wynik przez 2 gdy na obrot przypadaja dwa zaplony
      '  End If
        Wynik = Temp
                                                 'zapiasz wynik do zmiennej wynik
        Reset Pom_zak                                           'zeruj flage zezwolenia na obliczenie predkosci
        Set Zez_pom                                             'ustaw flage zezwalajaca na pomiar
        Zm_pom = 0                                              'wyzeruj zmienne
        Licz_czas = 0
        Enable Timer1
    
    
    
      'Else                                                      'w przeciwnym wypadku
     '   If Wynik > 0 And Br_syg = 65 Then                       'jezeli wynik >0 oraz wartosc br_syg=65 to
     '     nop
     '     nop
     '     nop
     '     Decr Wynik                                            'zmniejsz zmienna wyniku
     '   End If
      End If
    
    
    Loop                                                        'koniec petli glownej programu
    End
    
    Zw_licz_czasu:
                                                                'przerwanie przepelnienia timera0
    Zm_pom = Zm_pom + 65535                                     'dodaj wartosc 65536 (licznik pracuje jako 16-bitowy)
      Incr Licz_czas                                            'zwieksz zmienna licz_czas
      If Licz_czas = 10 Then                                    'jezeli wartosc tej zmiennej osiagnie 10 to
        Stop Timer1                                             'zatrzymaj timer0
        Set Zez_pom                                             'ustaw flage zezwolenia na pomiar
        Br_syg = 0                                              'wyzeruj zmienna br_syg
      End If
    Return
    
    Pomiar:                                                     'przerwanie od wejscia int1
      If Zez_pom = 1 Then                                       'jezeli flaga zezwolenia pomiaru ustawiona to
        Timer1 = 0                                              'wyzeruj timer0
        Start Timer1                                            'start timer0
        Reset Zez_pom                                           'wyzeruj flage zezwolenia na pomiar
    
      Else                                                      'w przeciwnym wypadku
        Stop Timer1                                             'zatrzymaj timer0
        Set Pom_zak
                                                     'ustaw flage pomiar zakonczony
      End If
      Br_syg = 0
    Return
    
    Obs_wysw:                                                   'przerowanie od timer1 obslugujace multipleksowanie wyswietlacza
    
      Timer0 = 0
      Start Timer1
    
      Cls
      If Wynik > 1000 Then
      Locate 2 , 1
      Lcd Wynik
      Else
      Locate 2 , 2
      Lcd Wynik
      End If
    
    Return


    Ma ktoś jakieś pomysły?
  • #8 8303158
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #11 8306560
    514242
    Poziom 20  
    PD4 (T0)
REKLAMA