- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: Eine bessere R zu T Wandler Routine gesucht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    So, nachdem ich gejoggt habe, gemütlich gebadet habe und der Kopf dadurch "freigeblassen" habe, habe ich eine Lösung gefunden. Jetzt bin ich bei 240µs anstatt 2.4 ms und habe auch noch knapp 400 Byte an Flash gespart, da kein abs und pow mehr gelinkt werden muss. Auch denke ich, das der Code einfacher ist. Wieviel der "einfachere" Code, oder besser kleinere Kode ausmacht, und wieviel abs, hab ich nicht gemessen.

    Klicke auf die Grafik für eine größere Ansicht

Name:	2014-09-20_19:37:44.jpg
Hits:	3
Größe:	11,6 KB
ID:	29077

    Peters Hinweis hat mich in die richtige Richtung gelenkt. Es muss die Anzahl der Vergleiche und Abfragen reduziert werden. Wie hab ich das jetzt gemacht? Ich habe mich an qsort und co. erinnert. Binäre Suche [1]. Jetzt brauche ich nur noch log(n)/log(2) Anfragen. Entsprechend weniger memcpy_P und kein abs/pow mehr. Bei meinem 22 Samples brauche ich also nur noch 4.45 Abfragen. Sprich entweder 4 oder 5. Je nach dem wo der Eintrag liegt. Vorher war die Laufzeit O(n) anstatt O(log n).

    Hier der Code:
    Code:
    118     // binary search without recursion
    119     unsigned char st = 0;
    120     unsigned char en;
    121     unsigned char m;
    122     switch (s)
    123     {
    124     case kt81_210: en = sizeof(t_kt81_210)/sizeof(sensorvalues_flash)-2; break; // -2: because start = 0 and endline is a 0/0 which we dont need
    125     case kt81_110: en = sizeof(t_kt81_110)/sizeof(sensorvalues_flash)-2; break;
    126     default:
    127         return 0.0;
    128     }
    129 
    130     sensorvalues_flash tmp;
    131     while (en-st>1)
    132     {
    133         m = st + (en-st)/2;
    134         memcpy_P(&tmp, &current[m], sizeof(sensorvalues_flash));    t1 = tmp;
    135         if (r > t1.r) // if we use at sometime a NTC, we need to adjust this
    136         {
    137             // right side
    138             st = m;
    139         }
    140         else
    141         {
    142             // left side
    143             en = m;
    144         }
    145     }
    146 
    147     // read the best matching lines
    148     memcpy_P(&tmp, &current[st+0], sizeof(sensorvalues_flash));    t1 = tmp;
    149     memcpy_P(&tmp, &current[st+1], sizeof(sensorvalues_flash));    t2 = tmp;
    150 
    151     // interpolate
    152     float dr = t2.r-t1.r;
    153 
    154     float f = (r-t1.r)/dr;
    155     return t1.t+(t2.t-t1.t)*f;
    Nochmals danke für den "Stuppser"

    @Besserwessi: Klar, ich habe eine Scheduler drin, der die Takte verteilt. Erst lauft die Konvertierung über den SPI (in mehreren Zyklen), dann die Umwandlung im letzten. Hier wird diese Funktion aufgerufen.

    [1] http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche
    Geändert von schorsch_76 (20.09.2014 um 19:51 Uhr)

Ähnliche Themen

  1. Nochmal RFM12, funktionierende Routine gesucht !
    Von Andree-HB im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.01.2008, 19:11
  2. Interruptfreie Routine für I2C gesucht
    Von Dani-Bruchflieger im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 07.09.2007, 04:39
  3. Wer hat Lust, eine Routine für ein LED-Display zu schreiben?
    Von avr-tools im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 31.07.2006, 08:14
  4. bessere H-Brücke als 293 gesucht
    Von aaaaamartin im Forum Motoren
    Antworten: 3
    Letzter Beitrag: 03.10.2005, 18:20
  5. Antworten: 9
    Letzter Beitrag: 10.12.2004, 09:14

Berechtigungen

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

Labornetzteil AliExpress