- LiFePO4 Speicher Test         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: 2 Vorgänge in Baskom bearbeiten.

  1. #1

    2 Vorgänge in Baskom bearbeiten.

    Anzeige

    Powerstation Test
    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.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  3. #3
    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

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  5. #5
    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.

    Code:
    2. wie geht sich das alles aus ?
    Verstehe ich nicht ganz

    Frage an dich ? Ist der Aufbau so vorerst i.O. ?

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  7. #7
    Gast
    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.

  8. #8
    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.

  9. #9
    So hab mal versucht en Timer0 zum laufen zu bekommen.
    Die Umdrehungszeit wird beim Int0 auf Null gesetzt.

    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
    Kommt mir so vor als ob Timer0 nicht die 0,1µs bringt.
    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 ?

  10. #10
    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.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test