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

Jak działa fragment kodu Bascom do liczenia impulsów wtryskiwacza?

darrrrek 29 Paź 2007 21:13 1713 3
REKLAMA
  • #1 4427927
    darrrrek
    Poziom 22  
    Posty: 733
    Pomógł: 4
    Ocena: 98
    Witam

    mam przed sobą kod w Bascomie, komputera samochodowego, liczacego spalanie itd...Nie rozumiem jednego fragmentu:

    Poczatek: 
    Timer1 = 0 
    Start Timer1 
    Do 
          If Pind.5 = 0 Then Incr Impw  ' PinD.5 = nóżka T1(11)
    Loop Until Timer1 = 15067 
    Stop Timer1 
    


    Impw - impulsy wtryskiwacza


    Jak sie domyslam kod ten ma liczyc czas trwania kiedy wlaczony jest wtryskiwacz(stan niski Pind.5), skad wartosc 15067 ?? i na jakiej zasadzie polega liczenie czasu. Co zawiera zmienna Impw ?? bo nie wydaje mi sie zeby ona zawierala dokladny czas niskiego stanu ani ilosci wtrysków w danym odcinku czasu ??

    Nie lepsze by bylo ??:

    Przerwanie_Int0: ' Przerwanie int0 ustawione na zbocze opadajace
    Start Timer1
    Do:Loop Until PinD.2 = 1
    Stop Timer1
    Dlugosc_wtrysku = Timer1
    Timer1=0
    Return



    A calosc jest tutaj:

    
    'stała wtrysku: 0,00317 l/s
    'stała czujnika prędkości: 16 imp/m
    'samochód: fiat siena 1.6 16V
    'wtryskiwacze: IWP001
    
    $regfile = "m8def.dat"
    $crystal = 4000000
    
    Dim Impw As Word                                            'impulsy wtryskiwacza
    Dim Predkosc As Byte
    Dim Impp As Byte                                            'impulsy predkosci
    Dim D As Single
    Dim Zuzycie As Single
    Dim Srednie As Single
    Dim K As Byte
    Dim Ds As Word
    Dim Droga As Word
    Dim Droga1 As Long
    Dim Zustr As String * 4
    Dim Srstr As String * 4
    Dim Droga1str As String * 6
    Dim Wymiana As Long
    Dim Insp As Byte
    Dim Wymianastr As String * 8
    Dim Eko As Word
    Dim Czasstr As String * 4
    Dim P As Word
    Dim Czas As Single
    
    
    
    Config Portd = &B1000100
    Portd = &B1110011
    Config Portb = Output
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Config Timer1 = Timer , Prescale = 64
    Config Timer0 = Counter , Edge = Falling
    
    Cursor Off
    Cls
    
    1:
    Bitwait Pind.3 , Set
    Waitms 50
    Set Portd.2
    
    Cls
    If Pind.1 = 0 Then
           Cls
           Lcd "Kasuje przebyta"
           Lowerline
           Lcd "droge!"
           Droga1 = 0
           Wait 2
           Cls
    End If
    
    K = 0
    Lcd "     WITAM!     "
    Wait 2
    For K = 1 To 16
    Shiftlcd Right
    Waitms 200
    Next K
    K = 0
    If Pind.1 = 0 Then
          Insp = 0
          Cls
          Lcd "Ustaw inspekcje."
          Wait 1
          Lowerline
          For K = 1 To 10
          Incr Insp
          Wymiana = Insp * 10000
          Wymianastr = Str(wymiana)
          Wymianastr = Format(wymianastr , "    0.0")
          Cls
          Lcd "Wymina co:"
          Lowerline
          Lcd Wymianastr ; " km"
          Waitms 1500
          If Pind.1 = 0 Then Goto 2:
                Next K
                K = 0
          End If
    2:
    If Wymiana <= 0 Then
          For K = 1 To 10
          Cls
          Lcd "  Wymien olej!"
          Reset Portd.2
          Waitms 500
          Set Portd.2
          Waitms 500
          Next K
          K = 0
          Goto Poczatek
    End If
    Cls
    Wymianastr = Str(wymiana)
    Wymianastr = Format(wymianastr , "    0.0")
    Lcd "Wymiana oleju za:"
    Lowerline
    Lcd Wymianastr ; "km"
    Wait 3
    
    Tcnt0 = 0
    Start Timer0
    
    Poczatek:
    Timer1 = 0
    Start Timer1
    Do
          If Pind.5 = 0 Then Incr Impw
    Loop Until Timer1 = 15067
    Stop Timer1
       Impp = Tcnt0
       Predkosc = Impp * 0.9 
         If Pind.1 = 0 Then
             If Ds = 0 Then Ds = 1
             Srednie = Srednie / Ds
             Srstr = Fusing(srednie , "00.0")
             Cls
             Lcd "Srednie spalanie"
             Lowerline
             Lcd "  " ; Srstr ; " l/100km"
             Wait 3
             If Pind.1 = 0 Then
                   Cls
                   Waitms 400
                   Goto Ekonomizer
             End If
             Droga1str = Str(droga1)
             Droga1str = Format(droga1str , "   0.0")
             Cls
             Lcd "Przebyta droga:"
             Lowerline
             Lcd "  " ; Droga1str ; " km"
             Wait 3
             Ds = 1
             If Pind.1 = 0 Then
                   Cls
                   Waitms 400
                   Goto Pomiarprzysp
             End If
             Goto Poczatek
    
       End If
       If Impw = 0 And Predkosc = 0 Then
             Zustr = "-.-"
             Goto Zbytmalapredkosc
       End If
             If Impw = 0 And Predkosc > 10 Then
             Zustr = "0.0"
             Incr Ds
             Goto Zbytmalapredkosc
       End If
       If Predkosc < 10 Then
             Zustr = "-.-"
             Goto Zbytmalapredkosc
       End If
       Incr Ds
       D = Impw * 0.20288
       Zuzycie = D / Impp
       Srednie = Srednie + Zuzycie
       Zustr = Fusing(zuzycie , "00.0")
    Zbytmalapredkosc:
       Cls
       Lcd "Sp:" ; Zustr ; " l/100km"
       Lowerline
       Lcd "Predkosc:" ; Predkosc ; "km/h"
       Impw = 0
       Zuzycie = 0
       D = 0
       Impp = 0
       Droga = Droga + Tcnt0
       If Droga >= 1600 Then
             Incr Droga1
             Droga = Droga - 1600
             Decr Wymiana
       End If
       Tcnt0 = 0
       If Pind.3 = 0 Then
             Cls
             Waitms 100
             K = 0
             Lcd "Do widzenia..."
             Wait 2
             For K = 1 To 16
             Shiftlcd Right
             Waitms 200
             Next K
             Waitms 500
             Reset Portd.2
             Goto 1
       End If
    Goto Poczatek
    
    
    
    Ekonomizer:
    Timer1 = 0
    Start Timer1
    Do
          If Pind.5 = 0 Then Incr Impw
    Loop Until Timer1 = 15067
       Stop Timer1
       Eko = Impw \ 500
       Cls
       If Eko >= 16 Then Eko = 15
       If Eko = 0 Then
             Lcd "Min          Max"
             Lowerline
             Lcd "*"
             Eko = 0
             If Pind.1 = 0 Then
                   Cls
                   Waitms 400
                   Goto Poczatek
             End If
             Goto Ekonomizer
       End If
       Lcd "Min          Max"
       Lowerline
       Lcd Spc(eko) ; "*"
       Eko = 0
       Impw = 0
       If Pind.1 = 0 Then
             Cls
             Waitms 400
             Goto Poczatek
       End If
       Droga = Droga + Tcnt0
             If Droga >= 1600 Then
             Incr Droga1
             Droga = Droga - 1600
             Decr Wymiana
       End If
       Tcnt0 = 0
    Goto Ekonomizer
    
    
    
    Pomiarprzysp:
    Start Timer1
    Cls
    Lcd "Czekam na start"
    4:
    If Pind.1 = 0 Then
          Cls
          Waitms 400
          Goto Poczatek
    End If
    Timer1 = 0
    Do
    Loop Until Timer1 = 6200                                    'do ustalenia
    If Tcnt0 >= 44 Then
          Czas = P / 10
          Cls
          Lcd "Przyspieszenie"
          Lowerline
          Czasstr = Fusing(czas , " 0.0")
          Lcd "0-100km/h : " ; Czasstr ; "s"
          Wait 4
          Droga = Droga + Tcnt0
          If Droga >= 1600 Then
                Incr Droga1
                Droga = Droga - 1600
                Decr Wymiana
          End If
          Tcnt0 = 0
    
          'Bitwait Pind.1 , Reset
          'Cls
          'Waitms 400
          Czas = 0
          P = 0
          Goto Poczatek
    End If
    If Tcnt0 > 1 Then
          Incr P
          Cls
          Lcd "Licze..."
    End If
    Droga = Droga + Tcnt0
    If Droga >= 1600 Then
          Incr Droga1
          Droga = Droga - 1600
          Decr Wymiana
    End If
    Tcnt0 = 0
    
    Goto 4
    
    End


    Pozdrawiam !
  • REKLAMA
  • #2 4428802
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    Witam
    Podany kawałek nie liczy czasu tylko ilość impulsów w czasie.
    Pozdrawiam
  • REKLAMA
  • #3 4428827
    jam_es
    Poziom 24  
    Posty: 491
    Pomógł: 75
    Ocena: 93
    Witam

    Zgadzam się z przedmówcą.
    W zmiennej "Impw" zliczane są impulsy wtryskiwacza w czasie trwania jego cyklu.
    Wartość 15067 to nastawa timera zależna od częstotliwości taktowania uK (zastosowanego kwarcu):
    1/4000000 = 0,25us
    0,25us * 15067 = 0,00376675ms
    Wartość ta (jak widać z programu) odpowiada w przybliżeniu stałej wtryskiwacza:
    'stała wtrysku: 0,00317 l/s

    Pozdrawiam
    James
  • #4 4429061
    darrrrek
    Poziom 22  
    Posty: 733
    Pomógł: 4
    Ocena: 98
    Dzieki wielkie, a jeszcze jedno pytanie, bo sklecilem teraz program, ktory bedzie mi zliczal w przyblizeniu ile auto "pożarło" juz paliwa, wiadomo ze dokladnosc tego bedzie niewielka, ale chodzi mi o przyblizenie, czy ten kod bedzie poprawny, najbardziej interesuje mnie to czy dobrze zrobilem obsluge przerwania timer1. Jezeli timer1 dojdzie do 65536, zatrzyma sie i zeby go wystartowac ponownie bede musial dac Start Timer1 czy automatycznie sie wyzeruje i zacznie zliczanie od poczatku ?? Wiem ze w '51 bylo cos takiego, to dopiero moje poczatki z AVR'ami

    $regfile = "m48def.dat"
    $crystal = 8000000
    $baud = 4800
    Print "START"
    
    
    Config Timer1 = Timer , Prescale = 1
    
    On Timer1 Czas
    Enable Timer1
    
    Config Int0 = Falling                                       'reakcja na zbocze opadajace
    On Int0 Zbocze
    Enable Int0
    Enable Interrupts
    Disable Int0
    
    Timer1 = 0
    Stop Timer1
    
    Dim Przelad As Word
    Dim Ilecykli As Word
    Dim Spalbenz As Single
    Dim Temp As Single
    Dim Ile As Word
    Przelad = 0
    Ile = 0
    
    
    
    Do
    'Obsluga wyswietlacza
    Loop
    End
    
    
    Czas:
    Incr Przelad
    
    Timer1 = 0 'Jest to zrobione poprawnie ??
    Start Timer1 ' czy timer automatycznie sie wyzeruje i wystartuje od poczatku ??
    Return
    
    Zbocze:
    If Pind.5 = 0 Then
     Start Timer1
     Config Int0 = Rising
    Else
     Stop Timer1
     Ilecykli = Przelad * 65536
     Ilecykli = Ilecykli + Timer1
     Temp = Ilecykli * 0.00317
     Temp = Temp / 1000
     Spalbenz = Spalbenz + Temp
     Timer1 = 0
     Config Int0 = Falling
    End If
    Return

    Pozdrawiam !
REKLAMA