Hallo, ich möchte Elko-Kapazitäten mit einem µC messen. Dabei wird der Elko über einen bekannten Ladewiderstand geladen und nach einer bestimmten Zeit wird die Spannung mit Hilfe des ADC gemessen. Die gemessene Spannung muss dann auf die Kapazität umgerechnet werden. Ich benutze AVR Studio 4 und einen Atmega 644, die math.h habe ich eingebunden. Mein Problem ist, dass ich immer Fehler mit den Datentypen bekomme. Ich habe das selbe mal in VB ohne Probleme gemacht, dort lautete meine Formel: C = (-t_load / (resistor * (Math.Log(1 - c_mess / V_real)))) * 1000000 Das Ergebnis wurde in µF angezeigt. Zur Zeit habe ich mir in Excel eine Tabelle angefertigt, und diese als Datenarray eingebunden. Das soll aber nur die Notlösung sein, Ich würde lieber die Kapazität direkt im µC berechnen. Wie müssen meine Datentypen deklariert sein, und wie muss die Formel dann geschrieben werden? vielen Dank für eure Bemühungen im vorraus, Grüße Michael
:
Verschoben durch Admin
saxosun schrieb: > Mein Problem ist, dass ich immer Fehler mit den Datentypen bekomme. Das wird an deiner Variablendeklaration oder an deiner Umsetzung der Formel liegen. Guck mal in Zeile 42.
1 | double c_real; //Kapazität in µF |
2 | double time; //Messzeit in Sekunden |
3 | double resistor; //Ladewiderstand in Ohm |
4 | double voltage_adc; //gemessene Spannung nach laden |
5 | double voltage_load; //angelegte Ladespannung |
6 | |
7 | c_real = (-time / resistor * log( 1- voltage_adc / voltage_load)) * 1000000; |
Fehlermeldung:
1 | c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(floatsisf.o): In function `__floatunsisf': |
2 | (.text.avr-libc.fplib+0x0): multiple definition of `__floatunsisf' |
3 | c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_usi_to_sf.o):c:\avrdev\gcc\build-avr\avr\avr5\libgcc/../../.././gcc/fp-bit.c:1391: first defined here |
Grüße Michael (was meinst du mit Zeile 42?)
saxosun schrieb: > multiple definition of `__floatunsisf' Und was sagt uns diese Fehlermeldung? Es liegt nicht an den Variablen, sondern an dem, was du geschrieben hast. Hast du die math.h vielleicht mehrfahr eingefügt? Vielleicht dadurch, dass eine andere header-Datei eingefügt hast? Ohne deinen Quellcode, wird niemand außer dir den Fehler finden können.
1 | #include <avr/io.h> |
2 | #define F_CPU 10000000
|
3 | #include <util/delay.h> |
4 | #include <math.h> |
5 | ///////////////////////////////////////////////////
|
6 | unsigned char Flag = 0; |
7 | #define t_fk SBIT (Flag, 0 )
|
8 | #define t_tast SBIT (Flag, 2 )
|
9 | ///////////////////////////////////////////////////
|
10 | double c_real; |
11 | unsigned char t_time = 10; |
12 | unsigned char v_s = 50; |
13 | ///////////////////////////////////////////////////
|
14 | struct bits |
15 | {
|
16 | uint8_t b0:1; uint8_t b1:1; uint8_t b2:1; uint8_t b3:1; |
17 | uint8_t b4:1; uint8_t b5:1; uint8_t b6:1; uint8_t b7:1; |
18 | }
|
19 | __attribute__((__packed__)); |
20 | #define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
|
21 | ///////////////////////////////////////////////////
|
22 | void get_in (void) |
23 | {if ((t_time <= 79) && (t_tast == 1)) t_fk = 1;} |
24 | ///////////////////////////////////////////////////
|
25 | int main (void) |
26 | {
|
27 | while(1) |
28 | {
|
29 | get_in(); |
30 | c_real = log(c_real); |
31 | _delay_ms(v_s); |
32 | }
|
33 | return(0); |
34 | }
|
35 | ////////////////////////////////////////////////////
|
Hallo, ich habe den Code jetzt soweit reduziert, dass die Fehlermeldung immer noch erscheint. Der Code macht natürlich keinen Sinn mehr. Setze ich z.B. in _delay_ms(v_s) einen festen Wert ein, verschwindet die Fehlermeldung. Genauso wenn ich den Code aus der Funktion get_in direkt in die mainloop einfüge, oder um eine Bedingung reduziere.... Ich verstehe das Problem leider nicht, und würde mich über Hilfe freuen. Grüße Michael
saxosun schrieb: > Setze ich z.B. in _delay_ms(v_s) einen festen Wert ein, verschwindet die > Fehlermeldung. Dann soltest du dir mal angucken, wie "_delay_ms()" funktioniert.
1 | t_fk = 1; |
Wenn ich das richtig interpretiere, steht da:
1 | SBIT (Flag, 0 ) = 1; |
ist wohl Blödsinn, oder? "_delay_ms()" mit einem Char aufzurufen fällt unter die gleiche Kategorie...
Ich schrieb doch das der Code keinen Sinn mehr macht, aber, es wird wohl einfacher sein den Fehler hier zu finden, als in 2000 Zeilen Code.
Also, wenn ich bei _ms_delay() einen Übergabewert als double einsetze verschwindet die Fehlermeldung, das hat geholfen, danke. Aber warum funktioniert es dann ohne die log Berechnung, und was bedeutet die Fehlermeldung? Und, warum ist es ein Problem (Blödsinn), wenn ich mir ein vorher deklariertes Flag in einer Bedingung auf 1 setze? Grüße Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.