Zitat von
Ceos
Overflow sollte einen eigenen interrupt haben
Hat Timer1. Erklärung s.u.
Zitat von
Ceos
kannst du mal ein paar bits opfern um den timerüberlauf mit zu erfassen wie ich es oben beschrieben habe?!
Kannst du mir mal aufschlüsseln wie dein capture timer konfiguriert hast?! 8Mhz F_CPU sehe ich ja aber bei der timer init komm ich ins schleudern
Die Programmteile stammen aus dem Simulator Programm.
Code:
On Timer1 Check_icp_alive 'on timer1 overflow -> ISR Check_icp_alive
On Icp1 Isr_get_icr 'on icp1 interrupt -> ISR isr_get_isr
Start_record:
Tccr1a = 0 'init timer1
Tcnt1 = 0
Ignition_seq = 0
Flag_rec_complete = 0
Tifr1.tov1 = 1 'reset eventually set TOV1 Flag
Enable Timer1 'enable timer1 overflow interrupt
Icr_old = Icr1 'not nessecary. artifact ?
Enable Icp1 'enable ICP1 Interrupt
Tccr1b = Bits(cs11 , Ices1) 'prescaler=8 timer1 clocked with 1MHz, ICP Interrupt on rising edge
Portc.pc4 = 1 'rec LED on
Return
Isr_get_icr:
Incr Ignition_seq
Word_variable = Icr1 / 10
Firing_interval(ignition_seq) = Word_variable * 10 'letzte Dezimalstelle auf Null
If Ignition_seq >= Sample_count Then 'array full, stop recording
Disable Icp1 'disable ICP1
Tccr1b = 0 'init, stop timer1
Flag_rec_complete = 1
Ignition_seq = 0
End If
Return
Check_icp_alive:
Firing_interval(ignition_seq) = Firing_interval(ignition_seq) + 1 'bei timer1 überlauf wird zum letzten gespeicherten ICR wert Eins addiert
If Ignition_seq_old = Ignition_seq Then
Flag_icp_dead = 1
Else
Ignition_seq_old = Ignition_seq
End If
Return
Mit zB "on timer1 check_icp_alive" werden die Interrupt Vektoren initialisiert
Die "Start_record" ist ein Unterprogramm und wird mit Drücken der Record Taste aufgerufen.
Dort wird der Timer1 initialisiert und mit Vorteiler 8 gestartet. Läuft bei Systemtakt von 8MHz dann mit 1MHz, Periodendauer = 1µs. Vorteil: Den ausgelesenen Wert aus ICR1 kann man mit Einheit µs versehen. Hab noch ein paar Remarks im Code eingefügt. Mit den Interrupts scharf machen (enable) und Starten des Timers beginnt die Meßwertaufnahme.
Die ISR_get_icr ist eine ISR und wird durch den ICP Interrupt aufgerufen. Dort wird jetzt die letzte Dezimalstelle auf Null gesetzt. Wenn 256 Werte aufgenommen sind wird Timer1 gestoppt mit tccr1b=0 und der ICP Interrupt wieder disabled.
Die ISR Check_icp_alive wurde und wird bei Timer1 Überlauf aufgerufen und dient eigentlich dazu festzustellen, ob überhaupt ICP Interrupts (Zündimpulse) auftreten. Aussetzen kann passieren, wenn zB das Impulsabnehmerkabel nichts liefert. In dieser ISR wird jetzt zusätzlich dem letzten, vor dem Overflow gespeicherten ICR Wert, Eins aufaddiert. Falls sich da was verschluckt müßte an der letzten Stelle mal eine Zwei auftauchen. Eine Eins immer dann, wenn nach einer großen Zahl eine kleinere auftauscht.
Im Anhang die Werte mit diesem Programm.
Worum es mir geht ist eine inkonsistenz deiner werte alle ~10 messungen, irgendwas passiert da dass das timing durcheinanderbringt!
Ich glaube, daß die Meßwerte stimmen. Die Ausreißer könnten von der Drehzahlregelung der Maschine kommen: Die Drehzahl sinkt langsam ab. Dann wird schnell auf höhere Drehzahl geregelt. Ein Ausreißer ist die Zündung auf dem Weg nach "oben". Dann sinkt die schnelle Drehzahl wieder langsam ab bis das Spiel von vorne beginnt.
Gruß
Searcher
Lesezeichen