ELM 327 kullanarak OBD soketinden alınan veriyi LCD ekrana yazdırma.

Başlatan hit85, 15 Şubat 2016, 11:34:51

hit85

ELM327 ile OBD soketinden veri alıp LCD ekrana yazdırmak için uğraşıyorum.
Kesme kullanarak denedim ama başarılı olamadım.

Aşağıdaki şekilde sistem çalışıyor ama arada sırada verilerde sorun oluşuyor.

Mesela Motor sıcaklığı 20C iken 20-30 sn sorun olmadan doğru okuma yapılıyor.
Ama 20-30sn sonrasında 3-5 bazen 10sn bounca verilerde yanlış gösterme oluyor.
Sonrasında tekrar düzeliyor.
Bu süreç kısmen döngüsel olarak devam ediyor.
Yardımlarınızı bekliyorum.
Teşekkürler

' HserOut Hserin ile ELM 327 iletişim başarılı

Device = 16F876
'@ CONFIG_REQ 
'@ __config CP_ON & CPD_OFF & WDT_OFF & HS_OSC & PWRTE_OFF & BODEN_OFF &  LVP_OFF & DEBUG_OFF 
'****************     Write protect Açık ****************************
;-------------------------------------------------------------------------------
Xtal = 16
Declare PortB_Pullups = On
Declare LCD_RSPin PORTB.2
Declare LCD_ENPin PORTB.3
Declare LCD_DTPin PORTB.4
Declare LCD_Interface 4
Declare LCD_Lines 2 

Symbol set_  PORTC.0 '17
Symbol geri  PORTC.1 '18
Symbol ileri PORTC.2 '16
Symbol iptal PORTC.3 '15
'Symbol buzzer PORTC.4

Declare Hserial_Baud = 38400
Declare Hserial_RCSTA = %10010000
Declare Hserial_TXSTA = %00100100
Declare Hserial_SPBRG=25
Declare Hserial_Clear = On


Dim Dongu As Byte 'donu ad.nda byte de.i.ken
Dim Elm327[22] As Byte
Dim i As Byte
Dim m As Byte        
Dim A As Byte
Dim B As Word
Dim C As Word
Dim D As Byte
Dim E As Word
Dim F As Word
Dim rpm As Word
Dim kmh As Byte
 
Dim volt As Float
Dim motor_sicaklik As Byte

Dim sayac As Byte
Dim hata_zamani As Byte

Print $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0         'derece işareti   0
Print $FE,$48,$0E,$0F,$10,$17,$11,$11,$0E,$0  'Ğ dataları        1
Print $FE,$50,$11,$0,$11,$11,$11,$11,$e,$0    'Ü dataları        2
Print $FE,$58,$0E,$10,$10,$0E,$01,$05,$1E,$04 'Ş dataları        3
Print $FE,$60,$04,$0E,$04,$04,$04,$04,$0e,$00 'İ dataları         4
Print $FE,$68,$0A,$0E,$11,$11,$11,$11,$0E,$0  'Ö dataları        5
Print $FE,$70,$0E,$11,$10,$10,$10,$15,$0E,$4  'Ç dataları         6
Print $FE,$78,$0,$0,$0C,$4,$4,$4,$e,$0        'ı dataları         7

        Print Cls
        Print At 1,1,"Baslatiliyor" 'gelen bilginin de.erini yazd.r
        Print At 2,1,"bekleyiniz" 'gelen bilginin de.erini yazd.r
        DelayMS 3000
        
              
HSerOut ["ATZ"] :DelayMS 2000    ' Reset
'HSerOut ["ATE0"] :DelayMS 1000    '  veri kalabalığını önle
'HSerOut ["ATL0"] :DelayMS 500      '  response formatı
'''HSerOut ["ATH0"] :DelayMS 500     '  Headr (PID) pasif
HSerOut ["ATH1"] :DelayMS 500     '   Headr (PID) aktif
'HSerOut ["ATSP0"] :DelayMS 500    ' basarısız olursa ilk burayı deaktif et ve tekrar dene
HSerOut ["01 00"] :DelayMS 500 
sayac=0
GoTo basla

reset_at:
        Print Cls
        For Dongu=1 To 16
        Print At 1,1,"Baglanti Kuruluyor"       '
        Print At 2,Dongu,"#"    '2 sat.r.n "Dongu" sutununa "#" yaz
        DelayMS 50
    Next 
    Print Cls
    HSerOut ["ATZ"]
    GoTo reset_al 
       
reset_al: 
    For i=0 To 12
    
    Elm327[i]=0
        
    Next
    
    HSerIn 1000,hata,[Wait("ATZ"),Str Elm327\13]
    
    For i=0 To 12
    If Elm327[i]=13 Or Elm327[i]=10 Or Elm327[i]=8 Then
    Elm327[i]=42
    EndIf
    Next
    
    If Elm327[3]="E" And Elm327[10]="v" Then
        Print Cls
        Print At 1,1,"Baglandi" 'gelen bilginin de.erini yazd.r
       ' Print At 2,1,Str Elm327\16
      For i=0 To 10
        Print At 2,1+i,Elm327[i+3]   
      Next
    
    DelayMS 5000
    Print Cls  

    GoTo basla
    Else
     
        Print Cls
        Print At 1,1,"Sorunlu !" 'gelen bilginin de.erini yazd.r
        Print At 2,1,Str Elm327\13
     ' For i=0 To 15
        'Print At 2,1+i,Elm327[i+3]   
      'Next
    DelayMS 5000 

    GoTo basla
    
    
    EndIf
    'Context Restore 'tum ky.tl. reg. tekrar yuklenip keseden c.k.l.yor

bilgi_at:
        For Dongu=1 To 16
        Print At 1,1,"Baglanti Kuruluyor"       '
        Print At 2,Dongu,"*"    '2 sat.r.n "Dongu" sutununa "#" yaz
        DelayMS 50
    Next 
    Print Cls
    HSerOut ["ATI"]
    GoTo bilgi_al 
        
bilgi_al: 'kesme alt program.
    
    For i=0 To 12
    
    Elm327[i]=0
        
    Next
    
    HSerIn 1000,hata,[Wait("ATI"),Str Elm327\13]
    
    For i=0 To 12
    If Elm327[i]=13 Or Elm327[i]=10 Or Elm327[i]=8 Then
    Elm327[i]=42
    EndIf
    Next
    
    If Elm327[1]="E" And Elm327[8]="v" Then
        Print Cls
        Print At 1,1,"Cihaz Versiyon" 'gelen bilginin de.erini yazd.r
        For i=0 To 10
        Print At 2,1+i,Elm327[i+1]   
        Next
    DelayMS 5000
    Print Cls 
    GoTo basla
    Else
     
    Print Cls
        Print At 1,1,"Baglanmadi !" 'gelen bilginin de.erini yazd.r
        Print At 2,1,Str Elm327\12
        Print At 2,1," "
         DelayMS 5000
    GoTo basla

    
    EndIf


'------------------------------------------------------------------------------------------------------------------------------------------------
basla:
    sayac=0
    For Dongu=1 To 16
        Print At 1,1,"Veri Reset Bilgi"       '
        Print At 2,Dongu,"*"    '2 sat.r.n "Dongu" sutununa "#" yaz
        DelayMS 50
    Next 
    Print Cls
    
    For Dongu=1 To 16      '
        Print At 1,1,"Tus Bekleniyor" 
        Print At 2,Dongu,"#"    '2 sat.r.n "Dongu" sutununa "#" yaz
        DelayMS 50
    Next 
    Print Cls
    
    If set_=1    Then GoTo menu
    
    If geri=1    Then GoTo bilgi_at
    
    If ileri=1   Then GoTo reset_at
      
    GoTo basla '
 
menu:
 sayac=3
 GoSub veri_gonder
 'print cls
 Print At 1,1,#motor_sicaklik,0," C  ",Dec3 motor_sicaklik,0," C ",       '
 Print At 2,1,"Hiz:",#kmh," rpm:",#rpm    
 DelayMS 100
GoTo menu

veri_gonder:
 A=0
 B=0
 C=0
 D=0
    'sayac_veri=1
    HSerOut ["0105"] 'Motor Sıcaklığı
    HSerIn 500,hata,[Wait("41 05"), A]
    motor_sicaklik= A - 40 

     
    DelayMS 100
    
    HSerOut ["010C"] 'Motor Devri
    HSerIn 1000,hata,[Wait("41 0C"),B, C]
    rpm=((B * 256)+C)/4
    
    DelayMS 100
   

  
    HSerOut ["010D"] 'Hız
    HSerIn 500,hata,[Wait("41 0D"), D]
    kmh=D
    
    Return
'------------------------------------------------------------------------------------------------------------------------------------------------
hata:
     hata_zamani=hata_zamani+1
     If hata_zamani>10 Then GoTo basla
     If sayac=3 Then GoTo menu
       
GoTo basla
'------------------------------------------------------------------------------------------------------------------------------------------------



Edit:Yazım yanlışı