Zitat von
wkrug
Und wie Du in deiner Signatur schreibst:
Hoffentlich liegt das Ziel auch am Weg
______________________________________
Jetzt habe ich schon mal einen Simulator gebastelt um die Zündimpulse nachzubilden. Ist ein ATmega88pa auf dem folgendes Programm läuft.
Code:
$regfile = "m88pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 38
$crystal = 8000000
$baud = 57600
Const Sample_count = 256 'number of samples to take
Dim Icr_old As Word
Dim Icr_new As Word
Dim Ignition_seq As Word
Dim Ignition_seq_old As Word
Dim Ocr1a_calc As Word
Dim Idx As Word
Dim Firing_interval(sample_count) As Word
Dim Intervals(sample_count) As Eram Word 'EEPROM variable
Dim Flag_rec_complete As Byte
Dim Flag_playback_running As Byte
Dim Flag_icp_dead As Byte 'indicates no pulses at ICP1 pin while recording
Config Portb.pb1 = Output 'OC1A pulse output
Config Portc.pc5 = Output 'green playback led
Config Portc.pc4 = Output 'red record led
Config Portd.pd5 = Output 'red led for playback
Portd.pd6 = 1 'pullup for "playback" button
Portd.pd7 = 1 'pullup for "start record" button
Portb.pb0 = 1 'pullup icp1 pin - stable level
On Timer1 Check_icp_alive
On Icp1 Isr_get_icr 'icp interrupt vector
On Compare1a Isr_send_pulses
Enable Interrupts
Print "Simulator start"
Do
Debounce Pind.pd7 , 0 , Start_record , Sub 'record ignition intervals
Debounce Pind.pd6 , 0 , Play_intervals , Sub 'start - stop playback
If Flag_rec_complete = 1 Then
For Idx = 1 To Sample_count
Intervals(idx) = Firing_interval(idx) 'copy sram variable to eeprom variable
Next
Print "samples copied to eram"
Flag_rec_complete = 0
Portc.pc4 = 0
Tccr1b = 0
End If
If Flag_icp_dead = 1 Then Gosub No_record
Loop
Start_record:
Tccr1a = 0 'init timer1
Tcnt1 = 0
Ignition_seq = 0
Flag_rec_complete = 0
Tifr1.tov1 = 1
Enable Timer1 'enable timer1 overflow interrupt
Icr_old = Icr1
Enable Icp1
Tccr1b = Bits(cs11 , Ices1) 'prescaler=8 timer1 clocked with 1MHz
Portc.pc4 = 1 'rec LED on
Return
No_record:
Disable Icp1
Tccr1b = 0 'stop timer1
Print "No pulses on ICP pin"
Portc.pc4 = 0
Flag_icp_dead = 0
Return
Play_intervals:
If Flag_playback_running = 1 Then 'button operated and playback running -> stop playback
Disable Compare1a
Tccr1b = 0 'stop timer1
Flag_playback_running = 0
Portc.pc5 = 0
Else
For Idx = 1 To Sample_count
Firing_interval(idx) = Intervals(idx) 'copy eeprom variable to sram variable
Next
Ignition_seq = 1
Ocr1a = Firing_interval(ignition_seq)
Print Ignition_seq ; " " ; Firing_interval(ignition_seq)
Tccr1a = Bits(com1a0) 'toggle oc1a on ocr1a compare match
Tcnt1 = 0
Tifr1.ocf1a = 1 'clear eventually set compare1a flag
Enable Compare1a
Tccr1b = Bits(cs11) 'start timer1, presacaler = 8
Flag_playback_running = 1 'green playback led on
Portc.pc5 = 1
End If
Return
Isr_send_pulses:
If Pinb.pb1 = 1 Then 'if pin is high make pulse length
Ocr1a = Ocr1a + 4000 'pulse length 4ms
Else 'else make time until next ignition
Incr Ignition_seq
Ocr1a_calc = Firing_interval(ignition_seq) - 4000
Ocr1a = Ocr1a + Ocr1a_calc
Print Ignition_seq ; " " ; Firing_interval(ignition_seq) 'visualise time in termial
End If
If Ignition_seq >= Sample_count Then Ignition_seq = Rnd(sample_count) 'continue playback with random start '
Return
Isr_get_icr:
Incr Ignition_seq
Icr_new = Icr1
If Icr_old = 0 And Ignition_seq = 1 Then
Ignition_seq = 0
Else
Firing_interval(ignition_seq) = Icr_new - Icr_old
End If
Icr_old = Icr_new
If Ignition_seq >= Sample_count Then
Disable Icp1
Tccr1b = 0 'init, stop timer1
Flag_rec_complete = 1
Ignition_seq = 0
End If
Return
Check_icp_alive:
If Ignition_seq_old = Ignition_seq Then
Flag_icp_dead = 1
Else
Ignition_seq_old = Ignition_seq
End If
Return
Das Programm kann 256 Zündimpulsabstände (limitiert durch die Größe des internen EEROMs mit 512Byte), die von der CD4093B Schaltung kommen können, aufzeichnen. Gemessen wie gehabt mit der Input Capture Funktion in µs Auflösung.
Abspielen der Impulse geschieht über den OC1A Pin. Die Impulslänge ist auf 4ms eingestellt, ähnlich wie in der CD4093B Schaltung.
Es gibt eine "Record" Taste, die die Aufzeichnung der 256 Werte startet und die rote Rec-LED einschaltet. Die ICR Daten werden erst in einem Array im RAM abgelegt. Ist das Array voll, wird es in den internen EEPROM geschrieben. Das Ende der Aufzeichnung wird durch das Erlöschen der Rec-LED angezeigt.
Über die "Playback" Taste werden die Impulse über den OC1A Pin elektrisch nachgebildet und der Impulsabstand in µs als Zahl auch über RS232 ausgegeben. Eine grüne LED leuchtet während des Abspielens. Nachdem der letzte Wert aus dem Speicherarray abgespielt wurde, wird eine Zufallszahl erzeugt, die als Index für ein Element aus dem Array als Startelement dient um wieder die restlichen Werte der Reihe nach aus dem Array auszugeben. Nochmaliges Drücken der Playback stoppt das Abspielen.
Im Anhang noch 256 Zündimpulsabstände (Einheit = µs) mit Ordnungsnummer, die bei noch kalter Maschine über etwa 5 Sekunden aufgezeichnet wurden. In einem Graph dargestellt ergab sich ein echt unerwartet interessantes Bild
Gruß
Searcher
Lesezeichen