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ışı