-         

Ergebnis 1 bis 5 von 5

Thema: Warum stimmt mein berechneter time-delay so nicht?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.08.2005
    Beiträge
    61

    Warum stimmt mein berechneter time-delay so nicht?

    Anzeige

    Hallo,
    ich benutze folgende Funktion um eine Zeit herunterzuzählen:

    // delay function
    // with external clock = 12.0 MHz
    void delay_ms(uint16_t ms) {

    uint16_t downtimer;

    while (ms) {
    downtimer = 12000;
    while (downtimer) {
    downtimer--;
    }
    ms--;
    }
    }

    Ich benutze eine 12.0 MHz external Clock am ATMEGA16,
    ist auch bei den fuse-bits korrekt eingestellt.
    Wenn ich nun aufrufe:
    delay_ms(500);
    Dann dauert es aber ca. 2 Sekunden, statt 1/2 Sekunde. Warum?
    Habe ich etwas falsch parametriert?

    Gruß
    RICOLA

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.08.2005
    Ort
    49.80248 8.59252
    Alter
    33
    Beiträge
    172
    Das Programm scheint richtig zu sein. Bedenke nur das while() auch ein paar Take an Zeit braucht.
    Wenn die Schleifen nicht duch ein Interrupt unterbrochen werden, muss was mit dem ext. Quarz oder den FuseBits nicht stimmen.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Deine Rechnung ist etwas optimistisch. Der Mega macht zwar zwölf Cycles in jeder MikroSekunde, aber die kriegst du nicht netto für brutto.
    Abgesehen vom Schleifen-Drumherum, das ja der Kater schon erwähnt hat:
    Um von 16 Bit eins abzuziehen, braucht er mindestens 2 Cycles
    Also 6000 statt 12000 ist schon mal sicher.
    Schauen, ob es null ist und ggf. wiederholen: nochmals 2 Cycles
    Also 3000 statt 12000 ist noch besser
    Um es genau zu machen, musst du die Assembler-Liste (.LSS) genau anschauen, welche maschinen-Cycles verbraten werden.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Ich vermute mal, du verwendest GCC und Optimierst. Dann macht deine ganze Funktion delay_ms() einfach *nichts*, denn die Ergebnisse von deinem Runterzählen etc werden nicht verwendet. Daher wird ein optimierender Compiler das Zeug in die Tonne kloppen, wie es sich auch gehört. Oder sonstige Optimierungen werden vorgenommen, so daß das ganze fixer läuft. Falls du nicht optimierst, dann brauchst du pro Durchlauf länger als gedacht.
    Wenn du nicht über Timer als Zeitbasis gehen willst und von C aus genau kontrollieren willst, welche asm-Befehle erzeugt werden, dann ist inline Assembler dein Freund.
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.08.2005
    Beiträge
    61
    Hallo,
    also mit den zweimal halbieren komme ich ziemlich genau auf
    die richtige Zeit. Danke, ist ja eigentlich auch ganz logisch.

    Ich werde aber demnächst auf den Timer umstellen.


    THX
    Ricola

Berechtigungen

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