Hello, George! You wrote to Nicolas Minakov on Tue, 27 Jun 2006 10:23:31 +0600:
GS> Пятница Июнь 23 2006 08:09, Nicolas Minakov wrote to Alexandr GS> Torres:
??>>> "ноу-хау" - назывется "кусочно-линейная аппроскимация". ??>>> Извини, сплайном на пике, или на той мотороле для которой это ??>>> писалось когда-то, делать трудно :) NM>> Ж;-). Посыпаю головy пеплом. NM>> Для меня самая сложная часть в этом конкyрсе - подогнать таблицy NM>> под реальный NTC. GS> Подгонкой может персоналка заняться, не только ведь игрушки на ней GS> гонять ;) Программка подгонки пишется на чём угодно (привычно, GS> наглядно...) Да это имхо ввобще дело десятое, откуда табличка возмётся. Мне сама идея, как интерпретировать значения в точках, как вычислять промежточные, уж больно "прямолинейной" показалась. Никакого куража, никакой выдумки. Скучно, нудно.
Извините, что коментарии тут на немецком, выдернул из проекта как есть...
//- Andrej Arnold 01_10_2005 #define MAIN_GPS
/* -->|----- 12 -----|<-- #define MASKE 0xF000 - 1111.0000.0000.0000 #define BIT_CHECK 0x0800 - 0000.1000.0000.0000 #define SHIFT_BIT 12 Natuerlich es alles kann man auch programmmaessig berechnen aus belibiger einer definition, aber es ist aufwendig und bringt uns hier keine Vorteile.
*/#include "iom128v.h" #include "gps_wert.h"
/*...wird der Wert fuer "berechnung_position" gesucht und am Ende zurueckgegeben. Gemeint ist, dass Werte zwischen bekanten Punkten befinden sich auf einer Gerade... ... wegen schieben "int" nach links kann das Ergebnis bis auf zwei digits kleiner (weil Endwert ist 0xFFFF und nicht 0x10000) oder ein digits groesser sein als man erwartet, aber dieser Fehler ist viel kleiner (0,003%) als der erwartete Fehler vom Aenderung des Widerstands der Zufuehrleitungen und Genauigkeit der Analogtechnik. (Endlast ist zur Zeit mir nicht bekant.)
Vorteil ist dass verwendet werden nur resursensparende Befehle. Nachteil - es koennen nur (2^n+1), bekante Punkte sein mit gleichem Abstand zwischen ihnen.
*/ unsigned int gps_berechnen(unsigned int berechnung_position) { unsigned int wert_l, wert_h, wert_m; unsigned int temp_low; unsigned int temp_high; unsigned int temp_bit; unsigned int position;temp_bit = BIT_CHECK; //werden bekante Werte zwischen denen der gesuche //Wert ligt, ermittelt position = berechnung_position>>SHIFT_BIT; wert_l = punkt_werte[position]; wert_h = punkt_werte[position +1];
while (temp_bit) { temp_low = wert_l>>1; temp_high = wert_h>>1; wert_m = temp_low + temp_high; //Mittelwert ist gefunden if (berechnung_position & temp_bit) { wert_l = wert_m; } else { wert_h = wert_m; } //und so kommen wir dem gesuchtem Wert naeher temp_bit = temp_bit>>1; } return wert_m; }
ещё хидер
/* ADCDAC16_DAC.h */ #ifndef _GPS_WERT_H_ #define _GPS_WERT_H_
#define PUNKTEN 17 #define MASKE 0xF000; #define BIT_CHECK 0x0800; #define SHIFT_BIT 12;
#define PUNKT0 0x0000 #define PUNKT1 0x1000 #define PUNKT2 0x2000 #define PUNKT3 0x3000 #define PUNKT4 0x4000 #define PUNKT5 0x5000 #define PUNKT6 0x6000 #define PUNKT7 0x7000 #define PUNKT8 0x8000 #define PUNKT9 0x9000 #define PUNKT10 0xA000 #define PUNKT11 0xB000 #define PUNKT12 0xC000 #define PUNKT13 0xD000 #define PUNKT14 0xE000 #define PUNKT15 0xF000 #define PUNKT16 0xFFFF
#ifdef MAIN_GPS #define EXTERN #else #define EXTERN extern #endif
EXTERN unsigned int punkt_werte[PUNKTEN];
extern unsigned int gps_berechnen(unsigned int);
#endif /* _ADCDAC16_DAC_H_ */
и ещё текстовый кусок, какой он был, для полного счастья...
#include "iom128v.h" #include "gps_wert.h"
void foo(void);
void foo(void) { //------------------------ // fuer Testzwecke fuellen... punkt_werte[0] = PUNKT0; punkt_werte[1] = PUNKT1; punkt_werte[2] = PUNKT2; punkt_werte[3] = PUNKT3; punkt_werte[4] = PUNKT4; punkt_werte[5] = PUNKT5; punkt_werte[6] = PUNKT6; punkt_werte[7] = PUNKT7; punkt_werte[8] = PUNKT8; punkt_werte[9] = PUNKT9; punkt_werte[10] = PUNKT10; punkt_werte[11] = PUNKT11; punkt_werte[12] = PUNKT12; punkt_werte[13] = PUNKT13; punkt_werte[14] = PUNKT14; punkt_werte[15] = PUNKT15; punkt_werte[16] = PUNKT16; //------------------------ }
void main(void) { unsigned int w; w = 0x1111; // das man Enderungen sieht foo(); //------------------------- w = gps_berechnen(0xf7fe); //------------------------- punkt_werte[0] = 0x4321; punkt_werte[1] = 0x2345; }
With best regards, Andrej Arnold. E-mail: snipped-for-privacy@aol.com