- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 12

Thema: Zeit zwischen 2 Flanken messen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    37
    Beiträge
    947
    öööhm, was genau kann man da rauslesen?

    Wenn ich das richtig verstanden habe, geht das mit CTC genauer als mit Timer-Ovf, oder war die Aussage falsch?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo Sheff,
    ich verstehe nicht so ganz, wie Du auf den Zähltakt von 10µs kommst und warum Du nur 1s Unterschied beim Stoppen hast.

    Im Programm steht $crystal=16000000 und im CONFIG TIMER ein PRESCALER von 8. Damit zählt der TCNT mit 2Mhz. Mit dem Compare1a von 10 errechnet sich die Interruptfrequenz mit: 2Mhz / (1 + 10) = 181818,18... Hz. Das sind 5,5µs Periodendauer.

    Bei dem Stoppuhrvergleich über 10s erhälts Du in der Variablen Mikrosek also den Wert von 1818181 , den Du für die Sekundenanzeige durch 100000 teilst - ergibt also 18,18s.

    Läuft der µC vielleicht nur mit 8MHz? 8MHz / (8 * (1 + 10)) = 90909,09...Hz - das käme mit ca 11µs näher an deinen angepeilten Wert. In 10s enthält Variable Mikrosek = 909090 -> 909090 / 100000 = 9,09s -> Danach müßte Dir das LCD zuwenig ausgeben oder eben 8s zuviel.

    Ich hoffe, daß ich selbst selbst den Timer richtig verstanden habe

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    37
    Beiträge
    947
    Hallo Searcher,

    Ich habe nochmal die Zeit gemessen. Genauer zu sein, ist es eine Sekunde bei 15 Sekunden.
    Die Timer/Compare-Einstellungen habe ich auf dieser seite berechnet: http://www.bunbury.de/technik/berech...berechnung.htm

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Hallo!

    Also das man Compare1A Enablen & Disablen kann, ist mir neu. Ist meinem bescheiden Wissen nach
    nur ein Bascom Name für das Compareregister.

    1 Sekunde hat meines Wissens 1Million µs.

    MfG
    Rone

  5. #5
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    37
    Beiträge
    947
    Hi,

    ich habe oft gesehen, dass Compare1A mit En-/Disable ein-und ausschalten kann.
    Eine Sekunde hat 1Mio. µs - ist richtig.

    Ich werde das ganze nochmal mit TimerOVF versuchen und den Preloader anpassen, sodass diese 10 Sekunden auch 10s dauern.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo,
    im Mega8 Datenblatt (Atmel doc2486) gibt es auf Seite 111 unter Figur 49 eine Formel zur Berechnung der Ausgangsfrequenz des OC Pins wenn er toggelt. Danach rechnet auch http://www.bunbury.de/technik/berech...berechnung.htm , Zitat: "...welche Comparewerte (CTC-Modus mit Toggle Pin)..."; meiner Meinung nach allerdings mit einem kleinen Fehler.

    Du brauchst jedoch nicht die Ausgangsfrequenzfrequenz des OC Pins sondern die Frequenz des Auftretens des Interrupts.
    Formel im Datenblatt für Ausgangsfrequenz: Focn = fclk / 2 * N * (1+OCRn)
    Die Interruptfrequenz ist doppelt so hoch: Fint = fclk / N * (1+OCRn)
    Focn - Ausgangsfrequenz am Pin
    fclk - Systemclock (zB 16Mhz oder 8MHz)
    2 - Devisor wg. toggle
    N - Prescaler
    OCRn - Compare Value
    Fint - Interruptfrequenz

    gewünschte Peridendauer 10µs entspricht Fint von 100000Hz
    Formel nach OCRn umgestellt: OCRn = (fclk / N * Fint) - 1
    Damit ist muß für 10µs der Compare1a (OCRn) = 19 für Systemtakt 16MHz sein und 9 für 8MHz

    Die "1", die da noch subtrahiert wird, kommt wohl daher daß wenn der Timer (TCNT) auf Null steht, einen clk braucht um auf Eins zu kommen. Zwei clks um auf Zwei zu kommen...zehn clks um auf Deinen Comparewert 10 zu kommen - Interrupt wird ausgelöst - ABER nun braucht er einen weiteren clk um wieder auf Null zu kommen!

    Hab jetzt nur versucht, den Timer wie ich ihn verstanden habe zu erklären. Alles ohne Gewähr und kann auch nicht sagen ob Dein Programm sonst OK ist, da ich mit ATtiny45 bastele. Weitere Abweichungen müßte man nochmal unter die Lupe nehmen, wenn das mit dem Timer klar ist.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    37
    Beiträge
    947
    So, ich bins wieder

    Ich habe mein Programm jetzt etwas umgestrickt, da nach meinen Berechnungen >65000 Timer1-Takte vollkommen ausreichen sollten.

    Nur das Programm will irgendwie nicht so, wie ich das will.

    Wie man im Code sehen kann, gebe ich die Geschwindigkeit und Momentanwert des Timers aus. Wert des Timer schwank hin und her, was auch i.O. ist aber die Geschwindigkeit nimmt nur einige werte an und zwar "0-5 oder 17 aber meistens 343" Wobei bei 343, als Timerwert 120 angezeigt wird.

    *kopfkratz*



    Code:
    'Geschwindigkeit in FPS (Foot per Second) messen und ausgeben.
    'Foot = 12 Inch
    'Weg = 6 Inch (Abstand zwischen den Lichtschranken )
    'Wenn die erste Lichtschranke (INT0) angesprochen wird, beginnt der Timer, die µs zu zählen
    'Beim Durchbrechen der zweiten Lichtschranke (INT0), stoppt der Timer, rechnet die Geschwindigkeit aus und zeigt diese auf dem LCD an.
    
    'Maximale Geschwindigkeit = 300FPS
    'Minimale Geschwindigkeit = 180FPS
    
    
    'Minimale Zeit zwischen Int0 und Int1 1,667ms
    'Maximale Zeit    "      "    "   "    2,778ms
    
    'Timer1 ohne Prescaler = 65535 Takte = 65,535ms
    
    
    $regfile = "m8def.dat"
    $crystal = 10000000
    '===============================================================================
    
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Initlcd
    Cursor Off Noblink
    Cls
    
    'Interrupt-Pins konfigurieren======================================================================
    On Int0 Timerstart
    On Int1 Timerstopp
    Ddrd = &B00000000                                           'PortD als Eingang
    Portd = &B11111111                                          'Pull-Ups von Int0 und Int1 einschalten
    Mcucr = &B00001010                                          'Interrupt bei H/L-Flanke
    Gicr = &B11000000                                           'Interrupts int0 und int1 einschalten
    Sreg.7 = 1                                                  'Interrupts freigeben
    
    
    '===============================================================================
    
    'Timer-Konfiguration============================================================
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Ovf                                               'Bei Timerueberlauf springe zu Ovf-Routine
    
    
    Disable Timer1                                              'Timer1 ausschalten
    Waitms 10                                                   'Warte
    Timer1 = 0                                                  'Timer1 mit 0 vorladen
    
    
    Enable Interrupts                                           'Interrupts An
    
    
    Dim Elapsed As Word                                         'Var. Elapsed fuer gemessene Zeit als Word
    Dim V As Word                                               'Geschwindigkeit als Word
    V = 0
    
    
    Const Mikrosek = 500000                                     'Konst. Wert in die Var. Mikrosek
    Const S = 1
    
    
    Dim Ueberlauf As Byte                                       'Variable fuer Timerueberlaeufe als Byte
    Ueberlauf = 0
    
    
     Enable Timer1
    
    
    'Hauptschleife
    Do
    
    Loop
    End
    
    
    'Sub-Routinen===================================================================
    
    'Bei INT0
    Timerstart:
    
    
    Timer1 = 0                                                  'Timer auf 0 setzen
    Start Timer1                                               'Timer1 starten
    Return
    '====================
    
    'Bei INT1
    Timerstopp:
    
    Stop Timer1                                                 'Timer1 stoppen
    Elapsed = Timer1                                            'Timer-Wert in Elapsed speichern
    
    V = Mikrosek / Elapsed                                      'Geschwindigkeit berechnen
    Cls
    Locate 1 , 1
    Lcd V
    
    Locate 2 , 1
    Lcd Elapsed                                                 'Geschwindigkeit ausgeben
    Waitms 1000
    
                                                      'Timer auf 0 setzen
    Elapsed = 0
    
    V = 0                                                       'Geschwindigkeit auf 0 setzen
    Return
    
    Ovf:
    Incr Ueberlauf
    Return

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Gib mal dies noch mit an:
    $hwstack = 32
    $swstack = 10
    $framesize = 40

    Und dimensioniere V als Long, sonst funktioniert dies nicht:

    Const Mikrosek = 500000
    V = Mikrosek / Elapsed

    Beide Operanden müssen in den Ergebnistyp passen.

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress