- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: externen timer auslesen (74hc193) und differenz berrechnen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.03.2011
    Ort
    Berlin Moabit
    Beiträge
    14

    externen timer auslesen (74hc193) und differenz berrechnen

    Hallo!

    Ich habe einen 4bit up/dwn timer an einen Port des Atmega angeschlossen.
    Der Timer wird mit 1Khz ausgelesen. Als return möchte ich die differenz als int8_t
    von -8 bis +8.
    Zudem soll der Code, aufgrund der hohen Frequenz, effizient sein!

    So funktionierts schonmal... aber da kann man sicher mächtig optimieren!
    Jemand nen Tipp??? Viele Dank!
    Code:
    ISR, 1Khz {
    static int old;                // alter Zählerstand
    int new, dir, diff;
    
    new = PINC & 0x0F;        // neuer Zählerstand, 4 bit ausmaskiert
    
    if (new > old) {
       diff = new - old;
       dir = 1;
    }
    else {
       diff = old - new;
       dir = -1;
    }
    
    if (diff > 8) {
       diff = (16 - diff);
       dir *= -1;
    }
    
    diff *= dir;
    
    old = new;
    return diff;
    }
    Geändert von TomSawer (19.03.2011 um 15:56 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Eines vorweg:
    Code:
    ISR, 1Khz {
    ...
    return diff;
    }
    Hä???


    Nun zum Optimieren:

    Code:
    static int old;                // alter Zählerstand
    int new, dir, diff;
    Warum sind das alles 16-Bit-Variablen, wo du doch nur mit 4 Bit rechnest und du im Text sogar explizit die 8-Bit-Variante int8_t erwähnst?


    Code:
    if (new > old) {
       diff = new - old;
       dir = 1;
    }
    else {
       diff = old - new;
       dir = -1;
    }
    
    if (diff > 8) {
       diff = (16 - diff);
       dir *= -1;
    }
    
    diff *= dir;
    Das würde ich so schreiben:
    Code:
    diff = new - old;
    if (diff > 8)
        diff -= 16;
    if (diff < -8)
        diff += 16;
    MfG
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    19.03.2011
    Ort
    Berlin Moabit
    Beiträge
    14
    oooopsieeee... 2 mal geposted!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.03.2011
    Ort
    Berlin Moabit
    Beiträge
    14
    Super Danke Stefan!

    Hatte nur in meinem Beitrag int geschrieben. Weiß nicht warum.
    in meinem Program war natürlich alles int8_t!

    Macht man solche "Kürzungen" auch mit boolscher algebra oder mit scharfem Verstand und Erfahrung?

    Schöne Woche! Tom

Berechtigungen

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

Labornetzteil AliExpress