- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 4 von 4

Thema: Programm für Zündung

  1. #1

    Programm für Zündung

    Anzeige

    Powerstation Test
    Hallo liebe Profis

    Ich habe hier ein Prog für eine Zündung. Will bemerken es ist mein erstes Prog.
    Wer Lust hat und vor allem Zeit könnte sich das mal durchlesen um einen Neuling kräftig die Meinung zu sagen oder auch nicht


    Folgendes sollte jetzt laufen.

    Int0 und Int1 werden per Interrupt erfasst und an die Asugänge Portb.0 und Portb.1 ausgegeben.
    Der Pegel fällt auf Low.
    Eine Zeit von 1ms soll der Pegel so gehalten werden.
    Danach soll der Pegel vieder auf High

    Wenn die Anzahl der Takte vom INT0 über einen sollwert ansteigt , soll Portb.2 angehen.


    Code:
    $regfile = "m8def.dat"
     $crystal = 10000000
      $baud = 9600
     Config Portb = Output
     Portb = &B00000000
     Config Portc = Output
     Portc = &B00000000
     Config Portd = Input
     Portd.2 = 1
     Portd.3 = 1
     Portd.5 = 1
    
     Dim A As Integer
     Dim B As Long
    
     Dim Testzeit As Integer
     Dim Testanzahl As Integer
    
    
    
    
    
    
    
     Enable Interrupts
    
     On Int0 Links
     On Int1 Rechts
    
    
     On Timer1 Ontimer1
    
     Config Timer1 = Timer , Prescale = 1024
     Enable Timer1
    
    
    
      'Testrotine der Ausg�ge
    
    
      Testzeit = 30
           Portb.2. = 1
    
           While A <= 4
             A = A + 1
             Print 0;
             Waitms Testzeit
             Portb.0 = 1
             Portb.1 = 1
             Waitms Testzeit
             Portb.0 = 0
             Portb.1 = 0
          Wend
            Print "Testrotine abgelaufen,"
    
    
          'Spulen auf an
          Print ",Spulen an,"
          Portb.0. = 1
          Portb.1. = 1
          Waitms 300
          Portb.2. = 0
    
    
    
       A = 0
       B = 0
    
    
    Do
    
     Enable Int0
     Enable Int1
     Portb.0. = 1
     Portb.1. = 1
    
    Loop
    
    
    Ontimer1:
         Portb.2 = 0
    Print A;
    
    B = A /3600
    Print B
    Timer1 = 5687
    If A > 1000 Then
    Portb.2 = 1
    Print "DB"
    End If
    
    
    A = 0
    Return
    
    
    Links:
    A = A + 1
    Disable Int0
    Portb.0. = 0
    Print "L"
    Waitms 1
    Return
    
    Rechts:
    Disable Int1
    Portb.1. = 0
    Print "R"
    Waitms 1
    Return

    Wenn mir noch mal einer erklären könnte wie ich den besten Prescale-Faktor ermittle und auf was ich Timer1 = XXXX setzte und warum wäre ich ihm auserordentlich dankbar
    Das ganze funzt auf meinem myAVR-Board. Nun müsste ich noch meine Kurve einbasteln (anderer Beitrag ,was aber funktionieren sollte)

    Danke erst mal vorweg =D>

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Wenn mir noch mal einer erklären könnte wie ich den besten Prescale-Faktor ermittle
    Ein Timer zählt bei jedem Takt des Controllers einen Zähler um eins hoch.
    Bei einer Taktung von 16MHz wird der Zähler also 16 Mio mal pro Sekunde hochgezählt.
    Bei einem 8Bit Timer ist der Zähler aber nur eine 8 Bit Variable, geht also nur bis 2^8 = 255. Bei 256 läuft der Zähler (Timer) über, wird auf 0 zurückgesetzt und es wird ein Interrupt ausgelöst.

    Der Prescale ist ein zusätzlicher Faktor um die Intervalle bei denen der Timerinterrupt ausgelöst wird zu verlängern.

    Bei einem Prescale von 1 löst der Timer 16Mio/256 mal pro Sekunde aus.
    Bei einem Prescale von 8 sind es 16Mio/(256*8 ) oder allgemein:
    Taktung/(256*Prescale)

    Bei einem 16 Bit Timer fünktioniert es analog, der läuft halt erst bei 2^16 statt bei 256 über.

    und auf was ich Timer1 = XXXX setzte
    Timer0 ist ein 8 Bit Timer, läuft wie gesagt bei 256 über, löst einen Interrupt aus, wird auf = zurückgesetzt und das Spiel geht von vorne los.

    Wenn du in der Interruptroutine den Wert von Timer0 änderst, z.B.
    Timer0 = 100, zählt der Timer0 nicht mehr von 0-255, sondern von 100-255. Damit machst du den Timerintervall also kürzer.

    Mit der Kombination von Prescale und Wert für Timer0 kannst du dir den Timerintervall auf die Frequenz legen die du benötigst.

    Beim 16 Bit Timer (Timer1) funktioniert das genauso, nur halt mit 2^16.

    Im Downloadbereich gibt es ein Programm, das die Berechnung automatisch ausführt und den passenden Quellcode erstellt. Da brauchst du nur deine Quarzfrequenz und die Gewünschte Frequenz für den Timerinterrupt eingeben.

  3. #3
    Danke für deine Antwort.
    Damit kann ich was anfangen. =D>

  4. #4
    Beim Timer1 also :

    16Bit = 65536
    10MHz = 39062,50 Takte/sec
    bei Prescale = 64 = 2,3841858 Hz/sec

    Wenn ich jetzt Timer1 = 1 machen würde , käme ich an meine 1Hz schon nahe ran.

    Richtich ?
    Kann ich gleitkomma verwenden ? 1.384 blablabla .

    Wenn ich 1/10sec. benötige, welche Timer wäre besser ?

    Dankle


Berechtigungen

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

Labornetzteil AliExpress