Der AVR tickert einen Befehl nach dem anderen runter, GLEICHZEITIG laufen nur die Hardware-Geräte (Timer, etc.).
Wenn die Interrupts enabled sind, haben sie absolut Vorrang.
Um was geht's ? Zündzeitpunkte etc. ? Für welche Drehzahlen ?
wie würdet ihr vorgehen ?
Ich bekomme von den Zündgebern immer einen Impuls bei dem immer ein Int0 oder Int1 ausgelöst werden.
Die Interruptverarbeitung klappt soweit schon mal.
Nun müssen diese beiden Signale getrennt verarbeitet werden . Denk ich mal.
Der Zeitverlauf für den Linken und rechten Zylinder wird sicher unterschiedlich sein.(Gas weg genommen z.B.) Verarbeitet Bascom SUB's nebeneinander ? Glaub ich nicht oder ? Das Programm wird erst die eine SUB verarbeiten und dann die andere. Was passiert wenn die eine SUB abgearbeitet wird und ein Interrupt kommt . Hat der Interrupt vorrang ?
Warum ich das frage ?
Ich messe ja die Umlaufzeit für den linken Zylinder und diesen Wert verkürze ich auf die erforderlichen µsec für die Frühzündung wenn der linke Zylinder bei der nächsten Umdrehung richtung OT saust. Nur das Problem ist das der rechte da das selbe macht nur aben versetzt. Kann ja nicht aus der Bearbeitung des rechten rausspringen und den Funken für den linken auslösen und wieder zurück. Dabei geht Zeit verloren und dann passt nix mehr.
Der AVR tickert einen Befehl nach dem anderen runter, GLEICHZEITIG laufen nur die Hardware-Geräte (Timer, etc.).
Wenn die Interrupts enabled sind, haben sie absolut Vorrang.
Um was geht's ? Zündzeitpunkte etc. ? Für welche Drehzahlen ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Zündung für ein Motorrad . 2-Zylinder
Code:$regfile = "m8def.dat" $crystal = 10000000 $baud = 9600 Ddrb = &B00000111 Portb = &B00000000 Ddrc = &B00000000 Portc = &B00000000 Ddrd = &B11110011 Portd = &B00001100 Dim A As Byte Dim Pause As Integer Dim Aus As Integer Dim Dzmax As Integer Pause = 100 Aus = 0 Dzmax = 10000 'Drehzahlbegrenzung 'Testrotine der Ausgänge A = 0 While A <= 4 A = A + 1 Waitms Pause Portb.0 = 1 Portb.1 = 0 Waitms Pause Portb.0 = 0 Portb.1 = 1 Wend Portb.0 = 1 'Zündung Config Pinb.0 = Output Config Pinb.1 = Output Config Pinb.2 = Output Config Pinb.3 = Output Config Pind.2 = Input Config Pind.3 = Input Portd.2 = 1 'Pullup ein Portd.3 = 1 'Pullup ein On Int0 Int0serv On Int1 Int1serv Config Int0 = Falling 'Überprüfung ob der Pegel vom Geber fällt oder steigt....Falling! Config Int1 = Falling Enable Int0 Enable Int1 'Drehzahl Config Timer1 = Timer , Prescale = 256 Const Timervorgabe = 3036 Const Markierungenproscheibe = 1 Dim Zaehlerirq0 As Long Dim Impulseprosekunde As Long Dim Impulseprominute As Long Dim Umdrehungenprominute As Integer Zaehlerirq0 = 0 On Timer1 Timer_irq Enable Timer1 Enable Interrupts '------------------- Do Portb.0 = 1 Portb.1 = 1 'Drehzahlüberwachung Impulseprominute = Impulseprosekunde * 60 Umdrehungenprominute = Impulseprominute / Markierungenproscheibe If Umdrehungenprominute > Dzmax Then Disable Int1 Print "Drehzahlbegrenzung hat angesprochen" Else Enable Int1 End If Select Case Umdrehungenprominute Case 1000 To 1200 : Portb.2 = 1 Case Else : Portb.2 = 0 End Select Impulseprominute = Impulseprosekunde * 60 Umdrehungenprominute = Impulseprominute / Markierungenproscheibe Print "Umdreh. Min: " ; Umdrehungenprominute Loop '-------------------- 'linker Zylinder Int0serv: Portb.0 = 0 waitms 50 Incr Zaehlerirq0 Enable Int0 Return 'rechter Zylinder Int1serv: Portb.1 = 0 Waitms 50 Enable Int1 Return 'Pro Sekunde ein Aufruf Timer_irq: Timer1 = Timervorgabe Impulseprosekunde = Zaehlerirq0 Zaehlerirq0 = 0 Return End
Wenn das Bike 5000 RpM dreht, macht er eine Umdrehung in 12 mS
also alle 24 mS eine Zündung.
Im Zünd-Interrupt hast du aber WaitmS 50 drinnen.
1. wozu
2. wie geht sich das alles aus ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Die waitms 50 hab ich vorerst nur drinnen damit ich die Taster etwas entprellen kann . Die werde ich dann rausnehmen wenn die Software so läuft wie ich das mir denke.
Verstehe ich nicht ganzCode:2. wie geht sich das alles aus ?![]()
Frage an dich ? Ist der Aufbau so vorerst i.O. ?
Ah so, du zündest noch mit der Hand.
Aber wirklich entprellen kannst du so nicht. das ist nur eine Bremse im Moment. na egal, kommt ja weg
iO Ich denk noch.
Für die doofen: Du kriegst bei jeder Umdrehung von der Zündung einen Impuls, einmal rechts, einmal links , du zählst aber nur die linken .
Jede sekunde rechnest du daraus RPM. Isses mehr als 10000, zeigst du "begrenzer" an und disablest InT1
Portb.0 u. 1 sind die tatsächlichen Zünder ?
d.h wenn du int1 disablest, fällt ein Zylinder aus.
Ist das so etwa der Gedankengang ?
Edit: Oder ist das ein Zweitakter ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Genau wie du es sagst.
Portb.0 u. 1 sind die tatsächlichen Zünder.
Wenn über 10000U/min nehm ich den rechte Zylinder weg und hab somit meinen Drehzahlbegrenzer.
Portb.2 = 0 ist meine Leerlaufdrehzahlkontrolle weil ich keienn Drehzahlmesser drann habe. Vieleicht mach ich mir ein Display drann und kann so mehr Infos an den Lenker zaubern![]()
Für die Umdrehungsberechnugn sollte der linke Topf reichen. Die zusätzliche Überwachung des rechten Zylinders macht sicher keinen Sinn.
Wobei die Auflösung erhört würde. Alles dann aber durch 2.
Die frage ist nur wie ich die Zündzeitpunkte verschiebe.
Ich kann ja schlecht in :
'linker Zylinder
Int0serv:
Warte bis der Kolben wieder kommt und lass den Funken vorher kommen .... machen
Portb.0 = 0
Incr Zaehlerirq0
Enable Int0
Return
In der zwieschenzeit ist der rechte Kolben schon unterwegs aber ich sitze noch am linken fest. Bzw... der rechte Interrupt wurde ausgelöst und der linke bekommt somit keinen Funken.
Ich bin da echt am Überlegen ob ich nicht auf dem falschen Dampfer bin mit meinen Überlegungen.
Ach jetzt kommt es mir .....
Es gibt keine Überschneidungen.
Ich muss schauen auf wieviel Grad Vorzündung meine Geber am Motorrad angebracht sind.
Wenn die Geber z.b. 50° vor OT angebaut wären , hätte ich ja noch Zeit.
Dann kann bei jeden Int0serv: und Int1serv: die Zeit bis Ot reduzieren und würde somit auf die erforderlichen 10 - 40° Vorzündung kommen.
So hab mal versucht en Timer0 zum laufen zu bekommen.
Die Umdrehungszeit wird beim Int0 auf Null gesetzt.
Kommt mir so vor als ob Timer0 nicht die 0,1µs bringt.Code:$regfile = "m8def.dat" $crystal = 10000000 $baud = 9600 Ddrb = &B00000111 Portb = &B00000000 Ddrc = &B00000000 Portc = &B00000000 Ddrd = &B11110011 Portd = &B00001100 Dim A As Byte Dim Pause As Integer Dim Aus As Integer Dim Dzmax As Integer Pause = 100 Aus = 0 Dzmax = 10000 'Drehzahlbegrenzung 'Testrotine der Ausgänge A = 0 While A <= 4 A = A + 1 Waitms Pause Portb.0 = 1 Portb.1 = 0 Waitms Pause Portb.0 = 0 Portb.1 = 1 Wend Portb.0 = 1 'Zündung Config Pinb.0 = Output Config Pinb.1 = Output Config Pinb.2 = Output Config Pinb.3 = Output Config Pind.2 = Input Config Pind.3 = Input Portd.2 = 1 'Pullup ein Portd.3 = 1 'Pullup ein On Int0 Int0serv On Int1 Int1serv Config Int0 = Falling 'Überprüfung ob der Pegel vom Geber fällt oder steigt....Falling! Config Int1 = Falling Enable Int0 Enable Int1 'Drehzahl Config Timer1 = Timer , Prescale = 256 Const Timervorgabe = 3036 Const Markierungenproscheibe = 1 Dim Zaehlerirq0 As Long Dim Impulseprosekunde As Long Dim Impulseprominute As Long Dim Umdrehungenprominute As Integer Zaehlerirq0 = 0 On Timer1 Timer_irq Enable Timer1 'Umlaufzeit 1.Zylinder Config Timer0 = Timer , Prescale = 1 Const Timervorgabe2 = 254 Dim Umtime As Word Dim Um_irq As Long Dim Zuenttime As Word Dim Zuenttime2 As Word On Timer0 Um_irq Enable Timer0 Enable Interrupts '------------------- Do Portb.0 = 1 Portb.1 = 1 'Drehzahlüberwachung Impulseprominute = Impulseprosekunde * 60 Umdrehungenprominute = Impulseprominute / Markierungenproscheibe If Umdrehungenprominute > Dzmax Then Disable Int1 Print "Drehzahlbegrenzung hat angesprochen" Else Enable Int1 End If Select Case Umdrehungenprominute Case 1000 To 1200 : Portb.2 = 1 Case Else : Portb.2 = 0 End Select Impulseprominute = Impulseprosekunde * 60 Umdrehungenprominute = Impulseprominute / Markierungenproscheibe 'Print "U/min " ; Umdrehungenprominute Loop '------------------- 'linker Zylinder Int0serv: Zuenttime = Umtime Umtime = 0 Waitms Zuenttime Zuenttime2 = Zuenttime Portb.0 = 0 Incr Zaehlerirq0 Enable Int0 Return 'rechter Zylinder Int1serv: Waitms Zuenttime2 Portb.1 = 0 Enable Int1 Return 'Umlaufzeit ermitteln Um_irq: Timer0 = Timervorgabe2 Incr Umtime Print "Zeit" ; Umtime Return 'Pro Sekunde ein Aufruf Timer_irq: Timer1 = Timervorgabe Impulseprosekunde = Zaehlerirq0 Zaehlerirq0 = 0 Return
Der Zähler steigt zu wenig in Incr Umtime.
Muss noch mal nachrechen mit der Umlaufzeit und dem zurücksetzen von Umtime auf 0.
Puhh das wird doch wohl nicht werden ?![]()
Ich hab mal ne Log mitgeschrieben.
U/min 840------------Zeit 4873
U/min 1380-----------Zeit 2420
U/min 2040-----------Zeit 2116
Habs noch nicht ausgerechent. Die Umlaufzeit reduziert sich mit steigender Umdrehung des Motors. Meine Hand ist immer noch der Geber [-X
Aber es schaut schon mal gut aus.
Lesezeichen